Hi all,
I may need some guidance on the finite state machine method which found an example in app_level.c (from nRF5 SDK for Mesh v3.1), please see my question on below:-
- What is event id use for? found the function generic_level_state_set_cb() will call this fsm_event_post(&p_server->fsm, E_SET, p_server) which meant it will trigger the fsm and start from state "FSM_ANY_STATE", am i right?
- from question 1, if the above assumption is correct, why we have 3 FSM_TRANSITION? which line will go for? FSM_TRANSITION(E_SET, G_SET_DELAY, A_DELAY_START, S_IN_DELAY),
FSM_TRANSITION(E_SET, G_SET_TRANSITION, A_TRANSITION_START, S_IN_TRANSITION),
FSM_TRANSITION(E_SET, FSM_OTHERWISE, A_TRANSITION_COMPLETE,S_IDLE),
Thank you!
static const fsm_transition_t m_app_level_fsm_transition_table[] =
{
FSM_STATE(S_IDLE),
FSM_STATE(S_IN_DELAY),
FSM_TRANSITION(E_TIMEOUT, G_SET_TRANSITION, A_TRANSITION_START, S_IN_TRANSITION),
FSM_TRANSITION(E_TIMEOUT, FSM_OTHERWISE, A_TRANSITION_COMPLETE, S_IDLE),
FSM_STATE(S_IN_TRANSITION),
FSM_TRANSITION(E_TIMEOUT, G_TRANSITION_COMPLETE, A_TRANSITION_COMPLETE, S_IDLE),
FSM_TRANSITION(E_TIMEOUT, FSM_ALWAYS, A_TRANSITION_TICK, S_IN_TRANSITION),
FSM_STATE(FSM_ANY_STATE),
FSM_TRANSITION(E_SET, G_SET_DELAY, A_DELAY_START, S_IN_DELAY),
FSM_TRANSITION(E_SET, G_SET_TRANSITION, A_TRANSITION_START, S_IN_TRANSITION),
FSM_TRANSITION(E_SET, FSM_OTHERWISE, A_TRANSITION_COMPLETE,S_IDLE),
FSM_TRANSITION(E_DELTA_SET, G_SET_DELAY, A_DELAY_START, S_IN_DELAY),
FSM_TRANSITION(E_DELTA_SET, G_SET_TRANSITION, A_TRANSITION_START, S_IN_TRANSITION),
FSM_TRANSITION(E_DELTA_SET, FSM_OTHERWISE, A_TRANSITION_COMPLETE,S_IDLE),
FSM_TRANSITION(E_MOVE_SET, G_SET_DELAY, A_DELAY_START, S_IN_DELAY),
FSM_TRANSITION(E_MOVE_SET, G_SET_TRANSITION, A_TRANSITION_START, S_IN_TRANSITION),
FSM_TRANSITION(E_MOVE_SET, FSM_OTHERWISE, FSM_NO_ACTION, S_IDLE)
};
