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.

501 lines
18 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) { //������
  124. if (error_state.fan_error_status == false && error_state.way_circuit_error_status == false) { //�豸���쳣
  125. if (key == &s_keys[0] && //��ʱ����
  126. key->cur_state == zks_keep && //����
  127. !key->hasProcessed && //û�б�������
  128. key->keep_state_count >= POWER_KEY_TRIGGER_TIME / KEY_SCAN_PERIOD) //���³���ʱ������3s
  129. {
  130. key->hasProcessed = true;
  131. } else if (key == &s_keys[0] && //��ʱ����
  132. key->cur_state == zks_falling_edge && //�½��ش���
  133. !key->hasProcessed && key->keep_state_count <= POWER_KEY_TRIGGER_TIME / KEY_SCAN_PERIOD) //��3s
  134. {
  135. key->hasProcessed = true;
  136. printf("key0 zks_falling_edge\r\n");
  137. update_timing_time();
  138. updae_led_light_mode();
  139. } else if (key == &s_keys[1] && //�ߵ͵�λѡ��
  140. key->cur_state == zks_rising_edge && //
  141. !key->hasProcessed && //
  142. key->keep_state_count <= POWER_KEY_TRIGGER_TIME / KEY_SCAN_PERIOD) {
  143. key->hasProcessed = true;
  144. printf("key1 zks_rising_edge\r\n");
  145. process_gearskey_press_even();
  146. } else if (key == &s_keys[2] && //��Ъ��������ѡ��
  147. key->cur_state == zks_rising_edge && //
  148. !key->hasProcessed && //
  149. key->keep_state_count <= POWER_KEY_TRIGGER_TIME / KEY_SCAN_PERIOD) {
  150. key->hasProcessed = true;
  151. printf("key2 zks_rising_edge\r\n");
  152. process_intervalkey_press_even();
  153. } else if (key == &s_keys[3] && //���ذ���
  154. key->cur_state == zks_rising_edge && //
  155. !key->hasProcessed && //
  156. key->keep_state_count <= POWER_KEY_TRIGGER_TIME / KEY_SCAN_PERIOD) {
  157. key->hasProcessed = true;
  158. printf("key2 zks_rising_edge\r\n");
  159. shutdown();
  160. }
  161. } else if (error_state.fan_error_status == true || error_state.way_circuit_error_status == true) { //�豸�����쳣
  162. if (key == &s_keys[3] && //���ذ���
  163. key->cur_state == zks_rising_edge && //
  164. !key->hasProcessed && //
  165. key->keep_state_count <= POWER_KEY_TRIGGER_TIME / KEY_SCAN_PERIOD) {
  166. key->hasProcessed = true;
  167. printf("key2 zks_rising_edge\r\n");
  168. shutdown();
  169. }
  170. }
  171. } else { //�ػ���
  172. if (key == &s_keys[3] && //���ذ���
  173. key->cur_state == zks_rising_edge && //
  174. !key->hasProcessed && //
  175. key->keep_state_count <= POWER_KEY_TRIGGER_TIME / KEY_SCAN_PERIOD) {
  176. key->hasProcessed = true;
  177. printf("key zks_rising_edge\r\n");
  178. starting_up();
  179. }
  180. }
  181. }
  182. /**
  183. * @brief ϵ,пػⲿϵ󣬲
  184. *
  185. */
  186. void power_on_ozone_working_status(void) {
  187. update_ozone_work_gears(WORK_LEVEL_CLOSE);
  188. light_module_set_timing_light_mode(CLOSE_ALL_LED);
  189. port_fan_set(false); //�رշ���
  190. }
  191. //####################### ����� #######################/
  192. /**
  193. * @brief ݵλpwmrgbɫ
  194. *
  195. * @param gears
  196. */
  197. void update_ozone_work_gears(WORK_LEVEL_T level) {
  198. if (level == WORK_LEVEL_CLOSE) {
  199. ozone_pwm_control_module_set_pwm_output_2(1, 0, s_interval_period, s_now_interval_duty);
  200. light_module_set_rgb_mode(RGB_CLOSE);
  201. } else if (level == WORK_LEVEL_LOW) {
  202. ozone_pwm_control_module_set_pwm_output_2(1, 25, s_interval_period, s_now_interval_duty);
  203. light_module_set_rgb_mode(RGB_COLOR_GERRN);
  204. } else if (level == WORK_LEVEL_MIDDLE) {
  205. ozone_pwm_control_module_set_pwm_output_2(1, 50, s_interval_period, s_now_interval_duty);
  206. light_module_set_rgb_mode(RGB_COLOR_BLUE);
  207. } else if (level == WORK_LEVEL_HIGHT) {
  208. ozone_pwm_control_module_set_pwm_output_2(1, 100, s_interval_period, s_now_interval_duty);
  209. light_module_set_rgb_mode(RGB_COLOR_RED);
  210. }
  211. now_level = level;
  212. }
  213. void process_gearskey_press_even(void) {
  214. static uint8_t gearskey_press_count;
  215. gearskey_press_count++;
  216. if (gearskey_press_count == 1) {
  217. update_ozone_work_gears(WORK_LEVEL_MIDDLE);
  218. } else if (gearskey_press_count == 2) {
  219. update_ozone_work_gears(WORK_LEVEL_LOW);
  220. } else if (gearskey_press_count == 3) {
  221. gearskey_press_count = 0;
  222. update_ozone_work_gears(WORK_LEVEL_HIGHT);
  223. }
  224. }
  225. //####################### �����ػ� #######################/
  226. void shutdown(void) {
  227. ozone_pwm_control_disable();
  228. error_state.fan_error_status = false;
  229. error_state.way_circuit_error_status = false;
  230. s_intervalkey_press_count = 0;
  231. shutdown_before_level = now_level;
  232. starting_up_state = false;
  233. update_ozone_work_gears(WORK_LEVEL_CLOSE);
  234. light_module_set_timing_light_mode(CLOSE_ALL_LED);
  235. port_fan_set(false); //�رշ���
  236. }
  237. /**
  238. * @brief 󣬸ݹػʱĵλãػʱλΪرΪߵ
  239. *
  240. */
  241. void starting_up(void) {
  242. //����û�м�Ъ������������ռ�ձ�Ϊ100
  243. update_interval_period_duty(100);
  244. //����û�ж�ʱ�������Խ� timing_function_enable_falg = false; s_timing_time = 0;
  245. timing_function_enable_falg = false;
  246. s_timing_time = 0;
  247. starting_up_state = true;
  248. if (shutdown_before_level == WORK_LEVEL_CLOSE) {
  249. update_ozone_work_gears(WORK_LEVEL_HIGHT);
  250. } else {
  251. update_ozone_work_gears(shutdown_before_level);
  252. }
  253. port_fan_set(true); //����������
  254. }
  255. void process_switchkey(void) {
  256. static bool switchkey_press_count = 0;
  257. switchkey_press_count = !switchkey_press_count;
  258. if (switchkey_press_count) { //����
  259. starting_up();
  260. } else { //�ػ�
  261. shutdown();
  262. }
  263. }
  264. //####################### ��ʱ���� #######################/
  265. /**
  266. * @brief ڵʱи
  267. *
  268. */
  269. void updae_led_light_mode(void) {
  270. if ((s_timing_time / TIMING_TICK) == 0) {
  271. light_module_set_timing_light_mode(CLOSE_ALL_LED);
  272. } else if ((s_timing_time / TIMING_TICK) == 1) {
  273. light_module_set_timing_light_mode(OPEN_ONE_LED);
  274. } else if ((s_timing_time / TIMING_TICK) == 2) {
  275. light_module_set_timing_light_mode(OPEN_TWO_LED);
  276. } else if ((s_timing_time / TIMING_TICK) == 3) {
  277. light_module_set_timing_light_mode(OPEN_THREE_LED);
  278. } else if ((s_timing_time / TIMING_TICK) == 4) {
  279. light_module_set_timing_light_mode(OPEN_FOUR_LED);
  280. }
  281. }
  282. /**
  283. * @brief ÿΰʱtiming_time=timing_time+TIMING_TICK
  284. * timing_time==timing_time = 4 * TIMING_TICK;
  285. * timing_time = 0;
  286. *
  287. */
  288. void update_timing_time(void) {
  289. s_timing_shutdown_begin_ticket = get_sys_ticket(); //���¶�ʱ�ػ���ʼ��ʱ��
  290. update_begin_ticket(); //���¼�Ъ��ʼ��ʱ��
  291. timing_function_enable_falg = true; //ʹ�ܶ�ʱ����
  292. if (s_timing_time == 0) {
  293. s_timing_time = 1 * TIMING_TICK;
  294. } else if ((s_timing_time / TIMING_TICK) == 1) {
  295. s_timing_time = 2 * TIMING_TICK;
  296. } else if ((s_timing_time / TIMING_TICK) == 2) {
  297. s_timing_time = 3 * TIMING_TICK;
  298. } else if ((s_timing_time / TIMING_TICK) == 3) {
  299. s_timing_time = 4 * TIMING_TICK;
  300. } else if ((s_timing_time / TIMING_TICK) == 4) {
  301. s_timing_time = 0 * TIMING_TICK;
  302. timing_function_enable_falg = false;
  303. update_interval_period_duty(100);
  304. }
  305. printf("timing time:%d\r\n", s_timing_time);
  306. }
  307. /**
  308. * @brief ʱÿTIMING_TICK timing_time=timing_time-TIMING_TICK
  309. * TIMING_TICK==0ʱػ
  310. *
  311. */
  312. void try_shutdown(void) {
  313. if (port_haspassedms(s_timing_shutdown_begin_ticket) > TIMING_TICK) {
  314. s_timing_shutdown_begin_ticket = get_sys_ticket();
  315. printf("time minus %dms", TIMING_TICK);
  316. s_timing_time -= TIMING_TICK;
  317. updae_led_light_mode();
  318. }
  319. if (s_timing_time == 0) { //��ʱʱ�䵽
  320. timing_function_enable_falg = false; //ʧ�ܶ�ʱ����
  321. shutdown();
  322. }
  323. }
  324. bool timing_function_is_enable(void) { return timing_function_enable_falg; }
  325. void iwdt_init(void) {
  326. /**
  327. * @brief Źܣ0ʱڼ+1
  328. * ڼΪ2ʱ򣬲ж
  329. * ڼΪ4֮ǰûнιλ
  330. *
  331. */
  332. IWDT_InitStruType x;
  333. x.WDT_Tms = 4000;
  334. x.WDT_IE = Enable; /* IWDT�ж�ʹ�� */
  335. x.WDT_Rst = Enable; /* IWDT��λʹ�� */
  336. x.WDT_Clock = IWDT_CLOCK_WDT; /* LRC */
  337. IWDT_Init(&x);
  338. /* ʹ��IWDT */
  339. IWDT_Enable();
  340. }
  341. void feed_iwdt(void) {
  342. //�
  343. if (0x01 == IWDT_GetFlagStatus()) //�����ж�
  344. {
  345. IWDT_Clear();
  346. // printf("�\r\n");
  347. }
  348. }
  349. void process_error_even(void) {
  350. if (error_state.fan_error_status == false && error_state.way_circuit_error_status == false) { //û�д���
  351. return;
  352. } else {
  353. if (!error_even_trigger_after_stop_ozone_work_state) {
  354. error_even_trigger_after_stop_ozone_work_state = true;
  355. set_pwm_modbul_freq_duty(1, 0);
  356. light_module_set_rgb_mode(RGB_CLOSE);
  357. light_module_set_timing_light_mode(CLOSE_ALL_LED);
  358. port_fan_set(false); //�رշ���
  359. }
  360. if (error_state.fan_error_status == true) { //���ȵ�ѹ�쳣
  361. static uint32_t error_even_fan_ticket = 0;
  362. static uint8_t one_led_flicker_state = 1;
  363. if (port_haspassedms(error_even_fan_ticket) > 500) {
  364. error_even_fan_ticket = get_sys_ticket();
  365. one_led_flicker_state = !one_led_flicker_state;
  366. port_led0_set(one_led_flicker_state);
  367. }
  368. } else if (error_state.way_circuit_error_status == true) { //�ܵ�·��ѹ�쳣
  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. /***********************************************************************************************************************
  381. * ===============================================================================================================
  382. **
  383. ***********************************************************************************************************************/
  384. void test(void) {
  385. port_fan_set(false);
  386. Delayms(10000);
  387. port_fan_set(true);
  388. printf("open\r\n");
  389. Delayms(10000);
  390. while (1) {
  391. // unused_gpio_init();
  392. // gpio_init();
  393. // port_fan_set(false);
  394. // printf("close\r\n");
  395. // Delayms(30000);
  396. // port_fan_set(true);
  397. // printf("open\r\n");
  398. // Delayms(10000);
  399. }
  400. error_state.way_circuit_error_status = true;
  401. error_state.fan_error_status = true;
  402. // while (1) {
  403. // port_fan_set(true); //���Թرշ���
  404. // printf("open\r\n");
  405. // Delayms(50000);
  406. // port_fan_set(false); //���Թرշ���
  407. // printf("close\r\n");
  408. // Delayms(50000);
  409. // port_do_debug_light_state();
  410. // printf("Initialization completed\r\n");
  411. // }
  412. // while (1) {
  413. // port_do_debug_light_state();
  414. // printf("Initialization completed\r\n");
  415. // }
  416. }
  417. /**
  418. * @brief Ъʹܺrgb˸
  419. *
  420. */
  421. /***********************************************************************************************************************
  422. * =============================================================================================================
  423. **
  424. ***********************************************************************************************************************/
  425. int main(void) {
  426. HRC_Config(Enable, SCU_HRC_48M, Enable); //ʱ��ԴSCU_CLK_HRC
  427. SystemInit();
  428. DeviceClockAllEnable(); //������������ʱ��
  429. User_SysTickInit(); //�δ���ʱ����ʼ��Ϊ(����Ϊ1ms�ж�)
  430. SysTick_Enable();
  431. // all_gpio_reset();
  432. unused_gpio_init();
  433. gpio_init();
  434. uart0_init();
  435. zkey_init(&key_module);
  436. t16_pa4_init();
  437. // iwdt_init();
  438. power_on_ozone_working_status();
  439. printf("Initialization completed\r\n");
  440. //test();
  441. while (true) {
  442. port_do_debug_light_state();
  443. // feed_iwdt();
  444. static uint32_t keylastprocess = 0;
  445. if (port_haspassedms(keylastprocess) > 20) {
  446. keylastprocess = get_sys_ticket();
  447. zkey_do_loop_in_each_period(NULL);
  448. }
  449. if (starting_up_state) { //������
  450. port_do_debug_light_state();
  451. process_error_even();
  452. try_adc_gather();
  453. if (timing_function_is_enable()) { //��ʱ�����ǿ�����
  454. try_shutdown();
  455. }
  456. if (ozone_pwm_control_is_enable() == true) {
  457. ozone_pwm_control_module_loop();
  458. process_rgb_flicker();
  459. }
  460. } else { //�ػ���
  461. }
  462. }
  463. }
  464. /**
  465. * ϵ״̬òͨ
  466. * ػͨ
  467. * ʱͨ
  468. * Ъ˸ͨ
  469. * λͨ
  470. * ģȴ󴥷led0˸ͨ
  471. * ģܵ·󴥷led0led1˸ͨ
  472. * עҪӸ߼ܵ·ѹȵѹ߼֮ټ
  473. */