gitee地址:https://gitee.com/PISCES_X/NorthFrame
單片機開發中是否被滿天飛的全局變量困擾?
是否在尋找一種層級間松耦合的信號傳遞方式?
是否希望優雅無負擔地使用狀態機思路進行開發?
調試打Log很麻煩,希望自動生成,最好還有測試腳本?
NF_Signal和NF_FSM 來幫你
用法1:代替全局變量,使用方便
- NF_Signal_Set("flag_connect", 1);
- NF_Signal_Set("blink_cnt", 3);
- NF_SignalValue flag_connect = NF_Signal_Get("flag_connect");
復制代碼
用法2:配合狀態機使用以下例程在VS2012環境中運行一個判斷QE組合鍵的狀態機
注:未來會更新使用狀態圖繪圖軟件自動生成狀態機代碼 
- #include "n_frame.h"
- #include "windows.h"
- #include "stdio.h"
- #define IS_KEY_PRESS(_key) ((GetKeyState(_key) >= 0) ? NF_Bool_False : NF_Bool_True )
- /* 信號產生者 */
- void Test_Key_Process(void)
- {
- if ( IS_KEY_PRESS('Q') ){
- NF_Signal_Set("key_q_press", 1);
- }
- else{
- NF_Signal_Set("key_q_press", 0);
- }
- if ( IS_KEY_PRESS('E') ){
- NF_Signal_Set("key_e_press", 1);
- }
- else{
- NF_Signal_Set("key_e_press", 0);
- }
- }
- /* 狀態機對象 */
- NF_FSM Test_FSM_QandE;
- /* 狀態機的三個狀態處理函數 */
- void Test_FSM_QandE_IDLE(NF_FSM* me, NF_SignalName name, NF_SignalValue val);
- void Test_FSM_QandE_QDOWN(NF_FSM* me, NF_SignalName name, NF_SignalValue val);
- void Test_FSM_QandE_QEDOWN(NF_FSM* me, NF_SignalName name, NF_SignalValue val);
- /* IDLE狀態處理函數 */
- void Test_FSM_QandE_IDLE(NF_FSM* me, NF_SignalName name, NF_SignalValue val)
- {
- if ( NF_FSM_NameIs(name, "key_q_press") )
- {
- if ( val == 1 )
- {
- NF_FSM_TRAN(Test_FSM_QandE_QDOWN);
- printf("Test_FSM_QandE State Translate : IDLE --> QDOWN\n");
- }
- }
- }
- /* QDOWN狀態處理函數 */
- void Test_FSM_QandE_QDOWN(NF_FSM* me, NF_SignalName name, NF_SignalValue val)
- {
- if ( NF_FSM_NameIs(name, "key_e_press") )
- {
- if ( val == 1 )
- {
- NF_FSM_TRAN(Test_FSM_QandE_QEDOWN);
- printf("Test_FSM_QandE State Translate : QDOWN --> QEDOWN\n");
- }
- }
- else if( NF_FSM_NameIs(name, "key_q_press") )
- {
- if ( val == 0 )
- {
- NF_FSM_TRAN(Test_FSM_QandE_IDLE);
- printf("Test_FSM_QandE State Translate : QDOWN --> IDLE\n");
- }
- }
- }
- /* QEDOWN狀態處理函數 */
- void Test_FSM_QandE_QEDOWN(NF_FSM* me, NF_SignalName name, NF_SignalValue val)
- {
- if ( NF_FSM_NameIs(name, "key_e_press") )
- {
- if ( val == 0 )
- {
- NF_FSM_TRAN(Test_FSM_QandE_QDOWN);
- printf("Test_FSM_QandE State Translate : QEDOWN --> QDOWN\n");
- }
- }
- else if( NF_FSM_NameIs(name, "key_q_press") )
- {
- if ( val == 0 )
- {
- NF_FSM_TRAN(Test_FSM_QandE_IDLE);
- printf("Test_FSM_QandE State Translate : QEDOWN --> IDLE\n");
- }
- }
- }
- int main(void)
- {
- /* 初始化狀態機 */
- NF_FSM_Translate(&Test_FSM_QandE, NF_FSM_State(Test_FSM_QandE_IDLE));
- for (;;)
- {
- Test_Key_Process();
- NF_FSM_CheckSignal(&Test_FSM_QandE, "key_q_press");
- NF_FSM_CheckSignal(&Test_FSM_QandE, "key_e_press");
- }
- }
復制代碼
NorthFrame 單片機極簡信號/狀態機框架 討論QQ群:431600056(添加時注明"來自51hei",否則不予通過)
|