四轴飞行器1.6 emwin与ucgui的移植,汉字外挂字库移植和DEMO效果对比

    飞控的遥控器打算自己做,这样全局都能掌握,可以通过遥控器对飞控的参数和飞行模式进行修改,而买遥控器是做不到这样的哈。。以后做图传的时候,屏幕还可以实时现实摄像头拍回来的画面,挺好的哈。。

   做遥控我们选的是原子的战舰开发板,开发板附带小霸王那种遥控器,可以用这个来控制飞控哈,回忆童年有木有。。。板子还带一个ADXL345的加速度传感器,那还可以用开发板的姿态控制飞控的姿态。。哈。。应该挺好玩。。。

    第一步我们打算先写一个GUI的界面,UI这东西就让我头疼哈。额。。打算第一版就没什么UI,就把要显示的数据往屏幕上堆就好了。。。以前在学校的时候针对原子开发板自己移植过UCGUI3.90a,并且做了一个ucos+ucgui+fatfs的干净模版工程。。打算直接用。。但是发现有个叫emwin的,看了下效果好很多,就像windows98到windowsxp的效果,本来就对UI界面烦心,这个效果好这么多,果断要用。。看了下,其实就是ucgui,额。。其实ucgui就是emwin。。。

 

先上个视频:

 

ucgui和emwin的移植是差不多的,只是emwin不开源,移植的过程有些地方稍微有点不同。。

先大致说下ucgui的移植,移植ucgui其实很容易,只要修改GUI\LCDDriver里面的LCDDummy.c文件,填写void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex) 和unsigned int LCD_L0_GetPixelIndex(int x, int y) 函数就可以了,可以优化LCD_L0_FillRect来增加刷新速率。但是有个前提,就是屏幕的扫描方向需要和XY轴的增加方向一致。这样就可以直接填充颜色,而不需要更改XY的坐标值,可以批量修改,比一个一个点修改速度快很多。亲测STM32下6804的3.5屏可以快10倍左右。其实就是这么简单。。。

 

emwin的移植

       我们用的stm32,可以用stemwin,不过下了stemwin,里面的源码不多,移植的时候还要到emwin里面去找,我们直接移植emwin好了,emwin改成stemwin是容易的,下面再说。。

下载emwin后,emwin可以不需要下载,在MDK里面是有的哈,在keil\arm\segger\emwin里面,5.0版本以上的MDK在keil\ARM\pack\keil\mdk=middleware\5.1.4\emwin里面

里面内容如下图1:

   四轴飞行器1.6 emwin与ucgui的移植,汉字外挂字库移植和DEMO效果对比

图1

移植主要有这么几个文件需要处理,GUIConf、LCDConf、和GUIDRV_Template,如果需要添加系统支持和触摸,那就还需要移植两个文件GUI_X_uCOS和GUI_X_Touch_Analog。

GUIConf是GUI的配置文件,主要是初始化GUI的内存池,LCDConf里面主要就是LCD的初始化函数。GUIDRV_Template主要就是用来实现打点和画线的函数,需要注意一点,要使用GUIDRV_Template文件作为i我们驱动函数的文件,需要在LCDConf.C里面将#define DISPLAY_DRIVER GUIDRV_LIN_32改成#define DISPLAY_DRIVER 。

第一步需要将lib和include复制到我们的项目里面,lib是库文件include是头文件。。。

在我的GUI里面有如下几个文件,用过UCGUI的和移植过UCGUI的下面的文件夹肯定不陌生。

四轴飞行器1.6 emwin与ucgui的移植,汉字外挂字库移植和DEMO效果对比

图2

第二步就是移植底层代码。在我们的lcddriver里面,其实只要实现一个C文件,GUIDRV_Template.c,这个文件在图1的Sample\DisplayDriver文件夹里有。

GUIDRV_Template.c里面实现打点函数就可以了,然后需要优化,可以对画线,矩形填充等函数进行优化,会有明显的效果。

第三步,在LCDConf.c里面的LCD_X_DisplayDriver函数的LCD_X_INITCONTROLLER:下填写屏幕的初始化函数,顺便说下,触摸的初始化函数也可以放在这。

第四步,在GUIConf.c中,对GUI的内存池进行初始化,并且设置内存的大小,可以选择内部ram和外部的SRRAM,这里就看自己需要了。。

第五步,我们ucos系统,然后将GUI_X_uCOS添加到项目中,到此,就移植完了,emwin就可以跑了。。记得把库加到项目中。。

如果试用st的stemwin,只需要将库换成stemwin,通知在GUI初始化前开启CRC,执行RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);就可以。

 

触摸移植:

按照上面的三步,加入触摸屏的初始化函数进去,因为我们使用的是模拟芯片测touch的,和数字中断方式有点不同哈。。不过也很简单。。

第一步:在GUIConf里面设置宏定义,#define GUI_SUPPORT_TOUCH       (1)  开启触摸屏功能,在图1的\Sample\GUI_X中找到GUI_X_Touch_Analog.c文件夹,如果是使用数字式直接输出坐标的芯片,则要试用GUI_X_Touch_StoreState.c文件。。我们触摸屏输出的是模拟数据,所以采用GUI_X_Touch_Analog.c,在里面只需要实现

int GUI_TOUCH_X_MeasureX(void)和int GUI_TOUCH_X_MeasureY(void)函数,直接调用原子的TP_Read_XY2(&x,&y);就完成了,到此触摸屏也可以使用了。

 

 

 

外挂汉字库的移植

有点懒哈,本来打算用英文算了,以前ucgui里面也没有移植汉字库进去,今天想了想,还是弄进去吧,

可以直接参考这个http://bbs.armfly.com/read.php?tid=1604。。

这里只大致解释下汉字的实现原理。。

我们可以看到GUI_FONT的定于如下,要实现汉字的功能,我们就需要实现这个结构体的制定函数的功能。

 1 struct GUI_FONT {
 2   GUI_DISPCHAR     * pfDispChar; 
 3   GUI_GETCHARDISTX * pfGetCharDistX; 
 4   GUI_GETFONTINFO  * pfGetFontInfo; 
 5   GUI_ISINFONT     * pfIsInFont;
 6   GUI_GETCHARINFO  * pfGetCharInfo;
 7   const tGUI_ENC_APIList* pafEncode;
 8   U8 YSize;
 9   U8 YDist;
10   U8 XMag;
11   U8 YMag;
12   union {
13     const void              GUI_UNI_PTR * pFontData;
14     const GUI_FONT_MONO     GUI_UNI_PTR * pMono;
15     const GUI_FONT_PROP     GUI_UNI_PTR * pProp;
16     const GUI_FONT_PROP_EXT GUI_UNI_PTR * pPropExt;
17   } p;
18   U8 Baseline;
19   U8 LHeight;     /* Height of a small lower case character (a,x) */
20   U8 CHeight;     /* Height of a small upper case character (A,X) */
21 };

我们看下我们汉字字体的定义:

 1 GUI_CONST_STORAGE GUI_CHARINFO GUI_FontHZ24_CharInfo[2] =  
 2 {     
 3       {  12,  12,  2, (void *)"0:/SYSTEM/FONT/ASC12x24.bin"},    
 4       {  24,  24,  3, (void *)"0:/SYSTEM/FONT/HZ24x24.bin"},        
 5 }; 
 6 GUI_CONST_STORAGE GUI_FONT_PROP GUI_FontHZ24_PropHZ= { 
 7       0xA1A1,  
 8       0xFEFE,  
 9       &GUI_FontHZ24_CharInfo[1], 
10       (void *)0,  
11 }; 
12 GUI_CONST_STORAGE  GUI_FONT_PROP GUI_FontHZ24_PropASC= { 
13       0x0000,  
14       0x007F,  
15       &GUI_FontHZ24_CharInfo[0], 
16       (void GUI_CONST_STORAGE *)&GUI_FontHZ24_PropHZ,  
17 }; 
18 GUI_CONST_STORAGE  GUI_FONT GUI_FontHZ24 =  
19 { 
20     GUI_FONTTYPE_PROP_HZ,
21     24,  
22     24,  
23     1,   
24     1,   
25     (void GUI_CONST_STORAGE *)&GUI_FontHZ24_PropASC
26 }; 
GUI_FontHZ24里面通过指向GUI_FontHZ24_Prop(GUI_FONT里面的GUI_FONT_PROP是个链表结构哈) ASC ASCII码字库,再通过GUI_FontHZ24_Prop里面的GUI_FontHZ24_PropHZ指向对应的汉字字库。
然后我们在看看对应 GUI_FONT 里面
1 GUI_DISPCHAR * pfDispChar; 
2 GUI_GETCHARDISTX * pfGetCharDistX; 
3 GUI_GETFONTINFO * pfGetFontInfo; 
4 GUI_ISINFONT * pfIsInFont;
5 GUI_GETCHARINFO * pfGetCharInfo;
6 const tGUI_ENC_APIList* pafEncode;
GUI_FONTTYPE_PROP_HZ,
GUI_FONTTYPE_PROP_HZ为
1 #define GUI_FONTTYPE_PROP_HZ       2   GUIPROP_X_DispChar,             3   GUIPROP_X_GetCharDistX,         4   GUIMONO_GetFontInfo,          5   GUIMONO_IsInFont,             6   (GUI_GETCHARINFO *)0,         7   (tGUI_ENC_APIList*)0        
如果你看了http://bbs.armfly.com/read.php?tid=1604,就直到这里面的GUIPROP_X_DispChar和 GUIPROP_X_GetCharDistX是在GUICharPEx.c实现的,这个也是具体读取汉字字库的地方,这里我们通过fatfa读取SD卡里面的字库。如果还需要添加其他字体,只需要实现对应的GUI_FONT结构体就可以了。。。。。

 

四轴飞行器1.6 emwin与ucgui的移植,汉字外挂字库移植和DEMO效果对比

上一篇:ExtJs自学教程(1):一切从API開始


下一篇:基于OWin的Web服务器Katana发布版本3