2012-06-30 24 views
1

我必須編寫一個低級驅動程序來管理嵌入式設備的tft顯示。 器件由一個PIC24,64K的RAM和大約128K的程序存儲器供電。在ansi中爲emebedded設備編寫可重用的低級圖形庫C

我的意圖是寫一個通用的圖形庫,在那裏,我把所有的原始圖形功能和驅動器發送命令和數據來顯示。

圖形lib中使用的驅動程序來訪問顯示,而是顯示TECNOLOGY可以改變,因此驅動程序必須容易reimplementabile。

在這種情況下編寫可重用代碼的最佳方式是什麼?

-----------------   ---------------  
|     |  |    | 
|     |  |    | 
| GFX_LIB  | =====> | DRIVER  | ====> DISPLAY 
|     |  |    | 
|     |  |    | 
-----------------   -----/----\---- 
           / \ 
          /  \ 
         ---------- ---------- 
         |   | |   | 
         | TYPE A | | TYPE B | 
         |   | |   | 
         ---------- ---------- 

更多細節

這是一張我的GFX的lib

#include "Graphics.h" 

void gfx_Init(uint16_t width, uint16_t height, uint8_t rotation){ 
    gfx_displayWidth=width; 
    gfx_displayHeight=height; 
    gfx_rotation=rotation; 
    displayDriverInit(); 
} 

void gfx_setPixel(uint16_t x, uint16_t y, uint32_t color){ 
    displayDriverSendCommand(CHANGE_COORDINATE); 
    displayDriverSendData(x); 
    displayDriverSendData(y); 
    displayDriverSendCommand(SET_COLOR); 
    displayDriverSendData(color); 
} 

的代碼這是一個假設的實現我的圖形庫。現在

,如果我改變驅動器,我真的很高興,如果我可以重用我的GFX lib和重寫僅顯示驅動程序。 達到此目的的最佳方法是什麼?

謝謝。

+1

OpenGL的情況如何?或SDL? – IanNorton

+0

嗨,這是一個嵌入式設備與picmicro – blow

回答

1

這取決於您的驅動程序將提供什麼功能。

的最小API可以聲明如下:

typedef void* gfx; 
typedef struct init_options { 
    int display_width, display_height; 
    //..etc.. 
}; 

gfx* gfx_init(init_options* opts); 
void gfx_free(gfx* gfx); 

// blit something onto sceeen 
void gfx_blit(gfx* gfx, void* buffer, int buf_w, int buf_h, int trg_x, int trg_y, int trg_w, int trg_h); 

// if you have double buffering (probably a good idea) 
void gfx_swap(gfx* gfx); 

初始化,關機模式轉換和位圖傳送像素到屏幕可能是你所需要的。也許你還應該提供一個快速的SetPixel()例程。基於此,其他一切都可以在某種「GfxUtil」庫中實現。

通過鏈接正確的庫(每個庫包含一個實際驅動程序,包含blitting的實際代碼等),可以處理此API的驅動程序選擇和實現。

編輯

有一些動態更換的代碼,你的驅動可以使用函數指針實際執行的驅動程序特定代碼結構:

// common driver struct, used by gfx api 
typedef struct driver { 
    void (*init)(driver *driver, init_options*); 
    void (*setpixel)(driver *driver, int x, int y, color color); 
    //... 
}; 

// driver constructor 
driver* create_foo_driver() { 
    driver* d = malloc(sizeof(driver)); 
    memset(d,0,sizeof(driver)); 
    d->init = foo_init; 
    d->setpixel = foo_setpixel; 
    return d; 
} 

// some driver-specific code ... 
void foo_setpixel(driver *driver, int x, int y, color color) { 
    // actual implementation 
} 

// API code calling driver code 
void gfx_setpixel(gfx* gfx, int x, int y, color color) { 
    driver* driver = ((gfx_impl)gfx)->driver; // .. just an example 
    driver->setpixel(driver, x, y, color); 
} 
+0

是的!是的,這與我的gfx lib很相似,現在的問題是:注入我的tft-driver發送命令和數據以顯示並保持開放顯示技術可能發生變化的可能性以及我必須重新實現驅動程序的最佳方式是什麼?我不需要(也不想)爲我使用的每個顯示重新實現所有gfx庫。 – blow

+0

@blow:提供更多詳情請 – Frunsi

+0

好,等一下 – blow

0

根據您在平臺上可以騰出多少內存,可以使用Cairo,其結構與您在ASCII藝術中繪製的完全相同。它也在C中實現。

+0

嗨,我只有64k的內存和大約128k的程序內存,所以我只能寫一個簡單的驅動程序原始圖形功能。 – blow

+0

你應該添加該信息給你的問題,低規格,低級別的圖形是一個不同的水壺 – IanNorton

+0

好的,謝謝! – blow

1

爲什麼重新發明輪子?使用GD Graphics Library在顯示器的圖像緩衝區中創建圖像。或者在顯示器的圖像緩衝區之外創建圖像,然後在完成渲染後複製像素數據。

請注意,GD通常用於創建圖像文件(瀏覽器可以下載),但渲染代碼是獨立的。

+0

嗨,我不需要這個。謝謝。 – blow

+0

你怎麼知道? –

+0

我需要類似java的Graphics類,但是對於性能差的嵌入式設備。而且我知道編寫我的原始gfx函數很熱,我只需要一個建議如何構建所有的可重用性......我是新的C. – blow

0

這裏有人谷歌搜索自己的方式應該看看Adafruit's GFX library,然後看看他們的庫如何爲特定的圖形驅動程序實現它。我的經驗特別是他們的ST7735 driver(我將其移植到chipKIT's PIC32上工作,現在正在從有經驗的chipKIT開發人員那裏獲得幫助)。 C++/OOP圖形框架的完美示例,可以實現特定硬件的驅動程序。

我很驚訝這個問題並沒有因爲像其他人一樣脫離主題而關閉「我怎樣才能完成這個問題」類型的問題。