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.

143 lines
3.7 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
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
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 "ozone_control_service.h"
  2. #include "../zes8p5066lib/systicket.h"
  3. #include "frequency_sweep_service.h"
  4. #include "state_machine.h"
  5. /**
  6. * @brief
  7. *
  8. * :
  9. * ------> ---->
  10. * ^ |
  11. * |------------------|
  12. *
  13. *
  14. * -----> --> ---->
  15. *
  16. **/
  17. typedef enum {
  18. kIdleState,
  19. kBeforeWorkingStateSweepFrequency,
  20. kWorkingState,
  21. } StateId_t;
  22. state_machine_state_t states[] = {
  23. [kIdleState] =
  24. {
  25. .name = "kIdleState",
  26. .stateId = kIdleState,
  27. .duration = 0,
  28. },
  29. [kBeforeWorkingStateSweepFrequency] =
  30. {
  31. .name = "kBeforeWorkingStateSweepFrequency",
  32. .stateId = kBeforeWorkingStateSweepFrequency,
  33. .duration = 0,
  34. },
  35. [kWorkingState] = //
  36. {
  37. .name = "kWorkingState",
  38. .stateId = kWorkingState,
  39. .duration = 0,
  40. }
  41. //
  42. };
  43. state_machine_t statemachine = {
  44. .states = states,
  45. .nstate = sizeof(states) / sizeof(states[0]),
  46. .nowstate = &states[kIdleState],
  47. .process_event = NULL,
  48. .nextstate = NULL,
  49. .laststate = NULL,
  50. };
  51. typedef struct {
  52. float resonant_frequency;
  53. } Context_t;
  54. static Context_t context;
  55. static float const_level1_expect_power;
  56. static uint16_t get_resonant_frequency(uint16_t startfreq, uint16_t step, uint16_t endfreq) {
  57. /**
  58. * @brief
  59. */
  60. float minpower = 0;
  61. uint16_t retfreq = 0;
  62. bool inited = false;
  63. for (uint16_t freq = startfreq; freq <= endfreq; freq += step) {
  64. float power = frequency_sweep_get_power(freq);
  65. if (inited) {
  66. minpower = power;
  67. retfreq = freq;
  68. inited = false;
  69. continue;
  70. }
  71. if (power < minpower) {
  72. minpower = power;
  73. retfreq = freq;
  74. }
  75. }
  76. return retfreq;
  77. }
  78. static state_machine_state_t* processBeforeWorkingStateSweepFrequency(state_machine_t* machine, state_machine_state_t* nowstate, int event) {
  79. /**
  80. * @brief
  81. */
  82. if (event == ENTER_STATE) {
  83. frequency_sweep_start(20000, 100, 40000, 3000);
  84. } else if (event == TIME_EVENT) {
  85. if (frequency_sweep_is_done()) {
  86. context.resonant_frequency = get_resonant_frequency(25000, 100, 35000);
  87. printf("----------Summarize--------\n");
  88. printf("-resonant_frequency: %f\n", context.resonant_frequency);
  89. return &states[kWorkingState];
  90. }
  91. } else if (event == EXIT_STATE) {
  92. frequency_sweep_stop();
  93. }
  94. }
  95. static float mf_get_ozone_power() {
  96. float powersum = 0;
  97. for (size_t i = 0; i < 10; i++) {
  98. powersum += port_adc_get_ozone_generator_power();
  99. }
  100. return powersum / 10;
  101. }
  102. static state_machine_state_t* state_machine_process_event(state_machine_t* machine, state_machine_state_t* nowstate, int event) {
  103. if /* */ (nowstate == &states[kIdleState]) {
  104. } else if (nowstate == &states[kBeforeWorkingStateSweepFrequency]) {
  105. processBeforeWorkingStateSweepFrequency(machine, nowstate, event);
  106. } else if (nowstate == &states[kWorkingState]) {
  107. if (event == ENTER_STATE) {
  108. /**
  109. * @brief
  110. */
  111. port_ozone_pwm_set_duty(context.resonant_frequency, 5000);
  112. port_ozone_pwm_start();
  113. } else if (event == TIME_EVENT) {
  114. /**
  115. * @brief
  116. */
  117. static uint32_t last_ticket = 0;
  118. if (systicket_haspassedms(last_ticket) > 10) {
  119. last_ticket = systicket_getms();
  120. float power = mf_get_ozone_power();
  121. }
  122. } else if (event == EXIT_STATE) {
  123. port_ozone_pwm_stop();
  124. }
  125. }
  126. }
  127. /**
  128. * @brief
  129. * 1.6W
  130. */