嵌入式---LittleVGL觸摸屏移植(本次設計基於nuc970)----1

一、目的

       在自己的嵌入式產品,尤其是單片機/arm/dsp之類的裸機產品或者輕量級產品上,爲了運行快速、緩存低、輕量級的界面設計開發,需littlevgl恰好滿足這個目的,且由於其免費,所以值得設計者研究或者去利用移植到自己平臺上。

       本次移植是在nuc970這個arm9平臺實現的,其他平臺類似。littlevgl的界面移植很簡單,並不繁瑣,很容易移植到終端mcu平臺中。

二、移植關鍵闡述

       對於littlevgl移植,最基本的移植爲圖像移植,人機互動則是input移植。只要移植好這兩個方面,基本就能將littlevgl的ui庫加載到我們自己的平臺上了。其中圖形移植,見另外一章,這裏只闡述input移植。

       input移植其實概用官方所述,只要實現兩個關鍵的東西,一個是觸摸數據上報,一個是觸摸類型配置。在littlevgl中提供了這些屬性的通用接口函數和流程。

       即申請一個input變量,然後實現這個變量的數據上報函數和類型。比如:

lv_indev_drv_t indev_drv;
lv_indev_drv_init(&indev_drv);      /*Basic initialization*/
indev_drv.type =...                 /*input  type.*/
indev_drv.read_cb =...              /*input fun to get input data.*/
/*Register the driver in LittlevGL and save the created input device object*/
lv_indev_t * my_indev = lv_indev_drv_register(&indev_drv);

     上面完成的就是創建了一個indev_drv的一個變量,然後配置它的type和read_cb兩個接口。前面那個爲觸摸的類型,根據觸摸的設備和功能來選擇,畢竟觸摸有屏,pad,按鍵、鼠標等。具體可配置如下:

LV_INDEV_TYPE_POINTER touchpad or mouse

LV_INDEV_TYPE_KEYPAD keyboard or keypad

LV_INDEV_TYPE_ENCODER encoder with left, right, push options

LV_INDEV_TYPE_BUTTON external buttons pressing the screen

       read_cb是核心函數。即littlevgl獲取觸摸的屬性只能通過其向它的系統中同步對應的觸摸數據。littlevgl圖形系統會自動的去查詢這個數據,然後做對應操作。即我們要在這個函數中加載對應觸摸屏對應的lcd屏像素點,注意,重要事情再重複一遍,這個函數加載的數據不是觸摸直接出來的數據,是和你對應lcd屏對應的數據,一般而言觸摸屏的點數大於顯示屏的像素的,要有個換算。下面是對read_cb的編寫:

indev_drv.type = LV_INDEV_TYPE_POINTER;
indev_drv.read_cb = my_input_read;

...

bool my_input_read(lv_indev_drv_t * drv, lv_indev_data_t*data)
{
    data->point.x = touchpad_x;
    data->point.y = touchpad_y;
    data->state = LV_INDEV_STATE_PR or LV_INDEV_STATE_REL;
    return false; /*No buffering now so no more data read*/
}

需要注意的是,爲了降低littlevgl的cpu佔有率,儘量不要在read函數上直接調用觸摸函數去讀取觸摸數據。觸摸數據最好在littlevgl去讀取的時候,數據已經準備好。後面真實中會體現。

三、實例

      這裏設計是基於NUC平臺所做的。

      第一步、創建一個觸摸對象並配置其值,然後註冊

  lv_indev_drv_t indev_drv;
  lv_indev_drv_init(&indev_drv);//init
  indev_drv.read = touchpad_read;//config read fun
  indev_drv.type = LV_INDEV_TYPE_POINTER;//config type
  lv_indev_drv_register(&indev_drv);//register

       第二步、實現觸摸數據上報

static bool touchpad_read(lv_indev_data_t *data)
{

		static int16_t last_x = 0;
		static int16_t last_y = 0;

		sysprintf(" x1 = %d, y1 = %d \r\n", g_GT911.X1,g_GT911.Y1);				

		if(g_GT911.S1){
			
			data->state = LV_INDEV_STATE_PR;
			data->point.x = g_GT911.X1 /(1024 / 800.0f);//獲取相對值,當前觸摸屏水平是1024,lcd是800像素
			data->point.y = g_GT911.Y1 /(600 / 480.0f);				
			last_x = data->point.x;
			last_y = data->point.y;		
			g_GT911.S1 = 0;
			sysprintf(" x2 = %d, y2 = %d \r\n", data->point.x,data->point.y);			
		}else{
			data->point.x = last_x;
			data->point.y = last_y;
			data->state = LV_INDEV_STATE_REL;
			sysprintf(" x3 = %d, y3 = %d \r\n", data->point.x,data->point.y);
		}
    return false;
}

       上面的數據read_cb是直接獲取到data形參中的。具體數據是配置了觸摸的中斷函數。當有觸摸事件發生的時候,數據直接保存g_GT911這個變量中。

四、結論

        不會上傳動畫,所以這裏沒有法子展示。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章