detection.c 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  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. rcu_periph_clock_enable(RCU_CFGCMP);
  56. rcu_periph_clock_enable(RCU_GPIOA);
  57. #if SURPPORT_2_PT
  58. rcu_periph_clock_enable(RCU_GPIOB);
  59. #endif
  60. gpio_mode_set(DERECTION_GPIO_1, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, DERECTION_IO_1);
  61. #if SURPPORT_2_PT
  62. gpio_mode_set(DERECTION_GPIO_2, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, DERECTION_IO_2);
  63. #endif
  64. #endif
  65. board->detection = get_detection;
  66. board->opt_detection = detection_opt;
  67. }
  68. void key_init(void)
  69. {
  70. #if SUPPORT_ALL_ON_OFF
  71. rcu_periph_clock_enable(RCU_CFGCMP);
  72. rcu_periph_clock_enable(KEY_RST_RCU);
  73. gpio_mode_set(KEY_RST_IO, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, KEY_RST);
  74. nvic_irq_enable(EXTI4_15_IRQn,2);
  75. syscfg_exti_line_config(KEY_RST_EXTI_SOURCE,KEY_RST_EXTI_IO);
  76. exti_init(KEY_RST_EXTI,EXTI_INTERRUPT,EXTI_TRIG_FALLING);
  77. exti_interrupt_flag_clear(KEY_RST_EXTI);
  78. rcu_periph_clock_enable(KEY_TEST_RCU);
  79. gpio_mode_set(KEY_TEST_IO, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, KEY_TEST);
  80. nvic_irq_enable(EXTI2_3_IRQn,2);
  81. syscfg_exti_line_config(KEY_TEST_EXTI_SOURCE,KEY_TEST_EXTI_IO);
  82. exti_init(KEY_TEST_EXTI,EXTI_INTERRUPT,EXTI_TRIG_FALLING);
  83. exti_interrupt_flag_clear(KEY_TEST_EXTI);
  84. #endif
  85. }
  86. void EXTI4_15_IRQHandler(void){
  87. #if SUPPORT_ALL_ON_OFF
  88. if(RESET != exti_interrupt_flag_get(KEY_RST_EXTI))
  89. {
  90. exti_interrupt_flag_clear(KEY_RST_EXTI);
  91. if(board)
  92. {
  93. if(gpio_input_bit_get(KEY_TEST_IO,KEY_TEST) != 0)
  94. {
  95. async_data da = {0};
  96. da.fire_or_zero = _FIRE;
  97. da.w_eep_flag = FLAG_W_EEP;
  98. for(uint8_t j = 0; j < PT_SUB_COUNT;j++)
  99. {
  100. // if(board->md_data.r_data.state.state[j].state == RELAY_CLOSE)
  101. // continue;
  102. da.channel = j;
  103. da.method = DELAY_CTRL;
  104. da.reg = &board->relay_staging_staus[j];
  105. da.status = RELAY_CLOSE;
  106. set_relay_sta_async(&da);
  107. }
  108. }
  109. }
  110. }
  111. #endif
  112. }
  113. void EXTI2_3_IRQHandler(void)
  114. {
  115. #if SUPPORT_ALL_ON_OFF
  116. if(RESET != exti_interrupt_flag_get(KEY_TEST_EXTI))
  117. {
  118. exti_interrupt_flag_clear(KEY_TEST_EXTI);
  119. if(board)
  120. {
  121. if(gpio_input_bit_get(KEY_RST_IO,KEY_RST) != 0)
  122. {
  123. #if SUPPORT_DETECTION
  124. if(board->md_data.r_data.detection & 0x1)
  125. #endif
  126. {
  127. async_data da = {0};
  128. da.fire_or_zero = _FIRE;
  129. da.method = DELAY_CTRL;
  130. da.w_eep_flag = FLAG_W_EEP;
  131. for(uint8_t k = 0; k < PT_SUB_COUNT;k++)
  132. {
  133. // if(board->md_data.r_data.state.state[k].state ==RELAY_OPEN)
  134. // continue;
  135. da.channel =k;
  136. da.reg = &board->relay_staging_staus[k];
  137. da.status = RELAY_OPEN;
  138. set_relay_sta_async(&da);
  139. }
  140. }
  141. }
  142. #if SURPPORT_2_PT
  143. #if SUPPORT_DETECTION
  144. if(board->md_data.r_data.detection & 0x2)
  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 = PT_SUB_COUNT; k < RelaySlaveChaNum;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. #endif
  162. }
  163. }
  164. #endif
  165. }
  166. static void get_detection()
  167. {
  168. #if SUPPORT_DETECTION
  169. if(board)
  170. {
  171. uint16_t data = 0;
  172. if(gpio_input_bit_get(GPIOA,GPIO_PIN_11)==0)
  173. {
  174. data |= (1 << 0);
  175. }
  176. #if SURPPORT_2_PT
  177. if(gpio_input_bit_get(GPIOB,GPIO_PIN_3)==0)
  178. {
  179. data |= (1 << 1);
  180. }
  181. #endif
  182. board->md_data.r_data.detection = data;
  183. }
  184. #endif
  185. }
  186. static void detection_opt(void)
  187. {
  188. if(board)
  189. {
  190. #if SUPPORT_RELAY_REMENBER
  191. if(board->md_data.r_data.detection & 0x1)
  192. {
  193. if(board->handle_input_pt[0] == 0)
  194. {
  195. board->handle_input_pt[0] = 1;
  196. for(uint8_t k = 0; k < PT_SUB_COUNT;k++)
  197. {
  198. async_data da = {0};
  199. da.channel =k;
  200. da.fire_or_zero = _FIRE;
  201. da.method = DELAY_CTRL;
  202. da.reg = &board->relay_staging_staus[k];
  203. da.status = board->handle_status[k];
  204. da.w_eep_flag = FLAG_N_W_EEP;
  205. set_relay_sta_async(&da);
  206. }
  207. }
  208. }else
  209. {
  210. if(board->handle_input_pt[0] == 1)
  211. {
  212. for(uint8_t k = 0; k < PT_SUB_COUNT;k++)
  213. {
  214. board->handle_status[k] = (board->md_data.r_data.rl_status & (1 << k)) ? 1 : 0;
  215. async_data da = {0};
  216. da.channel =k;
  217. da.fire_or_zero = _FIRE;
  218. da.method = PROMPT_CTRL;
  219. da.reg = &board->relay_staging_staus[k];
  220. da.status = RELAY_CLOSE;
  221. da.w_eep_flag = FLAG_N_W_EEP;
  222. set_relay_sta_async(&da);
  223. }
  224. board->handle_input_pt[0] = 0;
  225. }
  226. }
  227. #if SURPPORT_2_PT
  228. if(board->md_data.r_data.detection & 0x2)
  229. {
  230. if(board->handle_input_pt[1] == 0)
  231. {
  232. board->handle_input_pt[1] = 1;
  233. for(uint8_t k = PT_SUB_COUNT; k < RelaySlaveChaNum;k++)
  234. {
  235. async_data da = {0};
  236. da.channel =k;
  237. da.fire_or_zero = _FIRE;
  238. da.method = DELAY_CTRL;
  239. da.reg = &board->relay_staging_staus[k];
  240. da.status = board->handle_status[k];
  241. da.w_eep_flag = FLAG_N_W_EEP;
  242. set_relay_sta_async(&da);
  243. }
  244. }
  245. }else
  246. {
  247. if(board->handle_input_pt[1] == 1)
  248. {
  249. for(uint8_t k = PT_SUB_COUNT; k < RelaySlaveChaNum;k++)
  250. {
  251. board->handle_status[k] = (board->md_data.r_data.rl_status & (1 << k)) ? 1 : 0;
  252. async_data da = {0};
  253. da.channel =k;
  254. da.fire_or_zero = _FIRE;
  255. da.method = PROMPT_CTRL;
  256. da.reg = &board->relay_staging_staus[k];
  257. da.status = RELAY_CLOSE;
  258. da.w_eep_flag = FLAG_N_W_EEP;
  259. set_relay_sta_async(&da);
  260. }
  261. board->handle_input_pt[1] = 0;
  262. }
  263. }
  264. #endif
  265. #endif
  266. }
  267. }