<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          基于單片機(jī)的極簡(jiǎn)圖形化狀態(tài)機(jī)框架NorthFrame

          共 5831字,需瀏覽 12分鐘

           ·

          2021-08-05 02:20

          關(guān)注、星標(biāo)公眾號(hào),直達(dá)精彩內(nèi)容

          來(lái)源:嵌入式云IOT技術(shù)圈


          NorthFrame是基于非UML極簡(jiǎn)理念的狀態(tài)機(jī)框架

          配合NF_FsmDesigner圖形化開(kāi)發(fā)工具,可無(wú)負(fù)擔(dān)替代傳統(tǒng)switch-case狀態(tài)機(jī)開(kāi)發(fā)

          1、NorthFrame的組件

          • NF_FSM :

            極簡(jiǎn)非UML狀態(tài)機(jī)框架

          • NF_FsmDesigner :

            基于C# Winform開(kāi)發(fā)的狀態(tài)機(jī)圖形化開(kāi)發(fā)工具,可直接生成C代碼

          • NF_Signal :

            用于代替全局變量的動(dòng)態(tài)信號(hào)機(jī)制

          NF_Signal :代替全局變量,使用方便:

          NF_Signal_Set("flag_connect", 1);
          NF_Signal_Set("blink_cnt", 3);
          NF_SignalValue flag_connect = NF_Signal_Get("flag_connect");

          2、NorthFrame圖形化狀態(tài)機(jī)開(kāi)發(fā)

          以下例程在VS2012環(huán)境中運(yùn)行一個(gè)判斷QE組合鍵的狀態(tài)機(jī):

          Step1 : 使用NF_FsmDesigner工具設(shè)計(jì)繪制狀態(tài)轉(zhuǎn)換圖,并保存為XML文件

          Step2 : 點(diǎn)擊生成代碼,生成如下C語(yǔ)言代碼

          #include <n_frame.h>
          #include <fsm_qande.h>

          /* 轉(zhuǎn)換執(zhí)行的外部函數(shù)聲明 */
          extern void IDLE_TO_Q(void);
          extern void Q_TO_QE(void);
          extern void QE_TO_IDLE(void);
          extern void QE_TO_Q(void);
          extern void Q_TO_IDLE(void);

          /* 狀態(tài)處理函數(shù)聲明 */
          void FSM_QandE_IDLE(NF_FSM* me, NF_Event event);
          void FSM_QandE_Q_DOWN(NF_FSM* me, NF_Event event);
          void FSM_QandE_QE_DOWN(NF_FSM* me, NF_Event event);

          /* 狀態(tài)機(jī)對(duì)象 */
          NF_FSM FSM_QandE = {
              FSM_QandE_IDLE
          };

          /* IDLE狀態(tài)處理函數(shù) */
          void FSM_QandE_IDLE(NF_FSM* me, NF_Event event)
          {

              if (NF_FSM_NameIs(event.Name, "Q_DOWN"))
              {
                  IDLE_TO_Q();
                  NF_FSM_TRAN(FSM_QandE_Q_DOWN);
                  return ;
              }

              if (NF_FSM_NameIs(event.Name, "test"))
              {
                  NF_FSM_TRAN(FSM_QandE_IDLE);
                  return ;
              }
          }

          /* Q_DOWN狀態(tài)處理函數(shù) */
          void FSM_QandE_Q_DOWN(NF_FSM* me, NF_Event event)
          {

              if (NF_FSM_NameIs(event.Name, "E_DOWN"))
              {
                  Q_TO_QE();
                  NF_FSM_TRAN(FSM_QandE_QE_DOWN);
                  return ;
              }

              if (NF_FSM_NameIs(event.Name, "Q_UP"))
              {
                  Q_TO_IDLE();
                  NF_FSM_TRAN(FSM_QandE_IDLE);
                  return ;
              }
          }

          /* QE_DOWN狀態(tài)處理函數(shù) */
          void FSM_QandE_QE_DOWN(NF_FSM* me, NF_Event event)
          {

              if (NF_FSM_NameIs(event.Name, "Q_UP"))
              {
                  QE_TO_IDLE();
                  NF_FSM_TRAN(FSM_QandE_IDLE);
                  return ;
              }

              if (NF_FSM_NameIs(event.Name, "E_UP"))
              {
                  QE_TO_Q();
                  NF_FSM_TRAN(FSM_QandE_Q_DOWN);
                  return ;
              }
          }

          Step3 : 在main.c文件中實(shí)現(xiàn)按鍵處理,并發(fā)送事件給狀態(tài)機(jī)

          備注 : 后續(xù)版本會(huì)加入發(fā)布-訂閱機(jī)制,目前僅支持直接派發(fā)

          #include "n_frame.h"

          #include "windows.h"
          #include "stdio.h"

          #include "fsm_qande.h"

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

          /* 信號(hào)產(chǎn)生者 */
          void Test_Key_Process(void)
          {
           static NF_Bool last_q_val = NF_Bool_False;
           static NF_Bool last_e_val = NF_Bool_False;

           NF_Bool then_q_val;
           NF_Bool then_e_val;

           then_q_val = KEY_VALUE('Q');
           then_e_val = KEY_VALUE('E');

           /* Q鍵事件處理 */
           if ((last_q_val == NF_Bool_False) && (KEY_VALUE('Q') == NF_Bool_True))
           {
            NF_FSM_Dispatch(&FSM_QandE, NF_FSM_Event("Q_DOWN"));
           } 
           else if ((last_q_val == NF_Bool_True) && (KEY_VALUE('Q') == NF_Bool_False))
           {
            NF_FSM_Dispatch(&FSM_QandE, NF_FSM_Event("Q_UP"));
           }

           /* E鍵事件處理 */
           if ((last_e_val == NF_Bool_False) && (KEY_VALUE('E') == NF_Bool_True))
           {
            NF_FSM_Dispatch(&FSM_QandE, NF_FSM_Event("E_DOWN"));
           } 
           else if ((last_e_val == NF_Bool_True) && (KEY_VALUE('E') == NF_Bool_False))
           {
            NF_FSM_Dispatch(&FSM_QandE, NF_FSM_Event("E_UP"));
           }

           last_q_val = then_q_val;
           last_e_val = then_e_val;
          }

          void IDLE_TO_Q(void)
          {
           printf("state translate : IDLE -> Q_DOWN\n");
          }

          void Q_TO_QE(void)
          {
           printf("state translate : Q_DOWN -> QE_DOWN\n");
          }

          void QE_TO_IDLE(void)
          {
           printf("state translate : QE_DOWN -> IDLE\n");
          }

          void QE_TO_Q(void)
          {
           printf("state translate : QE_DOWN -> Q_DOWN\n");
          }

          void Q_TO_IDLE(void)
          {
           printf("state translate : Q_DOWN -> IDLE\n");
          }

          int main(void)
          {
           for (;;)
           {
            Test_Key_Process();
           }
          }

          克隆鏈接:

          git clone https://gitee.com/PISCES_X/NorthFrame.git

          版權(quán)歸原作者所有,如有侵權(quán),請(qǐng)聯(lián)系刪除。
          ????????????????  END  ????????????????

          關(guān)注我的微信公眾號(hào),回復(fù)“加群”按規(guī)則加入技術(shù)交流群。

          歡迎關(guān)注我的視頻號(hào):


          點(diǎn)擊“閱讀原文”查看更多分享,歡迎點(diǎn)分享、收藏、點(diǎn)贊、在看。

          瀏覽 61
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  91AV在线观看2011 | 成人美女视频在线观看18 | 亚洲在线播放视频 | 福利视频三区 | 久久久久国产欧美久久久aaa |