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.

365 lines
15 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
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
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. extern uint32_t target_frequencyhz;
  20. extern uint32_t target_duty;
  21. /***********************************************************************************************************************
  22. * =========================================================================================================== *
  23. ***********************************************************************************************************************/
  24. static bool error_even_trigger_after_stop_ozone_work_state; //错误事件触发后停止臭氧工作标志位
  25. // 设置
  26. bool g_setting_interval_work_flag = false; //现在间歇工作状态
  27. work_level_t g_setting_level = kwork_level_hight; //关机前的档位
  28. //标志位
  29. bool g_power_flag = false; //开关机标志位
  30. static int g_error_num;
  31. bool g_auto_shutdown_flag = false; //定时功能使能标志位
  32. static uint32_t g_auto_shutdown_countdown_s; //定时时间
  33. /***********************************************************************************************************************
  34. * =======================================================HOOK======================================================== *
  35. ***********************************************************************************************************************/
  36. bool hook_get_ozone_generator_working_flag() { return ozone_pwm_control_hardware_is_enable(); }
  37. int hook_get_autoshutdown_timecount() { return g_auto_shutdown_countdown_s; }
  38. /***********************************************************************************************************************
  39. * =================================================INTERNAL_FUNCTION================================================= *
  40. ***********************************************************************************************************************/
  41. /**
  42. * @brief
  43. *
  44. * @param freq
  45. * @param us
  46. */
  47. int get_duty_by_freq_and_valid_time(uint32_t freq, uint32_t us) {
  48. uint16_t period = 1000000 / freq;
  49. int duty = us * 100 / period;
  50. return duty;
  51. }
  52. /**
  53. * @brief pwm输出rgb的颜色
  54. *
  55. * @param gears
  56. */
  57. void update_ozone_work_level(bool interval_work, work_level_t level) {
  58. printf("update_ozone_work_level(interval_work:%d,level:%d)\n", interval_work, level);
  59. rgb_light_mode_t lightmode;
  60. int duty = 0;
  61. uint32_t pwm_freqhz = 0;
  62. if (level == kwork_level_close) {
  63. pwm_freqhz = 1;
  64. duty = 0;
  65. lightmode = krgb_close;
  66. } else if (level == kwork_level_low) {
  67. pwm_freqhz = LOW_LEVEL_PWM_FREQ;
  68. duty = get_duty_by_freq_and_valid_time(pwm_freqhz, 8);
  69. lightmode = krgb_color_blue;
  70. } else if (level == kwork_level_hight) {
  71. pwm_freqhz = HIGH_LEVEL_PWM_FREQ;
  72. duty = get_duty_by_freq_and_valid_time(pwm_freqhz, 8);
  73. lightmode = krgb_color_red;
  74. }
  75. if (interval_work) {
  76. ozone_pwm_control_module_set_pwm_output_2(pwm_freqhz, duty, INTERVAL_WORK_PERIOD_MS, INTERVAL_WORK_DUTY);
  77. } else {
  78. ozone_pwm_control_module_set_pwm_output_1(pwm_freqhz, duty);
  79. }
  80. light_module_set_rgb_mode(lightmode);
  81. light_module_set_rgb_in_interval_working_mode(interval_work);
  82. }
  83. /**
  84. * @brief
  85. */
  86. void shutdown(void) {
  87. printf("shutdown\n");
  88. g_power_flag = false;
  89. g_error_num = 0;
  90. g_auto_shutdown_flag = false;
  91. g_auto_shutdown_countdown_s = 0;
  92. g_setting_interval_work_flag = false;
  93. update_ozone_work_level(false, kwork_level_close);
  94. g_setting_level = kwork_level_hight;
  95. port_fan_set(false); //关闭风扇
  96. light_module_close_all_light();
  97. ozone_pwm_control_module_stop_pwm();
  98. }
  99. /***********************************************************************************************************************
  100. * ============================================================================================================= *
  101. ***********************************************************************************************************************/
  102. void iwdt_init(void) {
  103. /**
  104. * @brief 0+1
  105. * 2
  106. * 4
  107. */
  108. IWDT_InitStruType x;
  109. x.WDT_Tms = 4000;
  110. x.WDT_IE = Enable; /* IWDT中断使能 */
  111. x.WDT_Rst = Enable; /* IWDT复位使能 */
  112. x.WDT_Clock = IWDT_CLOCK_WDT; /* LRC */
  113. IWDT_Init(&x);
  114. /* 使能IWDT */
  115. IWDT_Enable();
  116. }
  117. void feed_iwdt(void) {
  118. //喂狗
  119. if (0x01 == IWDT_GetFlagStatus()) {
  120. IWDT_Clear();
  121. // printf("喂狗\r\n");
  122. }
  123. }
  124. /**
  125. * @brief
  126. *
  127. */
  128. void cancel_autoshutdown(void) {
  129. g_auto_shutdown_countdown_s = 0;
  130. g_auto_shutdown_flag = false;
  131. light_module_set_autoshutdown_indicator_light(false);
  132. }
  133. /**
  134. * @brief
  135. *
  136. */
  137. void starting_up(void) {
  138. g_power_flag = true; //开关机标志位
  139. g_error_num = 0;
  140. g_auto_shutdown_flag = false; //定时功能使能标志位
  141. g_auto_shutdown_countdown_s = 0; //定时时间
  142. port_fan_set(true); //打开风扇
  143. update_ozone_work_level(false, kwork_level_hight);
  144. }
  145. void onkey(zkey_t *key, zkey_state_t key_state) {
  146. if (key->hasProcessed) return;
  147. /**
  148. * @brief ,
  149. */
  150. if (!g_power_flag) {
  151. if (key == &s_keys[3] && key->cur_state == zks_falling_edge) {
  152. key->hasProcessed = true;
  153. // printf("key zks_rising_edge\r\n");
  154. /**
  155. * @brief
  156. * 1.
  157. * 2.
  158. * 3.
  159. */
  160. starting_up();
  161. }
  162. return;
  163. }
  164. /**
  165. * @brief
  166. */
  167. if (g_error_num != 0) { //设备存在异常
  168. if (key == &s_keys[3] && key->cur_state == zks_falling_edge) {
  169. key->hasProcessed = true;
  170. printf("process key[2] event\r\n");
  171. /**
  172. * @brief
  173. */
  174. shutdown();
  175. }
  176. return;
  177. }
  178. /*********************************************************************************************************************
  179. * ========================================================================================================= *
  180. *********************************************************************************************************************/
  181. if (key == &s_keys[0] && key->cur_state == zks_falling_edge) //小于3s
  182. {
  183. printf("process key[0] event\r\n");
  184. if (g_setting_interval_work_flag == true) { // g_setting_interval_work_flag=true现在是间歇工作
  185. g_setting_interval_work_flag = false; // 取消间歇工作
  186. update_ozone_work_level(g_setting_interval_work_flag, g_setting_level);
  187. }
  188. if (!g_auto_shutdown_flag) {
  189. g_auto_shutdown_flag = true;
  190. g_auto_shutdown_countdown_s = 0;
  191. light_module_set_autoshutdown_indicator_light(true);
  192. }
  193. g_auto_shutdown_countdown_s += AUTO_SHUTDOWN_ONE_LIGHT_EQ_TIME_S;
  194. if (g_auto_shutdown_countdown_s > AUTO_SHUTDOWN_ONE_LIGHT_EQ_TIME_S * 4) {
  195. cancel_autoshutdown();
  196. }
  197. }
  198. /*********************************************************************************************************************
  199. * ===================================================================================================== *
  200. *********************************************************************************************************************/
  201. else if (key == &s_keys[1] && key->cur_state == zks_falling_edge) {
  202. /**
  203. * @brief
  204. */
  205. printf("process key[1] event\r\n");
  206. if (g_setting_level == kwork_level_hight) {
  207. g_setting_level = kwork_level_low;
  208. update_ozone_work_level(g_setting_interval_work_flag, kwork_level_low);
  209. } else if (g_setting_level == kwork_level_low) {
  210. g_setting_level = kwork_level_hight;
  211. update_ozone_work_level(g_setting_interval_work_flag, kwork_level_hight);
  212. }
  213. }
  214. /*********************************************************************************************************************
  215. * ===================================================================================================== *
  216. *********************************************************************************************************************/
  217. else if (key == &s_keys[2] && key->cur_state == zks_falling_edge) {
  218. printf("process key[2] event\r\n");
  219. /**
  220. * @brief
  221. */
  222. if (g_auto_shutdown_flag) { //处于定时关机模式
  223. cancel_autoshutdown();
  224. }
  225. g_setting_interval_work_flag = !g_setting_interval_work_flag;
  226. update_ozone_work_level(g_setting_interval_work_flag, g_setting_level);
  227. } else if (key == &s_keys[3] && key->cur_state == zks_falling_edge) {
  228. printf("process key[2] event\r\n");
  229. /**
  230. * @brief
  231. */
  232. shutdown();
  233. }
  234. }
  235. #define DO_IT_EACH_MS(time) \
  236. { \
  237. static uint32_t __ticket = 0; \
  238. if (port_haspassedms(__ticket) > time) { \
  239. __ticket = get_sys_ticket();
  240. #define END() \
  241. } \
  242. }
  243. /**********************************************************************************************************************
  244. * ============================================================================================================== *
  245. **********************************************************************************************************************/
  246. void fan_module_schedule(void) {
  247. //风扇效果和PWM输出绑定
  248. port_fan_set(ozone_pwm_control_hardware_is_enable());
  249. }
  250. /***********************************************************************************************************************
  251. * =============================================================================================================
  252. ***********************************************************************************************************************/
  253. int main(void) {
  254. HRC_Config(Enable, SCU_HRC_48M, Enable); //时钟源SCU_CLK_HRC
  255. SystemInit();
  256. DeviceClockAllEnable(); //打开所有外设时钟
  257. User_SysTickInit(); //滴答定时器初始化为(配置为1ms中断)
  258. SysTick_Enable();
  259. //硬件初始化
  260. unused_gpio_init();
  261. gpio_init();
  262. uart0_init();
  263. //模块初始化
  264. zkey_init(&key_module);
  265. //上电默认开机并高档工作
  266. starting_up();
  267. //启动结束
  268. printf("Initialization completed\r\n");
  269. while (true) {
  270. /*******************************************************************************************************************
  271. * ===================================================================================================== *
  272. *******************************************************************************************************************/
  273. DO_IT_EACH_MS(200) {
  274. static uint8_t debug_led_state = 1;
  275. debug_led_state = !debug_led_state;
  276. port_debug_set(debug_led_state);
  277. }
  278. END()
  279. /***********************************************************************************************************************
  280. * =================================================================================================== *
  281. ***********************************************************************************************************************/
  282. DO_IT_EACH_MS(KEY_PERIOD) { zkey_do_loop_in_each_period(NULL); }
  283. END();
  284. /***********************************************************************************************************************
  285. * =============================================================================================== *
  286. ***********************************************************************************************************************/
  287. light_module_schedule();
  288. /***********************************************************************************************************************
  289. * =============================================================================================== *
  290. ***********************************************************************************************************************/
  291. ozone_pwm_control_module_loop();
  292. /*******************************************************************************************************************
  293. * ===================================================================================================== *
  294. *******************************************************************************************************************/
  295. fan_module_schedule();
  296. /***********************************************************************************************************************
  297. * ======================================================================================================= *
  298. ***********************************************************************************************************************/
  299. //
  300. DO_IT_EACH_MS(1000) {
  301. if (g_power_flag && g_auto_shutdown_flag) {
  302. if (g_auto_shutdown_countdown_s > 0) {
  303. g_auto_shutdown_countdown_s -= 1;
  304. printf("auto shutdown countdown %d\n", g_auto_shutdown_countdown_s);
  305. } else {
  306. g_auto_shutdown_flag = false;
  307. /**
  308. * @brief
  309. */
  310. shutdown();
  311. }
  312. }
  313. }
  314. END();
  315. /***********************************************************************************************************************
  316. * =======================================================================================================
  317. ***********************************************************************************************************************/
  318. DO_IT_EACH_MS(EXCEPTION_CHECK_PERIOD) {
  319. /**
  320. * @brief
  321. * ADC的数值是否超出规定范围
  322. */
  323. if (false) {
  324. }
  325. }
  326. END();
  327. // End..................................
  328. }
  329. }