12.2.2 編譯程序
執(zhí)行如下命令編譯:
左右滑動(dòng)查看完整內(nèi)容
$ source /opt/remi-sdk/environment-setup-aarch64-poky-linux $ cd lv_port_linux_frame_buffer-release-v9.0 $ mkdir build $ cd build $ cmake .. # 如果提示沒有 cmake 的話,執(zhí)行:sudo apt install cmake $ make -j 16
執(zhí)行完畢后,在源碼根目錄下生成了bin子目錄,里面有可執(zhí)行程序“main”:
左右滑動(dòng)查看完整內(nèi)容
$ ls ../bin/ main $ file ../bin/main ../bin/main: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-aarch64.so.1, for GNU/Linux 3.14.0, BuildID[sha1]=3fb9d000d98266fc0d4a252e8addaf07660e9612, wi th debug_info, not stripped
12.2.3 上機(jī)運(yùn)行
把編譯出來(lái)的可執(zhí)行程序main復(fù)制到開發(fā)板/mnt目錄:
左右滑動(dòng)查看完整內(nèi)容
$ scp ../bin/main root@192.168.5.9:/mnt
把系統(tǒng)的GUI程序關(guān)閉:
左右滑動(dòng)查看完整內(nèi)容
$ systemctl stop myir.service # 現(xiàn)在停止,下次開機(jī)重新啟動(dòng)
執(zhí)行第1個(gè)LVGL程序:
左右滑動(dòng)查看完整內(nèi)容
$ /mnt/main
可以看到如下界面:
12.3 實(shí)現(xiàn)按鍵操作
本節(jié)課程將開發(fā)一個(gè)LVGL程序,它顯示2個(gè)按鈕(button):第1個(gè)名為“Click me”,第2個(gè)名為“Reset”;并顯示一個(gè)label。當(dāng)用戶點(diǎn)擊第1個(gè)按鈕時(shí),label顯示的計(jì)數(shù)值加一;當(dāng)用戶點(diǎn)擊第2個(gè)按鈕時(shí),label顯示的計(jì)數(shù)值復(fù)位為0。
本節(jié)源碼位于如下目錄(已修改好):
12.3.1 編寫程序
在“第1個(gè)LVGL程序”的基礎(chǔ)上修改代碼。
1. 增加鼠標(biāo)的支持
修改“l(fā)v_config.h”,把宏“LV_USE_EVDEV”定義為1,如下所示:
左右滑動(dòng)查看完整內(nèi)容
889 #define LV_USE_EVDEV 1
修改“main.c”,增加,代碼如下:
左右滑動(dòng)查看完整內(nèi)容
60 int main(void) 61 { 62 lv_init(); 63 64 /*Linux frame buffer device init*/ 65 lv_display_t * disp = lv_linux_fbdev_create(); 66 lv_linux_fbdev_set_file(disp, "/dev/fb0"); 67 68 LV_IMG_DECLARE(mouse_cursor_icon) 69 lv_obj_t * cursor_obj = lv_img_create(lv_layer_sys()); /*Create an image objec t for the cursor */ 70 lv_img_set_src(cursor_obj, &mouse_cursor_icon); /*Set the image sourc e*/ 71 lv_indev_t * indev = lv_evdev_create(LV_INDEV_TYPE_POINTER, "/dev/input/event1 "); 72 lv_indev_set_cursor(indev, cursor_obj); 73 74 /*Create a Demo*/ 75 //lv_demo_widgets(); 76 //lv_demo_widgets_start_slideshow(); 77 78 button_test(); 79 80 /*Handle LVGL tasks*/ 81 while(1) { 82 lv_timer_handler(); 83 usleep(5000); 84 } 85 86 return 0; 87 }
第68行,聲明鼠標(biāo)指針的圖案,這就相當(dāng)于如下語(yǔ)句(mouse_curson_icon在“mouse_cursor_icon.c”中定義):
左右滑動(dòng)查看完整內(nèi)容
extern const lv_image_dsc_t mouse_cursor_icon;
第69行,創(chuàng)建一個(gè)“image object”。
第70行,設(shè)置“image object”的“image”,即:要顯示一個(gè)“image object”,需要設(shè)置它對(duì)應(yīng)的圖片。
第71行,創(chuàng)建一個(gè)輸入設(shè)備,它跟某個(gè)設(shè)備節(jié)點(diǎn)對(duì)應(yīng)。注意:需要接上鼠標(biāo),確定鼠標(biāo)對(duì)應(yīng)的設(shè)備節(jié)點(diǎn)。方法為:接上鼠標(biāo)后,執(zhí)行如下命令(使用hexdump逐個(gè)測(cè)試設(shè)備節(jié)點(diǎn),執(zhí)行hexdump后,移動(dòng)鼠標(biāo),有數(shù)據(jù)打印的話就找到了設(shè)備節(jié)點(diǎn)):
左右滑動(dòng)查看完整內(nèi)容
root@myir-remi-1g:~# ls /dev/input/event* /dev/input/event0 /dev/input/event1 /dev/input/event1 /dev/input/event3 /dev/input/event4 root@myir-remi-1g:~# root@myir-remi-1g:~# hexdump /dev/input/event2 0000000 0329 b493 0000 0000 9c6d 0008 0000 0000 0000010 0002 0000 0001 0000 0329 b493 0000 0000
第72行,輸入設(shè)備和前面的“image object”建立聯(lián)系。以后移動(dòng)鼠標(biāo)時(shí),就可以顯示對(duì)應(yīng)的光標(biāo)了。
第75~76行:注釋掉,我們不使用這個(gè)界面。
第78行,運(yùn)行我們的測(cè)試函數(shù)。
2. 創(chuàng)建按鈕及l(fā)abel
main函數(shù)里調(diào)用了“button_test”函數(shù),它里面創(chuàng)建了3個(gè)按鈕,代碼如下:
左右滑動(dòng)查看完整內(nèi)容
31 static void button_test(void) 32 { 33 lv_obj_t * btn_increment; 34 lv_obj_t * btn_reset; 35 lv_obj_t * label_btn_text; 36 lv_obj_t * label_value; 37 38 // Increment button 39 btn_increment = lv_button_create(lv_screen_active()); 40 lv_obj_align(btn_increment, LV_ALIGN_CENTER, -100, 0); 41 42 label_btn_text = lv_label_create(btn_increment); 43 lv_label_set_text(label_btn_text, "Click me"); 44 45 // Reset button 46 btn_reset = lv_button_create(lv_screen_active()); 47 lv_obj_align(btn_reset, LV_ALIGN_CENTER, 100, 0); 48 49 label_btn_text = lv_label_create(btn_reset); 50 lv_label_set_text(label_btn_text, "Reset"); 51 52 // Value label 53 label_value = lv_label_create(lv_screen_active()); 54 lv_obj_align(label_value, LV_ALIGN_CENTER, 0, 0); 55 56 lv_obj_add_event_cb(btn_increment, btn_event_handler, LV_EVENT_CLICKED, label_ value); 57 lv_obj_add_event_cb(btn_reset, btn_event_handler, LV_EVENT_CLICKED, label_valu e); 58 } 59
第39~43行,創(chuàng)建第1個(gè)按鈕“Click me”。
其中,第39行創(chuàng)建button,第40行設(shè)置對(duì)齊方式,第42行創(chuàng)建按鈕的label,第43行設(shè)置label的值。
第46~50行,創(chuàng)建第2個(gè)按鈕“Reset”。
其中,第46行創(chuàng)建button,第47行設(shè)置對(duì)齊方式,第49行創(chuàng)建按鈕的label,第50行設(shè)置label的值。
第53~54行,創(chuàng)建一個(gè)label。
其中,第53行創(chuàng)建label,第54行設(shè)置對(duì)齊方式。
第56行,為第1個(gè)按鈕設(shè)置回調(diào)函數(shù)。
第57行,為第2個(gè)按鈕設(shè)置回調(diào)函數(shù)。
3. 增加按鈕回調(diào)函數(shù)
按鈕回調(diào)函數(shù)為“btn_event_handler”,代碼如下:
左右滑動(dòng)查看完整內(nèi)容
08 static void btn_event_handler(lv_event_t * e) 09 { 10 lv_event_code_t code = lv_event_get_code(e); 11 lv_obj_t * btn = lv_event_get_target(e); 12 lv_obj_t * label_value = lv_event_get_user_data(e); 13 lv_obj_t * btn_label = lv_obj_get_child(btn, 0); 14 char * label_text = lv_label_get_text(btn_label); 15 16 if(code == LV_EVENT_CLICKED) { 17 if(strcmp(label_text, "Click me") == 0) 18 { 19 LV_LOG_USER("Increment"); 20 lv_label_set_text_fmt(label_value, "%d", (atoi(lv_label_get_text(label _value))+1)); 21 } 22 else if(strcmp(label_text, "Reset") == 0) 23 { 24 LV_LOG_USER("Reset"); 25 lv_label_set_text(label_value, "0"); 26 } 27 } 28 }
第10行,取出輸入事件的code,它有這些取值:LV_EVENT_CLICKED、LV_EVENT_RELEASED等。
第11行,獲得被點(diǎn)擊的圖標(biāo)。
第12行,獲得“用戶數(shù)據(jù)”,在前面的第56、57行設(shè)置按鈕回調(diào)函數(shù)時(shí)設(shè)置了“用戶數(shù)據(jù)”,這個(gè)用戶數(shù)據(jù)就是用于顯示計(jì)數(shù)值的label。
第13行,獲得被點(diǎn)擊的圖標(biāo)的label。
第14行,獲得被點(diǎn)擊的圖標(biāo)的label的值。
第16~21行,如果點(diǎn)擊的是“Click me”按鈕,則增加label 的計(jì)數(shù)值。
第22~27行,如果點(diǎn)擊的是“Reset”按鈕,則復(fù)位label的計(jì)數(shù)值為0。
12.3.2 上機(jī)運(yùn)行
執(zhí)行如下命令編譯:
左右滑動(dòng)查看完整內(nèi)容
$ source /opt/remi-sdk/environment-setup-aarch64-poky-linux $ tar xjf lv_port_linux_frame_buffer_mouse.tar.bz2 $ cd lv_port_linux_frame_buffer_mouse $ mkdir build $ cd build $ cmake .. # 如果提示沒有 cmake 的話,執(zhí)行:sudo apt install cmake $ make -j 16
執(zhí)行完畢后,在源碼根目錄下生成了bin子目錄,里面有可執(zhí)行程序“main”:
左右滑動(dòng)查看完整內(nèi)容
$ ls ../bin/ main $ file ../bin/main ../bin/main: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-aarch64.so.1, for GNU/Linux 3.14.0, BuildID[sha1]=3fb9d000d98266fc0d4a252e8addaf07660e9612, wi th debug_info, not stripped
把編譯出來(lái)的可執(zhí)行程序main復(fù)制到開發(fā)板/mnt目錄:
左右滑動(dòng)查看完整內(nèi)容
$ scp ../bin/main root@192.168.5.9:/mnt
把系統(tǒng)的GUI程序關(guān)閉:
左右滑動(dòng)查看完整內(nèi)容
$ systemctl stop myir.service # 現(xiàn)在停止,下次開機(jī)重新啟動(dòng)
執(zhí)行程序:
$ /mnt/main
如果沒有接入鼠標(biāo)的話,程序會(huì)出錯(cuò),如下所示:
正常的界面如下(點(diǎn)擊“Click me”數(shù)值增加1,點(diǎn)擊“Reset”數(shù)值變?yōu)?):
12.4 實(shí)現(xiàn)開機(jī)運(yùn)行
修改板子的“/usr/bin/start.sh”,內(nèi)容如下:
左右滑動(dòng)查看完整內(nèi)容
#!/bin/sh -e echo "Start MYiR HMI V2.0..." export TSLIB_TSDEVICE=/dev/input/event1 export TSLIB_CONFFILE=/etc/ts.conf export TSLIB_CALIBFILE=/etc/pointercal export TSLIB_PLUGINDIR=/usr/lib/ts export TSLIB_CONSOLEDEVICE=none export QT_QPA_FB_TSLIB=1 export QT_QPA_GENERIC_PLUGINS=tslib:/dev/input/event1 echo 7 > /sys/class/backlight/backlight/brightness sleep 5 # 【警告】這一行需要手動(dòng)敲上去,不可復(fù)制粘貼,否則不生效!作用:去掉屏幕左上角的光標(biāo)顯示 echo -e "?33[?25l" > /dev/tty1 echo 1 > /proc/sys/kernel/printk # 降低內(nèi)核打印等級(jí),這樣屏幕上就不用有內(nèi)核信息輸出 /mnt/main & # 你自己的程序 #/home/mxapp2 -platform linuxfb & # 注釋掉 #/usr/share/myir_test/age.sh & # 注釋掉 exit 0
然后重啟即可。
-
源碼
+關(guān)注
關(guān)注
8文章
652瀏覽量
29358 -
命令
+關(guān)注
關(guān)注
5文章
695瀏覽量
22073 -
編譯程序
+關(guān)注
關(guān)注
0文章
13瀏覽量
4145 -
LVGL
+關(guān)注
關(guān)注
1文章
91瀏覽量
3031
原文標(biāo)題:開發(fā)第1個(gè)LVGL程序與實(shí)現(xiàn)按鍵操作 - RZ MPU工業(yè)控制教程連載(46)
文章出處:【微信號(hào):瑞薩MCU小百科,微信公眾號(hào):瑞薩MCU小百科】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論