#include "state_machine.h" void state_machine_init(state_machine_t* machine, state_machine_state_t* statetable, size_t len, state_machine_process_event_t process_event) { machine->states = statetable; machine->nstate = len; machine->nowstate = &statetable[0]; machine->process_event = process_event; } void state_machine_trigger_event(state_machine_t* machine, int event) { machine->nextstate = machine->process_event(machine, machine->nowstate, event); } void state_machine_schedule_each10ms(state_machine_t* machine) { if (machine->nowstate == NULL) { machine->laststate = &machine->states[0]; machine->nowstate = &machine->states[0]; machine->nowstate->duration = 0; printf("%s\n", machine->nowstate->name); machine->process_event(machine, machine->nowstate, ENTER_STATE); } if (!machine->nextstate && machine->nextstate != machine->nowstate) { //状态退出 printf("%s exit\n", machine->nowstate->name); machine->process_event(machine, machine->nowstate, EXIT_STATE); //切换状态 machine->laststate = machine->nowstate; machine->nowstate = machine->nextstate; machine->nextstate = NULL; machine->nowstate->duration = 0; printf("%s enter\n", machine->nowstate->name); machine->process_event(machine, machine->nowstate, ENTER_STATE); } machine->nextstate = machine->process_event(machine, machine->nowstate, TIME_EVENT); machine->nowstate->duration++; } uint32_t state_machine_get_state_duration_ms(state_machine_state_t* state) { return state->duration * 10; }