Files
OBD2-car-display/due_obd2/statemachine.c
Sem van der Hoeven ef4ed9b617 finished state machine
2023-10-30 23:45:38 +01:00

60 lines
1.2 KiB
C

#include "statemachine.h"
int current_state_id = 0;
state_t states[STATE_AMOUNT] = {NULL, NULL};
__UINT8_TYPE__ next = 0;
__UINT8_TYPE__ statemachine_register_state(state_t *state, int index)
{
if (index >= STATE_AMOUNT)
{
return 0;
}
if (state->id != index)
{
return 0;
}
states[index] = *state;
return 1;
}
__UINT8_TYPE__ statemachine_init()
{
for (int i = 0; i < STATE_AMOUNT; i++)
{
if (states[i].id < 0 || states[i].next < 0 || states[i].on_enter == NULL || states[i].on_run == NULL || states[i].on_exit == NULL)
{
return 0;
}
}
current_state_id = 0;
states[current_state_id].on_enter();
}
void statemachine_loop()
{
if (next)
{
next = 0;
if (states[current_state_id].on_exit != NULL)
{
states[current_state_id].on_exit();
}
if (states[current_state_id].next >= 0 && states[current_state_id].next != current_state_id)
{
current_state_id = states[current_state_id].next;
}
states[current_state_id].on_enter();
}
if (states[current_state_id].on_run != NULL)
{
states[current_state_id].on_run();
}
}
void statemachine_next()
{
next = 1;
}