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.
 
 
 
 

40 lines
1.5 KiB

#include "state_machine.h"
#include <stdio.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; }