(東北電子技術研究所 錦州 121000)
基于WindML的圖形界面控制系統設計*
蒲元遠吉高卿
(東北電子技術研究所 錦州 121000)
論文結合實際項目介紹了WindML軟件架構,如何安裝、配置和使用WindML,在應用程序開發圖形界面軟件的流程,如何進行多頁軟件設計,WindML中的雙緩沖技術,漢字的顯示以及幫組頁面的制作,并給出了程序運行的相應結果。
VxWorks;WindML雙緩沖;漢字顯示;多頁顯示;軟件架構
ClassNumberTN97
VxWorks作為性能優秀的嵌入式實時操作系統,不論在可靠性、實時性、可裁減性方面,還是在開放性、易用性等方面都是相當不錯的。目前,嵌入式實時操作系統VxWorks以其良好的可靠性和卓越的實時性被廣泛地應用在國防、航空和航天等領域中。VxWorks圖形開發組件WIND MEDIA LIBRARY是一個適用于VxWorks下開發圖形用戶界面的媒體庫,它提供了一系列的API函數,功能強大,易于實現圖形用戶界面的開發。本文就圖形界面控制系統、WindML、應用程序設計等,作進一步的研究和探討[1]。
本系統由主顯控制器、從顯控制器以及分配器構成,如圖1所示。主顯控制器硬件由CPU模塊、接口模塊和人機交付模塊(顯示屏幕、鍵盤)組成,它通過CPU模塊自帶的網口接收上級的控制、氣象等數據,通過接口模塊接收分配器上報的信息以及與分顯控制器通信;主顯控制器和從顯控制器都使用了WindML設計,通過鍵盤進行頁面切換、輸入數據等,通過WindML圖形開發在屏幕上顯示信息[2]。

圖1 圖形界面控制系統構成圖
3.1 圖形驅動架構
WindML圖形驅動主要通過以下三層進行通信:2D層、板級支持包及操作系統和圖形設備。體系結構如圖2所示[3]。

圖2 圖形驅動體系結構
2D層與圖形驅動程序通過UGL圖形接口結構(ugl_ugi_driver結構)進行通信,ugl_ugi_driver結構在install-Dir/target/h/ugl/uglugi.h中定義。[2]圖形驅動程序通過硬件提取API與操作系統通信,硬件提取API提供了允許圖形驅動保留獨立于母板和CPU的接口。一般包含幾個可擴展的寄存器作為圖形加速器,可加速的操作有線條、填充、顏色擴充和光標。
3.2 安裝使用步驟
本項目使用WindRiver的WindML3.0版本,集成在Tornado2.2.1上;配置好BSP包后,選擇配置WindML。如圖3所示,需要選擇所對應的CPU平臺,圖形像素的大小,刷新率,是否需要鼠標、鍵盤,最后在Bitmap Fonts頁中選擇需要添加的漢字。
4.1 應用程序開發流程
用WindML API進行繪圖操作的一般步驟:1)程序初始化,調用uglInitialize;2)設備驅動裝載(uglRegistryFind),包括顯示、字體、事件處理、框架等;3)獲取ugl信息;4)創建圖形設備gc;5)設置字體;6)分配圖形空間,以及創建位圖;7)使用WindML的API函數輸出字符,像素描點等。流程如圖4所示[4]。

圖4 使用WindML進行應用程序開發的流程
在本項目中,使用了基于VxWorks的實時多任務設計,顯示主處理函數為專用的任務,它為循環不斷接收其他任務給顯示任務傳輸的消息,對消息進行解析刷新顯示。根據不同的消息顯示不同的頁面和每頁中的內容。應用程序框架代碼如下:
UGL_FOREVER{
if(ERROR!=(msgQReceive(QueueDisplay,msgBuffer,MESSAGE_MAX_LENGTH,WAIT_FOREVER))){
msg=msgBuffer;
switch(*msg){
case H_SYSCONTROL:
SysToDraw(msg);
break;
case Cycle_Queue_ID:
CycleToDraw(msg);
break;
default:break;
} } }
4.2 多頁設計
為了使圖形控制系統功能顯示細化,操作更清晰,本項目圖形控制系統采用頁面擦除的方法來實現頁面的多級顯示。鍵盤設計為中斷方式,根據鍵盤輸入,顯示需要的頁面及信息。多頁選擇見圖4,選擇后進入的主態勢頁面見圖5,也可以從主態勢頁面返回到選擇頁面,本項目多頁設計的層級化。主體代碼如下[5]:
intConnect(INUM_TO_IVEC(INT_VEC_GET(KBD_INT_LVL)),(VOIDFUNCPTR)IntKeyProg,0))//連接中斷服務程序
sysIntDisablePIC(KBD_INT_LVL);//關鍵盤中斷
KeyValue[0]=sysInByte(COMMAND_8042);//讀取鍵盤值
switch(KeyValue[0]){ //根據鍵盤值切換
case 0x1c:/** 回車 **/
KeyValue[1]=Key_Enter;
break;
case 0x0c:/** - **/
KeyValue[1]=Key_Minus;
break;
……
default:break;}
sysIntEnablePIC(KBD_INT_LVL);//開鍵盤中斷

圖5 圖形控制系統多頁設計效果圖

圖6 圖形控制系統多頁設計效果圖
4.3 雙緩存技術
本項目中的圖形控制系統采用了雙緩沖技術,它不改變可見視頻緩存區起始地址,而是在內存中開辟一塊與屏幕一樣大小的存儲區域,作為緩沖屏幕,同時將下一幀要顯示的圖像繪制到這個緩沖屏幕上面,在顯示的時候將虛擬屏幕中的數據直接復制到可見視頻緩存區里。由于圖形繪制過程是在不可見的虛擬屏幕中進行,所以可以消除屏幕的閃爍、抖動。主體代碼如下[6]:
page[0]= UGL_PAGE_ZERO_ID;
page[0]= uglPageCreate(devId);
page[1]= uglPageCreate(devId);
uglPageDrawSet (devId, page[1]);
if (pageIndex == 0){
uglPageVisibleSet(devId, page[1]);
uglPageDrawSet(devId, page[0]);
pageIndex = 1;}
else {
uglPageVisibleSet(devId, page[0]);
uglPageDrawSet(devId, page[1]);
pageIndex = 0;}
4.4 如何顯示漢字
在圖形方式下,要顯示漢字,必須要有漢字字模,并通過適當的轉換公式,將漢字編碼轉換為字模在字庫中的位移,然后選用讀寫指令實現字模的讀取和顯示。可以通過兩種方法輸出漢字,第一種是進行二次開發以支持漢字的顯示,讀取字庫文件,使用uglPixelSet屏幕點函數輸出漢字;第二種是編輯VxWorks自帶的bmf字庫文件,通過WindML的支持,然后在程序中直接調用uglTextDrawW()顯示漢字。本項目采用后一種方式,實際使用步驟如下[7]:
1)修改bmf字庫文件。在$BASEDIR argetsrcuglfontsmf,找到需修改的bmf文件uflbr18.c,其中第一行注釋/* uflbr18.c - Lucida_Sans_Bold_18 font for BMF font driver */ ,“—”后面的“Lucida_Sans_Bold_18”將由WindML Configuration解釋為“Lucida_Sans_Bold_18”字體。配置圖見圖2。
2)修改漢字字體。uflbr18.c中,會看到如下格式的漢字信息,可以編輯我們所需要的漢字。其中index和page的值可在UltraEdit直接得到。然后設置長寬為16X16,最后32個字節可以通過取模工具(字模3增強版)獲得。
/********導************/
181, /* index */
188, /* page */
0, /* size (MSB)*/
36, /* size (LSB)*/
16, /* width */
16, /* height */
16, /* ascent */
0x04, 0x00, 0x04, 0x00, 0x04, 0x7e, 0x04, 0x92, 0x14, 0x92, 0x24, 0x92, 0x04, 0x92, 0x04, 0x92, 0x44, 0x92, 0x84, 0x92, 0x7f, 0x92, 0x04, 0xbf, 0x04, 0x82, 0x06, 0xe0, 0x04, 0x00, 0x00, 0x00
3)在應用程序中使用。在應用程序中使用漢字,需要如下幾個步驟:
(1)uglFontFindString(fontDrvId, "familyName=Lucida;pixelSize=18", &fontoilDef);//找到對應文件
(2)font_oil = uglFontCreate(fontDrvId, &fontoilDef);//創建字體
(3)uglForegroundColorSet(gc, colorTable[DARKGRAY].uglColor);//設置顏色
(4)uglFontSet(gc, font_oil);//設置字體
(5)uglTextDrawW(gc, InfoTopPosX,InfoTopPosY,-1, "綜");//輸出漢字
uglTextDrawW(gc, InfoTopPosX,InfoTopPosY+Pix24,-1, "合");
4.5 如何顯示圖片
圖像數據是位圖矩陣的像素的顏色信息,圖像數據的存儲格式和含義,因表示像素顏色的位數不同而不同,對于沒有壓縮的圖像數據,當用1位表示一個像素顏色。同樣可以使用uglPixelSet屏幕點顯示函數顯示圖片。可以用取模工具,取出其數組,主體代碼如下[8]:
for(kk=0;kk<64*8;kk++){
for(jj=0;jj<8;jj++){
if(Bmp_boat[kk]&temp_bit){
uglPixelSet(gc,x+(kk%8)*8+jj,y+kk/8,colorTable[YELLOW].uglColor);
}
else {
uglPixelSet(gc,x+(kk%8)*8+jj,y+kk/8,colorTable[BLACK].uglColor);
}
temp_bit=temp_bit>>1;
}
temp_bit=0x80;
}
通過這種像素打點的方法,可以顯示任何內容的點陣圖片。
4.6 幫助界面,如何顯示字符串
本項目中的圖形控制系統需要制作幫助文檔。通過讀取固定格式的bin文件,將讀取的字符逐個畫在界面上,并且計算字符的高度和寬度;如果bin文件過大,可設計成多個屏幕顯示,并通過輸入鍵盤切換顯示的幫助頁面。幫助頁面效果如圖6所示[9]。

圖7 圖形控制系統幫主頁面效果圖
cd("/ata0a/");//創建磁盤格式
UVHandle=open("/ata0a/help.bin",O_CREAT|O_RDWR,0);//打開len=lseek(UVHandle,0,SEEK_END);
read(UVHandle,HpBuffer,len);
//以下逐個顯示字符
for(i=0;i uglTextDraw(gc,10,displayHeight/5+15*i,PageArrow,strBuf); //此處可以使用uglTextDrawW顯示漢字 strBuf+=PageArrow;} close(UVHandle); ioctl(UVHandle,FIOFLUSH,0); 本文介紹了WindML軟件架構,安裝、配置WindML,結合項目開發實際,詳細闡述了圖形界面控制系統中所使用到的設計原理,所開發的圖形控制系統已成功運用于某型號艦船的子系統控制中樞,界面美觀,運行穩定,達到了預期設計的目的。按照這些設計原理,也開發出其他型號的顯示控制器[10]。 [1]楊娟,王子勇,等.基于WindML的S3C2440顯示驅動設計[J].硅谷,2011(9). [2]陳君,唐秀.VxWork下圖形用戶界面開發中雙緩沖技術應用[J].微計算機信息,2006(8). [3]司江英,徐博寧,等.VxWorks系統下的漢字顯示[J].科技信息,2009(2). [4]WindML SDK 3.0 Programmer’s guide[Z]. Wind River Systems,Inc.,2002. [5]查振羽,熊華鋼.基于VxWorks實時控制系統中文交互界面開發平臺[J].計算機工程與設計,2009(8). [6]趙漫菲,王光輝.基于嵌入式操作系統VxWorks的多級界面開發[J].計算機工程與設計,2005(10). [7]陳君,唐秀明.VxWork下圖形用戶界面開發中雙緩沖技術應用[J].微計算機信息,2006(8). [8]何江水,高有行.VxWorks漢字的顯示支持[J].微計算機信息,2005(5). [9]孔祥營,張保山,俞烈彬.VxWorks驅動及分布式編程[M].北京:中國電力出版社,2007. [10]周祖洋,傅建剛,萬洋.Windows下的位圖在VxWorks中大字顯示的實現[J].應用科技,2005(7). DesignofGraphicsControlSystemBasedonWindML PU Yuanyuan JI Gaoqing (Northeast Research Institute of Electronics Technology, Jinzhou 121000) According to the actual project experience, the architecture of WindML, how to setup, configure and use WindML develop environment, and the steps of develop graphics software in applications, how to develop Multi-page applications,how to use Double Buffering, Chinese character show and make helping page are introduced. At last, the results of the program running are given. VxWorks, WindML, double buffering, chinese character show, multi-page show, software architecture 2013年11月10日, :2013年12月23日 蒲元遠,男,工程師,研究方向:主要從事計算機軟件及應用。 TN97DOI:10.3969/j.issn1672-9730.2014.05.0245 結語