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.

419 lines
17 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
4 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
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
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_HIGHT; //关机前的档位
  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. bool fan_control_by_ozone_pwm_falg = false; //风扇由大周期控制
  34. /***********************************************************************************************************************
  35. * =======================================================HOOK======================================================== *
  36. ***********************************************************************************************************************/
  37. void HOOK_pwm_module_set_pwm_duty(uint32_t frequencyhz, uint32_t duty) {
  38. set_pwm_modbul_freq_duty(frequencyhz, duty);
  39. pwm_modble_enable_falg = true;
  40. }
  41. void HOOK_pwm_stop(void) {
  42. set_pwm_modbul_freq_duty(PWM_FREQHZ, 0); //关闭PWM输出
  43. pwm_modble_enable_falg = false;
  44. }
  45. bool HOOK_pwm_is_enable(void) { return pwm_modble_enable_falg; }
  46. int hook_get_autoshutdown_timecount() { return g_auto_shutdown_countdown_s; }
  47. /***********************************************************************************************************************
  48. * =================================================INTERNAL_FUNCTION================================================= *
  49. ***********************************************************************************************************************/
  50. /**
  51. * @brief
  52. *
  53. * @param freq
  54. * @param us
  55. */
  56. int get_duty_by_freq_and_valid_time(uint32_t freq, uint32_t us) {
  57. uint16_t period = 1000000 / freq;
  58. int duty = us * 100 / period;
  59. return duty;
  60. }
  61. /**
  62. * @brief pwm输出rgb的颜色
  63. *
  64. * @param gears
  65. */
  66. void update_ozone_work_level(bool interval_work, WORK_LEVEL_T level) {
  67. printf("update_ozone_work_level(interval_work:%d,level:%d)\n", interval_work, level);
  68. rgb_light_mode_t lightmode;
  69. int duty = 0;
  70. uint32_t pwm_freqhz = 0;
  71. if (level == WORK_LEVEL_CLOSE) {
  72. pwm_freqhz = 1;
  73. duty = 0;
  74. lightmode = RGB_CLOSE;
  75. } else if (level == WORK_LEVEL_LOW) {
  76. pwm_freqhz = 10000;
  77. duty = get_duty_by_freq_and_valid_time(pwm_freqhz, 8);
  78. lightmode = RGB_COLOR_BLUE;
  79. } else if (level == WORK_LEVEL_HIGHT) {
  80. pwm_freqhz = 25000;
  81. duty = get_duty_by_freq_and_valid_time(pwm_freqhz, 8);
  82. lightmode = RGB_COLOR_RED;
  83. }
  84. if (interval_work) {
  85. ozone_pwm_control_module_set_pwm_output_2(pwm_freqhz, duty, INTERVAL_WORK_PERIOD_MS, INTERVAL_WORK_DUTY);
  86. } else {
  87. set_pwm_modbul_freq_duty(pwm_freqhz, duty);
  88. }
  89. light_module_set_rgb_mode(lightmode);
  90. light_module_set_rgb_flicker_mode(interval_work);
  91. }
  92. /**
  93. * @brief
  94. */
  95. void shutdown(void) {
  96. printf("shutdown\n");
  97. g_power_flag = false;
  98. g_error_num = 0;
  99. g_auto_shutdown_flag = false;
  100. g_auto_shutdown_countdown_s = 0;
  101. g_setting_interval_work_flag = false;
  102. update_ozone_work_level(false, WORK_LEVEL_CLOSE);
  103. g_setting_level = WORK_LEVEL_HIGHT;
  104. port_fan_set(false); //关闭风扇
  105. light_module_close_all_light();
  106. ozone_pwm_control_module_stop_pwm();
  107. }
  108. /***********************************************************************************************************************
  109. * ============================================================================================================= *
  110. ***********************************************************************************************************************/
  111. void iwdt_init(void) {
  112. /**
  113. * @brief 0+1
  114. * 2
  115. * 4
  116. */
  117. IWDT_InitStruType x;
  118. x.WDT_Tms = 4000;
  119. x.WDT_IE = Enable; /* IWDT中断使能 */
  120. x.WDT_Rst = Enable; /* IWDT复位使能 */
  121. x.WDT_Clock = IWDT_CLOCK_WDT; /* LRC */
  122. IWDT_Init(&x);
  123. /* 使能IWDT */
  124. IWDT_Enable();
  125. }
  126. void feed_iwdt(void) {
  127. //喂狗
  128. if (0x01 == IWDT_GetFlagStatus()) {
  129. IWDT_Clear();
  130. // printf("喂狗\r\n");
  131. }
  132. }
  133. /**
  134. * @brief
  135. *
  136. */
  137. void cancel_autoshutdown(void) {
  138. g_auto_shutdown_countdown_s = 0;
  139. g_auto_shutdown_flag = false;
  140. light_module_set_autoshutdown_indicator_light(false);
  141. }
  142. /**
  143. * @brief
  144. *
  145. */
  146. void starting_up(void) {
  147. g_power_flag = true; //开关机标志位
  148. g_error_num = 0;
  149. g_auto_shutdown_flag = false; //定时功能使能标志位
  150. g_auto_shutdown_countdown_s = 0; //定时时间
  151. port_fan_set(true); //打开风扇
  152. update_ozone_work_level(false, WORK_LEVEL_HIGHT);
  153. }
  154. void onkey(zkey_t *key, zkey_state_t key_state) {
  155. if (key->hasProcessed) return;
  156. /**
  157. * @brief ,
  158. */
  159. if (!g_power_flag) {
  160. if (key == &s_keys[3] && key->cur_state == zks_falling_edge) {
  161. key->hasProcessed = true;
  162. // printf("key zks_rising_edge\r\n");
  163. /**
  164. * @brief
  165. * 1.
  166. * 2.
  167. * 3.
  168. */
  169. starting_up();
  170. }
  171. return;
  172. }
  173. /**
  174. * @brief
  175. */
  176. if (g_error_num != 0) { //设备存在异常
  177. if (key == &s_keys[3] && key->cur_state == zks_falling_edge) {
  178. key->hasProcessed = true;
  179. printf("process key[2] event\r\n");
  180. /**
  181. * @brief
  182. */
  183. shutdown();
  184. }
  185. return;
  186. }
  187. if (key == &s_keys[0] && key->cur_state == zks_falling_edge) //小于3s
  188. {
  189. printf("process key[0] event\r\n");
  190. /**
  191. * @brief
  192. */
  193. if (g_setting_interval_work_flag == true) { // g_setting_interval_work_flag=true现在是间歇工作
  194. ozone_pwm_control_module_stop_pwm();
  195. g_setting_interval_work_flag = false; // 取消间歇工作
  196. update_ozone_work_level(g_setting_interval_work_flag, g_setting_level);
  197. fan_control_by_ozone_pwm_falg = false;
  198. pwm_modble_enable_falg = false; //硬件pwm使能标志位,这个标志位只在间歇功能下做逻辑了,所以取消间歇功能后将pwm_modble_enable_falg = false;
  199. port_fan_set(true); //打开风扇
  200. }
  201. if (!g_auto_shutdown_flag) {
  202. g_auto_shutdown_flag = true;
  203. g_auto_shutdown_countdown_s = 0;
  204. light_module_set_autoshutdown_indicator_light(true);
  205. }
  206. g_auto_shutdown_countdown_s += AUTO_SHUTDOWN_ONE_LIGHT_EQ_TIME_S;
  207. if (g_auto_shutdown_countdown_s > AUTO_SHUTDOWN_ONE_LIGHT_EQ_TIME_S * 4) {
  208. cancel_autoshutdown();
  209. }
  210. } else if (key == &s_keys[1] && key->cur_state == zks_falling_edge) {
  211. /**
  212. * @brief
  213. */
  214. printf("process key[1] event\r\n");
  215. if (g_setting_level == WORK_LEVEL_HIGHT) {
  216. g_setting_level = WORK_LEVEL_LOW;
  217. update_ozone_work_level(g_setting_interval_work_flag, WORK_LEVEL_LOW);
  218. } else if (g_setting_level == WORK_LEVEL_LOW) {
  219. g_setting_level = WORK_LEVEL_HIGHT;
  220. update_ozone_work_level(g_setting_interval_work_flag, WORK_LEVEL_HIGHT);
  221. }
  222. } else if (key == &s_keys[2] && key->cur_state == zks_falling_edge) {
  223. printf("process key[2] event\r\n");
  224. /**
  225. * @brief
  226. */
  227. if (g_auto_shutdown_flag) { //处于定时关机模式
  228. cancel_autoshutdown();
  229. }
  230. g_setting_interval_work_flag = !g_setting_interval_work_flag;
  231. // fan_control_by_ozone_pwm_falg为true时风扇由大周期控制
  232. fan_control_by_ozone_pwm_falg = !fan_control_by_ozone_pwm_falg;
  233. update_ozone_work_level(g_setting_interval_work_flag, g_setting_level);
  234. } else if (key == &s_keys[3] && key->cur_state == zks_falling_edge) {
  235. printf("process key[2] event\r\n");
  236. /**
  237. * @brief
  238. */
  239. shutdown();
  240. }
  241. }
  242. #define DO_IT_EACH_MS(time) \
  243. { \
  244. static uint32_t __ticket = 0; \
  245. if (port_haspassedms(__ticket) > time) { \
  246. __ticket = get_sys_ticket();
  247. #define END() \
  248. } \
  249. }
  250. /**
  251. * @brief 绿
  252. *
  253. */
  254. void process_interval_rgb_mode(void) {
  255. static bool last_pwm_modble_enable_falg_2;
  256. if (ozone_pwm_control_is_enable() == false) {
  257. return;
  258. }
  259. if (last_pwm_modble_enable_falg_2 != pwm_modble_enable_falg) {
  260. if (pwm_modble_enable_falg == true) {
  261. close_green_led();
  262. last_pwm_modble_enable_falg_2 = pwm_modble_enable_falg;
  263. light_module_set_rgb_flicker_mode(true);
  264. } else if (pwm_modble_enable_falg == false) {
  265. // light_module_set_rgb_mode(RGB_CLOSE);
  266. // DO_IT_EACH_MS(1000) {
  267. open_green_led();
  268. last_pwm_modble_enable_falg_2 = pwm_modble_enable_falg;
  269. light_module_set_rgb_flicker_mode(false);
  270. // }
  271. // END();
  272. }
  273. }
  274. }
  275. /**********************************************************************************************************************
  276. * ============================================================================================================== *
  277. **********************************************************************************************************************/
  278. void fan_module_schedule(void) {
  279. static bool last_pwm_modble_enable_falg = false;
  280. if (!fan_control_by_ozone_pwm_falg) {
  281. return;
  282. } else if (fan_control_by_ozone_pwm_falg && last_pwm_modble_enable_falg != pwm_modble_enable_falg) {
  283. if (pwm_modble_enable_falg == false) { //代表硬件pwm没有输出
  284. last_pwm_modble_enable_falg = pwm_modble_enable_falg;
  285. port_fan_set(false);
  286. } else if (pwm_modble_enable_falg == true) { //代表硬件pwm有输出
  287. last_pwm_modble_enable_falg = pwm_modble_enable_falg;
  288. port_fan_set(true);
  289. }
  290. }
  291. }
  292. /***********************************************************************************************************************
  293. * =============================================================================================================
  294. ***********************************************************************************************************************/
  295. int main(void) {
  296. HRC_Config(Enable, SCU_HRC_48M, Enable); //时钟源SCU_CLK_HRC
  297. SystemInit();
  298. DeviceClockAllEnable(); //打开所有外设时钟
  299. User_SysTickInit(); //滴答定时器初始化为(配置为1ms中断)
  300. SysTick_Enable();
  301. //硬件初始化
  302. unused_gpio_init();
  303. gpio_init();
  304. uart0_init();
  305. //模块初始化
  306. zkey_init(&key_module);
  307. // while (1) {
  308. // }
  309. //上电默认开机并高档工作
  310. starting_up();
  311. //启动结束
  312. printf("Initialization completed\r\n");
  313. //测试
  314. // set_pwm_modbul_freq_duty(25000, 10);
  315. // while (1) {
  316. // }
  317. while (true) {
  318. /*******************************************************************************************************************
  319. * ===================================================================================================== *
  320. *******************************************************************************************************************/
  321. DO_IT_EACH_MS(200) {
  322. static uint8_t debug_led_state = 1;
  323. debug_led_state = !debug_led_state;
  324. port_debug_set(debug_led_state);
  325. }
  326. END()
  327. /***********************************************************************************************************************
  328. * =================================================================================================== *
  329. ***********************************************************************************************************************/
  330. DO_IT_EACH_MS(KEY_PERIOD) { zkey_do_loop_in_each_period(NULL); }
  331. END();
  332. /***********************************************************************************************************************
  333. * =============================================================================================== *
  334. ***********************************************************************************************************************/
  335. light_module_schedule();
  336. /***********************************************************************************************************************
  337. * =============================================================================================== *
  338. ***********************************************************************************************************************/
  339. ozone_pwm_control_module_loop();
  340. /*******************************************************************************************************************
  341. * ===================================================================================================== *
  342. *******************************************************************************************************************/
  343. fan_module_schedule();
  344. /*******************************************************************************************************************
  345. * ==============================================rgb模式============================================== *
  346. *******************************************************************************************************************/
  347. process_interval_rgb_mode();
  348. /***********************************************************************************************************************
  349. * ======================================================================================================= *
  350. ***********************************************************************************************************************/
  351. //
  352. DO_IT_EACH_MS(1000) {
  353. if (g_power_flag && g_auto_shutdown_flag) {
  354. if (g_auto_shutdown_countdown_s > 0) {
  355. g_auto_shutdown_countdown_s -= 1;
  356. printf("auto shutdown countdown %d\n", g_auto_shutdown_countdown_s);
  357. } else {
  358. g_auto_shutdown_flag = false;
  359. /**
  360. * @brief
  361. */
  362. shutdown();
  363. }
  364. }
  365. }
  366. END();
  367. /***********************************************************************************************************************
  368. * =======================================================================================================
  369. ***********************************************************************************************************************/
  370. DO_IT_EACH_MS(EXCEPTION_CHECK_PERIOD) {
  371. /**
  372. * @brief
  373. * ADC的数值是否超出规定范围
  374. */
  375. if (false) {
  376. }
  377. }
  378. END();
  379. // End..................................
  380. }
  381. }