detection.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939
  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. #include "string.h"
  16. #define DERECTION_GPIO_1 GPIOA
  17. #define DERECTION_IO_1 GPIO_PIN_11
  18. #define DERECTION_IO_1_RCU EXTI_SOURCE_GPIOA
  19. #define DERECTION_IO_1_PIN DERECTION_IO_11
  20. #define DERECTION_IO_1_SOURCE EXTI_SOURCE_PIN11
  21. #define DERECTION_IO_1_EXIT EXTI_11
  22. #if (SURPPORT_2_PT)
  23. #define DERECTION_GPIO_2 GPIOB
  24. #define DERECTION_IO_2 GPIO_PIN_3
  25. #define DERECTION_IO_2_RCU EXTI_SOURCE_GPIOB
  26. #define DERECTION_IO_2_PIN DERECTION_IO_3
  27. #define DERECTION_IO_2_SOURCE EXTI_SOURCE_PIN3
  28. #define DERECTION_IO_2_EXIT EXTI_3
  29. #endif
  30. #define KEY_TEST_1_IO GPIO_PIN_14
  31. #define KEY_TEST_1_IO_SOURCE_RCU EXTI_SOURCE_GPIOC
  32. #define KEY_TEST_1_IO_SOURCE EXTI_SOURCE_PIN14
  33. #define KEY_TEST_1_IO_EXIT EXTI_14
  34. #define KEY_TEST_2_IO GPIO_PIN_2
  35. #define KEY_TEST_2_IO_SOURCE_RCU EXTI_SOURCE_GPIOB
  36. #define KEY_TEST_2_IO_SOURCE EXTI_SOURCE_PIN2
  37. #define KEY_TEST_2_IO_EXIT EXTI_2
  38. #define KEY_TEST_3_IO GPIO_PIN_0
  39. #define KEY_TEST_3_IO_SOURCE_RCU EXTI_SOURCE_GPIOA
  40. #define KEY_TEST_3_IO_SOURCE EXTI_SOURCE_PIN0
  41. #define KEY_TEST_3_IO_EXIT EXTI_0
  42. #define KEY_TEST_4_IO GPIO_PIN_1
  43. #define KEY_TEST_4_IO_SOURCE_RCU EXTI_SOURCE_GPIOA
  44. #define KEY_TEST_4_IO_SOURCE EXTI_SOURCE_PIN1
  45. #define KEY_TEST_4_IO_EXIT EXTI_1
  46. #define KEY_TEST_5_IO GPIO_PIN_12
  47. #define KEY_TEST_5_IO_SOURCE_RCU EXTI_SOURCE_GPIOA
  48. #define KEY_TEST_5_IO_SOURCE EXTI_SOURCE_PIN12
  49. #define KEY_TEST_5_IO_EXIT EXTI_12
  50. #define KEY_TEST_1_GPIO GPIOC
  51. #define KEY_TEST_2_GPIO GPIOB
  52. #define KEY_TEST_3_4_5_GPIO GPIOA
  53. static board_t *board = 0;
  54. #define KEY_RST_RCU RCU_GPIOC
  55. #define KEY_RST_IO GPIOC
  56. #define KEY_RST GPIO_PIN_14
  57. #define KEY_RST_EXTI_SOURCE EXTI_SOURCE_GPIOC
  58. #define KEY_RST_EXTI EXTI_14
  59. #define KEY_RST_EXTI_IO EXTI_SOURCE_PIN14
  60. #define KEY_TEST_RCU RCU_GPIOB
  61. #define KEY_TEST_IO GPIOB
  62. #define KEY_TEST GPIO_PIN_2
  63. #define KEY_TEST_EXTI_SOURCE EXTI_SOURCE_GPIOB
  64. #define KEY_TEST_EXTI EXTI_2
  65. #define KEY_TEST_EXTI_IO EXTI_SOURCE_PIN2
  66. static void get_detection(void);
  67. static void detection_opt(void);
  68. #if SUPPORT_SELF_LOCK
  69. static void get_test_1();
  70. static void get_test_2();
  71. static void get_test_3();
  72. static void get_test_4();
  73. static void get_lock_key(void);
  74. static void self_lock_opt(void);
  75. #endif
  76. void detection_init(void)
  77. {
  78. #if SUPPORT_DETECTION
  79. board = get_board();
  80. rcu_periph_clock_enable(RCU_CFGCMP);
  81. rcu_periph_clock_enable(RCU_GPIOA);
  82. #if SURPPORT_2_PT
  83. rcu_periph_clock_enable(RCU_GPIOB);
  84. #endif
  85. gpio_mode_set(DERECTION_GPIO_1, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, DERECTION_IO_1);
  86. #if SURPPORT_2_PT
  87. gpio_mode_set(DERECTION_GPIO_2, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, DERECTION_IO_2);
  88. #endif
  89. nvic_irq_enable(EXTI4_15_IRQn,2);
  90. syscfg_exti_line_config(DERECTION_IO_1_RCU,DERECTION_IO_1_SOURCE);
  91. exti_init(DERECTION_IO_1_EXIT,EXTI_INTERRUPT,EXTI_TRIG_FALLING);
  92. exti_interrupt_flag_clear(DERECTION_IO_1_EXIT);
  93. #if SURPPORT_2_PT
  94. nvic_irq_enable(EXTI2_3_IRQn,2);
  95. syscfg_exti_line_config(DERECTION_IO_2_RCU,DERECTION_IO_2_SOURCE);
  96. exti_init(DERECTION_IO_2_EXIT,EXTI_INTERRUPT,EXTI_TRIG_FALLING);
  97. exti_interrupt_flag_clear(DERECTION_IO_2_EXIT);
  98. #endif
  99. board->detection = get_detection;
  100. board->opt_detection = detection_opt;
  101. #endif
  102. }
  103. void key_init(void)
  104. {
  105. #if SUPPORT_ALL_ON_OFF
  106. rcu_periph_clock_enable(RCU_CFGCMP);
  107. rcu_periph_clock_enable(KEY_RST_RCU);
  108. gpio_mode_set(KEY_RST_IO, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, KEY_RST);
  109. nvic_irq_enable(EXTI4_15_IRQn,2);
  110. syscfg_exti_line_config(KEY_RST_EXTI_SOURCE,KEY_RST_EXTI_IO);
  111. exti_init(KEY_RST_EXTI,EXTI_INTERRUPT,EXTI_TRIG_FALLING);
  112. exti_interrupt_flag_clear(KEY_RST_EXTI);
  113. rcu_periph_clock_enable(KEY_TEST_RCU);
  114. gpio_mode_set(KEY_TEST_IO, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, KEY_TEST);
  115. nvic_irq_enable(EXTI2_3_IRQn,2);
  116. syscfg_exti_line_config(KEY_TEST_EXTI_SOURCE,KEY_TEST_EXTI_IO);
  117. exti_init(KEY_TEST_EXTI,EXTI_INTERRUPT,EXTI_TRIG_FALLING);
  118. exti_interrupt_flag_clear(KEY_TEST_EXTI);
  119. #elif SUPPORT_SELF_LOCK
  120. #if SUPPORT_MICRO_SWITCH
  121. rcu_periph_clock_enable(RCU_CFGCMP);
  122. rcu_periph_clock_enable(RCU_GPIOC);
  123. rcu_periph_clock_enable(RCU_GPIOA);
  124. rcu_periph_clock_enable(RCU_GPIOB);
  125. if(!board)
  126. {
  127. board = get_board();
  128. }
  129. #if (RelaySlaveChaNum >= 1)
  130. gpio_mode_set(KEY_TEST_1_GPIO, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, KEY_TEST_1_IO);
  131. nvic_irq_enable(EXTI4_15_IRQn,1);
  132. syscfg_exti_line_config(KEY_TEST_1_IO_SOURCE_RCU,KEY_TEST_1_IO_SOURCE);
  133. exti_init(KEY_TEST_1_IO_EXIT,EXTI_INTERRUPT,EXTI_TRIG_FALLING);
  134. exti_interrupt_flag_clear(KEY_TEST_1_IO_EXIT);
  135. #endif
  136. #if (RelaySlaveChaNum >= 2)
  137. gpio_mode_set(KEY_TEST_2_GPIO, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, KEY_TEST_2_IO);
  138. nvic_irq_enable(EXTI2_3_IRQn,1);
  139. syscfg_exti_line_config(KEY_TEST_2_IO_SOURCE_RCU,KEY_TEST_2_IO_SOURCE);
  140. exti_init(KEY_TEST_2_IO_EXIT,EXTI_INTERRUPT,EXTI_TRIG_FALLING);
  141. exti_interrupt_flag_clear(KEY_TEST_2_IO_EXIT);
  142. #endif
  143. #if (RelaySlaveChaNum >= 3)
  144. gpio_mode_set(KEY_TEST_3_4_5_GPIO, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, KEY_TEST_3_IO);
  145. nvic_irq_enable(EXTI0_1_IRQn,1);
  146. syscfg_exti_line_config(KEY_TEST_3_IO_SOURCE_RCU,KEY_TEST_3_IO_SOURCE);
  147. exti_init(KEY_TEST_3_IO_EXIT,EXTI_INTERRUPT,EXTI_TRIG_FALLING);
  148. exti_interrupt_flag_clear(KEY_TEST_3_IO_EXIT);
  149. #endif
  150. #if (RelaySlaveChaNum >= 4)
  151. gpio_mode_set(KEY_TEST_3_4_5_GPIO, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, KEY_TEST_4_IO);
  152. nvic_irq_enable(EXTI0_1_IRQn,1);
  153. syscfg_exti_line_config(KEY_TEST_4_IO_SOURCE_RCU,KEY_TEST_4_IO_SOURCE);
  154. exti_init(KEY_TEST_4_IO_EXIT,EXTI_INTERRUPT,EXTI_TRIG_FALLING);
  155. exti_interrupt_flag_clear(KEY_TEST_4_IO_EXIT);
  156. #endif
  157. #if (RelaySlaveChaNum >= 5)
  158. gpio_mode_set(KEY_TEST_3_4_5_GPIO, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, KEY_TEST_5_IO);
  159. nvic_irq_enable(EXTI4_15_IRQn,1);
  160. syscfg_exti_line_config(KEY_TEST_5_IO_SOURCE_RCU,KEY_TEST_5_IO_SOURCE);
  161. exti_init(KEY_TEST_5_IO_EXIT,EXTI_INTERRUPT,EXTI_TRIG_FALLING);
  162. exti_interrupt_flag_clear(KEY_TEST_5_IO_EXIT);
  163. #endif
  164. board->get_lock_key = get_lock_key;
  165. board->opt_lock_key = self_lock_opt;
  166. #else
  167. rcu_periph_clock_enable(RCU_CFGCMP);
  168. rcu_periph_clock_enable(RCU_GPIOC);
  169. if(!board)
  170. {
  171. board = get_board();
  172. }
  173. #if (RelaySlaveChaNum >= 1)
  174. gpio_mode_set(KEY_TEST_1_GPIO, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, KEY_TEST_1_IO);
  175. #endif
  176. #if (RelaySlaveChaNum >= 2)
  177. rcu_periph_clock_enable(RCU_GPIOB);
  178. gpio_mode_set(KEY_TEST_2_GPIO, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, KEY_TEST_2_IO);
  179. #endif
  180. #if (RelaySlaveChaNum >= 3)
  181. rcu_periph_clock_enable(RCU_GPIOA);
  182. gpio_mode_set(KEY_TEST_3_4_5_GPIO, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, KEY_TEST_3_IO);
  183. #endif
  184. #if (RelaySlaveChaNum >= 4)
  185. gpio_mode_set(KEY_TEST_3_4_5_GPIO, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, KEY_TEST_4_IO);
  186. #endif
  187. board->get_lock_key = get_lock_key;
  188. board->opt_lock_key = self_lock_opt;
  189. #endif
  190. //#elif SUPPORT_KEY_EXIT
  191. // rcu_periph_clock_enable(RCU_CFGCMP);
  192. // rcu_periph_clock_enable(RCU_GPIOC);
  193. // rcu_periph_clock_enable(RCU_GPIOA);
  194. // rcu_periph_clock_enable(RCU_GPIOB);
  195. // if(!board)
  196. // {
  197. // board = get_board();
  198. // }
  199. //#if (RelaySlaveChaNum >= 1)
  200. // gpio_mode_set(KEY_TEST_1_GPIO, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, KEY_TEST_1_IO);
  201. // nvic_irq_enable(EXTI4_15_IRQn,1);
  202. // syscfg_exti_line_config(KEY_TEST_1_IO_SOURCE_RCU,KEY_TEST_1_IO_SOURCE);
  203. // exti_init(KEY_TEST_1_IO_EXIT,EXTI_INTERRUPT,EXTI_TRIG_FALLING);
  204. // exti_interrupt_flag_clear(KEY_TEST_1_IO_EXIT);
  205. //#endif
  206. //
  207. //#if (RelaySlaveChaNum >= 2)
  208. // gpio_mode_set(KEY_TEST_2_GPIO, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, KEY_TEST_2_IO);
  209. // nvic_irq_enable(EXTI2_3_IRQn,1);
  210. // syscfg_exti_line_config(KEY_TEST_2_IO_SOURCE_RCU,KEY_TEST_2_IO_SOURCE);
  211. // exti_init(KEY_TEST_2_IO_EXIT,EXTI_INTERRUPT,EXTI_TRIG_FALLING);
  212. // exti_interrupt_flag_clear(KEY_TEST_2_IO_EXIT);
  213. //#endif
  214. //
  215. //
  216. //#if (RelaySlaveChaNum >= 3)
  217. // gpio_mode_set(KEY_TEST_3_4_5_GPIO, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, KEY_TEST_3_IO);
  218. // nvic_irq_enable(EXTI0_1_IRQn,1);
  219. // syscfg_exti_line_config(KEY_TEST_3_IO_SOURCE_RCU,KEY_TEST_3_IO_SOURCE);
  220. // exti_init(KEY_TEST_3_IO_EXIT,EXTI_INTERRUPT,EXTI_TRIG_FALLING);
  221. // exti_interrupt_flag_clear(KEY_TEST_3_IO_EXIT);
  222. //#endif
  223. //
  224. //#if (RelaySlaveChaNum >= 4)
  225. // gpio_mode_set(KEY_TEST_3_4_5_GPIO, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, KEY_TEST_4_IO);
  226. // nvic_irq_enable(EXTI0_1_IRQn,1);
  227. // syscfg_exti_line_config(KEY_TEST_4_IO_SOURCE_RCU,KEY_TEST_4_IO_SOURCE);
  228. // exti_init(KEY_TEST_4_IO_EXIT,EXTI_INTERRUPT,EXTI_TRIG_FALLING);
  229. // exti_interrupt_flag_clear(KEY_TEST_4_IO_EXIT);
  230. //#endif
  231. //
  232. //#if (RelaySlaveChaNum >= 5)
  233. // gpio_mode_set(KEY_TEST_3_4_5_GPIO, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, KEY_TEST_5_IO);
  234. // nvic_irq_enable(EXTI4_15_IRQn,1);
  235. // syscfg_exti_line_config(KEY_TEST_5_IO_SOURCE_RCU,KEY_TEST_5_IO_SOURCE);
  236. // exti_init(KEY_TEST_5_IO_EXIT,EXTI_INTERRUPT,EXTI_TRIG_FALLING);
  237. // exti_interrupt_flag_clear(KEY_TEST_5_IO_EXIT);
  238. //#endif
  239. #endif
  240. }
  241. extern uint8_t relay_flag[RelaySlaveChaNum];
  242. extern uint8_t relay_status[RelaySlaveChaNum];
  243. uint8_t relay_counter_flag[RelaySlaveChaNum];
  244. void EXTI4_15_IRQHandler(void){
  245. #if SUPPORT_ALL_ON_OFF
  246. if(RESET != exti_interrupt_flag_get(KEY_RST_EXTI))
  247. {
  248. exti_interrupt_flag_clear(KEY_RST_EXTI);
  249. for(int i = 0;i < 30;i++);
  250. if(gpio_input_bit_get(KEY_RST_IO,KEY_RST) != 0)
  251. {
  252. return;
  253. }
  254. if(board)
  255. {
  256. if(gpio_input_bit_get(KEY_TEST_IO,KEY_TEST) != 0)
  257. {
  258. async_data da = {0};
  259. da.fire_or_zero = _FIRE;
  260. da.w_eep_flag = FLAG_W_EEP;
  261. for(uint8_t j = 0; j < PT_SUB_COUNT;j++)
  262. {
  263. // if(board->md_data.r_data.state.state[j].state == RELAY_CLOSE)
  264. // continue;
  265. #if SUPPORT_CTRL2_LOCK2
  266. if(j >= AVALIABLE_RELAY)
  267. {
  268. continue;
  269. }
  270. #endif
  271. da.channel = j;
  272. da.method = DELAY_CTRL;
  273. da.reg = &board->relay_staging_staus[j];
  274. da.status = RELAY_CLOSE;
  275. set_relay_sta_async(&da);
  276. }
  277. }
  278. }
  279. }
  280. #elif SUPPORT_KEY_EXIT
  281. #if (RelaySlaveChaNum >= 1)
  282. if(RESET != exti_interrupt_flag_get(KEY_TEST_1_IO_EXIT))
  283. {
  284. exti_interrupt_flag_clear(KEY_TEST_1_IO_EXIT);
  285. for(int i = 0;i <30;i++);
  286. if(gpio_input_bit_get(KEY_TEST_1_GPIO,KEY_TEST_1_IO) == 0)
  287. {
  288. board->val_key[0] = board->val_key[0] ? 0 : 1;
  289. w_eeprom_data_t da = {0};
  290. da.lenth =1;
  291. memcpy((void*)&da.data,(void*)&board->val_key[0],1);
  292. da.start_addr = (EEPROM_SELF_LOCK_STATUS+0);
  293. board->q_cache.en_queue(&da);
  294. }
  295. }
  296. #endif
  297. #if (RelaySlaveChaNum >= 5)
  298. if(RESET != exti_interrupt_flag_get(KEY_TEST_5_IO_EXIT))
  299. {
  300. exti_interrupt_flag_clear(KEY_TEST_5_IO_EXIT);
  301. for(int i = 0;i <30;i++);
  302. if(gpio_input_bit_get(KEY_TEST_3_4_5_GPIO,KEY_TEST_5_IO) == 0)
  303. {
  304. board->val_key[4] = board->val_key[4] ? 0 : 1;
  305. w_eeprom_data_t da = {0};
  306. da.lenth =1;
  307. memcpy((void*)&da.data,(void*)&board->val_key[4],1);
  308. da.start_addr = (EEPROM_SELF_LOCK_STATUS+4);
  309. board->q_cache.en_queue(&da);
  310. }
  311. }
  312. #endif
  313. #endif
  314. if(RESET != exti_interrupt_flag_get(DERECTION_IO_1_EXIT))
  315. {
  316. exti_interrupt_flag_clear(DERECTION_IO_1_EXIT);
  317. if(board)
  318. {
  319. //for(int i = 0;i <20;i++);
  320. if(gpio_input_bit_get(DERECTION_GPIO_1,DERECTION_IO_1) == 0)
  321. {
  322. board->detection_1_value = 1;
  323. board->detection_1_count = 0;
  324. }
  325. }
  326. }
  327. }
  328. #if SUPPORT_KEY_EXIT
  329. void EXTI0_1_IRQHandler(void)
  330. {
  331. #if SUPPORT_DETECTION
  332. if(board->md_data.r_data.detection & 0x1)
  333. #endif
  334. {
  335. #if (RelaySlaveChaNum >= 3)
  336. if(RESET != exti_interrupt_flag_get(KEY_TEST_3_IO_EXIT))
  337. {
  338. exti_interrupt_flag_clear(KEY_TEST_3_IO_EXIT);
  339. for(int i = 0;i <30;i++);
  340. if(gpio_input_bit_get(KEY_TEST_3_4_5_GPIO,KEY_TEST_3_IO) == 0)
  341. {
  342. board->val_key[2] = board->val_key[2] ? 0 : 1;
  343. w_eeprom_data_t da = {0};
  344. da.lenth =1;
  345. memcpy((void*)&da.data,(void*)&board->val_key[2],1);
  346. da.start_addr = (EEPROM_SELF_LOCK_STATUS+2);
  347. board->q_cache.en_queue(&da);
  348. }
  349. }
  350. #endif
  351. #if (RelaySlaveChaNum >= 4)
  352. if(RESET != exti_interrupt_flag_get(KEY_TEST_4_IO_EXIT))
  353. {
  354. exti_interrupt_flag_clear(KEY_TEST_4_IO_EXIT);
  355. for(int i = 0;i <30;i++);
  356. if(gpio_input_bit_get(KEY_TEST_3_4_5_GPIO,KEY_TEST_4_IO) == 0)
  357. {
  358. board->val_key[3] = board->val_key[3] ? 0 : 1;
  359. w_eeprom_data_t da = {0};
  360. da.lenth =1;
  361. memcpy((void*)&da.data,(void*)&board->val_key[3],1);
  362. da.start_addr = (EEPROM_SELF_LOCK_STATUS+3);
  363. board->q_cache.en_queue(&da);
  364. }
  365. }
  366. #endif
  367. }
  368. }
  369. #endif
  370. void EXTI2_3_IRQHandler(void)
  371. {
  372. #if SUPPORT_ALL_ON_OFF
  373. if(RESET != exti_interrupt_flag_get(KEY_TEST_EXTI))
  374. {
  375. exti_interrupt_flag_clear(KEY_TEST_EXTI);
  376. for(int i = 0;i < 30;i++);
  377. if(gpio_input_bit_get(KEY_TEST_IO,KEY_TEST) != 0)
  378. {
  379. return;
  380. }
  381. if(board)
  382. {
  383. if(gpio_input_bit_get(KEY_RST_IO,KEY_RST) != 0)
  384. {
  385. #if SUPPORT_DETECTION
  386. if(board->md_data.r_data.detection & 0x1)
  387. #endif
  388. {
  389. async_data da = {0};
  390. da.fire_or_zero = _FIRE;
  391. da.method = DELAY_CTRL;
  392. da.w_eep_flag = FLAG_W_EEP;
  393. for(uint8_t k = 0; k < PT_SUB_COUNT;k++)
  394. {
  395. // if(board->md_data.r_data.state.state[k].state ==RELAY_OPEN)
  396. // continue;
  397. #if SUPPORT_CTRL2_LOCK2
  398. if(k >= AVALIABLE_RELAY)
  399. {
  400. continue;
  401. }
  402. #endif
  403. da.channel =k;
  404. da.reg = &board->relay_staging_staus[k];
  405. da.status = RELAY_OPEN;
  406. set_relay_sta_async(&da);
  407. }
  408. }
  409. }
  410. #if SURPPORT_2_PT
  411. #if SUPPORT_DETECTION
  412. if(board->md_data.r_data.detection & 0x2)
  413. #endif
  414. {
  415. async_data da = {0};
  416. da.fire_or_zero = _FIRE;
  417. da.method = DELAY_CTRL;
  418. da.w_eep_flag = FLAG_W_EEP;
  419. for(uint8_t k = PT_SUB_COUNT; k < RelaySlaveChaNum;k++)
  420. {
  421. if(board->md_data.r_data.state.state[k].state ==RELAY_OPEN)
  422. continue;
  423. da.channel =k;
  424. da.reg = &board->relay_staging_staus[k];
  425. da.status = RELAY_OPEN;
  426. set_relay_sta_async(&da);
  427. }
  428. }
  429. #endif
  430. }
  431. }
  432. #elif SUPPORT_KEY_EXIT
  433. #if (RelaySlaveChaNum >= 2)
  434. if(RESET != exti_interrupt_flag_get(KEY_TEST_2_IO_EXIT))
  435. {
  436. exti_interrupt_flag_clear(KEY_TEST_2_IO_EXIT);
  437. #if SUPPORT_DETECTION
  438. if(board->md_data.r_data.detection & 0x1)
  439. #endif
  440. {
  441. for(int i = 0;i <30;i++);
  442. if(gpio_input_bit_get(KEY_TEST_2_GPIO,KEY_TEST_2_IO) == 0)
  443. {
  444. board->val_key[1] = board->val_key[1] ? 0 : 1;
  445. w_eeprom_data_t da = {0};
  446. da.lenth =1;
  447. memcpy((void*)&da.data,(void*)&board->val_key[1],1);
  448. da.start_addr = (EEPROM_SELF_LOCK_STATUS+1);
  449. board->q_cache.en_queue(&da);
  450. }
  451. }
  452. }
  453. #endif
  454. #endif
  455. #if SURPPORT_2_PT
  456. if(RESET != exti_interrupt_flag_get(DERECTION_IO_2_EXIT))
  457. {
  458. exti_interrupt_flag_clear(DERECTION_IO_2_EXIT);
  459. if(board)
  460. {
  461. //for(int i = 0;i <20;i++);
  462. if(gpio_input_bit_get(DERECTION_GPIO_2,DERECTION_IO_2) == 0)
  463. {
  464. board->detection_2_value = 1;
  465. board->detection_2_count = 0;
  466. }
  467. }
  468. }
  469. #endif
  470. }
  471. static void get_detection()
  472. {
  473. #if SUPPORT_DETECTION
  474. if(board)
  475. {
  476. uint16_t data = 0;
  477. if(board->detection_1_value > 0)
  478. {
  479. data |= (1 << 0);
  480. }
  481. #if SURPPORT_2_PT
  482. if(board->detection_2_value > 0)
  483. {
  484. data |= (1 << 1);
  485. }
  486. #endif
  487. board->md_data.r_data.detection = data;
  488. }
  489. #endif
  490. }
  491. static void detection_opt(void)
  492. {
  493. if(board)
  494. {
  495. #if SUPPORT_RELAY_REMENBER
  496. if(board->md_data.r_data.detection & 0x1)
  497. {
  498. if(board->handle_input_pt[0] == 0)
  499. {
  500. for(uint8_t k = 0; k < PT_SUB_COUNT;k++)
  501. {
  502. #if SUPPORT_SELF_LOCK
  503. if(board->val_key[k] == 0)
  504. continue;
  505. #endif
  506. #if SUPPORT_CTRL2_LOCK2
  507. if(k >= AVALIABLE_RELAY)
  508. {
  509. continue;
  510. }
  511. #endif
  512. async_data da = {0};
  513. da.channel =k;
  514. da.fire_or_zero = _FIRE;
  515. da.method = DELAY_CTRL;
  516. da.reg = &board->relay_staging_staus[k];
  517. da.status = board->handle_status[k];
  518. da.w_eep_flag = FLAG_N_W_EEP;
  519. set_relay_sta_async(&da);
  520. }
  521. board->handle_input_pt[0] = 1;
  522. }
  523. }else
  524. {
  525. if(board->handle_input_pt[0] == 1)
  526. {
  527. for(uint8_t k = 0; k < PT_SUB_COUNT;k++)
  528. {
  529. #if SUPPORT_CTRL2_LOCK2
  530. if(k >= AVALIABLE_RELAY)
  531. {
  532. continue;
  533. }
  534. #endif
  535. board->handle_status[k] = board->md_data.r_data.state.state[k].state;
  536. async_data da = {0};
  537. da.channel =k;
  538. da.fire_or_zero = _FIRE;
  539. da.method = PROMPT_CTRL;
  540. da.reg = &board->relay_staging_staus[k];
  541. da.status = RELAY_CLOSE;
  542. da.w_eep_flag = FLAG_N_W_EEP;
  543. set_relay_sta_async(&da);
  544. }
  545. board->handle_input_pt[0] = 0;
  546. }
  547. }
  548. #if SURPPORT_2_PT
  549. if(board->md_data.r_data.detection & 0x2)
  550. {
  551. if(board->handle_input_pt[1] == 0)
  552. {
  553. for(uint8_t k = PT_SUB_COUNT; k < RelaySlaveChaNum;k++)
  554. {
  555. async_data da = {0};
  556. da.channel =k;
  557. da.fire_or_zero = _FIRE;
  558. da.method = DELAY_CTRL;
  559. da.reg = &board->relay_staging_staus[k];
  560. da.status = board->handle_status[k];
  561. da.w_eep_flag = FLAG_N_W_EEP;
  562. set_relay_sta_async(&da);
  563. }
  564. board->handle_input_pt[1] = 1;
  565. }
  566. }else
  567. {
  568. if(board->handle_input_pt[1] == 1)
  569. {
  570. for(uint8_t k = PT_SUB_COUNT; k < RelaySlaveChaNum;k++)
  571. {
  572. board->handle_status[k] = board->md_data.r_data.state.state[k].state;
  573. async_data da = {0};
  574. da.channel =k;
  575. da.fire_or_zero = _FIRE;
  576. da.method = PROMPT_CTRL;
  577. da.reg = &board->relay_staging_staus[k];
  578. da.status = RELAY_CLOSE;
  579. da.w_eep_flag = FLAG_N_W_EEP;
  580. set_relay_sta_async(&da);
  581. }
  582. board->handle_input_pt[1] = 0;
  583. }
  584. }
  585. #endif
  586. #endif
  587. }
  588. }
  589. #if SUPPORT_SELF_LOCK
  590. static void get_lock_key(void)
  591. {
  592. #if SUPPORT_MICRO_SWITCH
  593. #else
  594. #if (RelaySlaveChaNum >= 1)
  595. if(gpio_input_bit_get(KEY_TEST_1_GPIO,KEY_TEST_1_IO) == RESET)
  596. {
  597. board->val_key[0] = 1;
  598. }else
  599. {
  600. board->val_key[0] = 0;
  601. }
  602. #endif
  603. #if (RelaySlaveChaNum >= 2)
  604. if(gpio_input_bit_get(KEY_TEST_2_GPIO,KEY_TEST_2_IO) == RESET)
  605. {
  606. board->val_key[1] = 1;
  607. }else
  608. {
  609. board->val_key[1] = 0;
  610. }
  611. #endif
  612. #if (RelaySlaveChaNum >= 3)
  613. if(gpio_input_bit_get(KEY_TEST_3_4_5_GPIO,KEY_TEST_3_IO) == RESET)
  614. {
  615. board->val_key[2] = 1;
  616. }else
  617. {
  618. board->val_key[2] = 0;
  619. }
  620. #endif
  621. #if (RelaySlaveChaNum >= 4)
  622. if(gpio_input_bit_get(KEY_TEST_3_4_5_GPIO,KEY_TEST_4_IO) == RESET)
  623. {
  624. board->val_key[3] = 1;
  625. }else
  626. {
  627. board->val_key[3] = 0;
  628. }
  629. #endif
  630. #endif
  631. }
  632. //#if (RelaySlaveChaNum >= 1)
  633. //static void get_test_1()
  634. //{
  635. // uint8_t val = 0;
  636. // if(gpio_input_bit_get(KEY_TEST_1_GPIO,KEY_TEST_1_IO) == RESET)
  637. // {
  638. // val = 1;
  639. // }
  640. // board->key_1 = val;
  641. //}
  642. //#endif
  643. //#if (RelaySlaveChaNum >= 2)
  644. //static void get_test_2()
  645. //{
  646. // uint8_t val = 0;
  647. // if(gpio_input_bit_get(KEY_TEST_2_GPIO,KEY_TEST_2_IO) == RESET)
  648. // {
  649. // val = 1;
  650. // }
  651. // board->key_2 = val;
  652. //}
  653. //#endif
  654. //#if (RelaySlaveChaNum >= 3)
  655. //static void get_test_3()
  656. //{
  657. // uint8_t val = 0;
  658. // if(gpio_input_bit_get(KEY_TEST_3_4_GPIO,KEY_TEST_3_IO) == RESET)
  659. // {
  660. // val = 1;
  661. // }
  662. // board->key_3 = val;
  663. //}
  664. //#endif
  665. //#if (RelaySlaveChaNum >= 4)
  666. //static void get_test_4()
  667. //{
  668. // uint8_t val = 0;
  669. // if(gpio_input_bit_get(KEY_TEST_3_4_GPIO,KEY_TEST_4_IO) == RESET)
  670. // {
  671. // val = 1;
  672. // }
  673. // board->key_4 = val;
  674. //}
  675. //#endif
  676. static void self_lock_opt(void)
  677. {
  678. #if (RelaySlaveChaNum <= 5)
  679. async_data da = {0};
  680. da.fire_or_zero = _FIRE;
  681. da.method = PROMPT_CTRL;
  682. da.w_eep_flag = FLAG_W_EEP;
  683. for(uint8_t i = 0; i < RelaySlaveChaNum;i++)
  684. {
  685. da.channel = i;
  686. da.reg = &board->relay_staging_staus[i];
  687. if(board->val_key[i] == 0)
  688. {
  689. if(board->handle_k_status[i] == 1)
  690. {
  691. da.status = RELAY_CLOSE;
  692. set_relay_sta_async(&da);
  693. board->handle_k_status[i] = 0;
  694. }
  695. }else
  696. {
  697. if(board->handle_k_status[i] == 0)
  698. {
  699. if(board->md_data.r_data.detection & 0x1)
  700. {
  701. da.status = RELAY_OPEN;
  702. set_relay_sta_async(&da);
  703. }
  704. board->handle_k_status[i] = 1;
  705. }
  706. }
  707. }
  708. #endif
  709. }
  710. //static void self_lock_opt1(void)
  711. //{
  712. // async_data da = {0};
  713. //
  714. // da.fire_or_zero = _FIRE;
  715. // da.method = PROMPT_CTRL;
  716. // da.w_eep_flag = FLAG_W_EEP;
  717. //#if (RelaySlaveChaNum >= 1)
  718. // if(board->key_1 == 0)
  719. // {
  720. // da.channel =0;
  721. // da.reg = &board->relay_staging_staus[0];
  722. // if(board->handle_k_1_status == 1)
  723. // {
  724. // da.status = RELAY_CLOSE;
  725. // set_relay_sta_async(&da);
  726. // board->handle_k_1_status = 0;
  727. // }
  728. // }else
  729. // {
  730. // da.channel =0;
  731. // da.reg = &board->relay_staging_staus[0];
  732. // if(board->handle_k_1_status == 0)
  733. // {
  734. // da.status = RELAY_OPEN;
  735. // set_relay_sta_async(&da);
  736. // board->handle_k_1_status = 1;
  737. // }
  738. // }
  739. //#endif
  740. //
  741. //
  742. //#if (RelaySlaveChaNum >= 2)
  743. // if(board->key_2 == 0)
  744. // {
  745. // da.channel =1;
  746. // da.reg = &board->relay_staging_staus[1];
  747. // if(board->handle_k_2_status == 1)
  748. // {
  749. // da.status = RELAY_CLOSE;
  750. // set_relay_sta_async(&da);
  751. // board->handle_k_2_status = 0;
  752. // }
  753. // }else
  754. // {
  755. // da.channel =1;
  756. // da.reg = &board->relay_staging_staus[1];
  757. // if(board->handle_k_2_status == 0)
  758. // {
  759. // da.status = RELAY_OPEN;
  760. // set_relay_sta_async(&da);
  761. // board->handle_k_2_status = 1;
  762. // }
  763. // }
  764. //#endif
  765. //
  766. //#if (RelaySlaveChaNum >= 3)
  767. // if(board->key_3 == 0)
  768. // {
  769. // da.channel =2;
  770. // da.reg = &board->relay_staging_staus[2];
  771. // if(board->handle_k_3_status == 1)
  772. // {
  773. // da.status = RELAY_CLOSE;
  774. // set_relay_sta_async(&da);
  775. // board->handle_k_3_status = 0;
  776. // }
  777. // }else
  778. // {
  779. // da.channel =2;
  780. // da.reg = &board->relay_staging_staus[2];
  781. // if(board->handle_k_3_status == 0)
  782. // {
  783. // da.status = RELAY_OPEN;
  784. // set_relay_sta_async(&da);
  785. // board->handle_k_3_status = 1;
  786. // }
  787. // }
  788. //#endif
  789. //
  790. //#if (RelaySlaveChaNum >= 4)
  791. // if(board->key_4 == 0)
  792. // {
  793. // da.channel =3;
  794. // da.reg = &board->relay_staging_staus[3];
  795. // if(board->handle_k_4_status == 1)
  796. // {
  797. // da.status = RELAY_CLOSE;
  798. // set_relay_sta_async(&da);
  799. // board->handle_k_4_status = 0;
  800. // }
  801. // }else
  802. // {
  803. // da.channel =3;
  804. // da.reg = &board->relay_staging_staus[3];
  805. // if(board->handle_k_4_status == 0)
  806. // {
  807. // da.status = RELAY_OPEN;
  808. // set_relay_sta_async(&da);
  809. // board->handle_k_4_status = 1;
  810. // }
  811. // }
  812. //#endif
  813. //}
  814. #endif