detection.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  1. /*********************************************************************************************************
  2. * Module : detection
  3. * Abstract :
  4. * Version : 1.0.0
  5. * Author : Leopul(COPYRIGHT 2025 ~ 2027 Leopul. All rights reserved.)
  6. * Complete : 2025-04-08
  7. * Content : None
  8. * Note : None
  9. *********************************************************************************************************/
  10. #include "detection.h"
  11. #include "gd32e23x.h"
  12. #include "common.h"
  13. #include "board_cfg.h"
  14. #include "relay.h"
  15. #define DERECTION_GPIO_1 GPIOA
  16. #define DERECTION_IO_1 GPIO_PIN_11
  17. #define DERECTION_IO_1_RCU EXTI_SOURCE_GPIOA
  18. #define DERECTION_IO_1_PIN DERECTION_IO_11
  19. #define DERECTION_IO_1_SOURCE EXTI_SOURCE_PIN11
  20. #define DERECTION_IO_1_EXIT EXTI_11
  21. #if (SURPPORT_2_PT)
  22. #define DERECTION_GPIO_2 GPIOB
  23. #define DERECTION_IO_2 GPIO_PIN_3
  24. #define DERECTION_IO_2_RCU EXTI_SOURCE_GPIOB
  25. #define DERECTION_IO_2_PIN DERECTION_IO_3
  26. #define DERECTION_IO_2_SOURCE EXTI_SOURCE_PIN3
  27. #define DERECTION_IO_2_EXIT EXTI_3
  28. #endif
  29. #define KEY_TEST_1_IO GPIO_PIN_14
  30. #define KEY_TEST_2_IO GPIO_PIN_2
  31. #define KEY_TEST_3_IO GPIO_PIN_0
  32. #define KEY_TEST_4_IO GPIO_PIN_1
  33. #define KEY_TEST_1_GPIO GPIOC
  34. #define KEY_TEST_2_GPIO GPIOB
  35. #define KEY_TEST_3_4_GPIO GPIOA
  36. static board_t *board = 0;
  37. #define KEY_RST_RCU RCU_GPIOC
  38. #define KEY_RST_IO GPIOC
  39. #define KEY_RST GPIO_PIN_14
  40. #define KEY_RST_EXTI_SOURCE EXTI_SOURCE_GPIOC
  41. #define KEY_RST_EXTI EXTI_14
  42. #define KEY_RST_EXTI_IO EXTI_SOURCE_PIN14
  43. #define KEY_TEST_RCU RCU_GPIOB
  44. #define KEY_TEST_IO GPIOB
  45. #define KEY_TEST GPIO_PIN_2
  46. #define KEY_TEST_EXTI_SOURCE EXTI_SOURCE_GPIOB
  47. #define KEY_TEST_EXTI EXTI_2
  48. #define KEY_TEST_EXTI_IO EXTI_SOURCE_PIN2
  49. static void get_detection(void);
  50. static void detection_opt(void);
  51. void detection_init(void)
  52. {
  53. board = get_board();
  54. #if SUPPORT_DETECTION
  55. board = get_board();
  56. rcu_periph_clock_enable(RCU_CFGCMP);
  57. rcu_periph_clock_enable(RCU_GPIOA);
  58. #if SURPPORT_2_PT
  59. rcu_periph_clock_enable(RCU_GPIOB);
  60. #endif
  61. gpio_mode_set(DERECTION_GPIO_1, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, DERECTION_IO_1);
  62. #if SURPPORT_2_PT
  63. gpio_mode_set(DERECTION_GPIO_2, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, DERECTION_IO_2);
  64. #endif
  65. nvic_irq_enable(EXTI4_15_IRQn,2);
  66. syscfg_exti_line_config(DERECTION_IO_1_RCU,DERECTION_IO_1_SOURCE);
  67. exti_init(DERECTION_IO_1_EXIT,EXTI_INTERRUPT,EXTI_TRIG_FALLING);
  68. exti_interrupt_flag_clear(DERECTION_IO_1_EXIT);
  69. #if SURPPORT_2_PT
  70. nvic_irq_enable(EXTI2_3_IRQn,2);
  71. syscfg_exti_line_config(DERECTION_IO_2_RCU,DERECTION_IO_2_SOURCE);
  72. exti_init(DERECTION_IO_2_EXIT,EXTI_INTERRUPT,EXTI_TRIG_FALLING);
  73. exti_interrupt_flag_clear(DERECTION_IO_2_EXIT);
  74. #endif
  75. board->detection = get_detection;
  76. board->opt_detection = detection_opt;
  77. #endif
  78. }
  79. void key_init(void)
  80. {
  81. #if SUPPORT_ALL_ON_OFF
  82. rcu_periph_clock_enable(RCU_CFGCMP);
  83. rcu_periph_clock_enable(KEY_RST_RCU);
  84. gpio_mode_set(KEY_RST_IO, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, KEY_RST);
  85. nvic_irq_enable(EXTI4_15_IRQn,2);
  86. syscfg_exti_line_config(KEY_RST_EXTI_SOURCE,KEY_RST_EXTI_IO);
  87. exti_init(KEY_RST_EXTI,EXTI_INTERRUPT,EXTI_TRIG_FALLING);
  88. exti_interrupt_flag_clear(KEY_RST_EXTI);
  89. rcu_periph_clock_enable(KEY_TEST_RCU);
  90. gpio_mode_set(KEY_TEST_IO, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, KEY_TEST);
  91. nvic_irq_enable(EXTI2_3_IRQn,2);
  92. syscfg_exti_line_config(KEY_TEST_EXTI_SOURCE,KEY_TEST_EXTI_IO);
  93. exti_init(KEY_TEST_EXTI,EXTI_INTERRUPT,EXTI_TRIG_FALLING);
  94. exti_interrupt_flag_clear(KEY_TEST_EXTI);
  95. #endif
  96. }
  97. void EXTI4_15_IRQHandler(void){
  98. #if SUPPORT_ALL_ON_OFF
  99. if(RESET != exti_interrupt_flag_get(KEY_RST_EXTI))
  100. {
  101. exti_interrupt_flag_clear(KEY_RST_EXTI);
  102. if(board)
  103. {
  104. if(gpio_input_bit_get(KEY_TEST_IO,KEY_TEST) != 0)
  105. {
  106. async_data da = {0};
  107. da.fire_or_zero = _FIRE;
  108. da.w_eep_flag = FLAG_W_EEP;
  109. for(uint8_t j = 0; j < PT_SUB_COUNT;j++)
  110. {
  111. // if(board->md_data.r_data.state.state[j].state == RELAY_CLOSE)
  112. // continue;
  113. da.channel = j;
  114. da.method = DELAY_CTRL;
  115. da.reg = &board->relay_staging_staus[j];
  116. da.status = RELAY_CLOSE;
  117. set_relay_sta_async(&da);
  118. }
  119. }
  120. }
  121. }
  122. #endif
  123. if(RESET != exti_interrupt_flag_get(DERECTION_IO_1_EXIT))
  124. {
  125. if(board)
  126. {
  127. board->detection_1_value = 1;
  128. board->detection_1_count = 0;
  129. }
  130. exti_interrupt_flag_clear(DERECTION_IO_1_EXIT);
  131. }
  132. }
  133. void EXTI2_3_IRQHandler(void)
  134. {
  135. #if SUPPORT_ALL_ON_OFF
  136. if(RESET != exti_interrupt_flag_get(KEY_TEST_EXTI))
  137. {
  138. exti_interrupt_flag_clear(KEY_TEST_EXTI);
  139. if(board)
  140. {
  141. if(gpio_input_bit_get(KEY_RST_IO,KEY_RST) != 0)
  142. {
  143. #if SUPPORT_DETECTION
  144. if(board->md_data.r_data.detection & 0x1)
  145. #endif
  146. {
  147. async_data da = {0};
  148. da.fire_or_zero = _FIRE;
  149. da.method = DELAY_CTRL;
  150. da.w_eep_flag = FLAG_W_EEP;
  151. for(uint8_t k = 0; k < PT_SUB_COUNT;k++)
  152. {
  153. // if(board->md_data.r_data.state.state[k].state ==RELAY_OPEN)
  154. // continue;
  155. da.channel =k;
  156. da.reg = &board->relay_staging_staus[k];
  157. da.status = RELAY_OPEN;
  158. set_relay_sta_async(&da);
  159. }
  160. }
  161. }
  162. #if SURPPORT_2_PT
  163. #if SUPPORT_DETECTION
  164. if(board->md_data.r_data.detection & 0x2)
  165. #endif
  166. {
  167. async_data da = {0};
  168. da.fire_or_zero = _FIRE;
  169. da.method = DELAY_CTRL;
  170. da.w_eep_flag = FLAG_W_EEP;
  171. for(uint8_t k = PT_SUB_COUNT; k < RelaySlaveChaNum;k++)
  172. {
  173. if(board->md_data.r_data.state.state[k].state ==RELAY_OPEN)
  174. continue;
  175. da.channel =k;
  176. da.reg = &board->relay_staging_staus[k];
  177. da.status = RELAY_OPEN;
  178. set_relay_sta_async(&da);
  179. }
  180. }
  181. #endif
  182. }
  183. }
  184. #endif
  185. #if SURPPORT_2_PT
  186. if(RESET != exti_interrupt_flag_get(DERECTION_IO_2_EXIT))
  187. {
  188. if(board)
  189. {
  190. board->detection_2_value = 1;
  191. board->detection_2_count = 0;
  192. }
  193. exti_interrupt_flag_clear(DERECTION_IO_2_EXIT);
  194. }
  195. #endif
  196. }
  197. static void get_detection()
  198. {
  199. #if SUPPORT_DETECTION
  200. if(board)
  201. {
  202. uint16_t data = 0;
  203. if(board->detection_1_value > 0)
  204. {
  205. data |= (1 << 0);
  206. }
  207. #if SURPPORT_2_PT
  208. if(board->detection_2_value > 0)
  209. {
  210. data |= (1 << 1);
  211. }
  212. #endif
  213. board->md_data.r_data.detection = data;
  214. }
  215. #endif
  216. }
  217. static void detection_opt(void)
  218. {
  219. if(board)
  220. {
  221. async_data da = {0};
  222. da.w_eep_flag = FLAG_N_W_EEP;
  223. da.fire_or_zero = _FIRE;
  224. #if (AC_3_3 || AC_3_4)
  225. #if SUPPORT_RELAY_REMENBER
  226. if(board->md_data.r_data.detection & 0x1)
  227. {
  228. if(board->handle_input_pt[0] == 0)
  229. {
  230. board->handle_input_pt[0] = 1;
  231. for(uint8_t k = 0; k < PT_SUB_COUNT;k++)
  232. {
  233. da.channel =k;
  234. da.method = DELAY_CTRL;
  235. da.reg = &board->relay_staging_staus[k];
  236. da.status = board->handle_status[k];
  237. set_relay_sta_async(&da);
  238. }
  239. #if SUPPORT_ZERO_CRTL
  240. da.method = DELAY_CTRL;
  241. da.reg = &board->relay_zero_staging_status;
  242. da.status = board->handle_status_N;
  243. set_relay_sta_async(&da);
  244. #endif
  245. }
  246. }else
  247. {
  248. if(board->handle_input_pt[0] == 1)
  249. {
  250. for(uint8_t k = 0; k < PT_SUB_COUNT;k++)
  251. {
  252. board->handle_status[k] = board->md_data.r_data.status[k];
  253. da.channel =k;
  254. da.method = PROMPT_CTRL;
  255. da.reg = &board->relay_staging_staus[k];
  256. da.status = RELAY_CLOSE;
  257. set_relay_sta_async(&da);
  258. }
  259. #if SUPPORT_ZERO_CRTL
  260. board->handle_status_N = board->md_data.r_data.N_status;
  261. da.method = PROMPT_CTRL;
  262. da.reg = &board->relay_zero_staging_status;
  263. da.status = RELAY_CLOSE;
  264. set_relay_sta_async(&da);
  265. #endif
  266. board->handle_input_pt[0] = 0;
  267. }
  268. }
  269. #endif
  270. #else
  271. #if SUPPORT_RELAY_REMENBER
  272. uint8_t sync_buff[PT_SUB_COUNT] = {0};
  273. if(board->md_data.r_data.detection != 0x3)
  274. {
  275. if((board->md_data.r_data.detection & 0x1) == 0)
  276. {
  277. if(board->handle_input_pt[0] == 1)
  278. {
  279. da.method = PROMPT_CTRL;
  280. da.status = RELAY_CLOSE;
  281. for(int i= 0; i < PT_SUB_COUNT;i++)
  282. {
  283. if(board->md_data.rw_data.channel_ctrl[i] == 0 && board->md_data.rw_data.channel_ctrl[i + PT_SUB_COUNT] == 0)
  284. {
  285. board->handle_status[i] = board->md_data.r_data.status[i];
  286. board->handle_status[i + PT_SUB_COUNT] = board->md_data.r_data.status[i + PT_SUB_COUNT];
  287. da.channel =i;
  288. da.reg = &board->relay_staging_staus[i];
  289. set_relay_sta_async(&da);
  290. da.channel = i + PT_SUB_COUNT;
  291. da.reg = &board->relay_staging_staus[i + PT_SUB_COUNT];
  292. set_relay_sta_async(&da);
  293. sync_buff[i] = 1;
  294. }else
  295. {
  296. if(board->md_data.rw_data.channel_ctrl[i] == 0)
  297. {
  298. board->handle_status[i] = board->md_data.r_data.status[i];
  299. da.channel =i;
  300. da.reg = &board->relay_staging_staus[i];
  301. set_relay_sta_async(&da);
  302. }
  303. }
  304. }
  305. }
  306. board->handle_input_pt[0] = 0;
  307. }
  308. if((board->md_data.r_data.detection & 0x2) == 0)
  309. {
  310. if(board->handle_input_pt[1] == 1)
  311. {
  312. da.method = PROMPT_CTRL;
  313. da.status = RELAY_CLOSE;
  314. for(int i= 0; i < PT_SUB_COUNT;i++)
  315. {
  316. if(board->md_data.rw_data.channel_ctrl[i] == 0 && board->md_data.rw_data.channel_ctrl[i + PT_SUB_COUNT] == 0)
  317. {
  318. if(!sync_buff[i])
  319. {
  320. board->handle_status[i] = board->md_data.r_data.status[i];
  321. board->handle_status[i + PT_SUB_COUNT] = board->md_data.r_data.status[i + PT_SUB_COUNT];
  322. da.channel =i;
  323. da.reg = &board->relay_staging_staus[i];
  324. set_relay_sta_async(&da);
  325. da.channel = i + PT_SUB_COUNT;
  326. da.reg = &board->relay_staging_staus[i + PT_SUB_COUNT];
  327. set_relay_sta_async(&da);
  328. }
  329. }else
  330. {
  331. if(board->md_data.rw_data.channel_ctrl[i + PT_SUB_COUNT] == 0)
  332. {
  333. board->handle_status[i + PT_SUB_COUNT] = board->md_data.r_data.status[i + PT_SUB_COUNT];
  334. da.channel =i + PT_SUB_COUNT;
  335. da.reg = &board->relay_staging_staus[i + PT_SUB_COUNT];
  336. set_relay_sta_async(&da);
  337. }
  338. }
  339. }
  340. board->handle_input_pt[1] = 0;
  341. }
  342. }
  343. }else
  344. {
  345. if(board->handle_input_pt[0] == 0)
  346. {
  347. board->handle_input_pt[0] = 1;
  348. for(int i= 0; i < PT_SUB_COUNT;i++)
  349. {
  350. da.status = board->handle_status[i];
  351. da.method = DELAY_CTRL;
  352. if(board->md_data.rw_data.channel_ctrl[i] == 0 && board->md_data.rw_data.channel_ctrl[i + PT_SUB_COUNT] == 0)
  353. {
  354. if(!sync_buff[i])
  355. {
  356. da.channel =i;
  357. da.reg = &board->relay_staging_staus[i];
  358. set_relay_sta_async(&da);
  359. da.status = board->handle_status[i + PT_SUB_COUNT];
  360. da.channel = i + PT_SUB_COUNT;
  361. da.reg = &board->relay_staging_staus[i + PT_SUB_COUNT];
  362. set_relay_sta_async(&da);
  363. }
  364. }else
  365. {
  366. if(board->md_data.rw_data.channel_ctrl[i] == 0)
  367. {
  368. da.channel =i;
  369. da.reg = &board->relay_staging_staus[i];
  370. set_relay_sta_async(&da);
  371. }
  372. }
  373. }
  374. }
  375. if(board->handle_input_pt[1] == 0)
  376. {
  377. board->handle_input_pt[1] = 1;
  378. for(int i= 0; i < PT_SUB_COUNT;i++)
  379. {
  380. da.status = board->handle_status[i];
  381. da.method = DELAY_CTRL;
  382. if(board->md_data.rw_data.channel_ctrl[i] == 0 && board->md_data.rw_data.channel_ctrl[i + PT_SUB_COUNT] == 0)
  383. {
  384. da.channel =i;
  385. da.reg = &board->relay_staging_staus[i];
  386. set_relay_sta_async(&da);
  387. da.status = board->handle_status[i + PT_SUB_COUNT];
  388. da.channel = i + PT_SUB_COUNT;
  389. da.reg = &board->relay_staging_staus[i + PT_SUB_COUNT];
  390. set_relay_sta_async(&da);
  391. sync_buff[i] = 1;
  392. }else
  393. {
  394. if(board->md_data.rw_data.channel_ctrl[i + PT_SUB_COUNT] == 0)
  395. {
  396. da.status = board->handle_status[i + PT_SUB_COUNT];
  397. da.channel =i + PT_SUB_COUNT;
  398. da.reg = &board->relay_staging_staus[i + PT_SUB_COUNT];
  399. set_relay_sta_async(&da);
  400. }
  401. }
  402. }
  403. }
  404. }
  405. #endif
  406. #endif
  407. }
  408. }