關 閉

        新聞中心

        EEPW首頁 > 工控自動化 > 設計應用 > 實現針對觸摸屏的輸入引擎移植解析方案

        實現針對觸摸屏的輸入引擎移植解析方案

        作者: 時間:2012-05-16 來源:網絡 收藏

        3.嵌入式GUI研究

        3.1基于嵌入式Linux的GUI系統底層基礎

        一個能夠兼容多硬件平臺的嵌入式GUI系統,應至少抽象出兩類設備:基于圖形顯示設備(如VGA卡)的圖形抽象層 GAL(Graphic Abstract Layer)和基于設備(如鍵盤,等)的抽象層 IAL(Input Abstract Layer)[3]。抽象層的概念類似Linux內核虛擬文件系統的概念,它定義了一組不依賴于任何特殊硬件的抽象接口,所有頂層的圖形操作和處理都建立在抽象接口上,而用于該抽象接口的底層代碼稱為“圖形”或“輸入”,類似操作系統中的驅動程序,這實際是一種面向對象的程序結構。利用該抽象接口,嵌入式GUI可以非常方便的到其他POSIX系統上,只需要根據抽象層接口新的即可。

        3.2嵌入式GUI基本性能需求

        嵌入式GUI應在基于操作系統的基礎上,為用戶提供豐富的圖形編程接口,使其能夠方便快速的編制界面友好的應用程序。

        GUI模塊的性能指標為單位時間實例化個數,如下所列:

        基本圖形繪制速度,即點、線、框、塊、圓、弧、橢圓等圖形單元繪制速度。在顯示設備可見范圍內任意位置產生隨機大小的基本圖形。量化指標為單位時間內繪制的個數,并以較長測試時間中取得的單位時間平均值為準。

        窗口創建速度。在顯示設備可見范圍內任意位置創建隨機大小的窗口。量化指標為單位時間內成功創建及繪制完畢的窗口個數,并以較長測試時間中取單位時間平均值為準。

        控件創建速度。在顯示設備可見范圍內任意位置創建隨機大小、包含隨機內容的窗口。量化指標為單位時間內成功創建及繪制完畢的控件個數,并以較長測試時間中取單位時間平均值為準。

        事件驅動機制反應速度。窗口及不同控件的典型事件及耗時事件,測試其完成時間。窗口及控件的大小、復雜程度隨機產生。量化指標為單位時間內成功處理完畢的事件數,并以較長測試時間中取單位時間平均值為準。

        3.3輸入引擎

        在基于Linux的嵌入式系統中,輸入設備可能只有和為數不多的按鍵,相對圖形引擎來說,輸入設備的處理沒有統一接口,在此情況下,提供一個抽象的輸入層,顯得尤為重要。

        這里我們參考MiniGUI,并結合實際工程機械控制系統來實現輸入引擎的工作。MiniGUI簡單可分為三層,最頂層為API,即編程接口;中間層是 MiniGUI的核心層,其中包括了窗口系統必不可少的各個模塊,如消息事件處理模塊、圖形設備接口等;而最底層則是GAL和IAL。

        該實際工程機械控制系統擬采用作為主要的輸入設備,需要編寫自己的輸入引擎。首先定義一個結構體用來從觸摸屏設備(/dev/ts)中接受數據,結構體定義如下:

        typedef struct

        {

        unsigned short b; //觸摸屏狀態(是否被點擊)

        unsigned short x; //觸摸屏x坐標

        unsigned short y; //觸摸屏y坐標

        unsigned short pad; //32位填充域,無實際意義

        } POS;

        接下來定義輸入引擎的初始化函數,該函數打開觸摸屏設備文件:/dev/ts,類似PC上的/dev/psaux設備。在成功打開設備文件后,該函數通過 mouse_getxy和mouse_getbutton等函數將獲得的狀態信息通過INPUT結構體傳遞給GUI應用程序。

        BOOl InitPADInput (INPUT*input,const char*mdev,const char*mtype)

        {

        ts = open(“/dev/ts”, O_RDONLY);

        if (ts0) {

        fprintf (stderr, “PAD:Can not open touch screen! ”);

        return FALSE;

        }

        ……

        input->get_mouse_xy=mouse_getxy;

        input->get_mouse_button=mouse_getbutton;

        ……

        }

        static void mouse_getxy(int* x, int* y)

        {

        *x=mousex;

        *y=mousey;

        }

        static int mouse_getbutton(void)

        {

        return pos.b;

        }



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 合作市| 纳雍县| 长寿区| 佳木斯市| 会昌县| 丰镇市| 辽中县| 青龙| 靖江市| 积石山| 交口县| 常宁市| 岑巩县| 新营市| 金平| 阿瓦提县| 沽源县| 离岛区| 和平区| 吉木乃县| 芷江| 蒲江县| 桐梓县| 河南省| 靖西县| 商河县| 固安县| 什邡市| 蒙阴县| 大兴区| 镇雄县| 望奎县| 碌曲县| 涟水县| 和硕县| 奉化市| 揭阳市| 大理市| 涿鹿县| 富阳市| 临沭县|