OpenEdv-开源电子网

 找回密码
 立即注册
查看: 4109|回复: 3

LVGL8 的觸摸移植,觸摸讀取函數沒有被 ececuted

[复制链接]

18

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2016-1-15
在线时间
49 小时
发表于 2021-8-2 11:44:08 | 显示全部楼层 |阅读模式
1金钱
大家好:
想請問一下,LVGL8 的觸摸移植
因為已經用SV的 LVGL8 模擬器做好了 UI
所以,只能把STM32的@ v7 改成 v8 (v7 模板是在這裡下載的)
example 的顯示沒有大致問題,但是觸摸沒有反應
查了一下,LVGL 的觸摸讀取函數沒有被觸發!

LVGL 8 是從官方下載 master 版本
然後依據手上有的 LVGL7 更改

以下是有關於觸摸的程序

LVGL7 的 lv_port_index.c:
  1. #include "lv_port_indev.h"
  2. #include "touch.h"

  3. static bool touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data);

  4. void lv_port_indev_init(void)
  5. {
  6.     lv_indev_drv_t indev_drv;

  7.     /*------------------
  8.      * Touchpad
  9.      * -----------------*/

  10.     /*Register a touchpad input device*/
  11.     lv_indev_drv_init(&indev_drv);
  12.     indev_drv.type = LV_INDEV_TYPE_POINTER;
  13.     indev_drv.read_cb = touchpad_read;
  14.     lv_indev_drv_register(&indev_drv);
  15. }

  16. static bool touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
  17. {
  18.           printf("EXECUTE TOUCHPAD_READ \r\n");
  19.                 static uint16_t last_x = 0;
  20.                 static uint16_t last_y = 0;
  21.                 if(tp_dev.sta&TP_PRES_DOWN)
  22.                 {
  23.                         last_x = tp_dev.x[0];
  24.                         last_y = tp_dev.y[0];
  25.                         data->point.x = last_x;
  26.                         data->point.y = last_y;
  27.                         data->state = LV_INDEV_STATE_PR;
  28.                 }else{
  29.                         data->point.x = last_x;
  30.                         data->point.y = last_y;
  31.                         data->state = LV_INDEV_STATE_REL;
  32.                 }
  33.     /*Return `false` because we are not buffering and no more data to read*/
  34.     return false;
  35. }
复制代码


LVGL 8 的 lv_port_index.c:

  1. #include "lv_port_indev.h"
  2. #include "touch.h"

  3. static bool touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data);

  4. void lv_port_indev_init(void)
  5. {
  6.     lv_indev_drv_t indev_drv;

  7.     /*------------------
  8.      * Touchpad
  9.      * -----------------*/

  10.     /*Register a touchpad input device*/
  11.     lv_indev_drv_init(&indev_drv);
  12.     indev_drv.type = LV_INDEV_TYPE_POINTER;
  13.     indev_drv.read_cb = touchpad_read;
  14.     lv_indev_drv_register(&indev_drv);
  15. }


  16. /*Will be called by the library to read the touchpad*/
  17. static bool touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
  18. {
  19.     printf("EXECUTE TOUCHPAD_READ \r\n"); // indicates whether the function is executed

  20.     static lv_coord_t last_x = 0;
  21.     static lv_coord_t last_y = 0;
  22.    
  23.     /*Save the pressed coordinates and the state*/
  24.         if(tp_dev.sta&TP_PRES_DOWN)
  25.         {
  26.             printf("screen pressed x=%d y=%d\r\n",tp_dev.x[0],tp_dev.y[0]);
  27.             last_x = tp_dev.x[0];
  28.             last_y = tp_dev.y[0];
  29.             data->point.x = last_x;
  30.             data->point.y = last_y;
  31.             data->state = LV_INDEV_STATE_PR;
  32.         }else{
  33.             printf("screen released x=%d y=%d\r\n",last_x,last_y);
  34.             data->point.x = last_x;
  35.             data->point.y = last_y;
  36.             data->state = LV_INDEV_STATE_REL;
  37.         }
  38.     /*Return `false` because we are not buffering and no more data to read*/

  39.     return false;
  40. }
复制代码

為了測試 touch 是否有效,在 main 的 while(1){} loop 加入了讀取觸摸並打印的命令
  1.         lv_init();                                                                                        //lvgl系统初始化
  2.         lv_port_disp_init();                                                //lvgl显示接口初始化,放在lv_init()的后面
  3.         lv_port_indev_init();                                                //lvgl输入接口初始化,放在lv_init()的后面
  4.         //lv_demo_benchmark();
  5.         //官方打印机demo
  6. //        lv_demo_printer();
  7. //        lv_example_btnmatrix_3();
  8.         lv_example_keyboard_1();
  9. //        lv_example_grid_5();
  10.   //lv_example_btn_1();
  11.         printf("return to main() \r\n");
  12.   uint16_t t_counter=0;
  13.         uint8_t tp_sta_temp = 0;
  14.         while(1)
  15.         {
  16.     tp_dev.scan(0);
  17.     if (tp_dev.sta!=tp_sta_temp ){
  18.     if(tp_dev.sta&TP_PRES_DOWN)//觸摸按下了
  19.    {
  20.       printf("screen pressed x=%d y=%d\r\n",tp_dev.x[0],tp_dev.y[0]);
  21.     }else{
  22.       printf("screen released\r\n");
  23.     }
  24.     tp_sta_temp=tp_dev.sta;
  25.   }
  26.                 lv_task_handler();
  27.                 t_counter+=1;
  28.                 if (t_counter == 10000){
  29.                         //printf("time_out");
  30.                        
  31.                         t_counter = 0;
  32.                         LED1_Toggle;
  33.                        
  34.     }
  35.    }
  36. }
复制代码

在 main 中讀取觸摸並打印觸摸點是沒問題的
但是 在 touchpad_read() 中的 "EXECUTE TOUCHPAD_READ " 沒有被打印出來
也就是說 touchpad_read() 沒有被呼叫

檢查 lv_port_indev_init(void) ,touchpad_read 是有被註冊的
  1. indev_drv.read_cb = touchpad_read;
  2. 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 裡面的
  1. 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 應該是沒問題
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

18

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2016-1-15
在线时间
49 小时
 楼主| 发表于 2021-8-2 11:44:09 | 显示全部楼层
自問自答
根據官方的回應
v8 的 indev_drv 必須為 static
  1. static lv_indev_drv_t indev_drv;
复制代码

這樣就行了

BTW,v8(master)
模擬器你面的 lv_demo_widgets 移植到stm32H743似乎是不能跑
但是 lv_demo_benchmark() 是可以的!
其他的 example 應該是沒問題
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2020-6-24
在线时间
6 小时
发表于 2021-8-6 09:28:19 | 显示全部楼层
KCLin 发表于 2021-8-3 13:06
自問自答
根據官方的回應
v8 的 indev_drv 必須為 static

你好,我出现了跟你一样的问题,但是我把indev_drv定义成了static 还是触摸没有反应,能发个demo给我看看吗
回复

使用道具 举报

18

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2016-1-15
在线时间
49 小时
 楼主| 发表于 2021-8-31 15:40:55 | 显示全部楼层
Thomases 发表于 2021-8-6 09:28
你好,我出现了跟你一样的问题,但是我把indev_drv定义成了static 还是触摸没有反应,能发个demo给我看看 ...

請問您解決了嗎?
因為我在台灣,來這裡還要翻牆,所以很少來,都是有問題才會來
如果您的問題沒有解決,留言一下
我看看之前porting 的檔案還在不在
可以發一個給您!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-6-9 07:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表