83 lines
1.5 KiB
C
83 lines
1.5 KiB
C
typedef char bool;
|
|
|
|
typedef enum
|
|
{
|
|
STATE_I = 0,
|
|
STATE_A,
|
|
STATE_B,
|
|
STATE_C,
|
|
STATE_D
|
|
}
|
|
testfsm_state_t;
|
|
|
|
typedef struct
|
|
{
|
|
testfsm_state_t m_state;
|
|
bool m_a;
|
|
bool m_b;
|
|
} testfsm_t;
|
|
|
|
void process(testfsm_t *p_fsm, const bool input)
|
|
{
|
|
testfsm_state_t nextState = p_fsm->m_state;
|
|
|
|
p_fsm->m_a = false;
|
|
p_fsm->m_b = false;
|
|
|
|
switch(p_fsm->m_state)
|
|
{
|
|
case STATE_I:
|
|
if (!input)
|
|
nextState = STATE_A;
|
|
else
|
|
nextState = STATE_B;
|
|
break;
|
|
case STATE_A:
|
|
p_fsm->m_a = true;
|
|
if (!input)
|
|
nextState = STATE_D;
|
|
else
|
|
nextState = STATE_C;
|
|
break;
|
|
case STATE_B:
|
|
p_fsm->m_a = true;
|
|
p_fsm->m_b = true;
|
|
nextState = STATE_C;
|
|
break;
|
|
case STATE_C:
|
|
p_fsm->m_b = true;
|
|
nextState = STATE_A;
|
|
break;
|
|
case STATE_D:
|
|
nextState = STATE_B;
|
|
break;
|
|
}
|
|
|
|
p_fsm->m_state = nextState;
|
|
}
|
|
|
|
bool randbool(int throws)
|
|
{
|
|
bool stillTrue = true;
|
|
for (int i = 0; i < throws; ++i)
|
|
{
|
|
stillTrue &= rand() & 1;
|
|
}
|
|
return stillTrue;
|
|
}
|
|
|
|
int main()
|
|
{
|
|
testfsm_t fsm = { .m_state = STATE_I, .m_a = false, .m_b = false };
|
|
bool input = false;
|
|
|
|
srand(0);
|
|
for (int j = 0; j < 100; ++j)
|
|
{
|
|
input = randbool(1);
|
|
process(&fsm, input);
|
|
}
|
|
|
|
return 0;
|
|
}
|