You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
39 lines
1.5 KiB
39 lines
1.5 KiB
#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; }
|