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.

263 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
  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. this_device.time_led_num = 0;
  134. mf_led_rgb_set(false, false, false);
  135. stopwork();
  136. return;
  137. }
  138. static void onkey(key_t *key, key_state_t key_state) {
  139. if /* */ (strcmp(key->name, "powerkey") == 0 && zks_rising_edge == key_state) {
  140. mf_process_poweron_key(key);
  141. } else if (strcmp(key->name, "levelkey") == 0 && zks_rising_edge == key_state) {
  142. mf_process_level_key(key);
  143. } else if (strcmp(key->name, "timerkey") == 0 && zks_rising_edge == key_state) {
  144. mf_process_timer_key(key);
  145. } else if (strcmp(key->name, "intervalkey") == 0 && zks_rising_edge == key_state) {
  146. mf_process_interval_key(key);
  147. }
  148. }
  149. key_module_t key_module = key_module_init(s_keys, onkey);
  150. //等级处理
  151. void device_level_process() {
  152. if (this_device.ozone_level == level_low) {
  153. mf_led_rgb_set(true, false, false);
  154. } else if (this_device.ozone_level == level_high) {
  155. mf_led_rgb_set(false, false, true);
  156. }
  157. }
  158. //定时处理
  159. void device_time_process() {
  160. printf("led_num = %d,", this_device.time_led_num);
  161. if (this_device.time_led_num > 0 && this_device.ozone_module == timingMode) {
  162. if (systicket_haspassedms(this_device.time_led_start_time) > 5000) {
  163. this_device.time_led_start_time = systicket_get_now_ms();
  164. this_device.time_led_num = this_device.time_led_num - 1;
  165. }
  166. }
  167. }
  168. void hcis_shcedule_process() {
  169. if (!this_device.power) {
  170. mf_init_all_subdevice_state();
  171. return;
  172. }
  173. device_level_process();
  174. device_time_process();
  175. }
  176. void hcis_shcedule() {
  177. static uint32_t ticket = 0;
  178. if (systicket_haspassedms(ticket) > 30) {
  179. ticket = systicket_get_now_ms();
  180. hcis_shcedule_process();
  181. }
  182. }
  183. void configuration_shcedule() {
  184. static bool led_state;
  185. static uint32_t led_ticket = 0;
  186. if (this_device.configuration_mode == true) {
  187. if (systicket_haspassedms(this_device.configuration_start_time) > 2000) {
  188. this_device.configuration_mode = false;
  189. time_set_led_state(this_device.time_led_num, true);
  190. }
  191. if (systicket_haspassedms(led_ticket) > 100) {
  192. led_ticket = systicket_get_now_ms();
  193. time_set_led_state(this_device.time_led_num, led_state);
  194. led_state = !led_state;
  195. }
  196. } else {
  197. time_set_led_state(this_device.time_led_num, true);
  198. }
  199. }
  200. void hardware_init() {
  201. SystemInit(); //配置系统时钟
  202. DeviceClockAllEnable(); //打开所有外设时钟
  203. systicket_init();
  204. port_init();
  205. }
  206. void hardware_default_settings() { mf_init_all_subdevice_state(); }
  207. void flip_debuf_light_level() {
  208. static uint8_t debug_led_state = 1;
  209. debug_led_state = !debug_led_state;
  210. port_debug_set(debug_led_state);
  211. }
  212. int main() {
  213. hardware_init();
  214. hardware_default_settings();
  215. key_init(&key_module);
  216. while (true) {
  217. // scan key
  218. DO_IT_EACH_MS(20) { key_do_loop_in_each_period(); };
  219. END();
  220. // debug light
  221. DO_IT_EACH_MS(200) { flip_debuf_light_level(); }
  222. END();
  223. hcis_shcedule();
  224. configuration_shcedule();
  225. }
  226. return 0;
  227. }