key.c 24 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028
  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. menu.current=0;//回到初始
  459. refresh=true;
  460. break;
  461. }
  462. }
  463. #if debugkeyinfo == 1
  464. PRINT_MENU_STATUS("K3");
  465. #endif
  466. sent3_key = true;
  467. }
  468. return 1;
  469. }
  470. else // 按键释放
  471. {
  472. sent3_key = false;
  473. return 0;
  474. }
  475. }
  476. }
  477. return 0;
  478. }
  479. uint8_t KEY_4_Scan_PDA(void)
  480. {
  481. static uint8_t key_state = 0;
  482. static uint8_t last_key_state = 0;
  483. static uint32_t debounce_time = 0;
  484. key_state = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_6);
  485. if (key_state != last_key_state) // 检测按键状态变化
  486. {
  487. last_key_state = key_state;
  488. debounce_time = HAL_GetTick(); // 记录当前时间
  489. }
  490. else
  491. {
  492. if (HAL_GetTick() - debounce_time > 30) // 去抖时间
  493. {
  494. if (key_state == GPIO_PIN_RESET) // 按键按下
  495. {
  496. enterInterface_time = HAL_GetTick();
  497. if (!sent4_key) {//返回
  498. switch (menu.current) {
  499. case 0:
  500. {
  501. SET_MENU_STATUS(0,0,0,0);
  502. if(Developer_PortalA!=0)
  503. {
  504. Developer_PortalD+=1;
  505. }
  506. break;
  507. }
  508. case 1:
  509. {
  510. SET_MENU_STATUS(0,0,0,0);
  511. break;
  512. }
  513. case 2:
  514. case 3:
  515. {
  516. SET_MENU_STATUS(1,1,0,1);
  517. break;
  518. }
  519. case 4:
  520. case 5:
  521. case 6:
  522. case 7:
  523. {
  524. SET_MENU_STATUS(3,3,0,2);
  525. USART_SendString(&huart5, "AT+DISCONN=0\r\n");//断开连接
  526. break;
  527. }
  528. case 0xA0:
  529. {
  530. SET_MENU_STATUS(2,3,0,2);
  531. break;
  532. }
  533. case 0xA1:
  534. case 0xA2:
  535. {
  536. SET_MENU_STATUS(0xA0,1,0,3);
  537. break;
  538. }
  539. case 0xBB:
  540. {
  541. SET_MENU_STATUS(3,3,0,2);
  542. USART_SendString(&huart5, "AT+DISCONN=0\r\n");//断开连接
  543. break;
  544. }
  545. }
  546. #if debugkeyinfo == 1
  547. PRINT_MENU_STATUS("K4");
  548. #endif
  549. sent4_key = true;
  550. }
  551. return 1;
  552. }
  553. else // 按键释放
  554. {
  555. sent4_key = false;
  556. return 0;
  557. }
  558. }
  559. }
  560. return 0;
  561. }
  562. uint8_t KEY_1_Scan_DTU(void)
  563. {
  564. static uint8_t key_state = 0;
  565. static uint8_t last_key_state = 0;
  566. static uint32_t debounce_time = 0;
  567. key_state = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_3);
  568. if (key_state != last_key_state) // 检测按键状态变化
  569. {
  570. last_key_state = key_state;
  571. debounce_time = HAL_GetTick(); // 记录当前时间
  572. }
  573. else
  574. {
  575. if (HAL_GetTick() - debounce_time > 30) // 去抖时间
  576. {
  577. if (key_state == GPIO_PIN_RESET) // 按键按下
  578. {
  579. if(!sent1_key)
  580. {
  581. enterInterface_time = HAL_GetTick();
  582. switch(menu.current)
  583. {
  584. case 0:
  585. {
  586. Developer_PortalA+=1;
  587. SET_MENU_STATUS(0,0,0,0);
  588. break;
  589. }
  590. case 0xFF:
  591. {
  592. if(menu.up!=1)
  593. {
  594. menu.up=1;
  595. menu.next=0;
  596. }
  597. else if(menu.up==1)
  598. {
  599. menu.up=0;
  600. menu.next=1;
  601. }
  602. refresh=true;
  603. break;
  604. }
  605. }
  606. #if debugkeyinfo == 1
  607. PRINT_MENU_STATUS("K1");
  608. #endif
  609. sent1_key = true;
  610. }
  611. return 1;
  612. }
  613. else // 按键释放
  614. {
  615. sent1_key = false;
  616. return 0;
  617. }
  618. }
  619. }
  620. return 0;
  621. }
  622. uint8_t KEY_2_Scan_DTU(void)
  623. {
  624. static uint8_t key_state = 0;
  625. static uint8_t last_key_state = 0;
  626. static uint32_t debounce_time = 0;
  627. key_state = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_4);
  628. if (key_state != last_key_state) // 检测按键状态变化
  629. {
  630. last_key_state = key_state;
  631. debounce_time = HAL_GetTick(); // 记录当前时间
  632. }
  633. else
  634. {
  635. if (HAL_GetTick() - debounce_time > 30) // 去抖时间
  636. {
  637. if (key_state == GPIO_PIN_RESET) // 按键按下
  638. {
  639. if (!sent2_key)
  640. {
  641. enterInterface_time = HAL_GetTick();
  642. switch (menu.current)
  643. {
  644. case 0xFF:
  645. {
  646. if(menu.next!=1)
  647. {
  648. menu.up=0;
  649. menu.next=1;
  650. }
  651. else if(menu.next==1)
  652. {
  653. menu.up=1;
  654. menu.next=0;
  655. }
  656. refresh=true;
  657. break;
  658. }
  659. }
  660. #if debugkeyinfo == 1
  661. PRINT_MENU_STATUS("K2");
  662. #endif
  663. sent2_key = true;
  664. }
  665. return 1;
  666. }
  667. else // 按键释放
  668. {
  669. sent2_key = false;
  670. return 0;
  671. }
  672. }
  673. }
  674. return 0;
  675. }
  676. uint8_t KEY_3_Scan_DTU(void)
  677. {
  678. static uint8_t key_state = 0;
  679. static uint8_t last_key_state = 0;
  680. static uint32_t debounce_time = 0;
  681. key_state = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5);
  682. if (key_state != last_key_state) // 检测按键状态变化
  683. {
  684. last_key_state = key_state;
  685. debounce_time = HAL_GetTick(); // 记录当前时间
  686. }
  687. else
  688. {
  689. if (HAL_GetTick() - debounce_time > 30) // 去抖时间
  690. {
  691. if (key_state == GPIO_PIN_RESET) // 按键按下
  692. {
  693. if (!sent3_key) {
  694. enterInterface_time = HAL_GetTick();
  695. switch (menu.current)
  696. {
  697. case 0xFF:
  698. {
  699. if(menu.up==1)//PDA 0x0000
  700. {
  701. sys_mode[1]=PDA_MODE;
  702. if(sendCmd_BT("AT+ADV=0\r\n","OK",1,1))//开启广播
  703. {
  704. signal = true;
  705. printf("关闭广播\r\n");
  706. }
  707. }
  708. else if(menu.up==0)//DTU 0x0001
  709. {
  710. sys_mode[1]=DTU_MODE;
  711. if(sendCmd_BT("AT+ADV=1\r\n","OK",1,1))//开启广播
  712. {
  713. signal = true;
  714. printf("开启广播\r\n");
  715. }
  716. }
  717. Flash_WriteBytes(&sys_mode[1],SysModeAddr,1);
  718. menu.current=0;//回到初始
  719. refresh=true;
  720. break;
  721. }
  722. }
  723. #if debugkeyinfo == 1
  724. PRINT_MENU_STATUS("K3");
  725. #endif
  726. sent3_key = true;
  727. }
  728. return 1;
  729. }
  730. else // 按键释放
  731. {
  732. sent3_key = false;
  733. return 0;
  734. }
  735. }
  736. }
  737. return 0;
  738. }
  739. uint8_t KEY_4_Scan_DTU(void)
  740. {
  741. static uint8_t key_state = 0;
  742. static uint8_t last_key_state = 0;
  743. static uint32_t debounce_time = 0;
  744. key_state = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_6);
  745. if (key_state != last_key_state) // 检测按键状态变化
  746. {
  747. last_key_state = key_state;
  748. debounce_time = HAL_GetTick(); // 记录当前时间
  749. }
  750. else
  751. {
  752. if (HAL_GetTick() - debounce_time > 30) // 去抖时间
  753. {
  754. if (key_state == GPIO_PIN_RESET) // 按键按下
  755. {
  756. enterInterface_time = HAL_GetTick();
  757. if (!sent4_key) {//返回
  758. switch (menu.current)
  759. {
  760. case 0:
  761. {
  762. SET_MENU_STATUS(0,0,0,0);
  763. if(Developer_PortalA!=0)
  764. {
  765. Developer_PortalD+=1;
  766. }
  767. break;
  768. }
  769. }
  770. #if debugkeyinfo == 1
  771. PRINT_MENU_STATUS("K4");
  772. #endif
  773. sent4_key = true;
  774. }
  775. return 1;
  776. }
  777. else // 按键释放
  778. {
  779. sent4_key = false;
  780. return 0;
  781. }
  782. }
  783. }
  784. return 0;
  785. }
  786. void updatekeystate(void)
  787. {
  788. if(sys_mode[1] == PDA_MODE)//PDAmode 需DTU开锁
  789. {
  790. KEY_1_Scan_PDA();
  791. KEY_2_Scan_PDA();
  792. KEY_3_Scan_PDA();
  793. KEY_4_Scan_PDA();
  794. }
  795. else if(sys_mode[1] == DTU_MODE)
  796. {
  797. KEY_1_Scan_DTU();
  798. KEY_2_Scan_DTU();
  799. KEY_3_Scan_DTU();
  800. KEY_4_Scan_DTU();
  801. }
  802. }
  803. uint16_t Mac1[4];
  804. uint16_t Mac2[4];
  805. uint16_t Mac3[4];
  806. uint16_t Mac4[4];
  807. void WritekeyInfo(void)
  808. {
  809. switch(menu.PreNext)
  810. {
  811. case 0:
  812. {
  813. if(menu.current!=0xA2)//A1界面
  814. {
  815. for (int i = 0; i < sizeof(menu_dict) / sizeof(menu_dict[0]); i++) {
  816. if (menu.next == i) {
  817. lockinfo.SN1CONN = menu_dict[i].command;
  818. lockinfo.SN1ED = menu_dict[i].connected_msg;
  819. lockinfo.SN1DIS = menu_dict[i].disconnected_msg;
  820. Mac1[0] = (menu_dict[i].mac >> 32) & 0xFFFF;
  821. Mac1[1] = (menu_dict[i].mac >> 16) & 0xFFFF;
  822. Mac1[2] = menu_dict[i].mac & 0xFFFF;
  823. Flash_WriteBytes(Mac1,Sn1InfoAddr,3);//占用6个字节
  824. Flash_ReadBytes(lockinfo.mac1, Sn1InfoAddr, 3);
  825. }
  826. }
  827. }
  828. else
  829. {
  830. for (int i = 0; i < sizeof(menu_dict) / sizeof(menu_dict[0]); i++) {
  831. if ((menu.next+0xf) == i) {
  832. lockinfo.SN1CONN = menu_dict[i].command;
  833. lockinfo.SN1ED = menu_dict[i].connected_msg;
  834. lockinfo.SN1DIS = menu_dict[i].disconnected_msg;
  835. Mac1[0] = (menu_dict[i].mac >> 32) & 0xFFFF;
  836. Mac1[1] = (menu_dict[i].mac >> 16) & 0xFFFF;
  837. Mac1[2] = menu_dict[i].mac & 0xFFFF;
  838. Flash_WriteBytes(Mac1,Sn1InfoAddr,3);//占用6个字节
  839. Flash_ReadBytes(lockinfo.mac1, Sn1InfoAddr, 3);
  840. }
  841. }
  842. }
  843. menu.home &= 0x0FFF;
  844. sprintf(lockinfo.SN1name, "%04X", lockinfo.mac1[2]);
  845. L1bd = true;
  846. break;
  847. }
  848. case 1:
  849. {
  850. if(menu.current!=0xA2)
  851. {
  852. for (int i = 0; i < sizeof(menu_dict) / sizeof(menu_dict[0]); i++) {
  853. if (menu.next == i) {
  854. lockinfo.SN2CONN = menu_dict[i].command;
  855. lockinfo.SN2ED = menu_dict[i].connected_msg;
  856. lockinfo.SN2DIS = menu_dict[i].disconnected_msg;
  857. Mac2[0] = (menu_dict[i].mac >> 32) & 0xFFFF;
  858. Mac2[1] = (menu_dict[i].mac >> 16) & 0xFFFF;
  859. Mac2[2] = menu_dict[i].mac & 0xFFFF;
  860. Flash_WriteBytes(Mac2,Sn2InfoAddr,3);//占用6个字节
  861. Flash_ReadBytes(lockinfo.mac2, Sn2InfoAddr, 3);
  862. }
  863. }
  864. }
  865. else
  866. {
  867. for (int i = 0; i < sizeof(menu_dict) / sizeof(menu_dict[0]); i++) {
  868. if ((menu.next+0xf) == i) {
  869. lockinfo.SN2CONN = menu_dict[i].command;
  870. lockinfo.SN2ED = menu_dict[i].connected_msg;
  871. lockinfo.SN2DIS = menu_dict[i].disconnected_msg;
  872. Mac2[0] = (menu_dict[i].mac >> 32) & 0xFFFF;
  873. Mac2[1] = (menu_dict[i].mac >> 16) & 0xFFFF;
  874. Mac2[2] = menu_dict[i].mac & 0xFFFF;
  875. Flash_WriteBytes(Mac2,Sn2InfoAddr,3);//占用6个字节
  876. Flash_ReadBytes(lockinfo.mac2, Sn2InfoAddr, 3);
  877. }
  878. }
  879. }
  880. menu.home &= 0xF0FF;
  881. sprintf(lockinfo.SN2name, "%04X", lockinfo.mac2[2]);
  882. L2bd = true;
  883. break;
  884. }
  885. case 2:
  886. {
  887. if(menu.current!=0xA2)
  888. {
  889. for (int i = 0; i < sizeof(menu_dict) / sizeof(menu_dict[0]); i++) {
  890. if (menu.next == i) {
  891. lockinfo.SN3CONN = menu_dict[i].command;
  892. lockinfo.SN3ED = menu_dict[i].connected_msg;
  893. lockinfo.SN3DIS = menu_dict[i].disconnected_msg;
  894. Mac3[0] = (menu_dict[i].mac >> 32) & 0xFFFF;
  895. Mac3[1] = (menu_dict[i].mac >> 16) & 0xFFFF;
  896. Mac3[2] = menu_dict[i].mac & 0xFFFF;
  897. Flash_WriteBytes(Mac3,Sn3InfoAddr,3);//占用6个字节
  898. Flash_ReadBytes(lockinfo.mac3, Sn3InfoAddr, 3);
  899. }
  900. }
  901. }
  902. else
  903. {
  904. for (int i = 0; i < sizeof(menu_dict) / sizeof(menu_dict[0]); i++) {
  905. if ((menu.next+0xf) == i) {
  906. lockinfo.SN3CONN = menu_dict[i].command;
  907. lockinfo.SN3ED = menu_dict[i].connected_msg;
  908. lockinfo.SN3DIS = menu_dict[i].disconnected_msg;
  909. Mac3[0] = (menu_dict[i].mac >> 32) & 0xFFFF;
  910. Mac3[1] = (menu_dict[i].mac >> 16) & 0xFFFF;
  911. Mac3[2] = menu_dict[i].mac & 0xFFFF;
  912. Flash_WriteBytes(Mac3,Sn3InfoAddr,3);//占用6个字节
  913. Flash_ReadBytes(lockinfo.mac3, Sn3InfoAddr, 3);
  914. }
  915. }
  916. }
  917. sprintf(lockinfo.SN3name, "%04X", lockinfo.mac3[2]);
  918. menu.home &= 0xFF0F;
  919. L3bd = true;
  920. break;
  921. }
  922. case 3:
  923. {
  924. if(menu.current!=0xA2)
  925. {
  926. for (int i = 0; i < sizeof(menu_dict) / sizeof(menu_dict[0]); i++) {
  927. if (menu.next == i) {
  928. lockinfo.SN4CONN = menu_dict[i].command;
  929. lockinfo.SN4ED = menu_dict[i].connected_msg;
  930. lockinfo.SN4DIS = menu_dict[i].disconnected_msg;
  931. Mac4[0] = (menu_dict[i].mac >> 32) & 0xFFFF;
  932. Mac4[1] = (menu_dict[i].mac >> 16) & 0xFFFF;
  933. Mac4[2] = menu_dict[i].mac & 0xFFFF;
  934. Flash_WriteBytes(Mac4,Sn4InfoAddr,3);//占用6个字节
  935. Flash_ReadBytes(lockinfo.mac4, Sn4InfoAddr, 3);
  936. }
  937. }
  938. }
  939. else
  940. {
  941. for (int i = 0; i < sizeof(menu_dict) / sizeof(menu_dict[0]); i++) {
  942. if ((menu.next+0xf) == i) {
  943. lockinfo.SN4CONN = menu_dict[i].command;
  944. lockinfo.SN4ED = menu_dict[i].connected_msg;
  945. lockinfo.SN4DIS = menu_dict[i].disconnected_msg;
  946. Mac4[0] = (menu_dict[i].mac >> 32) & 0xFFFF;
  947. Mac4[1] = (menu_dict[i].mac >> 16) & 0xFFFF;
  948. Mac4[2] = menu_dict[i].mac & 0xFFFF;
  949. Flash_WriteBytes(Mac4,Sn4InfoAddr,3);//占用6个字节
  950. Flash_ReadBytes(lockinfo.mac4, Sn4InfoAddr, 3);
  951. }
  952. }
  953. }
  954. menu.home &= 0xFFF0;
  955. sprintf(lockinfo.SN4name, "%04X", lockinfo.mac4[2]);
  956. L4bd = true;
  957. break;
  958. }
  959. }
  960. }