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.

258 lines
6.3 KiB

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