自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

OpenHarmony輕量化系統(tǒng)的LVGL使用(一)

系統(tǒng) OpenHarmony
本文章將簡單介紹LVGL的主要開發(fā)流程,OpenHarmony->LVGL的具體移植期待后續(xù)文章。

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區(qū)??

??https://ost.51cto.com??

概括

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ù)文章。

#創(chuàng)作者激勵#【FFH】OpenHarmony輕量化系統(tǒng)的LVGL使用(一)-開源基礎軟件社區(qū)

初始化

概括

LVGL的初始化主要流程為以下步驟:

  1. 調用lv_init()。
  2. 初始化驅動程序
  3. 初始化顯示驅動和輸入設備驅動程序。
  4. 設置一個定時器,每隔n(1-10)毫秒調用lv_tick_inc(n)以告知lvgl經(jīng)過時間,該線程需要高于第五步的優(yōu)先級。
  5. 主程序中每隔數(shù)毫秒(5ms)調用lv_timer_handler()處理LVGL界面(繪制顯示界面,讀取輸入設備信息,展示動畫等)。

初始化顯示驅動

初始化lv_disp_draw_buf_t && lv_disp_drv_t這兩個結構體然后對應初始化繪制緩沖區(qū)的內部圖形緩沖區(qū),顯示驅動程序。

初始化緩存區(qū)

對于lv_disp_draw_buf_t:

/*一個靜態(tài)或全局變量來存儲緩沖區(qū)*/
static lv_disp_draw_buf_t disp_buf;

/*靜態(tài)或全局緩沖區(qū)(s)。第二個緩沖區(qū)是可選的*/
static lv_color_t buf_1[MY_DISP_HOR_RES * 10];
static lv_color_t buf_2[MY_DISP_HOR_RES * 10];

/*初始化函數(shù),第三變量可以為NULL */
lv_disp_draw_buf_init(&disp_buf, buf_1, buf_2, MY_DISP_HOR_RES*10);

更大的緩沖區(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。

  1. 用lv_disp_drv_init(&disp_drv)初始化。
  2. 以下的變量必須初始化。
  1. 指向上一章顯示緩存的指針的 draw_buf 。
  2. hor_res 顯示器的水平分辨率(以像素為單位)。
  3. ver_res 顯示器的垂直分辨率(以像素為單位)。
  4. flush_cb 一個回調函數(shù),用于將緩沖區(qū)的內容復制到顯示器的特定區(qū)域。
  1. 需要在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 用于清理與顯示相關的任何緩存的回調。
樣例
static lv_disp_drv_t disp_drv;    //靜態(tài)的一個顯示驅動結構體
lv_disp_drv_init(&disp_drv); //初始化結構體
disp_drv.draw_buf = &disp_buf; //指向上一章顯示緩存的指針
disp_drv.flush_cb = my_flush_cb; //回調函數(shù),將緩沖區(qū)的內容復制到顯示器的特定區(qū)域
disp_drv.hor_res = 320; //水平像素
disp_drv.ver_res = 240; //垂直像素

lv_disp_t * disp; //保存返回值
disp = lv_disp_drv_register(&disp_drv); //注冊結構體

//回調函數(shù)
void my_flush_cb(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{
//最簡單的情況下(但也最慢)
int32_t x, y;
for(y = area->y1; y <= area->y2; y++) {
for(x = area->x1; x <= area->x2; x++) {
put_px(x, y, *color_p);
color_p++;
}
}
//通知LVGL準備刷新
lv_disp_flush_ready(disp_drv);
}

初始化輸入設備驅動

對于輸入設備,首先要區(qū)分是何種類型輸入設備,不同輸入設備都有不同的初始化驅動API

LVGL將輸入設備分成了四種類型:

  • LV_INDEV_TYPE_POINTER 觸摸板或鼠標。
  • LV_INDEV_TYPE_KEYPAD 鍵盤。
  • LV_INDEV_TYPE_ENCODER 編碼器,帶有左/右轉和推動選項。
  • LV_INDEV_TYPE_BUTTON 外部按鈕。

初始化輸入設備結構體lv_indev_drv_t

lv_indev_drv_t indev_drv;
lv_indev_drv_init(&indev_drv); //初始化結構體
indev_drv.type =LV_INDEV_TYPE_POINTER; //輸入設備類型,當前為鼠標
indev_drv.read_cb =... //回調函數(shù),用于定期(幾乎實時)獲取輸入設備的數(shù)據(jù)
lv_indev_t * my_indev = lv_indev_drv_register(&indev_drv); //注冊輸入設備

觸摸板,鼠標

對于觸摸板,鼠標等指針類的輸入設備,他們的回調函數(shù)可以如下設置。

void my_input_read(lv_indev_drv_t * drv, lv_indev_data_t*data)
{
if(touchpad_pressed) {
data->point.x = touchpad_x;
data->point.y = touchpad_y;
data->state = LV_INDEV_STATE_PRESSED;
} else {
data->state = LV_INDEV_STATE_RELEASED;
}
}

若是需要顯示光標,則如下:

lv_indev_t * mouse_indev = lv_indev_drv_register(&indev_drv);
//圖像聲明
LV_IMG_DECLARE(mouse_cursor_icon);
//創(chuàng)建光標對象
lv_obj_t * cursor_obj = lv_img_create(lv_scr_act(), NULL);
//設置光標圖像的來源
lv_img_set_src(cursor_obj, &mouse_cursor_icon);
//鏈接顯示驅動
lv_indev_set_cursor(mouse_indev, cursor_obj);
//設置光標點擊
lv_obj_set_click(cursor_obj, false);

編碼器

使用編碼器可以做到以下事件:

  1. 按下按鈕
  2. 長按按鈕
  3. 左轉
  4. 右轉
  • 注冊一個帶有 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 的返回值)。
void encoder_read(lv_indev_drv_t * drv, lv_indev_data_t*data){
data->enc_diff = enc_get_new_moves();

if(enc_pressed()) data->state = LV_INDEV_STATE_PRESSED;
else data->state = LV_INDEV_STATE_RELEASED;
}

睡眠管理

由于屏幕驅動會占用系統(tǒng)的大量資源,所以在不需要屏幕驅動時,可以選擇睡眠LVGL子系統(tǒng),減少對資源的占用時,可以參考以下代碼:

while(1) {
//一秒內無操作
if(lv_disp_get_inactive_time(NULL) < 1000) {
//LVGL處理相關任務
lv_task_handler();
}
/*Sleep after 1 sec inactivity*/
else {
timer_stop(); //定時器暫停
sleep(); //休眠線程
}
my_delay_ms(5);
}

當需要喚醒時,對輸入設備進行操作以喚醒LVGL。

將下面代碼加入輸入設備讀取功能里面。

lv_tick_inc(LV_DISP_DEF_REFR_PERIOD);  //喚醒任務
timer_start(); //重啟定時器
lv_task_handler(); //啟動LVGL處理相關任務

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區(qū)??

??https://ost.51cto.com??

責任編輯:jianghua 來源: 51CTO 開源基礎軟件社區(qū)
相關推薦

2023-03-31 09:35:19

LVGL使用鴻蒙

2023-03-15 16:31:56

系統(tǒng)聲音收錄鴻蒙

2023-03-10 09:32:31

ANY功能短數(shù)據(jù)通信功能

2022-10-24 14:54:29

LWIP協(xié)議鴻蒙

2022-09-22 15:23:40

設備開發(fā)鴻蒙

2020-04-27 15:33:04

Bodhi LinuxLinux

2023-09-11 19:53:50

2019-07-04 11:46:44

智慧安防云存儲軟件

2023-06-09 14:51:31

5G輕量化

2017-11-21 08:19:26

機箱桌面PC

2021-09-07 18:05:51

深信服安全

2021-03-25 18:00:53

HarmonyOS元服務開發(fā)者

2011-04-28 12:53:29

3D眼鏡3D家庭影院

2016-04-20 15:36:38

圖片壓縮工具輕量化

2020-12-22 09:17:49

日志Loki服務

2022-08-10 16:56:30

StreamLak快手

2025-05-06 13:42:16

微軟Phi-4模型

2023-02-01 16:28:30

Linux內核鴻蒙
點贊
收藏

51CTO技術棧公眾號