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.

389 lines
16 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
  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. * ============================================================================================================== *
  252. **********************************************************************************************************************/
  253. void fan_module_schedule(void) {
  254. static bool last_pwm_modble_enable_falg = false;
  255. if (!fan_control_by_ozone_pwm_falg) {
  256. return;
  257. } else if (fan_control_by_ozone_pwm_falg && last_pwm_modble_enable_falg != pwm_modble_enable_falg) {
  258. if (pwm_modble_enable_falg == false) { //代表硬件pwm没有输出
  259. last_pwm_modble_enable_falg = pwm_modble_enable_falg;
  260. port_fan_set(false);
  261. } else if (pwm_modble_enable_falg == true) { //代表硬件pwm有输出
  262. last_pwm_modble_enable_falg = pwm_modble_enable_falg;
  263. port_fan_set(true);
  264. }
  265. }
  266. }
  267. /***********************************************************************************************************************
  268. * =============================================================================================================
  269. ***********************************************************************************************************************/
  270. int main(void) {
  271. HRC_Config(Enable, SCU_HRC_48M, Enable); //时钟源SCU_CLK_HRC
  272. SystemInit();
  273. DeviceClockAllEnable(); //打开所有外设时钟
  274. User_SysTickInit(); //滴答定时器初始化为(配置为1ms中断)
  275. SysTick_Enable();
  276. //硬件初始化
  277. unused_gpio_init();
  278. gpio_init();
  279. uart0_init();
  280. //模块初始化
  281. zkey_init(&key_module);
  282. // while (1) {
  283. // }
  284. //上电默认开机并高档工作
  285. starting_up();
  286. //启动结束
  287. printf("Initialization completed\r\n");
  288. //测试
  289. // set_pwm_modbul_freq_duty(25000, 10);
  290. // while (1) {
  291. // }
  292. while (true) {
  293. /*******************************************************************************************************************
  294. * ===================================================================================================== *
  295. *******************************************************************************************************************/
  296. DO_IT_EACH_MS(200) {
  297. static uint8_t debug_led_state = 1;
  298. debug_led_state = !debug_led_state;
  299. port_debug_set(debug_led_state);
  300. }
  301. END()
  302. /***********************************************************************************************************************
  303. * =================================================================================================== *
  304. ***********************************************************************************************************************/
  305. DO_IT_EACH_MS(KEY_PERIOD) { zkey_do_loop_in_each_period(NULL); }
  306. END();
  307. /***********************************************************************************************************************
  308. * =============================================================================================== *
  309. ***********************************************************************************************************************/
  310. light_module_schedule();
  311. /***********************************************************************************************************************
  312. * =============================================================================================== *
  313. ***********************************************************************************************************************/
  314. ozone_pwm_control_module_loop();
  315. /*******************************************************************************************************************
  316. * ===================================================================================================== *
  317. *******************************************************************************************************************/
  318. fan_module_schedule();
  319. /***********************************************************************************************************************
  320. * ======================================================================================================= *
  321. ***********************************************************************************************************************/
  322. //
  323. DO_IT_EACH_MS(1000) {
  324. if (g_power_flag && g_auto_shutdown_flag) {
  325. if (g_auto_shutdown_countdown_s > 0) {
  326. g_auto_shutdown_countdown_s -= 1;
  327. printf("auto shutdown countdown %d\n", g_auto_shutdown_countdown_s);
  328. } else {
  329. g_auto_shutdown_flag = false;
  330. /**
  331. * @brief
  332. */
  333. shutdown();
  334. }
  335. }
  336. }
  337. END();
  338. /***********************************************************************************************************************
  339. * =======================================================================================================
  340. ***********************************************************************************************************************/
  341. DO_IT_EACH_MS(EXCEPTION_CHECK_PERIOD) {
  342. /**
  343. * @brief
  344. * ADC的数值是否超出规定范围
  345. */
  346. if (false) {
  347. }
  348. }
  349. END();
  350. // End..................................
  351. }
  352. }