GUIX是微软的高级工业级GUI解决方案,专门针对深度嵌入式,实时和IoT应用程序而设计。微软还提供了名为GUIX Studio的桌面开发工具,该工具允许开发人员在桌面上设计其GUI并生成GUIX代码,然后可以将其导出到目标。
GUIX通过了医疗认证IEC-62304 Class C,汽车认证IEC-61508 ASIL D,工业认证IEC-61508 SIL 4和运输/铁路认证EN50128。表明GUIX可用于安全关键型系统。
【直观一致的API】
【控件库】
【数学和实用功能】
【图像处理】
【事件处理】
【Canvas画布处理】
【输入设备驱动】
【显示驱动和目标硬件】
【内存需求】
对于集成了内部GRAM和自刷新技术的显示屏,可以不需要canvas画布支持。这种情况下,GUIX需要的最小Flash是13.2KB,RAM是4KB。
所需画布大小的计算公式如下:
Canvas RAM (bytes) = (x * y * (bpp/8))
其中x和y分别是画布的长和宽,而bpp是画布的颜色深度,比如RGB565,颜色深度bpp就是16bit,即两字节。
另外大多数应用还会用到图形资源和字库,这个占用大小由实际应用而定。
GUIX Studio简介
使用GUIX Studio,完全可以让美工前期做好各种界面效果,后期工程师添加操作流程和触发事件。的确是做的非常成熟,可以添加设置各种主题,各种界面效果,各种字体展示,各种图片格式设置,使用GUIX Studio,基本可以实现GUI设计一条龙。
GUIX Studio生成的文件:
GUIX的体系结构的一个优势是,很容易移植到新的芯片体系结构。现在拿前一节准备好的并且测试正常的Theadx工程,直接移植,以下是过程。
OLED是单色屏,使用一个bit就可以表示是1个像素点,比如1表示亮,0表示灭。我们这里驱动的实现是定义了一个显存空间uint8_t s_ucGRAM[8][128],占用1K字节, 共8行,每行128像素。用户绘制的都是绘制到这个显存里面,需要刷新的时候整体刷新OLED界面即可。这里要注意的是显存每个字节反应到OLED显示屏实际坐标上表示的那些位置的像素点。下面是整体布局:
高是64个COM,宽是128个SEG,每8个COM组成一个Page,共计8个Page。然后再看每个Page的细节,以Page2为例:
每个Page的扫描方式可以认为是从上到下,从左到右,第1列的8个像素值对应的显存变量是s_ucGRAM[2][0],第2列就是s_ucGRAM[2][1],以此类推,这一点非常重要,因为我们后面要用到的GUIX Studio生成界面扫描方式不是这样的,它是从左到右,从上到下。
了解了这些知识点就够用了。
OLED的底层驱动实现如下:
/*
*********************************************************************************************************
* 函 数 名: hc32_monochrome_buffer_toggle
* 功能说明: I2C屏绘制,直接做整个屏的重绘
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
static void hc32_monochrome_buffer_toggle(GX_CANVAS *canvas, GX_RECTANGLE *dirty)
{
uint8_t *p;
/* 防止警告 */
(void)canvas;
(void)dirty;
/* 获得OLED画布的地址 */
p = (uint8_t *)display_1_canvas_memory;
// OLED_DrawBMP(0, 0, 128, 32, p);
/* 将画布的内容绘制到OLED显存 */
for (int y = 0; y < 32; y++)
{
for (int x = 0; x < 128; x += 8)
{
OLED_PutPixel(x, y, (p[16 * y + x / 8] & (0x80)) >> 7);
OLED_PutPixel(x + 1, y, (p[16 * y + x / 8] & (0x40)) >> 6);
OLED_PutPixel(x + 2, y, (p[16 * y + x / 8] & (0x20)) >> 5);
OLED_PutPixel(x + 3, y, (p[16 * y + x / 8] & (0x10)) >> 4);
OLED_PutPixel(x + 4, y, (p[16 * y + x / 8] & (0x08)) >> 3);
OLED_PutPixel(x + 5, y, (p[16 * y + x / 8] & (0x04)) >> 2);
OLED_PutPixel(x + 6, y, (p[16 * y + x / 8] & (0x02)) >> 1);
OLED_PutPixel(x + 7, y, (p[16 * y + x / 8] & (0x01)) >> 0);
}
}
/* 将OLED显存的内容实际绘制到OLED */
OLED_EndDraw();
}
/*
*********************************************************************************************************
* 函 数 名:hc32_graphics_driver_setup_monochrome
* 功能说明:单色屏驱动接口
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
UINT hc32_graphics_driver_setup_monochrome(GX_DISPLAY *display)
{
_gx_display_driver_monochrome_setup(display, (VOID *)HC32_SCREEN_HANDLE, hc32_monochrome_buffer_toggle);
return (GX_SUCCESS);
}
这里要注意两点:
由于GUIX Studio生成的界面扫描方式与OLED的扫描方式不同,这里的代码实现就是第3步中扫描方式的切换。具体实现的操作是将canvas画布通过函数OLED_PutPixel(注,此函数不是直接往OLED绘制的)绘制到OLED显存,然后调用函数OLED_EndDraw将OLED显存的内容实际绘制到OLED。
上面的函数要通过函数gx_studio_display_configure做配置,这样GUIX就会调用OLED驱动:
/* 配置显示屏 */
gx_studio_display_configure(DISPLAY_1, hc32_graphics_driver_setup_monochrome,
LANGUAGE_ENGLISH, DISPLAY_1_THEME_1, &root);
接着需要将GUIX的源码程序移植到TheadX_OLED 测试工程中,并且添加好对应的头文件路径,如下图:
需要使用设计器进行显示应用设计,新建工程并且配置如下:
这里需要注意,我们使用静态内存分配方式,所以所有控件都不能选则动态分布:
GUIX Studio 的具体使用方法和流程请参见以下链接:https://www.cnblogs.com/armfly/p/14189864.html
在 TheadX 的调度中,新建 gui_task 任务,用来测试上面新建的 HelloWorld 静态显示应用,实际结果如下图:
到这里,已经完成了TheadX+GUIX+OLED 的测评任务,希望在之后的应用中将Azure RTOS 全家桶带到产品中去,使整个系统更加安全。
gui居然是微软的?才知道!这玩意移植起来困难吗?