初级会员
- 积分
- 180
- 金钱
- 180
- 注册时间
- 2016-1-15
- 在线时间
- 49 小时
|
1金钱
大家好:
想請問一下,LVGL8 的觸摸移植
因為已經用SV的 LVGL8 模擬器做好了 UI
所以,只能把STM32的@ v7 改成 v8 (v7 模板是在這裡下載的)
example 的顯示沒有大致問題,但是觸摸沒有反應
查了一下,LVGL 的觸摸讀取函數沒有被觸發!
LVGL 8 是從官方下載 master 版本
然後依據手上有的 LVGL7 更改
以下是有關於觸摸的程序
LVGL7 的 lv_port_index.c:
- #include "lv_port_indev.h"
- #include "touch.h"
- static bool touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data);
- void lv_port_indev_init(void)
- {
- lv_indev_drv_t indev_drv;
- /*------------------
- * Touchpad
- * -----------------*/
- /*Register a touchpad input device*/
- lv_indev_drv_init(&indev_drv);
- indev_drv.type = LV_INDEV_TYPE_POINTER;
- indev_drv.read_cb = touchpad_read;
- lv_indev_drv_register(&indev_drv);
- }
- static bool touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
- {
- printf("EXECUTE TOUCHPAD_READ \r\n");
- static uint16_t last_x = 0;
- static uint16_t last_y = 0;
- if(tp_dev.sta&TP_PRES_DOWN)
- {
- last_x = tp_dev.x[0];
- last_y = tp_dev.y[0];
- data->point.x = last_x;
- data->point.y = last_y;
- data->state = LV_INDEV_STATE_PR;
- }else{
- data->point.x = last_x;
- data->point.y = last_y;
- data->state = LV_INDEV_STATE_REL;
- }
- /*Return `false` because we are not buffering and no more data to read*/
- return false;
- }
复制代码
LVGL 8 的 lv_port_index.c:
- #include "lv_port_indev.h"
- #include "touch.h"
- static bool touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data);
- void lv_port_indev_init(void)
- {
- lv_indev_drv_t indev_drv;
- /*------------------
- * Touchpad
- * -----------------*/
- /*Register a touchpad input device*/
- lv_indev_drv_init(&indev_drv);
- indev_drv.type = LV_INDEV_TYPE_POINTER;
- indev_drv.read_cb = touchpad_read;
- lv_indev_drv_register(&indev_drv);
- }
- /*Will be called by the library to read the touchpad*/
- static bool touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
- {
- printf("EXECUTE TOUCHPAD_READ \r\n"); // indicates whether the function is executed
- static lv_coord_t last_x = 0;
- static lv_coord_t last_y = 0;
-
- /*Save the pressed coordinates and the state*/
- if(tp_dev.sta&TP_PRES_DOWN)
- {
- printf("screen pressed x=%d y=%d\r\n",tp_dev.x[0],tp_dev.y[0]);
- last_x = tp_dev.x[0];
- last_y = tp_dev.y[0];
- data->point.x = last_x;
- data->point.y = last_y;
- data->state = LV_INDEV_STATE_PR;
- }else{
- printf("screen released x=%d y=%d\r\n",last_x,last_y);
- data->point.x = last_x;
- data->point.y = last_y;
- data->state = LV_INDEV_STATE_REL;
- }
- /*Return `false` because we are not buffering and no more data to read*/
- return false;
- }
复制代码
為了測試 touch 是否有效,在 main 的 while(1){} loop 加入了讀取觸摸並打印的命令
- lv_init(); //lvgl系统初始化
- lv_port_disp_init(); //lvgl显示接口初始化,放在lv_init()的后面
- lv_port_indev_init(); //lvgl输入接口初始化,放在lv_init()的后面
- //lv_demo_benchmark();
- //官方打印机demo
- // lv_demo_printer();
- // lv_example_btnmatrix_3();
- lv_example_keyboard_1();
- // lv_example_grid_5();
- //lv_example_btn_1();
- printf("return to main() \r\n");
- uint16_t t_counter=0;
- uint8_t tp_sta_temp = 0;
- while(1)
- {
- tp_dev.scan(0);
- if (tp_dev.sta!=tp_sta_temp ){
- if(tp_dev.sta&TP_PRES_DOWN)//觸摸按下了
- {
- printf("screen pressed x=%d y=%d\r\n",tp_dev.x[0],tp_dev.y[0]);
- }else{
- printf("screen released\r\n");
- }
- tp_sta_temp=tp_dev.sta;
- }
- lv_task_handler();
- t_counter+=1;
- if (t_counter == 10000){
- //printf("time_out");
-
- t_counter = 0;
- LED1_Toggle;
-
- }
- }
- }
复制代码
在 main 中讀取觸摸並打印觸摸點是沒問題的
但是 在 touchpad_read() 中的 "EXECUTE TOUCHPAD_READ " 沒有被打印出來
也就是說 touchpad_read() 沒有被呼叫
檢查 lv_port_indev_init(void) ,touchpad_read 是有被註冊的
- indev_drv.read_cb = touchpad_read;
- lv_indev_drv_register(&indev_drv);
复制代码 並有在 main 內被執行
不知哪裡我做錯了,或者是忘記設定?
謝謝您的幫助
順道一提的是
在我移植 lvgl 8 的經驗中
模擬器裡面 lv_demo_widgets() 無法在 h743執行,會 hardfault, 無論 stack, heap 調多大(我已經從1k調到 8k)
如果您有遇到這問題,請直接測試 example 就好,如果您的v8可以跑 lv_demo_widgets() 還請告知如何解決
還有就是,根據官方 Q&A,lv_port_disp.c 裡面的
- static lv_disp_buf_t disp_buf;
复制代码 必須為 static ,v7 好像不用
|
最佳答案
查看完整内容[请看2#楼]
自問自答
根據官方的回應
v8 的 indev_drv 必須為 static
這樣就行了
BTW,v8(master)
模擬器你面的 lv_demo_widgets 移植到stm32H743似乎是不能跑
但是 lv_demo_benchmark() 是可以的!
其他的 example 應該是沒問題
|