NorthFrame單片機(jī)極簡(jiǎn)信號(hào)/狀態(tài)機(jī)框架
NorthFrame,單片機(jī)極簡(jiǎn)信號(hào)/狀態(tài)機(jī)框架。
單片機(jī)開發(fā)中是否被滿天飛的全局變量困擾?
是否在尋找一種層級(jí)間松耦合的信號(hào)傳遞方式?
是否希望優(yōu)雅無(wú)負(fù)擔(dān)地使用狀態(tài)機(jī)思路進(jìn)行開發(fā)?
NF_Signal 和 NF_FSM 來(lái)幫你。
用法1:代替全局變量,使用方便
NF_Signal_Set("flag_connect", 1);
NF_Signal_Set("blink_cnt", 3);
NF_SignalValue flag_connect = NF_Signal_Get("flag_connect");
用法2:配合狀態(tài)機(jī)使用
以下例程在VS2012環(huán)境中運(yùn)行一個(gè)判斷QE組合鍵的狀態(tài)機(jī)
注:未來(lái)會(huì)更新使用狀態(tài)圖繪圖軟件自動(dòng)生成狀態(tài)機(jī)代碼
#include "n_frame.h"
#include "windows.h"
#include "stdio.h"
#define IS_KEY_PRESS(_key) ((GetKeyState(_key) >= 0) ? NF_Bool_False : NF_Bool_True )
/* 信號(hào)產(chǎn)生者 */
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);
}
}
/* 狀態(tài)機(jī)對(duì)象 */
NF_FSM Test_FSM_QandE;
/* 狀態(tài)機(jī)的三個(gè)狀態(tài)處理函數(shù) */
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狀態(tài)處理函數(shù) */
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狀態(tài)處理函數(shù) */
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狀態(tài)處理函數(shù) */
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)
{
/* 初始化狀態(tài)機(jī) */
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");
}
}
評(píng)論
圖片
表情
