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.

441 lines
16 KiB

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