你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于单片机的极简图形化状态机框架NorthFrame

[复制链接]
STMCU小助手 发布时间:2021-8-5 10:15
NorthFrame是基于非UML极简理念的状态机框架


配合NF_FsmDesigner图形化开发工具,可无负担替代传统switch-case状态机开发


1、NorthFrame的组件
NF_FSM :


极简非UML状态机框架


NF_FsmDesigner :


基于C# Winform开发的状态机图形化开发工具,可直接生成C代码


NF_Signal :


用于代替全局变量的动态信号机制


NF_Signal :代替全局变量,使用方便:
  1. <font face="微软雅黑" size="3">NF_Signal_Set("flag_connect", 1);

  2. NF_Signal_Set("blink_cnt", 3);

  3. NF_SignalValue flag_connect = NF_Signal_Get("flag_connect");</font>
复制代码




2、NorthFrame图形化状态机开发
以下例程在VS2012环境中运行一个判断QE组合键的状态机:


Step1 : 使用NF_FsmDesigner工具设计绘制状态转换图,并保存为XML文件


1.png


Step2 : 点击生成代码,生成如下C语言代码
  1. <font face="微软雅黑" size="3">#include <n_frame.h>
  2. #include <fsm_qande.h>

  3. /* 转换执行的外部函数声明 */
  4. extern void IDLE_TO_Q(void);
  5. extern void Q_TO_QE(void);
  6. extern void QE_TO_IDLE(void);
  7. extern void QE_TO_Q(void);
  8. extern void Q_TO_IDLE(void);

  9. /* 状态处理函数声明 */
  10. void FSM_QandE_IDLE(NF_FSM* me, NF_Event event);
  11. void FSM_QandE_Q_DOWN(NF_FSM* me, NF_Event event);
  12. void FSM_QandE_QE_DOWN(NF_FSM* me, NF_Event event);

  13. /* 状态机对象 */
  14. NF_FSM FSM_QandE = {
  15.     FSM_QandE_IDLE
  16. };

  17. /* IDLE状态处理函数 */
  18. void FSM_QandE_IDLE(NF_FSM* me, NF_Event event)
  19. {

  20.     if (NF_FSM_NameIs(event.Name, "Q_DOWN"))
  21.     {
  22.         IDLE_TO_Q();
  23.         NF_FSM_TRAN(FSM_QandE_Q_DOWN);
  24.         return ;
  25.     }

  26.     if (NF_FSM_NameIs(event.Name, "test"))
  27.     {
  28.         NF_FSM_TRAN(FSM_QandE_IDLE);
  29.         return ;
  30.     }
  31. }

  32. /* Q_DOWN状态处理函数 */
  33. void FSM_QandE_Q_DOWN(NF_FSM* me, NF_Event event)
  34. {

  35.     if (NF_FSM_NameIs(event.Name, "E_DOWN"))
  36.     {
  37.         Q_TO_QE();
  38.         NF_FSM_TRAN(FSM_QandE_QE_DOWN);
  39.         return ;
  40.     }

  41.     if (NF_FSM_NameIs(event.Name, "Q_UP"))
  42.     {
  43.         Q_TO_IDLE();
  44.         NF_FSM_TRAN(FSM_QandE_IDLE);
  45.         return ;
  46.     }
  47. }

  48. /* QE_DOWN状态处理函数 */
  49. void FSM_QandE_QE_DOWN(NF_FSM* me, NF_Event event)
  50. {

  51.     if (NF_FSM_NameIs(event.Name, "Q_UP"))
  52.     {
  53.         QE_TO_IDLE();
  54.         NF_FSM_TRAN(FSM_QandE_IDLE);
  55.         return ;
  56.     }

  57.     if (NF_FSM_NameIs(event.Name, "E_UP"))
  58.     {
  59.         QE_TO_Q();
  60.         NF_FSM_TRAN(FSM_QandE_Q_DOWN);
  61.         return ;
  62.     }
  63. }</font>
复制代码

Step3 : 在main.c文件中实现按键处理,并发送事件给状态机

备注 : 后续版本会加入发布-订阅机制,目前仅支持直接派发

  1. <font face="微软雅黑" size="3">#include "n_frame.h"

  2. #include "windows.h"
  3. #include "stdio.h"

  4. #include "fsm_qande.h"

  5. #define KEY_VALUE(_key) ((GetKeyState(_key) >= 0) ? NF_Bool_False : NF_Bool_True )

  6. /* 信号产生者 */
  7. void Test_Key_Process(void)
  8. {
  9. static NF_Bool last_q_val = NF_Bool_False;
  10. static NF_Bool last_e_val = NF_Bool_False;

  11. NF_Bool then_q_val;
  12. NF_Bool then_e_val;

  13. then_q_val = KEY_VALUE('Q');
  14. then_e_val = KEY_VALUE('E');

  15. /* Q键事件处理 */
  16. if ((last_q_val == NF_Bool_False) && (KEY_VALUE('Q') == NF_Bool_True))
  17. {
  18.   NF_FSM_Dispatch(&FSM_QandE, NF_FSM_Event("Q_DOWN"));
  19. }
  20. else if ((last_q_val == NF_Bool_True) && (KEY_VALUE('Q') == NF_Bool_False))
  21. {
  22.   NF_FSM_Dispatch(&FSM_QandE, NF_FSM_Event("Q_UP"));
  23. }

  24. /* E键事件处理 */
  25. if ((last_e_val == NF_Bool_False) && (KEY_VALUE('E') == NF_Bool_True))
  26. {
  27.   NF_FSM_Dispatch(&FSM_QandE, NF_FSM_Event("E_DOWN"));
  28. }
  29. else if ((last_e_val == NF_Bool_True) && (KEY_VALUE('E') == NF_Bool_False))
  30. {
  31.   NF_FSM_Dispatch(&FSM_QandE, NF_FSM_Event("E_UP"));
  32. }

  33. last_q_val = then_q_val;
  34. last_e_val = then_e_val;
  35. }

  36. void IDLE_TO_Q(void)
  37. {
  38. printf("state translate : IDLE -> Q_DOWN\n");
  39. }

  40. void Q_TO_QE(void)
  41. {
  42. printf("state translate : Q_DOWN -> QE_DOWN\n");
  43. }

  44. void QE_TO_IDLE(void)
  45. {
  46. printf("state translate : QE_DOWN -> IDLE\n");
  47. }

  48. void QE_TO_Q(void)
  49. {
  50. printf("state translate : QE_DOWN -> Q_DOWN\n");
  51. }

  52. void Q_TO_IDLE(void)
  53. {
  54. printf("state translate : Q_DOWN -> IDLE\n");
  55. }

  56. int main(void)
  57. {
  58. for (;;)
  59. {
  60.   Test_Key_Process();
  61. }
  62. }</font>
复制代码

克隆链接:

  1. <font face="微软雅黑" size="3">git clone https://gitee.com/PISCES_X/NorthFrame.git</font>
复制代码


收藏 评论0 发布时间:2021-8-5 10:15

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版