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.

319 lines
13 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
4 years ago
3 years ago
4 years ago
3 years ago
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
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
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
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 "main.h"
  2. #include <stdbool.h> //定义布尔
  3. #include "board.h"
  4. #define PWM_FREQHZ 25000 //硬件pwm频率
  5. /***********************************************************************************************************************
  6. * =========================================================================================================== *
  7. ***********************************************************************************************************************/
  8. void onkey(zkey_t *key, zkey_state_t key_state);
  9. /***********************************************************************************************************************
  10. * =========================================================================================================== *
  11. ***********************************************************************************************************************/
  12. static zkey_t s_keys[] = {
  13. ZKEY_INIT("timerkey", port_gpio_get_timer_key_state),
  14. ZKEY_INIT("gearskey", port_gpio_get_gears_key_state),
  15. ZKEY_INIT("intervalkey", port_gpio_get_interval_key_state),
  16. ZKEY_INIT("switchkey", port_gpio_get_switch_key_state),
  17. };
  18. zkey_module_t key_module = ZMODULE_INIT(s_keys, onkey);
  19. /***********************************************************************************************************************
  20. * =========================================================================================================== *
  21. ***********************************************************************************************************************/
  22. static bool error_even_trigger_after_stop_ozone_work_state; //错误事件触发后停止臭氧工作标志位
  23. // 设置
  24. bool g_setting_interval_work_flag = false; //现在的档位
  25. WORK_LEVEL_T g_setting_level = WORK_LEVEL_LOW; //关机前的档位
  26. //标志位
  27. bool g_power_flag = false; //开关机标志位
  28. static int g_error_num;
  29. bool g_auto_shutdown_flag = false; //定时功能使能标志位
  30. static uint32_t g_auto_shutdown_countdown_s; //定时时间
  31. //其他
  32. static bool pwm_modble_enable_falg; //硬件pwm使能标志位
  33. /***********************************************************************************************************************
  34. * =======================================================HOOK======================================================== *
  35. ***********************************************************************************************************************/
  36. void HOOK_pwm_module_set_pwm_duty(uint32_t frequencyhz, uint32_t duty) {
  37. set_pwm_modbul_freq_duty(frequencyhz, duty);
  38. pwm_modble_enable_falg = true;
  39. }
  40. void HOOK_pwm_stop(void) {
  41. set_pwm_modbul_freq_duty(PWM_FREQHZ, 0); //关闭PWM输出
  42. pwm_modble_enable_falg = false;
  43. }
  44. bool HOOK_pwm_is_enable(void) { return pwm_modble_enable_falg; }
  45. int hook_get_autoshutdown_timecount() { return g_auto_shutdown_countdown_s; }
  46. /***********************************************************************************************************************
  47. * =================================================INTERNAL_FUNCTION================================================= *
  48. ***********************************************************************************************************************/
  49. /**
  50. * @brief pwm输出rgb的颜色
  51. *
  52. * @param gears
  53. */
  54. void update_ozone_work_level(bool interval_work, WORK_LEVEL_T level) {
  55. printf("update_ozone_work_level(interval_work:%d,level:%d)\n", interval_work, level);
  56. rgb_light_mode_t lightmode;
  57. int duty = 0;
  58. if (level == WORK_LEVEL_CLOSE) {
  59. duty = 0;
  60. lightmode = RGB_CLOSE;
  61. } else if (level == WORK_LEVEL_LOW) {
  62. duty = 10;
  63. lightmode = RGB_COLOR_GERRN;
  64. } else if (level == WORK_LEVEL_MIDDLE) {
  65. duty = 20;
  66. lightmode = RGB_COLOR_BLUE;
  67. } else if (level == WORK_LEVEL_HIGHT) {
  68. duty = 25;
  69. lightmode = RGB_COLOR_RED;
  70. }
  71. if (interval_work) {
  72. ozone_pwm_control_module_set_pwm_output_2(PWM_FREQHZ, duty, INTERVAL_WORK_PERIOD_MS, INTERVAL_WORK_DUTY);
  73. } else {
  74. set_pwm_modbul_freq_duty(PWM_FREQHZ, duty);
  75. }
  76. light_module_set_rgb_mode(lightmode);
  77. light_module_set_rgb_flicker_mode(interval_work);
  78. }
  79. /**
  80. * @brief
  81. */
  82. void shutdown(void) {
  83. printf("shutdown\n");
  84. g_power_flag = false;
  85. g_error_num = 0;
  86. g_auto_shutdown_flag = false;
  87. g_auto_shutdown_countdown_s = 0;
  88. update_ozone_work_level(false, WORK_LEVEL_CLOSE);
  89. port_fan_set(false); //关闭风扇
  90. light_module_close_all_light();
  91. }
  92. /***********************************************************************************************************************
  93. * ============================================================================================================= *
  94. ***********************************************************************************************************************/
  95. void iwdt_init(void) {
  96. /**
  97. * @brief 0+1
  98. * 2
  99. * 4
  100. */
  101. IWDT_InitStruType x;
  102. x.WDT_Tms = 4000;
  103. x.WDT_IE = Enable; /* IWDT中断使能 */
  104. x.WDT_Rst = Enable; /* IWDT复位使能 */
  105. x.WDT_Clock = IWDT_CLOCK_WDT; /* LRC */
  106. IWDT_Init(&x);
  107. /* 使能IWDT */
  108. IWDT_Enable();
  109. }
  110. void feed_iwdt(void) {
  111. //喂狗
  112. if (0x01 == IWDT_GetFlagStatus()) {
  113. IWDT_Clear();
  114. // printf("喂狗\r\n");
  115. }
  116. }
  117. void onkey(zkey_t *key, zkey_state_t key_state) {
  118. if (key->hasProcessed) return;
  119. /**
  120. * @brief
  121. */
  122. if (!g_power_flag) {
  123. if (key == &s_keys[3] && key->cur_state == zks_falling_edge) {
  124. key->hasProcessed = true;
  125. // printf("key zks_rising_edge\r\n");
  126. /**
  127. * @brief
  128. * 1.
  129. * 2.
  130. * 3.
  131. */
  132. g_power_flag = true; //开关机标志位
  133. g_error_num = 0;
  134. g_auto_shutdown_flag = false; //定时功能使能标志位
  135. g_auto_shutdown_countdown_s = 0; //定时时间
  136. port_fan_set(true); //打开你风扇
  137. update_ozone_work_level(g_setting_interval_work_flag, g_setting_level);
  138. }
  139. return;
  140. }
  141. /**
  142. * @brief
  143. */
  144. if (g_error_num != 0) { //设备存在异常
  145. if (key == &s_keys[3] && key->cur_state == zks_falling_edge) {
  146. key->hasProcessed = true;
  147. printf("process key[2] event\r\n");
  148. /**
  149. * @brief
  150. */
  151. shutdown();
  152. }
  153. return;
  154. }
  155. if (key == &s_keys[0] && key->cur_state == zks_falling_edge) //小于3s
  156. {
  157. printf("process key[0] event\r\n");
  158. /**
  159. * @brief
  160. */
  161. if (!g_auto_shutdown_flag) {
  162. g_auto_shutdown_flag = true;
  163. g_auto_shutdown_countdown_s = 0;
  164. light_module_set_autoshutdown_indicator_light(true);
  165. }
  166. g_auto_shutdown_countdown_s += AUTO_SHUTDOWN_ONE_LIGHT_EQ_TIME_S;
  167. if (g_auto_shutdown_countdown_s > AUTO_SHUTDOWN_ONE_LIGHT_EQ_TIME_S * 4) {
  168. g_auto_shutdown_countdown_s = 0;
  169. g_auto_shutdown_flag = false;
  170. light_module_set_autoshutdown_indicator_light(false);
  171. }
  172. } else if (key == &s_keys[1] && key->cur_state == zks_falling_edge) {
  173. /**
  174. * @brief
  175. */
  176. printf("process key[1] event\r\n");
  177. if (g_setting_level == WORK_LEVEL_HIGHT) {
  178. g_setting_level = WORK_LEVEL_LOW;
  179. update_ozone_work_level(g_setting_interval_work_flag, WORK_LEVEL_LOW);
  180. } else if (g_setting_level == WORK_LEVEL_MIDDLE) {
  181. g_setting_level = WORK_LEVEL_HIGHT;
  182. update_ozone_work_level(g_setting_interval_work_flag, WORK_LEVEL_HIGHT);
  183. } else if (g_setting_level == WORK_LEVEL_LOW) {
  184. g_setting_level = WORK_LEVEL_MIDDLE;
  185. update_ozone_work_level(g_setting_interval_work_flag, WORK_LEVEL_MIDDLE);
  186. }
  187. } else if (key == &s_keys[2] && key->cur_state == zks_falling_edge) {
  188. printf("process key[2] event\r\n");
  189. /**
  190. * @brief
  191. */
  192. g_setting_interval_work_flag = !g_setting_interval_work_flag;
  193. update_ozone_work_level(g_setting_interval_work_flag, g_setting_level);
  194. } else if (key == &s_keys[3] && key->cur_state == zks_falling_edge) {
  195. printf("process key[2] event\r\n");
  196. /**
  197. * @brief
  198. */
  199. shutdown();
  200. }
  201. }
  202. #define DO_IT_EACH_MS(time) \
  203. { \
  204. static uint32_t __ticket = 0; \
  205. if (port_haspassedms(__ticket) > time) { \
  206. __ticket = get_sys_ticket();
  207. #define END() \
  208. } \
  209. }
  210. /***********************************************************************************************************************
  211. * =============================================================================================================
  212. ***********************************************************************************************************************/
  213. int main(void) {
  214. HRC_Config(Enable, SCU_HRC_48M, Enable); //时钟源SCU_CLK_HRC
  215. SystemInit();
  216. DeviceClockAllEnable(); //打开所有外设时钟
  217. User_SysTickInit(); //滴答定时器初始化为(配置为1ms中断)
  218. SysTick_Enable();
  219. //硬件初始化
  220. unused_gpio_init();
  221. gpio_init();
  222. uart0_init();
  223. //模块初始化
  224. zkey_init(&key_module);
  225. //上电默认关机
  226. shutdown();
  227. //启动结束
  228. printf("Initialization completed\r\n");
  229. //测试
  230. // set_pwm_modbul_freq_duty(25000, 10);
  231. // while (1) {
  232. // }
  233. while (true) {
  234. /*******************************************************************************************************************
  235. * ===================================================================================================== *
  236. *******************************************************************************************************************/
  237. DO_IT_EACH_MS(200) {
  238. static uint8_t debug_led_state = 1;
  239. debug_led_state = !debug_led_state;
  240. port_debug_set(debug_led_state);
  241. }
  242. END()
  243. /***********************************************************************************************************************
  244. * =================================================================================================== *
  245. ***********************************************************************************************************************/
  246. DO_IT_EACH_MS(KEY_PERIOD) { zkey_do_loop_in_each_period(NULL); }
  247. END();
  248. /***********************************************************************************************************************
  249. * =============================================================================================== *
  250. ***********************************************************************************************************************/
  251. light_module_schedule();
  252. /***********************************************************************************************************************
  253. * =============================================================================================== *
  254. ***********************************************************************************************************************/
  255. ozone_pwm_control_module_loop();
  256. /***********************************************************************************************************************
  257. * ======================================================================================================= *
  258. ***********************************************************************************************************************/
  259. //
  260. DO_IT_EACH_MS(1000) {
  261. if (g_power_flag && g_auto_shutdown_flag) {
  262. if (g_auto_shutdown_countdown_s > 0) {
  263. g_auto_shutdown_countdown_s -= 1;
  264. printf("auto shutdown countdown %d\n", g_auto_shutdown_countdown_s);
  265. } else {
  266. g_auto_shutdown_flag = false;
  267. /**
  268. * @brief
  269. */
  270. shutdown();
  271. }
  272. }
  273. }
  274. END();
  275. /***********************************************************************************************************************
  276. * =======================================================================================================
  277. ***********************************************************************************************************************/
  278. DO_IT_EACH_MS(EXCEPTION_CHECK_PERIOD) {
  279. /**
  280. * @brief
  281. * ADC的数值是否超出规定范围
  282. */
  283. if (false) {
  284. }
  285. }
  286. END();
  287. // End..................................
  288. }
  289. }