Слияние кода завершено, страница обновится автоматически
NF_Signal_Set("flag_connect", 1);
NF_Signal_Set("blink_cnt", 3);
NF_SignalValue flag_connect = NF_Signal_Get("flag_connect");
Демонстрация в Visual Studio 2012:
Шаг 1: создание проекта NF_FsmDesignerDemo.
Шаг 2: реализация кода.
#include <n_frame.h>
#include <fsm_qande.h>
/* Объявление функций */
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);
/* Реализация функций */
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);
/* Создание объекта */
NF_FSM FSM_QandE = {
FSM_QandE_IDLE
};
/* IDLE */
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 */
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 */
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 ;
}
}
Шаг 3: код в main.c.
#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 )
/* Обработка клавиш */
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();
}
}
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )