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.1 KiB

3 years ago
  1. #pragma once
  2. #include <stdbool.h>
  3. #include <stdint.h>
  4. #include <stdlib.h>
  5. typedef struct state_machine_state_s state_machine_state_t;
  6. typedef struct state_machine_s state_machine_t;
  7. typedef state_machine_state_t* (*state_machine_process_event_t)(state_machine_t* machine, state_machine_state_t* nowstate, int event);
  8. struct state_machine_state_s {
  9. char const* name;
  10. int stateId;
  11. int duration; //当前这个状态持续了多久
  12. };
  13. struct state_machine_s {
  14. state_machine_state_t* states;
  15. int nstate;
  16. //
  17. state_machine_state_t* nowstate;
  18. state_machine_process_event_t process_event;
  19. state_machine_state_t* nextstate;
  20. state_machine_state_t* laststate;
  21. };
  22. /**
  23. * @brief
  24. * 0->1000
  25. */
  26. #define TIME_EVENT 0x01 //
  27. #define ENTER_STATE 0x02 //
  28. #define EXIT_STATE 0x03 //
  29. void state_machine_init(state_machine_t* machine, state_machine_state_t* statetable, size_t len, state_machine_state_t* initstate);
  30. void state_machine_trigger_event(state_machine_t* machine, int event);
  31. void state_machine_schedule_each10ms(state_machine_t* machine);
  32. //
  33. uint32_t state_machine_get_state_duration_ms(state_machine_state_t* state);