key.c 24 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030
  1. #include "key.h"
  2. #include "usart.h"
  3. #include "interface.h"
  4. //结构体
  5. LockInfo lockinfo;
  6. extern Menu_table menu;
  7. extern TipsFlag tipsflag;
  8. struct keys key[1]={0};
  9. //布尔
  10. bool sent1_key = false;
  11. bool sent2_key = false;
  12. bool sent3_key = false;
  13. bool sent4_key = false;
  14. //字符串
  15. char timeout[] = "+CONNECT TIMEOUT";
  16. //字节
  17. uint32_t enterInterface_time = 0;
  18. uint8_t Developer_PortalA = 0;
  19. uint8_t Developer_PortalD = 0;
  20. uint8_t sys_Mode = 0;
  21. uint8_t preworkUp = 0;
  22. uint8_t presjfUp = 0;
  23. uint8_t KEY_1_Scan_PDA(void)
  24. {
  25. static uint8_t key_state = 0;
  26. static uint8_t last_key_state = 0;
  27. static uint32_t debounce_time = 0;
  28. key_state = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_3);
  29. if (key_state != last_key_state) // 检测按键状态变化
  30. {
  31. last_key_state = key_state;
  32. debounce_time = HAL_GetTick(); // 记录当前时间
  33. }
  34. else
  35. {
  36. if (HAL_GetTick() - debounce_time > 30) // 去抖时间
  37. {
  38. if (key_state == GPIO_PIN_RESET) // 按键按下
  39. {
  40. if(!sent1_key)
  41. {
  42. enterInterface_time = HAL_GetTick();
  43. switch(menu.current)
  44. {
  45. case 0:
  46. {
  47. Developer_PortalA+=1;
  48. SET_MENU_STATUS(0,0,0,0);
  49. break;
  50. }
  51. case 1:
  52. {
  53. SET_MENU_STATUS(1,1,0,1);
  54. break;
  55. }
  56. case 2:
  57. {
  58. if(menu.up!=3)
  59. {
  60. menu.up+=1;
  61. menu.next-=1;
  62. }
  63. else if(menu.up==3)
  64. {
  65. menu.up=0;
  66. menu.next=3;
  67. }
  68. refresh=true;
  69. break;
  70. }
  71. case 3:
  72. {
  73. if(menu.up!=3)
  74. {
  75. menu.up+=1;
  76. menu.next-=1;
  77. }
  78. else if(menu.up==3)
  79. {
  80. menu.up=0;
  81. menu.next=3;
  82. }
  83. refresh=true;
  84. break;
  85. }
  86. case 4:
  87. case 5:
  88. case 6:
  89. case 7:
  90. case 0xA0:
  91. case 0xFF:
  92. {
  93. if(menu.up!=1)
  94. {
  95. menu.up+=1;
  96. menu.next-=1;
  97. }
  98. else if(menu.up==1)
  99. {
  100. menu.up=0;
  101. menu.next=1;
  102. }
  103. refresh=true;
  104. break;
  105. }
  106. case 0xA1:
  107. {
  108. if(menu.up!=0xE)
  109. {
  110. menu.up+=1;
  111. menu.next-=1;
  112. }
  113. else if(menu.up==0xE)
  114. {
  115. menu.up=0;
  116. menu.next=0xE;
  117. }
  118. refresh=true;
  119. break;
  120. }
  121. case 0xA2:
  122. {
  123. if(menu.up!=0xF)
  124. {
  125. menu.up+=1;
  126. menu.next-=1;
  127. }
  128. else if(menu.up==0xF)
  129. {
  130. menu.up=0;
  131. menu.next=0xF;
  132. }
  133. refresh=true;
  134. break;
  135. }
  136. }
  137. #if debugkeyinfo == 1
  138. PRINT_MENU_STATUS("K1");
  139. #endif
  140. sent1_key = true;
  141. }
  142. return 1;
  143. }
  144. else // 按键释放
  145. {
  146. sent1_key = false;
  147. return 0;
  148. }
  149. }
  150. }
  151. return 0;
  152. }
  153. uint8_t KEY_2_Scan_PDA(void)
  154. {
  155. static uint8_t key_state = 0;
  156. static uint8_t last_key_state = 0;
  157. static uint32_t debounce_time = 0;
  158. key_state = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_4);
  159. if (key_state != last_key_state) // 检测按键状态变化
  160. {
  161. last_key_state = key_state;
  162. debounce_time = HAL_GetTick(); // 记录当前时间
  163. }
  164. else
  165. {
  166. if (HAL_GetTick() - debounce_time > 30) // 去抖时间
  167. {
  168. if (key_state == GPIO_PIN_RESET) // 按键按下
  169. {
  170. if (!sent2_key)
  171. {
  172. enterInterface_time = HAL_GetTick();
  173. switch (menu.current)
  174. {
  175. case 0:
  176. {
  177. SET_MENU_STATUS(0,0,0,0);
  178. break;
  179. }
  180. case 1:
  181. {
  182. SET_MENU_STATUS(1,0,1,1);
  183. break;
  184. }
  185. case 2:
  186. {
  187. if(menu.next!=3)
  188. {
  189. menu.up-=1;
  190. menu.next+=1;
  191. }
  192. else if(menu.next==3)
  193. {
  194. menu.up=3;
  195. menu.next=0;
  196. }
  197. refresh=true;
  198. break;
  199. }
  200. case 3:
  201. {
  202. if(menu.next!=3)
  203. {
  204. menu.up-=1;
  205. menu.next+=1;
  206. }
  207. else if(menu.next==3)
  208. {
  209. menu.up=3;
  210. menu.next=0;
  211. }
  212. refresh=true;
  213. break;
  214. }
  215. case 4:
  216. case 5:
  217. case 6:
  218. case 7:
  219. case 0xA0:
  220. case 0xFF:
  221. {
  222. if(menu.next!=1)
  223. {
  224. menu.up-=1;
  225. menu.next+=1;
  226. }
  227. else if(menu.next==1)
  228. {
  229. menu.up=1;
  230. menu.next=0;
  231. }
  232. refresh=true;
  233. break;
  234. }
  235. case 0xA1:
  236. {
  237. if(menu.next!=0xE)
  238. {
  239. menu.up-=1;
  240. menu.next+=1;
  241. }
  242. else if(menu.next==0xE)
  243. {
  244. menu.up=0xE;
  245. menu.next=0;
  246. }
  247. refresh=true;
  248. break;
  249. }
  250. case 0xA2:
  251. {
  252. if(menu.next!=0xF)
  253. {
  254. menu.up-=1;
  255. menu.next+=1;
  256. }
  257. else if(menu.next==0xF)
  258. {
  259. menu.up=0xF;
  260. menu.next=0;
  261. }
  262. refresh=true;
  263. break;
  264. }
  265. }
  266. #if debugkeyinfo == 1
  267. PRINT_MENU_STATUS("K2");
  268. #endif
  269. sent2_key = true;
  270. }
  271. return 1;
  272. }
  273. else // 按键释放
  274. {
  275. sent2_key = false;
  276. return 0;
  277. }
  278. }
  279. }
  280. return 0;
  281. }
  282. // 定义menu_dict存储menu.next对应的信息
  283. MenuInfo menu_dict[] = {
  284. {"AT+CONN=101000000001\r\n", "+CONNECTED:0,101000000001", "+DISCONN:0,101000000001", 0x101000000001},
  285. {"AT+CONN=101000000002\r\n", "+CONNECTED:0,101000000002", "+DISCONN:0,101000000002", 0x101000000002},
  286. {"AT+CONN=101000000003\r\n", "+CONNECTED:0,101000000003", "+DISCONN:0,101000000003", 0x101000000003},
  287. {"AT+CONN=101000000004\r\n", "+CONNECTED:0,101000000004", "+DISCONN:0,101000000004", 0x101000000004},
  288. {"AT+CONN=101000000005\r\n", "+CONNECTED:0,101000000005", "+DISCONN:0,101000000005", 0x101000000005},
  289. {"AT+CONN=101000000006\r\n", "+CONNECTED:0,101000000006", "+DISCONN:0,101000000006", 0x101000000006},
  290. {"AT+CONN=101000000007\r\n", "+CONNECTED:0,101000000007", "+DISCONN:0,101000000007", 0x101000000007},
  291. {"AT+CONN=101000000008\r\n", "+CONNECTED:0,101000000008", "+DISCONN:0,101000000008", 0x101000000008},
  292. {"AT+CONN=101000000009\r\n", "+CONNECTED:0,101000000009", "+DISCONN:0,101000000009", 0x101000000009},
  293. {"AT+CONN=10100000000A\r\n", "+CONNECTED:0,10100000000A", "+DISCONN:0,10100000000A", 0x10100000000A},
  294. {"AT+CONN=10100000000B\r\n", "+CONNECTED:0,10100000000B", "+DISCONN:0,10100000000B", 0x10100000000B},
  295. {"AT+CONN=10100000000C\r\n", "+CONNECTED:0,10100000000C", "+DISCONN:0,10100000000C", 0x10100000000C},
  296. {"AT+CONN=10100000000D\r\n", "+CONNECTED:0,10100000000D", "+DISCONN:0,10100000000D", 0x10100000000D},
  297. {"AT+CONN=10100000000E\r\n", "+CONNECTED:0,10100000000E", "+DISCONN:0,10100000000E", 0x10100000000E},
  298. {"AT+CONN=10100000000F\r\n", "+CONNECTED:0,10100000000F", "+DISCONN:0,10100000000F", 0x10100000000F},
  299. {"AT+CONN=101000000010\r\n", "+CONNECTED:0,101000000010", "+DISCONN:0,101000000010", 0x101000000010},
  300. {"AT+CONN=101000000011\r\n", "+CONNECTED:0,101000000011", "+DISCONN:0,101000000011", 0x101000000011},
  301. {"AT+CONN=101000000012\r\n", "+CONNECTED:0,101000000012", "+DISCONN:0,101000000012", 0x101000000012},
  302. {"AT+CONN=101000000013\r\n", "+CONNECTED:0,101000000013", "+DISCONN:0,101000000013", 0x101000000013},
  303. {"AT+CONN=101000000014\r\n", "+CONNECTED:0,101000000014", "+DISCONN:0,101000000014", 0x101000000014},
  304. {"AT+CONN=101000000015\r\n", "+CONNECTED:0,101000000015", "+DISCONN:0,101000000015", 0x101000000015},
  305. {"AT+CONN=101000000016\r\n", "+CONNECTED:0,101000000016", "+DISCONN:0,101000000016", 0x101000000016},
  306. {"AT+CONN=101000000017\r\n", "+CONNECTED:0,101000000017", "+DISCONN:0,101000000017", 0x101000000017},
  307. {"AT+CONN=101000000018\r\n", "+CONNECTED:0,101000000018", "+DISCONN:0,101000000018", 0x101000000018},
  308. {"AT+CONN=101000000019\r\n", "+CONNECTED:0,101000000019", "+DISCONN:0,101000000019", 0x101000000019},
  309. {"AT+CONN=10100000001A\r\n", "+CONNECTED:0,10100000001A", "+DISCONN:0,10100000001A", 0x10100000001A},
  310. {"AT+CONN=10100000001B\r\n", "+CONNECTED:0,10100000001B", "+DISCONN:0,10100000001B", 0x10100000001B},
  311. {"AT+CONN=10100000001C\r\n", "+CONNECTED:0,10100000001C", "+DISCONN:0,10100000001C", 0x10100000001C},
  312. {"AT+CONN=10100000001D\r\n", "+CONNECTED:0,10100000001D", "+DISCONN:0,10100000001D", 0x10100000001D},
  313. {"AT+CONN=10100000001E\r\n", "+CONNECTED:0,10100000001E", "+DISCONN:0,10100000001E", 0x10100000001E},
  314. {"AT+CONN=10100000001F\r\n", "+CONNECTED:0,10100000001F", "+DISCONN:0,10100000001F", 0x10100000001F},
  315. // 其他项依次类推
  316. };
  317. uint8_t KEY_3_Scan_PDA(void)
  318. {
  319. static uint8_t key_state = 0;
  320. static uint8_t last_key_state = 0;
  321. static uint32_t debounce_time = 0;
  322. key_state = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5);
  323. if (key_state != last_key_state) // 检测按键状态变化
  324. {
  325. last_key_state = key_state;
  326. debounce_time = HAL_GetTick(); // 记录当前时间
  327. }
  328. else
  329. {
  330. if (HAL_GetTick() - debounce_time > 30) // 去抖时间
  331. {
  332. if (key_state == GPIO_PIN_RESET) // 按键按下
  333. {
  334. if (!sent3_key) {
  335. enterInterface_time = HAL_GetTick();
  336. switch (menu.current) {
  337. case 0://跳转到菜单界面
  338. {
  339. SET_MENU_STATUS(1,1,0,1);
  340. break;
  341. }
  342. case 1://跳转到L绑定界面
  343. {
  344. Developer_PortalA=0;
  345. Developer_PortalD=0;
  346. if(menu.up==1)
  347. {
  348. SET_MENU_STATUS(2,3,0,2);
  349. }
  350. else
  351. {
  352. SET_MENU_STATUS(3,3,0,2);
  353. }
  354. break;
  355. }
  356. case 2:
  357. {
  358. menu.PreNext=menu.next;//L1 - L4
  359. SET_MENU_STATUS(0xA0,1,0,3);
  360. break;
  361. }
  362. case 3://施解封操作
  363. {
  364. if(menu.up==3)//L1操作
  365. {
  366. preworkUp=menu.up;
  367. SET_MENU_STATUS(4,1,0,3);
  368. break;
  369. }
  370. if(menu.up==2)//2操作
  371. {
  372. preworkUp=menu.up;
  373. SET_MENU_STATUS(5,1,0,3);
  374. break;
  375. }
  376. if(menu.up==1)//3操作
  377. {
  378. preworkUp=menu.up;
  379. SET_MENU_STATUS(6,1,0,3);
  380. break;
  381. }
  382. if(menu.up==0)//4操作
  383. {
  384. preworkUp=menu.up;
  385. SET_MENU_STATUS(7,1,0,3);
  386. break;
  387. }
  388. }
  389. case 4:
  390. case 5:
  391. case 6:
  392. case 7:
  393. {
  394. // if(lockinfo.SN1CONN == NULL || lockinfo.SN2CONN == NULL || lockinfo.SN3CONN == NULL ||lockinfo.SN4CONN == NULL)
  395. // {
  396. // menu.current=0xBB;
  397. // tipsflag = Nosn;
  398. // SET_MENU_STATUS(3,3,0,2);
  399. // }
  400. // else
  401. // {
  402. presjfUp = menu.up;
  403. printf("%d",presjfUp);
  404. menu.current=0xBB;
  405. tipsflag = Btconn;
  406. refresh = true;
  407. if(preworkUp == 3)//L1
  408. {
  409. USART_SendString(&huart5, lockinfo.SN1CONN);//连接
  410. }
  411. else if(preworkUp == 2)//L2
  412. {
  413. USART_SendString(&huart5, lockinfo.SN2CONN);//连接
  414. }
  415. else if(preworkUp == 1)//L3
  416. {
  417. USART_SendString(&huart5, lockinfo.SN3CONN);//连接
  418. }
  419. else if(preworkUp == 0)//L4
  420. {
  421. USART_SendString(&huart5, lockinfo.SN4CONN);//连接
  422. }
  423. // }
  424. break;
  425. }
  426. case 0xA0:
  427. {
  428. if(menu.up==1)
  429. {
  430. SET_MENU_STATUS(0xA1,0xE,0,3);
  431. }
  432. else if(menu.up==0)
  433. {
  434. SET_MENU_STATUS(0xA2,0xF,0,3);
  435. }
  436. break;
  437. }
  438. case 0xA1:
  439. case 0xA2:
  440. {
  441. WritekeyInfo();//写入MAC保存状态
  442. SET_MENU_STATUS(2,3,0,2);
  443. break;
  444. }
  445. case 0xFF:
  446. {
  447. if(menu.up==1)//PDA 0x0000
  448. {
  449. signal = true;
  450. sys_mode[1]=PDA_MODE;
  451. }
  452. else if(menu.up==0)//DTU 0x0001
  453. {
  454. signal = true;
  455. sys_mode[1]=DTU_MODE;
  456. }
  457. Flash_WriteBytes(&sys_mode[1],SysModeAddr,1);
  458. Flash_ReadBytes(sys_mode, SysModeAddr, 1);//读取一个2B的,系统模式
  459. menu.current=0;//回到初始
  460. refresh=true;
  461. break;
  462. }
  463. }
  464. #if debugkeyinfo == 1
  465. PRINT_MENU_STATUS("K3");
  466. #endif
  467. sent3_key = true;
  468. }
  469. return 1;
  470. }
  471. else // 按键释放
  472. {
  473. sent3_key = false;
  474. return 0;
  475. }
  476. }
  477. }
  478. return 0;
  479. }
  480. uint8_t KEY_4_Scan_PDA(void)
  481. {
  482. static uint8_t key_state = 0;
  483. static uint8_t last_key_state = 0;
  484. static uint32_t debounce_time = 0;
  485. key_state = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_6);
  486. if (key_state != last_key_state) // 检测按键状态变化
  487. {
  488. last_key_state = key_state;
  489. debounce_time = HAL_GetTick(); // 记录当前时间
  490. }
  491. else
  492. {
  493. if (HAL_GetTick() - debounce_time > 30) // 去抖时间
  494. {
  495. if (key_state == GPIO_PIN_RESET) // 按键按下
  496. {
  497. enterInterface_time = HAL_GetTick();
  498. if (!sent4_key) {//返回
  499. switch (menu.current) {
  500. case 0:
  501. {
  502. SET_MENU_STATUS(0,0,0,0);
  503. if(Developer_PortalA!=0)
  504. {
  505. Developer_PortalD+=1;
  506. }
  507. break;
  508. }
  509. case 1:
  510. {
  511. SET_MENU_STATUS(0,0,0,0);
  512. break;
  513. }
  514. case 2:
  515. case 3:
  516. {
  517. SET_MENU_STATUS(1,1,0,1);
  518. break;
  519. }
  520. case 4:
  521. case 5:
  522. case 6:
  523. case 7:
  524. {
  525. SET_MENU_STATUS(3,3,0,2);
  526. USART_SendString(&huart5, "AT+DISCONN=0\r\n");//断开连接
  527. break;
  528. }
  529. case 0xA0:
  530. {
  531. SET_MENU_STATUS(2,3,0,2);
  532. break;
  533. }
  534. case 0xA1:
  535. case 0xA2:
  536. {
  537. SET_MENU_STATUS(0xA0,1,0,3);
  538. break;
  539. }
  540. case 0xBB:
  541. {
  542. SET_MENU_STATUS(3,3,0,2);
  543. USART_SendString(&huart5, "AT+DISCONN=0\r\n");//断开连接
  544. break;
  545. }
  546. }
  547. #if debugkeyinfo == 1
  548. PRINT_MENU_STATUS("K4");
  549. #endif
  550. sent4_key = true;
  551. }
  552. return 1;
  553. }
  554. else // 按键释放
  555. {
  556. sent4_key = false;
  557. return 0;
  558. }
  559. }
  560. }
  561. return 0;
  562. }
  563. uint8_t KEY_1_Scan_DTU(void)
  564. {
  565. static uint8_t key_state = 0;
  566. static uint8_t last_key_state = 0;
  567. static uint32_t debounce_time = 0;
  568. key_state = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_3);
  569. if (key_state != last_key_state) // 检测按键状态变化
  570. {
  571. last_key_state = key_state;
  572. debounce_time = HAL_GetTick(); // 记录当前时间
  573. }
  574. else
  575. {
  576. if (HAL_GetTick() - debounce_time > 30) // 去抖时间
  577. {
  578. if (key_state == GPIO_PIN_RESET) // 按键按下
  579. {
  580. if(!sent1_key)
  581. {
  582. enterInterface_time = HAL_GetTick();
  583. switch(menu.current)
  584. {
  585. case 0:
  586. {
  587. Developer_PortalA+=1;
  588. SET_MENU_STATUS(0,0,0,0);
  589. break;
  590. }
  591. case 0xFF:
  592. {
  593. if(menu.up!=1)
  594. {
  595. menu.up=1;
  596. menu.next=0;
  597. }
  598. else if(menu.up==1)
  599. {
  600. menu.up=0;
  601. menu.next=1;
  602. }
  603. refresh=true;
  604. break;
  605. }
  606. }
  607. #if debugkeyinfo == 1
  608. PRINT_MENU_STATUS("K1");
  609. #endif
  610. sent1_key = true;
  611. }
  612. return 1;
  613. }
  614. else // 按键释放
  615. {
  616. sent1_key = false;
  617. return 0;
  618. }
  619. }
  620. }
  621. return 0;
  622. }
  623. uint8_t KEY_2_Scan_DTU(void)
  624. {
  625. static uint8_t key_state = 0;
  626. static uint8_t last_key_state = 0;
  627. static uint32_t debounce_time = 0;
  628. key_state = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_4);
  629. if (key_state != last_key_state) // 检测按键状态变化
  630. {
  631. last_key_state = key_state;
  632. debounce_time = HAL_GetTick(); // 记录当前时间
  633. }
  634. else
  635. {
  636. if (HAL_GetTick() - debounce_time > 30) // 去抖时间
  637. {
  638. if (key_state == GPIO_PIN_RESET) // 按键按下
  639. {
  640. if (!sent2_key)
  641. {
  642. enterInterface_time = HAL_GetTick();
  643. switch (menu.current)
  644. {
  645. case 0xFF:
  646. {
  647. if(menu.next!=1)
  648. {
  649. menu.up=0;
  650. menu.next=1;
  651. }
  652. else if(menu.next==1)
  653. {
  654. menu.up=1;
  655. menu.next=0;
  656. }
  657. refresh=true;
  658. break;
  659. }
  660. }
  661. #if debugkeyinfo == 1
  662. PRINT_MENU_STATUS("K2");
  663. #endif
  664. sent2_key = true;
  665. }
  666. return 1;
  667. }
  668. else // 按键释放
  669. {
  670. sent2_key = false;
  671. return 0;
  672. }
  673. }
  674. }
  675. return 0;
  676. }
  677. uint8_t KEY_3_Scan_DTU(void)
  678. {
  679. static uint8_t key_state = 0;
  680. static uint8_t last_key_state = 0;
  681. static uint32_t debounce_time = 0;
  682. key_state = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5);
  683. if (key_state != last_key_state) // 检测按键状态变化
  684. {
  685. last_key_state = key_state;
  686. debounce_time = HAL_GetTick(); // 记录当前时间
  687. }
  688. else
  689. {
  690. if (HAL_GetTick() - debounce_time > 30) // 去抖时间
  691. {
  692. if (key_state == GPIO_PIN_RESET) // 按键按下
  693. {
  694. if (!sent3_key) {
  695. enterInterface_time = HAL_GetTick();
  696. switch (menu.current)
  697. {
  698. case 0xFF:
  699. {
  700. if(menu.up==1)//PDA 0x0000
  701. {
  702. sys_mode[1]=PDA_MODE;
  703. if(sendCmd_BT("AT+ADV=0\r\n","OK",1,1))//开启广播
  704. {
  705. signal = true;
  706. printf("关闭广播\r\n");
  707. }
  708. }
  709. else if(menu.up==0)//DTU 0x0001
  710. {
  711. sys_mode[1]=DTU_MODE;
  712. if(sendCmd_BT("AT+ADV=1\r\n","OK",1,1))//开启广播
  713. {
  714. signal = true;
  715. printf("开启广播\r\n");
  716. }
  717. }
  718. Flash_WriteBytes(&sys_mode[1],SysModeAddr,1);
  719. Flash_ReadBytes(sys_mode, SysModeAddr, 1);//读取一个2B的,系统模式
  720. menu.current=0;//回到初始
  721. refresh=true;
  722. break;
  723. }
  724. }
  725. #if debugkeyinfo == 1
  726. PRINT_MENU_STATUS("K3");
  727. #endif
  728. sent3_key = true;
  729. }
  730. return 1;
  731. }
  732. else // 按键释放
  733. {
  734. sent3_key = false;
  735. return 0;
  736. }
  737. }
  738. }
  739. return 0;
  740. }
  741. uint8_t KEY_4_Scan_DTU(void)
  742. {
  743. static uint8_t key_state = 0;
  744. static uint8_t last_key_state = 0;
  745. static uint32_t debounce_time = 0;
  746. key_state = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_6);
  747. if (key_state != last_key_state) // 检测按键状态变化
  748. {
  749. last_key_state = key_state;
  750. debounce_time = HAL_GetTick(); // 记录当前时间
  751. }
  752. else
  753. {
  754. if (HAL_GetTick() - debounce_time > 30) // 去抖时间
  755. {
  756. if (key_state == GPIO_PIN_RESET) // 按键按下
  757. {
  758. enterInterface_time = HAL_GetTick();
  759. if (!sent4_key) {//返回
  760. switch (menu.current)
  761. {
  762. case 0:
  763. {
  764. SET_MENU_STATUS(0,0,0,0);
  765. if(Developer_PortalA!=0)
  766. {
  767. Developer_PortalD+=1;
  768. }
  769. break;
  770. }
  771. }
  772. #if debugkeyinfo == 1
  773. PRINT_MENU_STATUS("K4");
  774. #endif
  775. sent4_key = true;
  776. }
  777. return 1;
  778. }
  779. else // 按键释放
  780. {
  781. sent4_key = false;
  782. return 0;
  783. }
  784. }
  785. }
  786. return 0;
  787. }
  788. void updatekeystate(void)
  789. {
  790. if(sys_mode[1] == PDA_MODE)//PDAmode 需DTU开锁
  791. {
  792. KEY_1_Scan_PDA();
  793. KEY_2_Scan_PDA();
  794. KEY_3_Scan_PDA();
  795. KEY_4_Scan_PDA();
  796. }
  797. else if(sys_mode[1] == DTU_MODE )
  798. {
  799. KEY_1_Scan_DTU();
  800. KEY_2_Scan_DTU();
  801. KEY_3_Scan_DTU();
  802. KEY_4_Scan_DTU();
  803. }
  804. }
  805. uint16_t Mac1[4];
  806. uint16_t Mac2[4];
  807. uint16_t Mac3[4];
  808. uint16_t Mac4[4];
  809. void WritekeyInfo(void)
  810. {
  811. switch(menu.PreNext)
  812. {
  813. case 0:
  814. {
  815. if(menu.current!=0xA2)//A1界面
  816. {
  817. for (int i = 0; i < sizeof(menu_dict) / sizeof(menu_dict[0]); i++) {
  818. if (menu.next == i) {
  819. lockinfo.SN1CONN = menu_dict[i].command;
  820. lockinfo.SN1ED = menu_dict[i].connected_msg;
  821. lockinfo.SN1DIS = menu_dict[i].disconnected_msg;
  822. Mac1[0] = (menu_dict[i].mac >> 32) & 0xFFFF;
  823. Mac1[1] = (menu_dict[i].mac >> 16) & 0xFFFF;
  824. Mac1[2] = menu_dict[i].mac & 0xFFFF;
  825. Flash_WriteBytes(Mac1,Sn1InfoAddr,3);//占用6个字节
  826. Flash_ReadBytes(lockinfo.mac1, Sn1InfoAddr, 3);
  827. }
  828. }
  829. }
  830. else
  831. {
  832. for (int i = 0; i < sizeof(menu_dict) / sizeof(menu_dict[0]); i++) {
  833. if ((menu.next+0xf) == i) {
  834. lockinfo.SN1CONN = menu_dict[i].command;
  835. lockinfo.SN1ED = menu_dict[i].connected_msg;
  836. lockinfo.SN1DIS = menu_dict[i].disconnected_msg;
  837. Mac1[0] = (menu_dict[i].mac >> 32) & 0xFFFF;
  838. Mac1[1] = (menu_dict[i].mac >> 16) & 0xFFFF;
  839. Mac1[2] = menu_dict[i].mac & 0xFFFF;
  840. Flash_WriteBytes(Mac1,Sn1InfoAddr,3);//占用6个字节
  841. Flash_ReadBytes(lockinfo.mac1, Sn1InfoAddr, 3);
  842. }
  843. }
  844. }
  845. menu.home &= 0x0FFF;
  846. sprintf(lockinfo.SN1name, "%04X", lockinfo.mac1[2]);
  847. L1bd = true;
  848. break;
  849. }
  850. case 1:
  851. {
  852. if(menu.current!=0xA2)
  853. {
  854. for (int i = 0; i < sizeof(menu_dict) / sizeof(menu_dict[0]); i++) {
  855. if (menu.next == i) {
  856. lockinfo.SN2CONN = menu_dict[i].command;
  857. lockinfo.SN2ED = menu_dict[i].connected_msg;
  858. lockinfo.SN2DIS = menu_dict[i].disconnected_msg;
  859. Mac2[0] = (menu_dict[i].mac >> 32) & 0xFFFF;
  860. Mac2[1] = (menu_dict[i].mac >> 16) & 0xFFFF;
  861. Mac2[2] = menu_dict[i].mac & 0xFFFF;
  862. Flash_WriteBytes(Mac2,Sn2InfoAddr,3);//占用6个字节
  863. Flash_ReadBytes(lockinfo.mac2, Sn2InfoAddr, 3);
  864. }
  865. }
  866. }
  867. else
  868. {
  869. for (int i = 0; i < sizeof(menu_dict) / sizeof(menu_dict[0]); i++) {
  870. if ((menu.next+0xf) == i) {
  871. lockinfo.SN2CONN = menu_dict[i].command;
  872. lockinfo.SN2ED = menu_dict[i].connected_msg;
  873. lockinfo.SN2DIS = menu_dict[i].disconnected_msg;
  874. Mac2[0] = (menu_dict[i].mac >> 32) & 0xFFFF;
  875. Mac2[1] = (menu_dict[i].mac >> 16) & 0xFFFF;
  876. Mac2[2] = menu_dict[i].mac & 0xFFFF;
  877. Flash_WriteBytes(Mac2,Sn2InfoAddr,3);//占用6个字节
  878. Flash_ReadBytes(lockinfo.mac2, Sn2InfoAddr, 3);
  879. }
  880. }
  881. }
  882. menu.home &= 0xF0FF;
  883. sprintf(lockinfo.SN2name, "%04X", lockinfo.mac2[2]);
  884. L2bd = true;
  885. break;
  886. }
  887. case 2:
  888. {
  889. if(menu.current!=0xA2)
  890. {
  891. for (int i = 0; i < sizeof(menu_dict) / sizeof(menu_dict[0]); i++) {
  892. if (menu.next == i) {
  893. lockinfo.SN3CONN = menu_dict[i].command;
  894. lockinfo.SN3ED = menu_dict[i].connected_msg;
  895. lockinfo.SN3DIS = menu_dict[i].disconnected_msg;
  896. Mac3[0] = (menu_dict[i].mac >> 32) & 0xFFFF;
  897. Mac3[1] = (menu_dict[i].mac >> 16) & 0xFFFF;
  898. Mac3[2] = menu_dict[i].mac & 0xFFFF;
  899. Flash_WriteBytes(Mac3,Sn3InfoAddr,3);//占用6个字节
  900. Flash_ReadBytes(lockinfo.mac3, Sn3InfoAddr, 3);
  901. }
  902. }
  903. }
  904. else
  905. {
  906. for (int i = 0; i < sizeof(menu_dict) / sizeof(menu_dict[0]); i++) {
  907. if ((menu.next+0xf) == i) {
  908. lockinfo.SN3CONN = menu_dict[i].command;
  909. lockinfo.SN3ED = menu_dict[i].connected_msg;
  910. lockinfo.SN3DIS = menu_dict[i].disconnected_msg;
  911. Mac3[0] = (menu_dict[i].mac >> 32) & 0xFFFF;
  912. Mac3[1] = (menu_dict[i].mac >> 16) & 0xFFFF;
  913. Mac3[2] = menu_dict[i].mac & 0xFFFF;
  914. Flash_WriteBytes(Mac3,Sn3InfoAddr,3);//占用6个字节
  915. Flash_ReadBytes(lockinfo.mac3, Sn3InfoAddr, 3);
  916. }
  917. }
  918. }
  919. sprintf(lockinfo.SN3name, "%04X", lockinfo.mac3[2]);
  920. menu.home &= 0xFF0F;
  921. L3bd = true;
  922. break;
  923. }
  924. case 3:
  925. {
  926. if(menu.current!=0xA2)
  927. {
  928. for (int i = 0; i < sizeof(menu_dict) / sizeof(menu_dict[0]); i++) {
  929. if (menu.next == i) {
  930. lockinfo.SN4CONN = menu_dict[i].command;
  931. lockinfo.SN4ED = menu_dict[i].connected_msg;
  932. lockinfo.SN4DIS = menu_dict[i].disconnected_msg;
  933. Mac4[0] = (menu_dict[i].mac >> 32) & 0xFFFF;
  934. Mac4[1] = (menu_dict[i].mac >> 16) & 0xFFFF;
  935. Mac4[2] = menu_dict[i].mac & 0xFFFF;
  936. Flash_WriteBytes(Mac4,Sn4InfoAddr,3);//占用6个字节
  937. Flash_ReadBytes(lockinfo.mac4, Sn4InfoAddr, 3);
  938. }
  939. }
  940. }
  941. else
  942. {
  943. for (int i = 0; i < sizeof(menu_dict) / sizeof(menu_dict[0]); i++) {
  944. if ((menu.next+0xf) == i) {
  945. lockinfo.SN4CONN = menu_dict[i].command;
  946. lockinfo.SN4ED = menu_dict[i].connected_msg;
  947. lockinfo.SN4DIS = menu_dict[i].disconnected_msg;
  948. Mac4[0] = (menu_dict[i].mac >> 32) & 0xFFFF;
  949. Mac4[1] = (menu_dict[i].mac >> 16) & 0xFFFF;
  950. Mac4[2] = menu_dict[i].mac & 0xFFFF;
  951. Flash_WriteBytes(Mac4,Sn4InfoAddr,3);//占用6个字节
  952. Flash_ReadBytes(lockinfo.mac4, Sn4InfoAddr, 3);
  953. }
  954. }
  955. }
  956. menu.home &= 0xFFF0;
  957. sprintf(lockinfo.SN4name, "%04X", lockinfo.mac4[2]);
  958. L4bd = true;
  959. break;
  960. }
  961. }
  962. }