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.

41 lines
1.5 KiB

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