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.

38 lines
1.5 KiB

3 years ago
  1. #include "state_machine.h"
  2. void state_machine_init(state_machine_t* machine, state_machine_state_t* statetable, size_t len, state_machine_state_t* initstate) {
  3. machine->states = statetable;
  4. machine->nstate = len;
  5. machine->nowstate = initstate;
  6. }
  7. void state_machine_trigger_event(state_machine_t* machine, int event) {
  8. machine->nextstate = machine->process_event(machine, machine->nowstate, event);
  9. }
  10. void state_machine_schedule_each10ms(state_machine_t* machine) {
  11. if (machine->nowstate == NULL) {
  12. machine->laststate = &machine->states[0];
  13. machine->nowstate = &machine->states[0];
  14. machine->nowstate->duration = 0;
  15. printf("%s\n", machine->nowstate->name);
  16. machine->process_event(machine, machine->nowstate, ENTER_STATE);
  17. }
  18. if (!machine->nextstate && machine->nextstate != machine->nowstate) {
  19. //状态退出
  20. printf("%s exit\n", machine->nowstate->name);
  21. machine->process_event(machine, machine->nowstate, EXIT_STATE);
  22. //切换状态
  23. machine->laststate = machine->nowstate;
  24. machine->nowstate = machine->nextstate;
  25. machine->nextstate = NULL;
  26. machine->nowstate->duration = 0;
  27. printf("%s enter\n", machine->nowstate->name);
  28. machine->process_event(machine, machine->nowstate, ENTER_STATE);
  29. }
  30. machine->nextstate = machine->process_event(machine, machine->nowstate, TIME_EVENT);
  31. machine->nowstate->duration++;
  32. }
  33. uint32_t state_machine_get_state_duration_ms(state_machine_state_t* state) { return state->duration * 10; }