久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2387|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

[開源框架] 極簡(jiǎn)信號(hào)/狀態(tài)機(jī)框架 NorthFrame

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:697946 發(fā)表于 2020-2-25 13:56 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
gitee地址:https://gitee.com/PISCES_X/NorthFrame
單片機(jī)開發(fā)中是否被滿天飛的全局變量困擾?
是否在尋找一種層級(jí)間松耦合的信號(hào)傳遞方式?
是否希望優(yōu)雅無負(fù)擔(dān)地使用狀態(tài)機(jī)思路進(jìn)行開發(fā)?
調(diào)試打Log很麻煩,希望自動(dòng)生成,最好還有測(cè)試腳本?

NF_Signal和NF_FSM 來幫你

用法1:代替全局變量,使用方便
  1.     NF_Signal_Set("flag_connect", 1);
  2.     NF_Signal_Set("blink_cnt", 3);

  3.     NF_SignalValue flag_connect = NF_Signal_Get("flag_connect");
復(fù)制代碼

用法2:配合狀態(tài)機(jī)使用
以下例程在VS2012環(huán)境中運(yùn)行一個(gè)判斷QE組合鍵的狀態(tài)機(jī)
注:未來會(huì)更新使用狀態(tài)圖繪圖軟件自動(dòng)生成狀態(tài)機(jī)代碼

  1.     #include "n_frame.h"

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

  4.     #define IS_KEY_PRESS(_key) ((GetKeyState(_key) >= 0) ? NF_Bool_False : NF_Bool_True )

  5.     /* 信號(hào)產(chǎn)生者 */
  6.     void Test_Key_Process(void)
  7.     {
  8.         if ( IS_KEY_PRESS('Q') ){
  9.             NF_Signal_Set("key_q_press", 1);
  10.         }
  11.         else{
  12.             NF_Signal_Set("key_q_press", 0);
  13.         }

  14.         if ( IS_KEY_PRESS('E') ){
  15.             NF_Signal_Set("key_e_press", 1);
  16.         }
  17.         else{
  18.             NF_Signal_Set("key_e_press", 0);
  19.         }
  20.     }

  21.     /* 狀態(tài)機(jī)對(duì)象 */
  22.     NF_FSM Test_FSM_QandE;

  23.     /* 狀態(tài)機(jī)的三個(gè)狀態(tài)處理函數(shù) */
  24.     void Test_FSM_QandE_IDLE(NF_FSM* me, NF_SignalName name, NF_SignalValue val);
  25.     void Test_FSM_QandE_QDOWN(NF_FSM* me, NF_SignalName name, NF_SignalValue val);
  26.     void Test_FSM_QandE_QEDOWN(NF_FSM* me, NF_SignalName name, NF_SignalValue val);

  27.     /* IDLE狀態(tài)處理函數(shù) */
  28.     void Test_FSM_QandE_IDLE(NF_FSM* me, NF_SignalName name, NF_SignalValue val)
  29.     {
  30.         if ( NF_FSM_NameIs(name, "key_q_press") )
  31.         {
  32.             if ( val == 1 )
  33.             {
  34.                 NF_FSM_TRAN(Test_FSM_QandE_QDOWN);
  35.                 printf("Test_FSM_QandE State Translate : IDLE --> QDOWN\n");
  36.             }
  37.         }
  38.     }

  39.     /* QDOWN狀態(tài)處理函數(shù) */
  40.     void Test_FSM_QandE_QDOWN(NF_FSM* me, NF_SignalName name, NF_SignalValue val)
  41.     {
  42.         if ( NF_FSM_NameIs(name, "key_e_press") )
  43.         {
  44.             if ( val == 1 )
  45.             {
  46.                 NF_FSM_TRAN(Test_FSM_QandE_QEDOWN);
  47.                 printf("Test_FSM_QandE State Translate : QDOWN --> QEDOWN\n");
  48.             }
  49.         }
  50.         else if( NF_FSM_NameIs(name, "key_q_press") )
  51.         {
  52.             if ( val == 0 )
  53.             {
  54.                 NF_FSM_TRAN(Test_FSM_QandE_IDLE);
  55.                 printf("Test_FSM_QandE State Translate : QDOWN --> IDLE\n");
  56.             }
  57.         }
  58.     }

  59.     /* QEDOWN狀態(tài)處理函數(shù) */
  60.     void Test_FSM_QandE_QEDOWN(NF_FSM* me, NF_SignalName name, NF_SignalValue val)
  61.     {
  62.         if ( NF_FSM_NameIs(name, "key_e_press") )
  63.         {
  64.             if ( val == 0 )
  65.             {
  66.                 NF_FSM_TRAN(Test_FSM_QandE_QDOWN);
  67.                 printf("Test_FSM_QandE State Translate : QEDOWN --> QDOWN\n");
  68.             }
  69.         }
  70.         else if( NF_FSM_NameIs(name, "key_q_press") )
  71.         {
  72.             if ( val == 0 )
  73.             {
  74.                 NF_FSM_TRAN(Test_FSM_QandE_IDLE);
  75.                 printf("Test_FSM_QandE State Translate : QEDOWN --> IDLE\n");
  76.             }
  77.         }
  78.     }

  79.     int main(void)
  80.     {
  81.         /* 初始化狀態(tài)機(jī) */
  82.         NF_FSM_Translate(&Test_FSM_QandE, NF_FSM_State(Test_FSM_QandE_IDLE));

  83.         for (;;)
  84.         {
  85.             Test_Key_Process();
  86.             NF_FSM_CheckSignal(&Test_FSM_QandE, "key_q_press");
  87.             NF_FSM_CheckSignal(&Test_FSM_QandE, "key_e_press");
  88.         }
  89.     }
復(fù)制代碼


NorthFrame 單片機(jī)極簡(jiǎn)信號(hào)/狀態(tài)機(jī)框架   討論QQ群:431600056(添加時(shí)注明"來自51hei",否則不予通過)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:258566 發(fā)表于 2020-2-25 15:59 | 只看該作者
封裝的比較好,但是要說簡(jiǎn)單還是switch case簡(jiǎn)單。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 成人高清视频在线观看 | 免费播放一级片 | 中文字幕91 | 91综合网 | 亚洲精品在线免费播放 | 亚洲精品一区在线 | 91久久精品| 视频一区二区中文字幕 | 亚洲精品av在线 | 欧美日韩视频一区二区 | 成人伊人 | 国产一区 日韩 | 一级黄色片在线看 | 夜夜操操操 | 精品国产乱码久久久久久牛牛 | 在线观看中文字幕av | 人妖av| 中文字幕一区二区三区四区五区 | 精品欧美一区二区精品久久久 | 亚洲国产中文字幕 | 一区二区三区四区在线 | 凹凸日日摸日日碰夜夜 | 亚洲精品日韩精品 | 日韩欧美国产一区二区 | 亚洲日本中文 | www.日本精品 | 亚洲成人www | 国产免费福利在线 | 久久国产区 | 精品免费国产视频 | 国产精品不卡 | 中文字幕亚洲一区 | jav成人av免费播放 | 成人欧美一区二区三区在线播放 | 亚洲午夜精品视频 | www.天天操 | 国产成人一区二区三区 | 99色综合| 91文字幕巨乱亚洲香蕉 | 鲁一鲁资源影视 | 日韩一区二区久久 |