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

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