在线时间80 小时
UID260243
注册时间2010-11-21
NXP金币0
TA的每日心情 | 衰 2018-2-28 16:09 |
---|
签到天数: 65 天 连续签到: 1 天 [LV.6]常住居民II
中级会员
 
- 积分
- 488
- 最后登录
- 2019-9-18
|

楼主 |
发表于 2017-8-10 14:59:32
|
显示全部楼层
本帖最后由 gujiamao 于 2017-8-10 15:01 编辑
M4内核中,增加如下代码:typedef enum {
fsm_rt_err = -1, //!< fsm error, error code can be get from other interface
fsm_rt_cpl = 0, //!< fsm complete
fsm_rt_on_going = 1, //!< fsm on-going
} fsm_rt_t;
typedef struct _msg_t msg_t;
typedef fsm_rt_t MSG_HANDLER(msg_t *ptMSG);
struct _msg_t {
uint8_t chMSG[17]; //!< ???????16????
MSG_HANDLER *fnHandler; //!< ??????
};
#define NUM_OF_MSG 10 //10 is TBD
#define UBOUND(__X) (sizeof(__X) / sizeof(__X[0]))
static msg_t s_tMSGMap[NUM_OF_MSG];
bool msg_register(msg_t *ptMsg, uint8_t chNum)
{
if(NULL == ptMsg || chNum <= NUM_OF_MSG) {
return false;
}
for(uint8_t chIndex = 0; chIndex < chNum; chIndex++) {
s_tMSGMap[chIndex].fnHandler = ptMsg[chIndex].fnHandler;
for(uint8_t chAddr = 0; chAddr < sizeof(ptMsg[chIndex].chMSG); chAddr++) {
s_tMSGMap[chIndex].chMSG[chAddr] = ptMsg[chIndex].chMSG[chAddr];
}
//strcpy(s_tMSGMap[chIndex].chMSG, ptMsg[chIndex].chMSG);
}
return true;
}
static fsm_rt_t msg_apple_handler(msg_t *ptMSG);
static fsm_rt_t msg_orange_handler(msg_t *ptMSG);
static fsm_rt_t msg_hello_handler(msg_t *ptMSG);
//!
static msg_t s_tMSGMap[] = {
{"a", &msg_apple_handler},
{"b", &msg_orange_handler},
{"c", &msg_hello_handler},
};
msg_t tMsgResult;
msg_t *search_msg_map(uint8_t chByte);
#define APPLE_HANDLER_RESET_FSM() \
do {\
s_tState = TASK_APPLE_START;\
} while(0)
static fsm_rt_t msg_apple_handler(msg_t *ptMSG)
{
if(NULL == ptMSG) {
return fsm_rt_err;
}
static enum {
TASK_APPLE_START = 0,
TASK_APPLE_TRIGGER,
} s_tState = TASK_APPLE_START;
switch(s_tState) {
case TASK_APPLE_START:
s_tState = TASK_APPLE_TRIGGER;
case TASK_APPLE_TRIGGER:
PRINTF("apple\r\n");
//SET_EVENT(&s_tTaskATrigger);
APPLE_HANDLER_RESET_FSM();
return fsm_rt_cpl;
}
return fsm_rt_on_going;
}
#define ORANGE_HANDLER_RESET_FSM() \
do {\
s_tState = TASK_ORANGE_START;\
} while(0)
static fsm_rt_t msg_orange_handler(msg_t *ptMSG)
{
if(NULL == ptMSG) {
return fsm_rt_err;
}
static enum {
TASK_ORANGE_START = 0,
TASK_ORANGE_TRIGGER,
} s_tState = TASK_ORANGE_START;
switch(s_tState) {
case TASK_ORANGE_START:
s_tState = TASK_ORANGE_TRIGGER;
case TASK_ORANGE_TRIGGER:
PRINTF("orange\r\n");
//SET_EVENT(&s_tTaskBTrigger);
ORANGE_HANDLER_RESET_FSM();
return fsm_rt_cpl;
}
return fsm_rt_on_going;
}
#define HELLO_HANDLER_RESET_FSM() \
do {\
s_tState = TASK_HELLO_START;\
} while(0)
static fsm_rt_t msg_hello_handler(msg_t *ptMSG)
{
if(NULL == ptMSG) {
return fsm_rt_err;
}
static enum {
TASK_HELLO_START = 0,
TASK_HELLO_TRIGGER,
} s_tState = TASK_HELLO_START;
switch(s_tState) {
case TASK_HELLO_START:
s_tState = TASK_HELLO_TRIGGER;
case TASK_HELLO_TRIGGER:
PRINTF("world\r\n");
//SET_EVENT(&s_tTaskCTrigger);
HELLO_HANDLER_RESET_FSM();
return fsm_rt_cpl;
}
return fsm_rt_on_going;
}
#define SEARCH_MESSAGE_RESET_FSM() \
do {\
s_tState = SEARCH_MESSAGE_START;\
} while(0)
msg_t *search_msg_map(uint8_t chByte)
{
static enum {
SEARCH_MESSAGE_START = 0,
SEARCH_MESSAGE_GET,
SEARCH_MESSAGE_JUDGE,
} s_tState = SEARCH_MESSAGE_START;
static msg_t *s_ptMsg = NULL;
static uint8_t s_chCount = 0;
switch(s_tState) {
case SEARCH_MESSAGE_START:
s_tState = SEARCH_MESSAGE_GET;
case SEARCH_MESSAGE_GET:
if(s_chCount < UBOUND(s_tMSGMap)) {
s_ptMsg = (msg_t *)&s_tMSGMap[s_chCount];
s_chCount++;
} else {
s_chCount = 0;
s_ptMsg = (msg_t *)&s_tMSGMap[s_chCount];
}
s_tState = SEARCH_MESSAGE_JUDGE;
case SEARCH_MESSAGE_JUDGE:
if(chByte == s_ptMsg->chMSG[0]) {
s_chCount = 0;
SEARCH_MESSAGE_RESET_FSM();
return s_ptMsg;
} else {
s_tState = SEARCH_MESSAGE_GET;
}
}
return NULL;
}
main中增加:
#if 1
tMsgResult.chMSG[0] = 0;
tMsgResult = *search_msg_map(g_msg);
if(tMsgResult.chMSG[0]) {
PRINTF("%c\r\n", tMsgResult.chMSG[0]);
tMsgResult.fnHandler(&tMsgResult);
g_msg = 0;
}
#endif
|
|