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.

455 lines
16 KiB

4 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
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
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
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. #define TIMING_TICK 20000
  4. #define INTERVAL_PERIOD 10000
  5. /***********************************************************************************************************************
  6. * =====================================================ȫֱ====================================================== *
  7. ***********************************************************************************************************************/
  8. bool starting_up_state = false; //���ػ���־λ
  9. bool timing_function_enable_falg = false; //��ʱ����ʹ�ܱ�־λ
  10. static uint32_t s_timing_shutdown_begin_ticket = 0; //��ʱ��ʼʱ����ʱ��ϵͳʱ��
  11. static uint32_t s_timing_time; //��ʱʱ��
  12. static uint32_t s_interval_period = 0; //��Ъ���ܵ�����
  13. static uint8_t s_now_interval_duty = 0; //��Ъ���ܵ�ռ�ձ�
  14. static uint8_t s_intervalkey_press_count = 0; //��Ъ�������µĴ���
  15. WORK_LEVEL_T now_level; //���ڵĵ�λ
  16. WORK_LEVEL_T shutdown_before_level; //�ػ�ǰ�ĵ�λ
  17. error_state_t error_state; //�ĸ������¼�
  18. static bool error_even_trigger_after_stop_ozone_work_state; //�����¼�������ֹͣ����������־λ
  19. static bool pwm_modble_enable_falg; //Ӳ��pwmʹ�ܱ�־λ
  20. //####################### HOOKʵ�� ################################//
  21. void HOOK_pwm_module_set_pwm_duty(uint32_t frequency, uint32_t duty) {
  22. set_pwm_modbul_freq_duty(frequency, duty);
  23. port_fan_set(true); //�򿪷���
  24. pwm_modble_enable_falg = true;
  25. printf("work\r\n");
  26. }
  27. void HOOK_pwm_stop(void) {
  28. set_pwm_modbul_freq_duty(1, 0); //�ر�PWM����
  29. port_fan_set(false); //���Ƚ�������
  30. pwm_modble_enable_falg = false;
  31. printf("rest\r\n");
  32. }
  33. bool HOOK_pwm_is_enable(void) { return pwm_modble_enable_falg; }
  34. //####################### ������ ################################//
  35. void process_intervalkey_press_even(void) {
  36. s_intervalkey_press_count++;
  37. if (s_intervalkey_press_count == 1) {
  38. update_interval_period_duty(50);
  39. } else {
  40. update_interval_period_duty(100); // ����update_interval_period_duty��100������s_intervalkey_press_count=0
  41. }
  42. }
  43. /**
  44. * @brief
  45. *
  46. */
  47. void update_interval_period_duty(uint8_t interval_duty) {
  48. if (interval_duty == 100) { //ռ�ձ�����100һֱ����
  49. printf("duty 100\r\n");
  50. s_interval_period = 0;
  51. s_now_interval_duty = 100;
  52. s_intervalkey_press_count = 0;
  53. ozone_pwm_control_disable();
  54. restore_the_mode_before_intermittent_work();
  55. } else if (interval_duty == 50) {
  56. printf("duty 50\r\n");
  57. s_interval_period = INTERVAL_PERIOD;
  58. s_now_interval_duty = 50;
  59. ozone_pwm_control_enable();
  60. }
  61. ozone_pwm_control_module_set_pwm_output_1(s_interval_period, s_now_interval_duty);
  62. }
  63. /**
  64. * @brief ָЪǰĹλ
  65. *
  66. */
  67. void restore_the_mode_before_intermittent_work(void) {
  68. if (now_level == WORK_LEVEL_LOW) {
  69. light_module_set_rgb_mode(RGB_COLOR_GERRN);
  70. set_pwm_modbul_freq_duty(1, 25);
  71. port_fan_set(true); //�򿪷���
  72. } else if (now_level == WORK_LEVEL_MIDDLE) {
  73. light_module_set_rgb_mode(RGB_COLOR_BLUE);
  74. set_pwm_modbul_freq_duty(1, 50);
  75. port_fan_set(true); //�򿪷���
  76. } else if (now_level == WORK_LEVEL_HIGHT) {
  77. light_module_set_rgb_mode(RGB_COLOR_RED);
  78. set_pwm_modbul_freq_duty(1, 100);
  79. port_fan_set(true); //�򿪷���
  80. }
  81. }
  82. /**
  83. * @brief Ъܿʱrgb3s1s
  84. *
  85. */
  86. void process_rgb_flicker(void) {
  87. static uint32_t rgb_ticket = 0;
  88. static uint8_t rgb_ticket_count = 0;
  89. if (port_haspassedms(rgb_ticket) > 1000) {
  90. rgb_ticket = get_sys_ticket();
  91. if (rgb_ticket_count < 3) {
  92. if (now_level == WORK_LEVEL_LOW) {
  93. light_module_set_rgb_mode(RGB_COLOR_GERRN);
  94. } else if (now_level == WORK_LEVEL_MIDDLE) {
  95. light_module_set_rgb_mode(RGB_COLOR_BLUE);
  96. } else if (now_level == WORK_LEVEL_HIGHT) {
  97. light_module_set_rgb_mode(RGB_COLOR_RED);
  98. }
  99. } else {
  100. light_module_set_rgb_mode(RGB_CLOSE);
  101. rgb_ticket_count = 0;
  102. }
  103. rgb_ticket_count++;
  104. }
  105. }
  106. /***********************************************************************************************************************
  107. * =============================================================================================================== *
  108. ***********************************************************************************************************************/
  109. static zkey_t s_keys[] = {
  110. ZKEY_INIT("timerkey", port_gpio_get_timer_key_state),
  111. ZKEY_INIT("gearskey", port_gpio_get_gears_key_state),
  112. ZKEY_INIT("intervalkey", port_gpio_get_interval_key_state),
  113. ZKEY_INIT("switchkey", port_gpio_get_switch_key_state),
  114. };
  115. zkey_module_t key_module = ZMODULE_INIT(s_keys, onkey);
  116. void onkey(zkey_t *key, zkey_state_t key_state) {
  117. /**
  118. * @brief жÿ״̬
  119. *
  120. * @param key
  121. * @param key_state
  122. */
  123. if (starting_up_state && error_state.no_error == true) { //������
  124. if (key == &s_keys[0] && //��ʱ����
  125. key->cur_state == zks_keep && //����
  126. !key->hasProcessed && //û�б�������
  127. key->keep_state_count >= POWER_KEY_TRIGGER_TIME / KEY_SCAN_PERIOD) //���³���ʱ������3s
  128. {
  129. key->hasProcessed = true;
  130. } else if (key == &s_keys[0] && //��ʱ����
  131. key->cur_state == zks_falling_edge && //�½��ش���
  132. !key->hasProcessed && key->keep_state_count <= POWER_KEY_TRIGGER_TIME / KEY_SCAN_PERIOD) //��3s
  133. {
  134. key->hasProcessed = true;
  135. printf("key0 zks_falling_edge\r\n");
  136. update_timing_time();
  137. updae_led_light_mode();
  138. } else if (key == &s_keys[1] && //�ߵ͵�λѡ��
  139. key->cur_state == zks_rising_edge && //
  140. !key->hasProcessed && //
  141. key->keep_state_count <= POWER_KEY_TRIGGER_TIME / KEY_SCAN_PERIOD) {
  142. key->hasProcessed = true;
  143. printf("key1 zks_rising_edge\r\n");
  144. process_gearskey_press_even();
  145. } else if (key == &s_keys[2] && //��Ъ��������ѡ��
  146. key->cur_state == zks_rising_edge && //
  147. !key->hasProcessed && //
  148. key->keep_state_count <= POWER_KEY_TRIGGER_TIME / KEY_SCAN_PERIOD) {
  149. key->hasProcessed = true;
  150. printf("key2 zks_rising_edge\r\n");
  151. process_intervalkey_press_even();
  152. } else if (key == &s_keys[3] && //���ذ���
  153. key->cur_state == zks_rising_edge && //
  154. !key->hasProcessed && //
  155. key->keep_state_count <= POWER_KEY_TRIGGER_TIME / KEY_SCAN_PERIOD) {
  156. key->hasProcessed = true;
  157. printf("key2 zks_rising_edge\r\n");
  158. shutdown();
  159. }
  160. } else { //�ػ���
  161. if (key == &s_keys[3] && //���ذ���
  162. key->cur_state == zks_rising_edge && //
  163. !key->hasProcessed && //
  164. key->keep_state_count <= POWER_KEY_TRIGGER_TIME / KEY_SCAN_PERIOD) {
  165. key->hasProcessed = true;
  166. printf("key zks_rising_edge\r\n");
  167. if (error_state.no_error == false) {
  168. shutdown();
  169. }
  170. starting_up();
  171. }
  172. }
  173. }
  174. /**
  175. * @brief ϵ,пػⲿϵ󣬲
  176. *
  177. */
  178. void power_on_ozone_working_status(void) {
  179. update_ozone_work_gears(WORK_LEVEL_CLOSE);
  180. light_module_set_timing_light_mode(CLOSE_ALL_LED);
  181. port_fan_set(false); //�رշ���
  182. }
  183. //####################### ����� #######################/
  184. /**
  185. * @brief ݵλpwmrgbɫ
  186. *
  187. * @param gears
  188. */
  189. void update_ozone_work_gears(WORK_LEVEL_T level) {
  190. if (level == WORK_LEVEL_CLOSE) {
  191. ozone_pwm_control_module_set_pwm_output_2(1, 0, s_interval_period, s_now_interval_duty);
  192. light_module_set_rgb_mode(RGB_CLOSE);
  193. } else if (level == WORK_LEVEL_LOW) {
  194. ozone_pwm_control_module_set_pwm_output_2(1, 25, s_interval_period, s_now_interval_duty);
  195. light_module_set_rgb_mode(RGB_COLOR_GERRN);
  196. } else if (level == WORK_LEVEL_MIDDLE) {
  197. ozone_pwm_control_module_set_pwm_output_2(1, 50, s_interval_period, s_now_interval_duty);
  198. light_module_set_rgb_mode(RGB_COLOR_BLUE);
  199. } else if (level == WORK_LEVEL_HIGHT) {
  200. ozone_pwm_control_module_set_pwm_output_2(1, 100, s_interval_period, s_now_interval_duty);
  201. light_module_set_rgb_mode(RGB_COLOR_RED);
  202. }
  203. now_level = level;
  204. }
  205. void process_gearskey_press_even(void) {
  206. static uint8_t gearskey_press_count;
  207. gearskey_press_count++;
  208. if (gearskey_press_count == 1) {
  209. update_ozone_work_gears(WORK_LEVEL_MIDDLE);
  210. } else if (gearskey_press_count == 2) {
  211. update_ozone_work_gears(WORK_LEVEL_LOW);
  212. } else if (gearskey_press_count == 3) {
  213. gearskey_press_count = 0;
  214. update_ozone_work_gears(WORK_LEVEL_HIGHT);
  215. }
  216. }
  217. //####################### �����ػ� #######################/
  218. void shutdown(void) {
  219. ozone_pwm_control_disable();
  220. error_state.no_error = true;
  221. s_intervalkey_press_count = 0;
  222. shutdown_before_level = now_level;
  223. starting_up_state = false;
  224. update_ozone_work_gears(WORK_LEVEL_CLOSE);
  225. light_module_set_timing_light_mode(CLOSE_ALL_LED);
  226. port_fan_set(false); //�رշ���
  227. error_state.fan_error_status = false;
  228. error_state.way_circuit_error_status = false;
  229. error_even_trigger_after_stop_ozone_work_state = false;
  230. }
  231. /**
  232. * @brief 󣬸ݹػʱĵλãػʱλΪرΪߵ
  233. *
  234. */
  235. void starting_up(void) {
  236. //����û�м�Ъ������������ռ�ձ�Ϊ100
  237. update_interval_period_duty(100);
  238. //����û�ж�ʱ�������Խ� timing_function_enable_falg = false; s_timing_time = 0;
  239. timing_function_enable_falg = false;
  240. s_timing_time = 0;
  241. starting_up_state = true;
  242. if (shutdown_before_level == WORK_LEVEL_CLOSE) {
  243. update_ozone_work_gears(WORK_LEVEL_HIGHT);
  244. } else {
  245. update_ozone_work_gears(shutdown_before_level);
  246. }
  247. port_fan_set(true); //����������
  248. }
  249. void process_switchkey(void) {
  250. static bool switchkey_press_count = 0;
  251. switchkey_press_count = !switchkey_press_count;
  252. if (switchkey_press_count) { //����
  253. starting_up();
  254. } else { //�ػ�
  255. shutdown();
  256. }
  257. }
  258. //####################### ��ʱ���� #######################/
  259. /**
  260. * @brief ڵʱи
  261. *
  262. */
  263. void updae_led_light_mode(void) {
  264. if ((s_timing_time / TIMING_TICK) == 0) {
  265. light_module_set_timing_light_mode(CLOSE_ALL_LED);
  266. } else if ((s_timing_time / TIMING_TICK) == 1) {
  267. light_module_set_timing_light_mode(OPEN_ONE_LED);
  268. } else if ((s_timing_time / TIMING_TICK) == 2) {
  269. light_module_set_timing_light_mode(OPEN_TWO_LED);
  270. } else if ((s_timing_time / TIMING_TICK) == 3) {
  271. light_module_set_timing_light_mode(OPEN_THREE_LED);
  272. } else if ((s_timing_time / TIMING_TICK) == 4) {
  273. light_module_set_timing_light_mode(OPEN_FOUR_LED);
  274. }
  275. }
  276. /**
  277. * @brief ÿΰʱtiming_time=timing_time+TIMING_TICK
  278. * timing_time==timing_time = 4 * TIMING_TICK;
  279. * timing_time = 0;
  280. *
  281. */
  282. void update_timing_time(void) {
  283. s_timing_shutdown_begin_ticket = get_sys_ticket(); //���¶�ʱ�ػ���ʼ��ʱ��
  284. update_begin_ticket(); //���¼�Ъ��ʼ��ʱ��
  285. timing_function_enable_falg = true; //ʹ�ܶ�ʱ����
  286. if (s_timing_time == 0) {
  287. s_timing_time = 1 * TIMING_TICK;
  288. } else if ((s_timing_time / TIMING_TICK) == 1) {
  289. s_timing_time = 2 * TIMING_TICK;
  290. } else if ((s_timing_time / TIMING_TICK) == 2) {
  291. s_timing_time = 3 * TIMING_TICK;
  292. } else if ((s_timing_time / TIMING_TICK) == 3) {
  293. s_timing_time = 4 * TIMING_TICK;
  294. } else if ((s_timing_time / TIMING_TICK) == 4) {
  295. s_timing_time = 0 * TIMING_TICK;
  296. timing_function_enable_falg = false;
  297. update_interval_period_duty(100);
  298. }
  299. printf("timing time:%d\r\n", s_timing_time);
  300. }
  301. /**
  302. * @brief ʱÿTIMING_TICK timing_time=timing_time-TIMING_TICK
  303. * TIMING_TICK==0ʱػ
  304. *
  305. */
  306. void try_shutdown(void) {
  307. if (port_haspassedms(s_timing_shutdown_begin_ticket) > TIMING_TICK) {
  308. s_timing_shutdown_begin_ticket = get_sys_ticket();
  309. printf("time minus %dms", TIMING_TICK);
  310. s_timing_time -= TIMING_TICK;
  311. updae_led_light_mode();
  312. }
  313. if (s_timing_time == 0) { //��ʱʱ�䵽
  314. timing_function_enable_falg = false; //ʧ�ܶ�ʱ����
  315. shutdown();
  316. }
  317. }
  318. bool timing_function_is_enable(void) { return timing_function_enable_falg; }
  319. void iwdt_init(void) {
  320. /**
  321. * @brief Źܣ0ʱڼ+1
  322. * ڼΪ2ʱ򣬲ж
  323. * ڼΪ4֮ǰûнιλ
  324. *
  325. */
  326. IWDT_InitStruType x;
  327. x.WDT_Tms = 4000;
  328. x.WDT_IE = Enable; /* IWDT�ж�ʹ�� */
  329. x.WDT_Rst = Enable; /* IWDT��λʹ�� */
  330. x.WDT_Clock = IWDT_CLOCK_WDT; /* LRC */
  331. IWDT_Init(&x);
  332. /* ʹ��IWDT */
  333. IWDT_Enable();
  334. }
  335. void feed_iwdt(void) {
  336. //�
  337. if (0x01 == IWDT_GetFlagStatus()) //�����ж�
  338. {
  339. IWDT_Clear();
  340. // printf("�\r\n");
  341. }
  342. }
  343. void process_error_even(void) {
  344. if (error_state.fan_error_status == true) {
  345. error_state.no_error = false;
  346. if (!error_even_trigger_after_stop_ozone_work_state) {
  347. error_even_trigger_after_stop_ozone_work_state = true;
  348. set_pwm_modbul_freq_duty(1, 0);
  349. light_module_set_rgb_mode(RGB_CLOSE);
  350. light_module_set_timing_light_mode(CLOSE_ALL_LED);
  351. port_fan_set(false); //�رշ���
  352. }
  353. static uint32_t error_even_fan_ticket = 0;
  354. static uint8_t one_led_flicker_state = 1;
  355. if (port_haspassedms(error_even_fan_ticket) > 500) {
  356. error_even_fan_ticket = get_sys_ticket();
  357. one_led_flicker_state = !one_led_flicker_state;
  358. port_led0_set(one_led_flicker_state);
  359. }
  360. } else if (error_state.way_circuit_error_status == true) {
  361. error_state.no_error = false;
  362. if (!error_even_trigger_after_stop_ozone_work_state) {
  363. error_even_trigger_after_stop_ozone_work_state = true;
  364. set_pwm_modbul_freq_duty(1, 0);
  365. light_module_set_rgb_mode(RGB_CLOSE);
  366. light_module_set_timing_light_mode(CLOSE_ALL_LED);
  367. port_fan_set(false); //�رշ���
  368. }
  369. static uint32_t error_even_way_circuit = 0;
  370. static uint8_t two_led_flicker_state = 1;
  371. if (port_haspassedms(error_even_way_circuit) > 500) {
  372. error_even_way_circuit = get_sys_ticket();
  373. two_led_flicker_state = !two_led_flicker_state;
  374. port_led0_set(two_led_flicker_state);
  375. port_led1_set(two_led_flicker_state);
  376. }
  377. }
  378. }
  379. /**
  380. * @brief Ъʹܺrgb˸
  381. *
  382. */
  383. /***********************************************************************************************************************
  384. * ============================================================================================================= *
  385. ***********************************************************************************************************************/
  386. int main(void) {
  387. HRC_Config(Enable, SCU_HRC_48M, Enable); //ʱ��ԴSCU_CLK_HRC
  388. SystemInit();
  389. DeviceClockAllEnable(); //������������ʱ��
  390. User_SysTickInit(); //�δ���ʱ����ʼ��Ϊ(����Ϊ1ms�ж�)
  391. SysTick_Enable();
  392. uart0_init();
  393. gpio_init();
  394. zkey_init(&key_module);
  395. t16_pa4_init();
  396. iwdt_init();
  397. power_on_ozone_working_status();
  398. error_state.way_circuit_error_status = true;
  399. while (true) {
  400. static uint32_t keylastprocess = 0;
  401. if (port_haspassedms(keylastprocess) > 20) {
  402. keylastprocess = get_sys_ticket();
  403. zkey_do_loop_in_each_period(NULL);
  404. }
  405. if (starting_up_state) { //������
  406. port_do_debug_light_state();
  407. process_error_even();
  408. try_adc_gather();
  409. if (timing_function_is_enable()) { //��ʱ�����ǿ�����
  410. try_shutdown();
  411. }
  412. if (ozone_pwm_control_is_enable() == true) {
  413. ozone_pwm_control_module_loop();
  414. process_rgb_flicker();
  415. }
  416. } else { //�ػ���
  417. }
  418. feed_iwdt();
  419. }
  420. }
  421. /**
  422. * ϵ״̬òͨ
  423. * ػͨ
  424. * ʱͨ
  425. * Ъ˸ͨ
  426. * λͨ
  427. * ģȴ󴥷led0˸ͨ
  428. * ģܵ·󴥷led0led1˸ͨ
  429. *
  430. */