OpenHarmony輕量化系統(tǒng)的LVGL使用(一)
概括
LVGL(Light and Versatile Graphics Library)是一個開源輕量級顯示框架,支持多類型顯示設備&&輸入設備,作為一個開源圖形庫,自帶了三十多種小組件供開發(fā)者使用。兼容低配置的嵌入式開發(fā),可以以極低的配置要求完成絲滑動畫。LVGL其強大的功能,使得它在物聯(lián)網(wǎng)設備中應用比比皆是。
前一陣子開發(fā)了潤和hispark_pegasus Hi3861開發(fā)板上的SSD1306,其提供的開發(fā)庫開發(fā)起來還是較為困難,于是想嘗試將LVGL移植到OpenHarmony輕量化系統(tǒng)上,便于后續(xù)OpenHarmony物聯(lián)網(wǎng)設備的屏幕開發(fā),大大降低屏幕開發(fā)的時間成本。
本文章將簡單介紹LVGL的主要開發(fā)流程,OpenHarmony->LVGL的具體移植期待后續(xù)文章。
初始化
概括
LVGL的初始化主要流程為以下步驟:
- 調用lv_init()。
- 初始化驅動程序
- 初始化顯示驅動和輸入設備驅動程序。
- 設置一個定時器,每隔n(1-10)毫秒調用lv_tick_inc(n)以告知lvgl經(jīng)過時間,該線程需要高于第五步的優(yōu)先級。
- 主程序中每隔數(shù)毫秒(5ms)調用lv_timer_handler()處理LVGL界面(繪制顯示界面,讀取輸入設備信息,展示動畫等)。
初始化顯示驅動
初始化lv_disp_draw_buf_t && lv_disp_drv_t這兩個結構體然后對應初始化繪制緩沖區(qū)的內部圖形緩沖區(qū),顯示驅動程序。
初始化緩存區(qū)
對于lv_disp_draw_buf_t:
更大的緩沖區(qū)能帶來更高的性能,但超過1/10屏幕大小的緩沖區(qū)之后性能沒有顯著提升,因而建議稍微大于1/10屏幕大小的緩沖區(qū)即可.
只使用一個緩沖區(qū),那么需要等待LVGL刷新了之后才能渲染下一幀.而使用到兩個緩沖區(qū)后,LVGL可以同時進行刷新和渲染。
初始化顯示驅動程序
?對于lv_disp_drv_t:
初始化中可以啟用 ?full_refresh 以強制 LVGL 始終重繪整個屏幕。這適用于單/雙緩沖模式。
如果啟用該模式并提供 2 個屏幕大小的繪制緩沖區(qū),LVGL 的顯示處理就像“傳統(tǒng)”雙緩沖一樣工作。
這意味著在 flush_cb? 中只有幀緩沖區(qū)的地址需要更改為提供的指針(color_p 參數(shù))。 如果 MCU 具有 LCD 控制器外圍設備而不是外部顯示控制器(例如 ILI9341 或 SSD1963),則應使用此配置。
初始化流程
對于上面的緩沖區(qū)初始化完成之后,可以初始化顯示驅動結構體lv_disp_drv_t。
- 用lv_disp_drv_init(&disp_drv)初始化。
- 以下的變量必須初始化。
- 指向上一章顯示緩存的指針的 draw_buf 。
- hor_res 顯示器的水平分辨率(以像素為單位)。
- ver_res 顯示器的垂直分辨率(以像素為單位)。
- flush_cb 一個回調函數(shù),用于將緩沖區(qū)的內容復制到顯示器的特定區(qū)域。
- 需要在LVGL中用lv_disp_drv_register(&disp_drv)注冊。
lv_disp_flush_ready(&disp_drv) 需要在刷新準備好時調用。 LVGL 可能會以多個塊呈現(xiàn)屏幕,因此多次調用 flush_cb。要查看當前是否是渲染的最后一個塊,請使用 lv_disp_flush_is_last(&disp_drv)。
結構體其余成員
對于lv_disp_drv_t對象而言,還有一些可選擇的成員可以修改:
- color_chroma_key 將在鍍鉻鍵控圖像上繪制為透明的顏色。從lv_conf.h默認設置為LV_COLOR_CHROMA_KEY。
- anti_aliasing 使用抗鋸齒(邊緣平滑)。如果在 lv_conf.h 中將 LV_COLOR_DEPTH 設置為至少 16,則默認啟用。
- rotated 和 sw_rotate 硬件旋轉屏幕和軟件旋轉屏幕.sw_rotate 置為1時執(zhí)行旋轉.
- screen_transp 如果 1 屏幕本身也可以具有透明度。 LV_COLOR_SCREEN_TRANSP 需要在 lv_conf.h 中啟用并且需要 LV_COLOR_DEPTH 32。
- user_data 驅動程序的自定義void 用戶數(shù)據(jù)…
- rounder_cb 四舍五入要重繪的區(qū)域的坐標。例如。 2x2 px 可以轉換為 2x8。 如果顯示控制器只能刷新具有特定高度或寬度的區(qū)域(單色顯示器通常為 8 像素高度),則可以使用它。
- set_px_cb 一個自定義函數(shù)來寫入繪制緩沖區(qū)。如果顯示器具有特殊的顏色格式,它可用于將像素更緊湊地存儲在繪圖緩沖區(qū)中。 (例如 1 位單色、2 位灰度等) 這樣,lv_disp_draw_buf_t 中使用的緩沖區(qū)可以更小,以僅容納給定區(qū)域大小所需的位數(shù)。請注意,使用set_px_cb 渲染比普通渲染慢。
- monitor_cb 一個回調函數(shù),告訴我們在多長時間內刷新了多少像素。當最后一個塊被渲染并發(fā)送到顯示器時調用。
- clean_dcache_cb 用于清理與顯示相關的任何緩存的回調。
樣例
初始化輸入設備驅動
對于輸入設備,首先要區(qū)分是何種類型輸入設備,不同輸入設備都有不同的初始化驅動API
LVGL將輸入設備分成了四種類型:
- LV_INDEV_TYPE_POINTER 觸摸板或鼠標。
- LV_INDEV_TYPE_KEYPAD 鍵盤。
- LV_INDEV_TYPE_ENCODER 編碼器,帶有左/右轉和推動選項。
- LV_INDEV_TYPE_BUTTON 外部按鈕。
初始化輸入設備結構體lv_indev_drv_t
觸摸板,鼠標
對于觸摸板,鼠標等指針類的輸入設備,他們的回調函數(shù)可以如下設置。
若是需要顯示光標,則如下:
編碼器
使用編碼器可以做到以下事件:
- 按下按鈕
- 長按按鈕
- 左轉
- 右轉
- 注冊一個帶有 LV_INDEV_TYPE_ENCODER 類型的 read_cb 函數(shù)。
- 必須創(chuàng)建一個對象組:lv_group_t * g = lv_group_create() 并且對象必須使用 lv_group_add_obj(g, obj) 添加到其中。
- 創(chuàng)建的組必須分配給輸入設備:lv_indev_set_group(my_indev, g)(my_indev 是 lv_indev_drv_register 的返回值)。
睡眠管理
由于屏幕驅動會占用系統(tǒng)的大量資源,所以在不需要屏幕驅動時,可以選擇睡眠LVGL子系統(tǒng),減少對資源的占用時,可以參考以下代碼:
當需要喚醒時,對輸入設備進行操作以喚醒LVGL。
將下面代碼加入輸入設備讀取功能里面。