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


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

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

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

    先上个视频:

    视频地址:http://v.youku.com/v_show/id_XNzY1NTYwMjA0.html

    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

    移植主要有这么几个文件需要处理,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的下面的文件夹肯定不陌生。

    图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结构体就可以了。。。。。
    
    
    
  • 相关阅读:
    15第十四章:Docker轻量级可视化工具Portainer
    14第十三章:Dockercompose容器编排
    01第一章:【01】设计模式前言
    16第十五章:Docker容器监控
    13第十二章:Docker网络
    00设计模式【目录】
    03第一章:【02】单一职责原则(SRP)
    12第十一章:Docker微服务实战
    02第一章:【01】设计模式七大原则
    node2vec: Scalable Feature Learning for Networks
  • 原文地址:https://www.cnblogs.com/adfjhg/p/3947103.html
Copyright © 2020-2023  润新知