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.

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