基于Nios II自助点菜系统的μC/GUI应用
3 μC/GUI应用开发
3.1 触摸屏消息响应机制
GUI所有外设输入均以消息形式发送给当前窗体回调函数处理,具体流程如图2所示[5]。触摸屏的消息传递实质是对全局变量_State记载和更新。_State有3个成员变量:消息发生点x坐标、y坐标、外设按下与否的操作状态。外设输入消息统称为WM_TOUCH,函数WM_HandlePID()专门处理这种消息。通过GUI_PID_GetState获取GUI_PID_STATE结构的WM_TOUCH消息,将新获取消息与函数内静态旧消息变量比较,包括该消息发生点的屏幕坐标及外设操作状态。状态发生变化是将操作状态变化作为独立消息WM_PID_STATE_CHANGED发送,再发送WM_TOUCH消息。构造WM_TOUCH消息所用到的数据,需要获取当前焦点窗体句柄,当前焦点窗体是用WM_hCapture全局变量记载,如果为0则调用函数WM_Screen2hWin(),根据消息发生点屏幕坐标获取窗体句柄。向当前焦点窗体发送消息后,更新当前消息到旧消息变量,结束本次消息处理。
3.2 窗口、控件和对话框应用
系统界面丰富,频繁用到页面切换,因此使用?滋C/GUI视窗管理器(WM)进行窗口创建、显示、隐藏和删除等。用户程序中对不同窗口指定不同回调函数,当指定事件发生时,通知图形系统调用指定函数,如窗口内容改变时自动重绘的场合等。图3(a)、图3(b)分别为菜品推荐及菜单显示窗口。
为使点菜系统功能更加丰富,界面中加入按钮、列表框、单选按钮、框架窗口等控件。控件是构造用户接口的元素,能自动对某些事件反应。控件也是通过其构造函数返回的句柄而引用。控件使用视窗管理器,一旦一个控件建立,它被处理成与其他窗口一样,WM保证它在需要时能正确显示(及重绘)。
控件消息响应机制在使用中十分重要,包括按钮触碰响应、单选按钮序列号获取、列表框滑动等。下面以按钮为例介绍其功能。Button按钮在其回调函数中对相关消息(WM_MOUSEOVER/WM_PID_STATE_CHANGED/WM_TOUCH)进行处理,在button.c文件中可找到相关实现函数,用触摸屏点击该按钮时发送以下三种消息之一:WM_NOTIFICATION_MOVED_OUT、WM_NOTIFICATION_RELEASED、WM_NOTIFICATION_PRESSED,之后在该按钮父窗口捕获并处理消息。系统是通过捕获WM_NOTIFICATION_RELEASED消息实现按钮触碰功能的。
系统除了点菜外,还能存储会员信息,用于累积会员积分,如图3(c)。对于新建和登录账户界面,使用对话框是很需要的。建立对话框需要做两件基本工作:一个资源表,定义包括的控件;另一个是定义控件的初始化。对话框包含多个控件(框架窗口、按钮、编辑框、文本框),通过对不同控件的选择向系统发出请求信息。多数消息被对话框自动处理,其他传送给对话框指定的回调函数。其中,将WM_INIT_DIALOG和WM_NOTIFY_PARENT两种类型的附加消息传送到对话框窗口进行处理。对话框显示前,WM_INIT_DIALOG消息立即被发送到对话框处理,对话框程序用这个消息初始化控件以及实现其他影响对话框显示的初始化任务;通过对话框的子窗口发送WM_NOTIFY_PARENT消息到对话框,通知父窗口以保证事件同步。
3.3μC/OS II应用
系统使用接口函数OSTaskCreateExt 创建任务,根据系统要求,设计四个任务,分别是:初始化任务(TaskStart)、接收消息任务(TaskRxmsg)、响应触摸任务(TaskTouch)和更新任务(TaskUpdate)。任务间通过信号量、全局变量等方式通信,具体状态转移如图4所示。
(1)初始化任务
优先级别最高,用于建立和调用系统初始化函数。系统上电后,首先对各个硬件模块、软件内各数据初始化,如果SD卡读取不成功、无线运行不正常,LED灯提示系统初始化失败,同时系统退出运行状态。反之,初始化完毕,系统开始任务调度。
(2)接收消息任务
接收上位机传回的确认信息,实时显示菜单状态:准备中、制作中、传送中和已上菜。由于无线发回数据不定时,且为了避免数据丢失,该任务优先级别高于TaskTouch。该任务与TaskTouch之间用信号量通信。
(3)响应触摸任务
用于执行GUI_TOUCH_Exec()函数,更新触摸点状态,设置窗口、对话框等的回调函数,进行界面切换。放弃对CPU占用后,系统调度将CPU占用权交给TaskUpdate。
(4)更新任务
由于使用视窗管理回调机制,该任务必须实现,并定期调用(至少每秒钟100次),优先级别最低。仅从一个任务调用GUI更新函数(即GUI_Exec(),GUI_Delay()),有助于保持程序结构清晰。任务完成后,按任务优先级高低开始新一轮调度。
以μC/OS-II操作系统为基础,系统在响应触摸任务和更新任务中分别调用μC/GUI函数。该项工作通过在配置中使能多任务支持及配合内核接口函数来完成。由于任务实时行为只受运行在更高级别任务的影响,所以在低级别任务中设置用户界面,使其切换到用户界面时不会影响实时行为。
本文介绍的系统,在Nios II架构上移植了可视化图形库μC/GUI,系统重点研究了如何应用?滋C/GUI。在实现触摸屏操作的基础上,结合消息响应机制实现窗口、控件和对话框的使用,并融合多任务操作系统提高点菜的实时性。LTM触摸屏显示带有Windows风格图形界面,顾客可根据菜品图片、营养介绍及价格随时点餐。通过GUI整合的触摸操作,实现了自助点菜、查看菜品状态、加菜、退菜以及结账功能,可提供更优质、更人性化的服务。
- μC/OS-II下通用驱动框架的设计与实现(07-23)
- 基于μC/OS-II嵌入式系统的低功耗开发(07-08)
- 基于S3C44B0X+μcLinux的嵌入式以太网设计(07-08)
- 蓄电池化成控制系统中显示功能的实现(11-05)
- 嵌入式实时操作系统μC/OS-II 在P89V51RD2中的移植(04-09)
- LPC2292的伪中断与伪中断处理(03-25)