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.

265 lines
6.6 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
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
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 <stdbool.h> //定义布尔
  2. #include <string.h>
  3. #include "key.h"
  4. #include "port.h"
  5. #include "systicket.h"
  6. #include "this_device.h"
  7. static key_t s_keys[] = {
  8. s_key_init("powerkey", port_gpio_get_power_key_state),
  9. s_key_init("levelkey", port_gpio_get_level_key_state),
  10. s_key_init("timerkey", port_gpio_get_timer_key_state),
  11. s_key_init("intervalkey", port_gpio_get_interval_key_state),
  12. };
  13. static ThisDevice_t this_device;
  14. static void mf_led_rgb_set(bool red, bool green, bool blue) {
  15. port_led_r_set(red);
  16. port_led_g_set(green);
  17. port_led_b_set(blue);
  18. }
  19. static void mf_init_all_subdevice_state() {
  20. port_debug_set(false);
  21. port_fan_set(false);
  22. port_led0_set(false);
  23. port_led1_set(false);
  24. port_led2_set(false);
  25. port_led3_set(false);
  26. port_led_r_set(false);
  27. port_led_g_set(false);
  28. port_led_b_set(false);
  29. }
  30. static void time_set_led_state(uint8_t led_num, bool state) {
  31. switch (led_num) {
  32. case 0:
  33. port_led0_set(false);
  34. port_led1_set(false);
  35. port_led2_set(false);
  36. port_led3_set(false);
  37. break;
  38. case 1:
  39. port_led0_set(state);
  40. port_led1_set(false);
  41. port_led2_set(false);
  42. port_led3_set(false);
  43. break;
  44. case 2:
  45. port_led0_set(state);
  46. port_led1_set(state);
  47. port_led2_set(false);
  48. port_led3_set(false);
  49. break;
  50. case 3:
  51. port_led0_set(state);
  52. port_led1_set(state);
  53. port_led2_set(state);
  54. port_led3_set(false);
  55. break;
  56. case 4:
  57. port_led0_set(state);
  58. port_led1_set(state);
  59. port_led2_set(state);
  60. port_led3_set(state);
  61. break;
  62. default:
  63. printf("no more led\n");
  64. break;
  65. }
  66. }
  67. //开始工作
  68. static void startwork() { port_fan_set(true); }
  69. //停止工作
  70. static void stopwork() { port_fan_set(false); }
  71. static void poweron() {
  72. this_device.power = true;
  73. this_device.ozone_level = level_low;
  74. this_device.ozone_module = normal;
  75. startwork();
  76. return;
  77. }
  78. static void powerdown() {
  79. this_device.power = false;
  80. stopwork();
  81. return;
  82. }
  83. // 各个按键处理逻辑
  84. static void mf_process_poweron_key(key_t *key) {
  85. printf("key name:%s\n", key->name);
  86. if (!this_device.power) {
  87. mf_init_all_subdevice_state();
  88. poweron();
  89. } else {
  90. powerdown();
  91. }
  92. return;
  93. }
  94. static void mf_process_level_key(key_t *key) {
  95. if (!this_device.power) {
  96. mf_init_all_subdevice_state();
  97. return;
  98. }
  99. printf("key name:%s\n", key->name);
  100. if (this_device.ozone_level == level_high) {
  101. this_device.ozone_level = level_low;
  102. } else if (this_device.ozone_level == level_low) {
  103. this_device.ozone_level = level_high;
  104. }
  105. return;
  106. }
  107. static void mf_process_timer_key(key_t *key) {
  108. if (!this_device.power) {
  109. mf_init_all_subdevice_state();
  110. return;
  111. }
  112. printf("key name:%s\n", key->name);
  113. this_device.ozone_module = timingMode;
  114. if (this_device.configuration_mode == false) {
  115. this_device.configuration_start_time = systicket_get_now_ms();
  116. this_device.configuration_mode = true;
  117. } else {
  118. this_device.time_led_num = this_device.time_led_num + 1;
  119. if (this_device.time_led_num > 4) {
  120. this_device.time_led_num = this_device.time_led_num - 4;
  121. }
  122. this_device.time_led_start_time = systicket_get_now_ms();
  123. }
  124. return;
  125. }
  126. static void mf_process_interval_key(key_t *key) {
  127. if (!this_device.power) {
  128. mf_init_all_subdevice_state();
  129. return;
  130. }
  131. printf("key name:%s\n", key->name);
  132. this_device.ozone_module = intermittentMode;
  133. return;
  134. }
  135. static void onkey(key_t *key, key_state_t key_state) {
  136. if /* */ (strcmp(key->name, "powerkey") == 0 && zks_rising_edge == key_state) {
  137. mf_process_poweron_key(key);
  138. } else if (strcmp(key->name, "levelkey") == 0 && zks_rising_edge == key_state) {
  139. mf_process_level_key(key);
  140. } else if (strcmp(key->name, "timerkey") == 0 && zks_rising_edge == key_state) {
  141. mf_process_timer_key(key);
  142. } else if (strcmp(key->name, "intervalkey") == 0 && zks_rising_edge == key_state) {
  143. mf_process_interval_key(key);
  144. }
  145. }
  146. key_module_t key_module = key_module_init(s_keys, onkey);
  147. //等级处理
  148. void device_level_process() {
  149. if (this_device.ozone_level == level_low) {
  150. mf_led_rgb_set(true, false, false);
  151. } else if (this_device.ozone_level == level_high) {
  152. mf_led_rgb_set(false, false, true);
  153. }
  154. }
  155. //定时处理
  156. void device_time_process() {
  157. if (this_device.time_led_num > 0 && this_device.ozone_module == timingMode) {
  158. if (systicket_haspassedms(this_device.time_led_start_time) > 5000) {
  159. this_device.time_led_start_time = systicket_get_now_ms();
  160. this_device.time_led_num = this_device.time_led_num - 1;
  161. if (this_device.time_led_num == 0) {
  162. powerdown();
  163. }
  164. }
  165. }
  166. }
  167. void hcis_shcedule_process() {
  168. if (!this_device.power) {
  169. mf_init_all_subdevice_state();
  170. return;
  171. }
  172. device_level_process();
  173. device_time_process();
  174. }
  175. void hcis_shcedule() {
  176. static uint32_t ticket = 0;
  177. if (systicket_haspassedms(ticket) > 30) {
  178. ticket = systicket_get_now_ms();
  179. hcis_shcedule_process();
  180. }
  181. }
  182. void configuration_shcedule() {
  183. static bool led_state;
  184. static uint32_t led_ticket = 0;
  185. if (this_device.configuration_mode == true) {
  186. if (systicket_haspassedms(this_device.configuration_start_time) > 2000) {
  187. this_device.configuration_mode = false;
  188. time_set_led_state(this_device.time_led_num, true);
  189. }
  190. if (systicket_haspassedms(led_ticket) > 100) {
  191. led_ticket = systicket_get_now_ms();
  192. time_set_led_state(this_device.time_led_num, led_state);
  193. led_state = !led_state;
  194. }
  195. } else {
  196. time_set_led_state(this_device.time_led_num, true);
  197. }
  198. }
  199. void hardware_init() {
  200. SystemInit(); //配置系统时钟
  201. DeviceClockAllEnable(); //打开所有外设时钟
  202. systicket_init();
  203. port_init();
  204. }
  205. void hardware_default_settings() { mf_init_all_subdevice_state(); }
  206. void flip_debuf_light_level() {
  207. static uint8_t debug_led_state = 1;
  208. debug_led_state = !debug_led_state;
  209. port_debug_set(debug_led_state);
  210. }
  211. int main() {
  212. hardware_init();
  213. hardware_default_settings();
  214. key_init(&key_module);
  215. while (true) {
  216. // scan key
  217. DO_IT_EACH_MS(20) { key_do_loop_in_each_period(); };
  218. END();
  219. // debug light
  220. DO_IT_EACH_MS(200) {
  221. flip_debuf_light_level();
  222. // printf("fan freq:%lf\n", port_adc_get_fan_power());
  223. }
  224. END();
  225. hcis_shcedule();
  226. configuration_shcedule();
  227. }
  228. return 0;
  229. }