搜索
bottom↓
楼主: mcu_lover

嵌入式系统用户接口设计之裸机界面开发

  [复制链接]

出0入4汤圆

发表于 2014-8-11 23:27:23 | 显示全部楼层
有些需要实时显示的数据该如何设定呢?

出0入264汤圆

 楼主| 发表于 2014-8-12 00:38:04 | 显示全部楼层
PICTURE 发表于 2014-8-11 23:27
有些需要实时显示的数据该如何设定呢?

处理定时事件即可。在定时事件处理代码里面职位刷新标志。再根据刷新标志进行刷新。
1S刷10次就可以了。再快人眼看不清楚。无意义。

出0入0汤圆

发表于 2014-8-29 10:15:54 | 显示全部楼层
orzorzorzorz 发表于 2013-7-24 22:13
我贴一张我做界面的状态图,这张图画好界面就写好了,界面开发是基于PC模拟器,调试都在PC上进行,只要交 ...

这是什么软件啊

出0入0汤圆

发表于 2014-8-29 19:45:22 | 显示全部楼层

QP状态机,只要维护好状态图即可

出0入0汤圆

发表于 2014-10-8 11:11:17 | 显示全部楼层
学习 谢谢楼主

出0入0汤圆

发表于 2014-10-8 20:46:33 | 显示全部楼层
好东西,学习下

出0入0汤圆

发表于 2014-10-8 20:50:34 | 显示全部楼层
哈哈                       学习        了                        

出0入0汤圆

发表于 2014-10-12 14:59:08 | 显示全部楼层
研读一下。。。

出0入0汤圆

发表于 2014-10-12 15:49:48 | 显示全部楼层
学习一下!!!感觉挺牛的

出0入0汤圆

发表于 2014-10-12 16:05:17 | 显示全部楼层
orzorzorzorz 发表于 2013-7-24 22:13
我贴一张我做界面的状态图,这张图画好界面就写好了,界面开发是基于PC模拟器,调试都在PC上进行,只要交 ...

不错,一直都这样做!

出0入0汤圆

发表于 2014-10-12 21:51:00 | 显示全部楼层
正在学习这个

出0入0汤圆

发表于 2014-10-13 08:30:36 | 显示全部楼层
mark~学习,学习,谢谢分享

出0入0汤圆

发表于 2014-10-15 08:35:31 | 显示全部楼层
很不错的例子,费了不少心思了。

出0入0汤圆

发表于 2014-10-15 08:44:06 | 显示全部楼层
好帖,谢谢分享

出0入0汤圆

发表于 2014-10-15 09:21:49 | 显示全部楼层
赞一个 mark

出0入0汤圆

发表于 2014-10-15 11:39:57 | 显示全部楼层
MARK                                

出0入0汤圆

发表于 2014-10-16 16:16:06 | 显示全部楼层
顶一下!

出0入0汤圆

发表于 2014-10-17 15:33:12 | 显示全部楼层
mark一下,以后用

出0入0汤圆

发表于 2014-10-24 13:06:47 | 显示全部楼层
orzorzorzorz 发表于 2013-7-24 22:13
我贴一张我做界面的状态图,这张图画好界面就写好了,界面开发是基于PC模拟器,调试都在PC上进行,只要交 ...

求个清晰图啊,这个图根本看不清出……谢谢!

出0入0汤圆

发表于 2014-10-24 13:39:08 | 显示全部楼层
好东西,学习

出0入0汤圆

发表于 2014-11-7 18:37:00 | 显示全部楼层
很好的思路,多谢分享

出0入0汤圆

发表于 2014-11-7 18:52:43 | 显示全部楼层
占座学习,到今天才看到,太失败了

出0入0汤圆

发表于 2014-11-9 20:39:23 | 显示全部楼层
我认真的看完了,有启发。谢谢lz分享。

出0入0汤圆

发表于 2014-11-9 22:07:38 | 显示全部楼层
学习了!!

出0入0汤圆

发表于 2014-11-11 08:26:45 | 显示全部楼层
收藏,后面学习。

出0入0汤圆

发表于 2014-12-31 23:20:33 | 显示全部楼层
学习,多谢分享

出0入0汤圆

发表于 2015-1-6 14:19:16 | 显示全部楼层
裸机GUI设计思想,mark!感谢楼主!

出0入0汤圆

发表于 2015-1-6 19:00:08 | 显示全部楼层
学习一下

出0入0汤圆

发表于 2015-1-6 19:49:52 | 显示全部楼层
学习一下

出0入0汤圆

发表于 2015-1-31 14:46:16 | 显示全部楼层
已经收藏成功。。

出0入0汤圆

发表于 2015-2-5 17:46:27 | 显示全部楼层
mcu_lover 发表于 2014-3-1 22:41
所有的界面函数都是基于状态机+消息的结构

大侠,能解析一下这个结构吗?SYSMSG

出0入0汤圆

发表于 2015-2-5 18:08:11 | 显示全部楼层
orzorzorzorz 发表于 2013-7-22 21:04
状态机画个图全搞定了,并且还是图形化维护

请发资料,大家学习一下吧。

出0入264汤圆

 楼主| 发表于 2015-2-5 20:19:11 | 显示全部楼层
lyricpoem0726 发表于 2015-2-5 17:46
大侠,能解析一下这个结构吗?SYSMSG


一个整型变量标识 消息类型。 两个额外整型变量标识消息参数。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-2-5 21:12:21 来自手机 | 显示全部楼层
linuxxulin 发表于 2014-8-1 22:50
mark一下,以前的BOSS就是用组态的思路在51上实现GUI的。在没有操作系统支持下。学习~~~ ...

说说你boss的思路啊

出0入0汤圆

发表于 2015-2-5 21:17:10 | 显示全部楼层
又看了一遍,最近正好在做人机界面

出0入0汤圆

发表于 2015-2-5 21:23:51 | 显示全部楼层
mark  裸机界面开发

出0入0汤圆

发表于 2015-2-6 08:44:41 | 显示全部楼层
谢谢 楼主分享,讲的挺好的

出0入0汤圆

发表于 2015-2-6 09:21:19 | 显示全部楼层
这是个典型的双向链表,我正在用双向链表的方式实现一个菜单界面!

出0入0汤圆

发表于 2015-2-6 09:24:57 | 显示全部楼层
orzorzorzorz 发表于 2013-7-29 08:56
我知道你第三种方法,这个方法以前我也研究考虑过,你就是语法解析的方法来做显示,并不是写代码来显示, ...

大侠也用迪文的屏,你是怎么处理显示的呢? 求赐教啊 ,很困惑,想嫁接到freemodbus中但是又感觉不合适

出0入0汤圆

发表于 2015-2-6 11:29:39 | 显示全部楼层
mcu_lover 发表于 2015-2-5 20:19
一个整型变量标识 消息类型。 两个额外整型变量标识消息参数。


谢谢您能回答我的问题:看了高手的分析我还是有些不太明白这种基于状态机+消息的结构,但是觉得这种结构非常好,能整合大部分的应用,
但是我还不能明白这种结构该如何使用,我是手工编码的。
1.从前文的代码中看出:使用的数据结构体比较多,看着让人比较着急。
2.所有的界面都需要写一个这种结构的函数吗?那如果界面比较多的话,是不是需要很多个?
3.这些函数如何调用,消息怎么触发,界面怎么切换,从MSG_UI_ENTER_SCREEN: 到MSG_UI_LOOP_SCREEN是怎么切换的?
4.在操作系统中该如何调用或使用这种结构?

能否结合小例子来分析下?

我目前的需求:
1.        每次重新进入屏幕要初始化。
2.        有按键消息时,要处理。
3.        可以定时刷新屏幕。
4.        部分界面内容可以闪烁。

我该如何使用这种结构来组织?
谢谢指点!!!

出0入0汤圆

发表于 2015-2-9 12:11:08 | 显示全部楼层
mcu_lover 发表于 2014-3-1 22:41
所有的界面函数都是基于状态机+消息的结构

请教
采用这种结构
如果 MSG_KEY导致UI切换,难道还要重新发个SYSMSG 来退出(MSG_UI_EXIT_SCREEN)当前屏幕?
谢谢!

出0入264汤圆

 楼主| 发表于 2015-2-9 15:08:43 | 显示全部楼层
lyricpoem0726 发表于 2015-2-6 11:29
谢谢您能回答我的问题:看了高手的分析我还是有些不太明白这种基于状态机+消息的结构,但是觉得这种结构 ...

1. 问题需要抽象,抽象出来的东西,才能建立模型,建立了模型,才能理解,模型的建立则依赖于数据结构体的定义
2. 每个界面是有一个函数负责处理的。所有与当前界面相关的状态及事件都应该在这个函数里面进行处理。界面再多也不会凌乱。因为已经进行了分类及规划。
3. 函数在main函数  while 循环中调用。
   
   
    消息和事件通过消息队列来传递。
   

    MSG_UI_ENTER_SCREEN 标识进入一个屏幕的进入事件,那么它一定是在屏幕进行切换时候产生的。所以,在进行屏幕切换时候,你判断即将跳转
    的屏幕与当前显示屏幕是否一致,如果不一致,则当前屏幕需要投递一个退出屏幕事件,而待跳转的屏幕则投递一个进入屏幕事件。
    MSG_UI_LOOP_SCREEN 在没有任何事件需要处理时候,则投递此消息。即系统空闲时候,当前屏幕在主循环每循环一次时候,均有机会得到CPU的处理权。

4 在操作系统中,UI 部分,用一个优先级较低的线程处理即可。如果没有线程,则用一个优先级低的任务进行处理。

你目前的需求正好非常合适这样的界面模型:
1. 每次进入屏幕初始化时候,响应MSG_UI_ENTER_SCREEN 消息,这个消息在每次进入屏幕时候会接收到,是屏幕运行时候第一个接收到的消息。
2. 按键消息始终投放到当前活动的界面,响应MSG_KEY即可。
3. 定时刷新屏幕,响应MSG_TIMER即可。
4. 界面部分闪烁,同样响应MSG_TIMER即可。

下面有个例子截图,是以前给深圳一家公司做的测试设备的主界面截图,满足你上面提到的四点要求。
每次进入时候,会初始化只需绘制一次的部分,如公司LOGO,固定的文字等等。按下确定键之后进入到其它界面。按键输入提示采用闪烁方式提示。
闪烁的实现是响应定时消息。


上面这个界面对应的屏幕处理函数如下,可以清晰看到各个事件逻辑的处理流程。



后续等我手头一些重要的事情完成了,会有大量关于人机交互的文章出来。欢迎探讨。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入264汤圆

 楼主| 发表于 2015-2-9 15:11:13 | 显示全部楼层
Zigbee2012 发表于 2015-2-9 12:11
请教
采用这种结构
如果 MSG_KEY导致UI切换,难道还要重新发个SYSMSG 来退出(MSG_UI_EXIT_SCREEN)当前 ...

屏幕切换会自动产生对应的进入/退出消息。
参考142楼的回复。

出0入0汤圆

发表于 2015-2-9 17:47:13 | 显示全部楼层
mcu_lover 发表于 2015-2-9 15:11
屏幕切换会自动产生对应的进入/退出消息。
参考142楼的回复。

多谢提醒! 结构出来了  的确要清晰些
  1.                         if( xQueueReceive(xGuiMessageHandle,&UImsg,portMAX_DELAY))
  2.                         {
  3.                                 pmenu_manage = menu_getcurrent();
  4.                                 pfuncsave = pmenu_manage->current_menu->items[pmenu_manage->current_item]->func;
  5.                                 if(pfuncsave != NULL)
  6.                                 {
  7.                                         pfuncsave(UImsg);
  8.                                         pmenu_manage = menu_getcurrent();
  9.                                         if( pfuncsave != pmenu_manage->current_menu->items[pmenu_manage->current_item]->func)
  10.                                         {
  11.                                                 UImsg.uMsgTyp = MSG_UI_EXIT_SCREEN;
  12.                                                 UImsg.wm = 0;
  13.                                                 pfuncsave(UImsg);
  14.                                                
  15.                                                 UImsg.uMsgTyp = MSG_UI_ENTER_SCREEN;
  16.                                                 UImsg.wm = 0;
  17.                                                 pmenu_manage->current_menu->items[pmenu_manage->current_item]->func(UImsg);
  18.                                                
  19.                                         }/* pfuncsave != ... */       
  20.                                 }        /* pfuncsave != NULL */                       
  21.                         }/* xQueueReceive*/
复制代码

出0入0汤圆

发表于 2015-2-9 17:52:58 | 显示全部楼层
写的非常不错

出0入0汤圆

发表于 2015-2-10 12:01:21 | 显示全部楼层
我一直是按键扫描+状态机跳转

出0入0汤圆

发表于 2015-2-27 09:40:42 | 显示全部楼层
本帖最后由 lyricpoem0726 于 2015-2-27 16:18 编辑
mcu_lover 发表于 2015-2-9 15:08
1. 问题需要抽象,抽象出来的东西,才能建立模型,建立了模型,才能理解,模型的建立则依赖于数据结构体 ...


请问,什么时间发布关于屏幕设计的详细资料?等不及了,142楼的回复看了好几遍了,对于整个构架还不是很清楚?屏幕是如何切换的?消息是何时发送的?都比较迷惑,期待中。。。

出0入0汤圆

发表于 2015-2-27 16:26:17 | 显示全部楼层
Zigbee2012 发表于 2015-2-9 17:47
多谢提醒! 结构出来了  的确要清晰些

能分享一下你的代码吗?膜拜

出0入0汤圆

发表于 2015-2-27 18:46:25 | 显示全部楼层
前来学习一下!!!

出0入0汤圆

发表于 2015-2-28 10:39:33 | 显示全部楼层
学习了 原来还有qp这种东西

出0入0汤圆

发表于 2015-2-28 11:59:30 | 显示全部楼层
多谢楼主分享,学习了,打算自己实践一下,如果有完整的源代码就更好了!

出0入0汤圆

发表于 2015-2-28 14:01:03 | 显示全部楼层
mcu_lover 发表于 2015-2-9 15:11
屏幕切换会自动产生对应的进入/退出消息。
参考142楼的回复。

请教哈!关于弹出窗口问题,比如弹出提示窗口 YES  NO!

1.在当前界面上,直接弹出提示窗口?
2.产生一个MSG_UI_EXIT_SCREEN,退出当前界面,然后弹出提示窗口界面?
请给点思路,谢谢!

出0入0汤圆

发表于 2015-2-28 14:01:59 | 显示全部楼层
lyricpoem0726 发表于 2015-2-27 16:26
能分享一下你的代码吗?膜拜

代码贴了的  资料已经足够了?多看看

出0入264汤圆

 楼主| 发表于 2015-2-28 15:02:45 | 显示全部楼层
本帖最后由 mcu_lover 于 2015-2-28 15:06 编辑
Zigbee2012 发表于 2015-2-28 14:01
请教哈!关于弹出窗口问题,比如弹出提示窗口 YES  NO!

1.在当前界面上,直接弹出提示窗口?


设置一个专门的子窗口指针。用于指向子画面。
消息分发函数中,如果该指针有效,则消息优先子窗口处理。子窗口不处理的消息,再接着传给当前窗口。
因此,需要专门写两个函数,用于显式的显示子窗口/销毁子窗口。在显示子窗口函数中,发送并处理进入屏幕消息。销毁子窗口函数中,发送并处理退出屏幕消息。



如果需要在当前界面上弹出一个子窗口,则调用显示子窗口的函数,把待显示子窗口的函数地址,作为参数进行传递。这样子窗口就显示出来。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-2-28 15:47:12 | 显示全部楼层
强帖,必须学习,谢谢楼主

出0入0汤圆

发表于 2015-2-28 16:21:31 | 显示全部楼层
mcu_lover 发表于 2013-7-25 09:25
谢谢。不错。与我的想法基本上是一致的。虽然具体实现方式不一样,但方法和原理应该是比较接近的。
我全 ...

楼主的第三代出炉了吗?

我做了一个彩屏的的界面生成工具,有空交流一下.

出0入264汤圆

 楼主| 发表于 2015-2-28 17:07:46 | 显示全部楼层
zhuser 发表于 2015-2-28 16:21
楼主的第三代出炉了吗?

我做了一个彩屏的的界面生成工具,有空交流一下. ...

欢迎交流,可以加我Q号:272402202, 注明是来自AMOBBS。

出0入0汤圆

发表于 2015-3-3 10:35:33 | 显示全部楼层
MARK 嵌入式界面 裸机开发

出0入0汤圆

发表于 2015-3-3 11:12:19 | 显示全部楼层
好好学习以下

出0入0汤圆

发表于 2015-3-10 11:01:12 | 显示全部楼层
Zigbee2012 发表于 2015-2-9 17:47
多谢提醒! 结构出来了  的确要清晰些

请教
这个指针类型的数据结构是怎样定义的?

出0入0汤圆

发表于 2015-3-10 11:40:07 | 显示全部楼层
不错,保存下来以后备用

出0入0汤圆

发表于 2015-3-10 14:21:07 | 显示全部楼层
mcu_lover 发表于 2015-2-9 15:08
1. 问题需要抽象,抽象出来的东西,才能建立模型,建立了模型,才能理解,模型的建立则依赖于数据结构体 ...

楼主,我又看了好多遍这篇文章,终于有点领悟了,看看我的理解对不对?

麻烦能提醒一下,函数UIProcessMainLoop(&msg) 和 UIProcess_WndSwitch();的实现方法吗?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-3-25 11:08:24 | 显示全部楼层
orzorzorzorz 发表于 2014-8-29 19:45
QP状态机,只要维护好状态图即可

你好,能说一下状态机具体的软件的名字吗

出0入0汤圆

发表于 2015-3-25 16:43:19 | 显示全部楼层
楼主 有示范性的 代码吗,只看描述的文字,有的地方,还是不清楚

出0入0汤圆

发表于 2015-4-15 18:02:10 | 显示全部楼层
mcu_lover 发表于 2015-2-9 15:08
1. 问题需要抽象,抽象出来的东西,才能建立模型,建立了模型,才能理解,模型的建立则依赖于数据结构体 ...

一、楼主,这句话怎么理解呢?

2. 每个界面是有一个函数负责处理的。所有与当前界面相关的状态及事件都应该在这个函数里面进行处理。界面再多也不会凌乱。因为已经进行了分类及规划。


我的问题是:凌乱到不会,关键是一个页面一个函数,如果有200个页面的话就有200个函数去处理????这样那个做总的页面切换,消息分发的函数是不是有点凌乱了?


二、消息疑问
  1. typedef struct
  2. {
  3.   uint32_t uMsg;
  4.   WPARM wm;
  5.   LPARAM lm;
  6. }SYSMSG,*PSYSMSG;
复制代码


这个是消息的结构体。

1、 WPARM wm和LPARAM lm是干什么用的?
2、给一个界面传入的消息应该是各种各样的参数都有,你只定义了3个?能满足实际应用吗?
3、uint32_t uMsg 这个值为什么要用32位的值来表示?
4、UIMessageBoxScreen和UINullScreen函数的内容差不多【BOX中多了绘制标题等功能】,能否合并成一个呢?
5、进入子菜单时当前页面的参数保存是在UIProcess_WndSwitch函数中进行的?这个函数参数中好像没有相关的参数表示现在该保存数据还是恢复数据呢
6、eUIState 变量给谁用的?比如:eUIState = MSG_UI_LOOP_SCREEN;当下一次刷屏时,页面切换函数怎么能够准确进入到当前页面【假如该页面显示的是时间或其他值,需要实时刷新】呢
7、在其他人没有你的那个电脑软件的情况下,我们做每个页面的显示内容时是不是要做一个类似这样的东西:
  1. uint8_t * const menux[]=
  2. {"功能设置"},
  3. {"参数设置"},
  4. {"语言选择"},
  5. {"历史记录"},
  6. };
复制代码


谢谢

出0入264汤圆

 楼主| 发表于 2015-4-15 19:51:42 | 显示全部楼层
guxingganyue 发表于 2015-4-15 18:02
一、楼主,这句话怎么理解呢?

2. 每个界面是有一个函数负责处理的。所有与当前界面相关的状态及事件都 ...

1. 问题需要抽象,抽象出来的东西,才能建立模型,建立了模型,才能理解,模型的建立则依赖于数据结构体的定义。
    就好比你现在对页面的管理有疑惑,你就需要思考,这么多的页面该如何管理。所以必须建立一定的数据结构来进行管理。
2. 就算有10000个页面函数,消息分发函数始终都是一样的。消息分发函数与页面数量没有关系。如果你从事过WIN32 的程序设计就会明白。
   事实上,这个裸机界面开发的思路,就是借鉴WIN32 的消息机制的思想。如果你了解WIN32 程序设计,就会对整个程序结构非常了解。

3. WPARAM LPARAM  就是定义了两个 void* 的指针。其概念同样来源于WIN32的消息结构体。只是在这里简化了。
   2. 既然是指针,传递任意参数都是没有问题的。
   3. uint32_t uMsg  这里定义成uint8 ,uint16都可以,根据需求来定。我的习惯是8位单片机定义成uint8, 32位单片机定义成uint32.
   4. UIMessageBoxScreen和UINullScreen 差很多。UIMessageBoxScreen 是我根据自己的需求实现的一个弹出消息框。如果你想实现自己的弹出框,可以自己写。
       无非就是响应各种按键消息,定时器消息等等之类。UINullScreen  只是一个空的函数,用于我演示 给你们,看界面函数内部是什么样的结构。
   5. 菜单全部放在一个界面函数里就可以了。分清楚菜单与具体的最终子菜单项界面区别(最终子菜单项界面是一个个具体的设置界面/查看界面等等,如参数设置等)
       菜单界面函数负责维护自己内部的菜单项关系。如果你需要从最终子菜单项界面,如一个参数设置界面,当设置完成之后,返回菜单界面时候,调用界面切换函数,
      则返回到菜单界面,因为菜单界面函数,自己负责维护内部菜单项之间的关系,如当前选择的是第几项,处于第几级菜单,所以自然就会恢复进入最终子菜单项界面之前的显示。
   6。 eUIState  主要用在parent界面与 child界面之间传递消息。如在当前界面下,突然系统需要弹出显示一个报警信息的子画面,则可以将这个报警子画面设计为child画面。
      当报警子画面显示的时候,有些消息它不需要响应,但是当前界面却需要该消息,这样报警子画面,通过eUIState  返回值告诉当前界面,这个消息我没有响应,你去响应吧。
      诸如此类。
   7. 不是。菜单界面全部由一个界面来进行维护管理。参考第5点。
     142楼给出了一个动画,以及它的实现代码。你可以思考下,如果是你来实现上面的显示效果,你的代码是如何设计的。然后再与我给出的代码比较。这样就会很清晰的
     看到比较出来的差异所在。
     144楼的另外一个坛友,他摸索出来的结构基本与我的思想是一致的。
     154楼的动画,演示了一个图标型式菜单,以及当按下某个图标菜单项之后,弹出了一个子对话框,然后进入具体的菜单项界面的例子。你可以思考下,如果你用传统的方式
     去实现,如何实现,繁琐吗,如何改进。然后再换到我说的这种方式去思考一遍。

   感觉你陷入了思维的死区。你现在需要抛弃掉传统的那种链表型,状态机型的思维方式。否则,你可能一直都无法理解透彻。在这里,传统的菜单设计包含在了一个界面函数中。
   如果有兴趣,强烈推荐你了解一下WIN32程序设计思想。
   PS:1. 几乎所有的嵌入式GUI都可以看到很多WIN32的影子,所以了解一下它的编程思路对于嵌入式系统的设计,大有裨益。
          2. 我描述的这些界面方法,不仅仅只是界面设计,其实是包含了很多程序结构相关的编程思想,如消息机制等等。
          3. 我所描述的自动化工具与这里讲到的逻辑界面开发,差异是天壤之别。自动化工具生成的界面 是基于数据驱动的。所有的工作都在上位机完成。与系统的交互通过
              数据驱动来完成。

出0入0汤圆

发表于 2015-4-15 20:47:18 | 显示全部楼层
mark,谢谢分享

出0入0汤圆

发表于 2015-4-15 22:27:09 | 显示全部楼层
mcu_lover 发表于 2015-4-15 19:51
1. 问题需要抽象,抽象出来的东西,才能建立模型,建立了模型,才能理解,模型的建立则依赖于数据结构体 ...

感谢详细的回复。

那我先阅读下  WIN32 程序设计思想,你的这个菜单结构现在好多地方都不能理解是怎么工作的。

出0入0汤圆

发表于 2015-4-16 08:38:20 | 显示全部楼层
mcu_lover 发表于 2015-4-15 19:51
1. 问题需要抽象,抽象出来的东西,才能建立模型,建立了模型,才能理解,模型的建立则依赖于数据结构体 ...

有 WIN32程序设计 推荐的书或文章吗,直接搜的话不知从哪里看起啊。

出0入0汤圆

发表于 2015-4-16 08:49:17 | 显示全部楼层
mcu_lover 发表于 2015-4-15 19:51
1. 问题需要抽象,抽象出来的东西,才能建立模型,建立了模型,才能理解,模型的建立则依赖于数据结构体 ...

事实上,他说2000个界面,确实是需要2000个函数来维记的,因为每个界面必定不一样;除非界面有通性;
但总的来说,确实是汇总到一个消息处理机制上面;

出0入0汤圆

发表于 2015-4-16 09:10:59 | 显示全部楼层
guxingganyue 发表于 2015-4-16 08:38
有 WIN32程序设计 推荐的书或文章吗,直接搜的话不知从哪里看起啊。


我来描述一下红金龙的思想,我不晓得对不对,但我是这么干的:

1.  首先你要定义一个函数指针, curscreen(msg *msg),它的形参为消息;

2.  其次,你要定义2000个界面函数,每个界面函数的入口形参都是消息;
    比如: screen_001(msg *msg)

3. 在所有的界面函数内部,一定有一个函数指针切换,这个是对应界面来的;比如你希望在按下确认键,返回主界面,如下:
    curscreen = screen_main;
    备注: 这样是不是就形成了一个状态机;

4. 在主程里面,你只要调用这个函数指针就可以了;

5. 后注: 至于在各界面函数内部,你如何对这个消息解析,看你自己了,对不对;  从广义上看, 不就是一个消息发出来,统一汇总到这个函数指针来;



出0入0汤圆

发表于 2015-4-16 09:48:19 | 显示全部楼层
MARK___裸机界面开发

出0入0汤圆

发表于 2015-4-16 10:00:00 | 显示全部楼层

出0入0汤圆

发表于 2015-4-16 10:06:27 | 显示全部楼层
kinsno 发表于 2015-4-16 09:10
我来描述一下红金龙的思想,我不晓得对不对,但我是这么干的:

1.  首先你要定义一个函数指针, curscreen(m ...

嗯,你这么一说,我好像理解了这个菜单的整体框架了,但不知和 mcu_lover的是否有区别。


这么看来,这个框架和我以前用的一个结构就比较类似了,但感觉和楼主的有点不一样。

如我有100个页面,就写100个case【相当于每个页面都在同一级,没有嵌套一样】,在每个case里处理按键消息,定时消息,或者程序发出的其他消息。且在这个case里做状态切换。

while1中调用这个函数,所有的参数都是通过全局变量传入了。
  1. void Menu_Process_Display(void)
  2. {
  3.   switch (Current_State)
  4.   {
  5.     case Menu_1://页面1
  6.     {
  7.       if()//该页面第一次进来时初始化整个屏幕
  8.       {
  9.         //刷新整个屏幕
  10.       }
  11.       //这里有一个虚拟按键处理,来模拟定时消息或其他消息来时该做什么按键处理
  12.       if()
  13.       {
  14.         //虚拟按键处理
  15.       }
  16.       switch (key) //根据按键值做出不同动作
  17.       {
  18.         case Up_key:
  19.         {
  20.           //其他处理
  21.           //更新需要显示的内容,放到缓存中
  22.           break;
  23.         }
  24.         case Down_key:
  25.         {
  26.           //其他处理
  27.           //更新需要显示的内容,放到缓存中
  28.           break;
  29.         }
  30.         case Ok_key:
  31.         {
  32.           //其他处理
  33.           //更新需要显示的内容,放到缓存中
  34.           break;
  35.         }
  36.         case Menu_key:
  37.         {
  38.           //其他处理
  39.           //更新需要显示的内容,放到缓存中
  40.           break;
  41.         }
  42.         default://没有按键按下
  43.           break;
  44.       }
  45.       break;
  46.     }
  47.     default:
  48.       Current_State = Standby;//默认到待机界面
  49.       break;//进入待机界面
  50.   }
  51.   case Menu_2://页面2
  52.   {
  53.   }
  54.   case Menu_n://页面n
  55.   {
  56.   }
  57.   //下面做液晶显示,比较整个屏幕数据,只刷新数据变化的地方
  58.   Display();
  59. }
复制代码

出0入0汤圆

发表于 2015-4-16 10:22:04 | 显示全部楼层
本帖最后由 kinsno 于 2015-4-16 10:25 编辑
guxingganyue 发表于 2015-4-16 10:06
嗯,你这么一说,我好像理解了这个菜单的整体框架了,但不知和 mcu_lover的是否有区别。


CASE也是状态机啊;
你这样节约了一个我上面所说的函数指针 curscreen, 对吧,但实际上你这样维护起来好难的啊;修改某个界面,你还得从头到尾看,好累的啊;
PS:  你这上面有一个全局变量KEY在传导,这样不是很好,还是少用点全局变量吧;

出0入264汤圆

 楼主| 发表于 2015-4-16 11:17:19 | 显示全部楼层
guxingganyue 发表于 2015-4-16 08:38
有 WIN32程序设计 推荐的书或文章吗,直接搜的话不知从哪里看起啊。

windows 程序设计 第五版

出0入264汤圆

 楼主| 发表于 2015-4-16 11:19:51 | 显示全部楼层
kinsno 发表于 2015-4-16 09:10
我来描述一下红金龙的思想,我不晓得对不对,但我是这么干的:

1.  首先你要定义一个函数指针, curscreen(m ...

是的,基本思想就是这样。只是每个人的组织结构不一样而已。

出0入264汤圆

 楼主| 发表于 2015-4-16 11:20:44 | 显示全部楼层
guxingganyue 发表于 2015-4-16 10:06
嗯,你这么一说,我好像理解了这个菜单的整体框架了,但不知和 mcu_lover的是否有区别。

思想大概都差不多,想想如何优化结构。

出0入0汤圆

发表于 2015-4-16 11:41:10 | 显示全部楼层
这个方法挺好的,又学到了一招,谢谢分享经验!

出0入0汤圆

发表于 2015-4-16 13:07:29 | 显示全部楼层
kinsno 发表于 2015-4-16 10:22
CASE也是状态机啊;
你这样节约了一个我上面所说的函数指针 curscreen, 对吧,但实际上你这样维护起来好难 ...

嗯,这个结构添加删除页面有点麻烦,需要修改当前页面的上,下,使状态能切换正确。不用从头开始看的,只要找到菜单编号,再复制或删除一个case,里面做相应的修改即可。

以前用的全局变量比较多,这次准备全改过来。

出0入0汤圆

发表于 2015-4-16 13:09:47 | 显示全部楼层
mcu_lover 发表于 2015-4-16 11:17
windows 程序设计 第五版

好的,谢谢。

我看了一下win32程序设计思想,发现你的这个菜单结构和win32的消息机制非常的像。

出0入0汤圆

发表于 2015-4-16 13:58:19 | 显示全部楼层
好帖必须收藏,very good

出0入0汤圆

发表于 2015-4-21 21:20:35 | 显示全部楼层
其实多参考参考Windows的机制。

出0入0汤圆

发表于 2015-5-10 12:01:59 | 显示全部楼层
guxingganyue 发表于 2015-4-16 13:09
好的,谢谢。

我看了一下win32程序设计思想,发现你的这个菜单结构和win32的消息机制非常的像。 ...

从头到尾看了一下你发的帖子,谢谢你帮我们提的问题,

出0入0汤圆

发表于 2015-5-11 00:42:43 | 显示全部楼层

谢谢lz分享 mark

出0入0汤圆

发表于 2015-5-12 17:32:43 | 显示全部楼层
谢谢分享 仔细看了一遍 很有启发 mark

出0入8汤圆

发表于 2015-5-22 15:30:40 | 显示全部楼层
mcu_lover:
看你的界面设计软件不错,很专业,自己手动修改个东西比较麻烦,所以我也想尝试一下你的软件,可以付费,期待你的回复!

出0入0汤圆

发表于 2015-5-24 14:50:57 | 显示全部楼层
好东西标记一下

出0入0汤圆

发表于 2015-5-29 14:00:31 | 显示全部楼层
好东西,必须顶

出0入0汤圆

发表于 2015-5-30 14:11:18 | 显示全部楼层
思路不错,谢谢分享。

出0入0汤圆

发表于 2015-5-30 14:56:42 | 显示全部楼层
标记一下

出0入8汤圆

发表于 2015-8-6 14:21:04 | 显示全部楼层
大师,你这个帖子我刚开始看不懂,最近花了一周时间专门去看,把你所有的回帖看了很多遍,然后
又花了一周的时间去写代码……写完代码后总算有了点领悟,但就是这一点点,我已经深深感觉到你
这个框架的好处了……感谢分享。

出0入264汤圆

 楼主| 发表于 2015-8-6 20:44:42 | 显示全部楼层
Jmhh247 发表于 2015-8-6 14:21
大师,你这个帖子我刚开始看不懂,最近花了一周时间专门去看,把你所有的回帖看了很多遍,然后
又花了一周 ...

恭喜。自己走过一遍,感受才会最深刻。

出0入0汤圆

发表于 2015-8-6 23:03:18 | 显示全部楼层
mark。菜单

出0入0汤圆

发表于 2015-11-23 17:07:48 | 显示全部楼层
mcu_lover 发表于 2015-8-6 20:44
恭喜。自己走过一遍,感受才会最深刻。

用了几个小时的时间看完了整个帖子,思路写的非常的清晰。
不知本人的理解和楼主的有多少分歧,请明示:
1.感觉楼主的界面管理,跟UCOS系统的运行机制非常的接近,只不过uc采用滴答定时器,不断的call调度系统。
2.楼主的每个窗口界面,就是os的每个任务。os滴答中断(如果有更高优先级就绪任务,保存当前运行寄存器,切换),你这个是用key切换调度(直接指定某个窗口函数就是最高优先级的,这运行过程中不存在硬件强制中断了某个窗口函数,所以当前窗口的值都是存在变量里的,便于子窗口的退出恢复)
3.如果有msgbox 点 yes or no, parent窗口响应 就是任务之间的消息传递。
4.loop 中只有一个窗口在运行。不需要并发其它窗口运行。(直到有按键切换窗口)

出0入0汤圆

发表于 2015-12-1 13:45:24 | 显示全部楼层
很好的思路!学习了!
谢谢分享!

出0入0汤圆

发表于 2015-12-1 14:11:18 | 显示全部楼层
orzorzorzorz 发表于 2014-8-29 19:45
QP状态机,只要维护好状态图即可

状态图自动生成代码?

出0入0汤圆

发表于 2015-12-4 09:50:10 | 显示全部楼层
对于具体的界面系统来说,一般为三层左右,顶多四层,到了五层就比较讨厌了。至于六层,用户肯定想砸了产品!

出0入0汤圆

发表于 2015-12-4 10:26:51 | 显示全部楼层
好像依稀记得起了  dos 界面 win3.1 之类的,,,呵呵

出0入0汤圆

发表于 2015-12-4 10:32:17 | 显示全部楼层
那最终的设置或者信息查看屏幕(我觉得这个在树形菜单结构里 是不是可以叫做叶子菜单,最终树上的叶子^_^)是被剥离出菜单项内核,让应用层用户设计修改吗?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-29 03:57

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表