led.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571
  1. /*
  2. * @Description:
  3. * @Version: 2.0
  4. * @Author: Seven
  5. * @Date: 2022-06-14 14:01:56
  6. * @LastEditors: Seven
  7. * @LastEditTime: 2022-08-31 11:04:05
  8. */
  9. #include "led.h"
  10. #include "includes.h"
  11. #include "gw_ctrl.h"
  12. ///
  13. uint8_t LED_STATUS = 0;
  14. uint8_t uninit_led_state = 0; //未初始化时灯的开关状态
  15. uint8_t loraindex_led_flag = 0;//lora信道索引指示灯显示标记
  16. led_info_t led_info;
  17. void LED_Init(void)
  18. {
  19. //LED_RUN(PE14)
  20. GPIO_COMM_Init(RCC_APB2Periph_GPIOE, GPIOE,
  21. GPIO_Pin_14, GPIO_Mode_Out_PP, GPIO_Speed_50MHz);
  22. LED_RUN_ON();
  23. if(hd_id == PCB_V0)
  24. {
  25. //8引脚灯
  26. GPIO_COMM_Init(RCC_APB2Periph_GPIOD, GPIOD,
  27. GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15, GPIO_Mode_Out_PP, GPIO_Speed_50MHz);
  28. GPIO_COMM_Init(RCC_APB2Periph_GPIOC, GPIOC,
  29. GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9, GPIO_Mode_Out_PP, GPIO_Speed_50MHz);
  30. led_run_set(LED_ALL,LED_OFF);
  31. }
  32. else if(hd_id == PCB_V1)
  33. {
  34. //74hc595
  35. // led_run_set(LED_ALL,LED_OFF);
  36. GPIO_COMM_Init(RCC_APB2Periph_GPIOE, GPIOE,
  37. GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_11, GPIO_Mode_Out_PP, GPIO_Speed_50MHz);
  38. led_run_set(LED_ALL,LED_OFF);
  39. }
  40. led_info_init();
  41. }
  42. //输出0灯亮,输出1灯灭
  43. void led_send_byte(uint8_t data)
  44. {
  45. uint8_t i;
  46. LED_RCK_LOW();
  47. delay_us(2);
  48. LED_SCK_HIGH();
  49. delay_us(4);
  50. for(i = 0; i < 8; i++)
  51. {
  52. if(data&0x80)
  53. LED_SER_HIGH();
  54. else
  55. LED_SER_LOW();
  56. data <<= 1;
  57. LED_SCK_LOW();
  58. delay_us(4);
  59. LED_SCK_HIGH();
  60. delay_us(4);
  61. }
  62. LED_RCK_HIGH();
  63. // LED_SCK_LOW();
  64. delay_us(4);
  65. // LED_SCK_HIGH();
  66. // delay_us(4);
  67. LED_RCK_LOW();
  68. }
  69. //设置led灯
  70. //status:灯的状态
  71. //led:灯的编号
  72. void led_run_set(uint8_t led, uint8_t status)
  73. {
  74. if(hd_id == PCB_V0)
  75. {
  76. switch(led)
  77. {
  78. case LED0:
  79. if(status == LED_ON)
  80. {
  81. LED0_ON();
  82. }
  83. else if(status == LED_OFF)
  84. {
  85. LED0_OFF();
  86. }
  87. break;
  88. case LED1:
  89. if(status == LED_ON)
  90. {
  91. LED1_ON();
  92. }
  93. else if(status == LED_OFF)
  94. {
  95. LED1_OFF();
  96. }
  97. break;
  98. case LED2:
  99. if(status == LED_ON)
  100. {
  101. LED2_ON();
  102. }
  103. else if(status == LED_OFF)
  104. {
  105. LED2_OFF();
  106. }
  107. break;
  108. case LED3:
  109. if(status == LED_ON)
  110. {
  111. LED3_ON();
  112. }
  113. else if(status == LED_OFF)
  114. {
  115. LED3_OFF();
  116. }
  117. break;
  118. case LED4:
  119. if(status == LED_ON)
  120. {
  121. LED4_ON();
  122. }
  123. else if(status == LED_OFF)
  124. {
  125. LED4_OFF();
  126. }
  127. break;
  128. case LED5:
  129. if(status == LED_ON)
  130. {
  131. LED5_ON();
  132. }
  133. else if(status == LED_OFF)
  134. {
  135. LED5_OFF();
  136. }
  137. break;
  138. case LED6:
  139. if(status == LED_ON)
  140. {
  141. LED6_ON();
  142. }
  143. else if(status == LED_OFF)
  144. {
  145. LED6_OFF();
  146. }
  147. break;
  148. case LED7:
  149. if(status == LED_ON)
  150. {
  151. LED7_ON();
  152. }
  153. else if(status == LED_OFF)
  154. {
  155. LED7_OFF();
  156. }
  157. break;
  158. case LED_ALL:
  159. if(status == LED_ON)
  160. {
  161. LED_ON_ALL();
  162. }
  163. else if(status == LED_OFF)
  164. {
  165. LED_OFF_ALL();
  166. }
  167. break;
  168. default:
  169. break;
  170. }
  171. }
  172. else if(hd_id == PCB_V1)
  173. {
  174. switch(led)
  175. {
  176. case LED0:
  177. if(status == LED_ON)//输出低
  178. {
  179. LED_STATUS &= ~(1<<0);
  180. }
  181. else if(status == LED_OFF)//输出高
  182. {
  183. LED_STATUS |= (1<<0);
  184. }
  185. led_send_byte(LED_STATUS);
  186. break;
  187. case LED1:
  188. if(status == LED_ON)//输出低
  189. {
  190. LED_STATUS &= ~(1<<1);
  191. }
  192. else if(status == LED_OFF)//输出高
  193. {
  194. LED_STATUS |= (1<<1);
  195. }
  196. led_send_byte(LED_STATUS);
  197. break;
  198. case LED2:
  199. if(status == LED_ON)//输出低
  200. {
  201. LED_STATUS &= ~(1<<2);
  202. }
  203. else if(status == LED_OFF)//输出高
  204. {
  205. LED_STATUS |= (1<<2);
  206. }
  207. led_send_byte(LED_STATUS);
  208. break;
  209. case LED3:
  210. if(status == LED_ON)//输出低
  211. {
  212. LED_STATUS &= ~(1<<3);
  213. }
  214. else if(status == LED_OFF)//输出高
  215. {
  216. LED_STATUS |= (1<<3);
  217. }
  218. led_send_byte(LED_STATUS);
  219. break;
  220. case LED4:
  221. if(status == LED_ON)//输出低
  222. {
  223. LED_STATUS &= ~(1<<4);
  224. }
  225. else if(status == LED_OFF)//输出高
  226. {
  227. LED_STATUS |= (1<<4);
  228. }
  229. led_send_byte(LED_STATUS);
  230. break;
  231. case LED5:
  232. if(status == LED_ON)//输出低
  233. {
  234. LED_STATUS &= ~(1<<5);
  235. }
  236. else if(status == LED_OFF)//输出高
  237. {
  238. LED_STATUS |= (1<<5);
  239. }
  240. led_send_byte(LED_STATUS);
  241. break;
  242. case LED6:
  243. if(status == LED_ON)//输出低
  244. {
  245. LED_STATUS &= ~(1<<6);
  246. }
  247. else if(status == LED_OFF)//输出高
  248. {
  249. LED_STATUS |= (1<<6);
  250. }
  251. led_send_byte(LED_STATUS);
  252. break;
  253. case LED7:
  254. if(status == LED_ON)//输出低
  255. {
  256. LED_STATUS &= ~(1<<7);
  257. }
  258. else if(status == LED_OFF)//输出高
  259. {
  260. LED_STATUS |= (1<<7);
  261. }
  262. led_send_byte(LED_STATUS);
  263. break;
  264. case LED_ALL:
  265. if(status == LED_ON)//输出低
  266. {
  267. LED_STATUS = 0;
  268. }
  269. else if(status == LED_OFF)//输出高
  270. {
  271. LED_STATUS = 0xff;
  272. }
  273. led_send_byte(LED_STATUS);
  274. break;
  275. default:
  276. break;
  277. }
  278. }
  279. }
  280. //单个灯状态设置
  281. void Led_Single_State_Set(uint8_t led, uint8_t state)
  282. {
  283. led_run_set(led,state);
  284. }
  285. //指示灯初始化
  286. void led_info_init(void)
  287. {
  288. memset(&led_info,0,sizeof(led_info_t));
  289. //运行指示灯
  290. led_info.run_led.flag = 0xff;
  291. led_info.run_led.timeout = LED_RUN_SLOW_TIME;
  292. //报税口指示灯
  293. led_info.tax1_rcv_led.timeout = TAX1_RCV_LED_TIME;
  294. led_info.tax1_send_led.timeout = TAX1_SEND_LED_TIME;
  295. led_info.tax2_rcv_led.timeout = TAX2_RCV_LED_TIME;
  296. led_info.tax2_send_led.timeout = TAX2_SEND_LED_TIME;
  297. //Lora指示灯
  298. led_info.lora_rcv_led.timeout = LORA_RCV_LED_TIME;
  299. led_info.lora_send_led.timeout = LORA_SEND_LED_TIME;
  300. //未配置sn指示灯
  301. if(device_fixed_info.Work_State == DEV_WORK_STATE_UNINIT) //未配置sn
  302. {
  303. led_info.uninit_led.flag = 0xff;
  304. led_info.uninit_led.timeout = LED_RUN_FAST_TIME;
  305. }
  306. //显示屏指示灯
  307. led_info.display_rcv_led.timeout = DISPLAY_RCV_LED_TIME;
  308. led_info.display_send_led.timeout = DISPLAY_SEND_LED_TIME;
  309. }
  310. //关闭其他所有指示灯
  311. void close_all_led(void)
  312. {
  313. led_info.tax1_rcv_led.flag = 0;
  314. led_info.tax1_send_led.flag = 0;
  315. led_info.tax2_rcv_led.flag = 0;
  316. led_info.tax2_send_led.flag = 0;
  317. led_info.lora_rcv_led.flag = 0;
  318. led_info.lora_send_led.flag = 0;
  319. led_info.display_rcv_led.flag = 0;
  320. led_info.display_send_led.flag = 0;
  321. led_run_set(LED_ALL,LED_OFF);
  322. }
  323. //功能指示灯开始指示
  324. void led_start(uint8_t state)
  325. {
  326. if(device_fixed_info.Work_State==DEV_WORK_STATE_NORMAL && loraindex_led_flag==0)//正常工作模式和未打开lora信道指示灯时
  327. {
  328. switch(state)
  329. {
  330. case TAX1_RCV_LED:
  331. timeout_start(&led_info.tax1_rcv_led,1);
  332. Led_Single_State_Set(TAX1_RCV_LED,LED_OFF);
  333. break;
  334. case TAX1_SEND_LED:
  335. timeout_start(&led_info.tax1_send_led,1);
  336. Led_Single_State_Set(TAX1_SEND_LED,LED_OFF);
  337. break;
  338. case TAX2_RCV_LED:
  339. timeout_start(&led_info.tax2_rcv_led,1);
  340. Led_Single_State_Set(TAX2_RCV_LED,LED_OFF);
  341. break;
  342. case TAX2_SEND_LED:
  343. timeout_start(&led_info.tax2_send_led,1);
  344. Led_Single_State_Set(TAX2_SEND_LED,LED_OFF);
  345. break;
  346. case LORA_RCV_LED:
  347. timeout_start(&led_info.lora_rcv_led,1);
  348. Led_Single_State_Set(LORA_RCV_LED,LED_OFF);
  349. break;
  350. case LORA_SEND_LED:
  351. timeout_start(&led_info.lora_send_led,1);
  352. Led_Single_State_Set(LORA_SEND_LED,LED_OFF);
  353. break;
  354. case DISPLAY_RCV_LED:
  355. timeout_start(&led_info.display_rcv_led,1);
  356. Led_Single_State_Set(DISPLAY_RCV_LED,LED_OFF);
  357. break;
  358. case DISPLAY_SEND_LED:
  359. timeout_start(&led_info.display_send_led,1);
  360. Led_Single_State_Set(DISPLAY_SEND_LED,LED_OFF);
  361. break;
  362. default:
  363. break;
  364. }
  365. }
  366. }
  367. //led运行处理
  368. void led_run(void)
  369. {
  370. //未初始化运行指示灯开关判断
  371. if(key_info[KEY0_PRES-1].execute)//按键功能正在执行,关闭未初始化指示灯
  372. {
  373. timeout_stop(&led_info.uninit_led);
  374. }
  375. else//按键功能执行结束,根据模式判断未初始化指示灯
  376. {
  377. if(device_fixed_info.Work_State == DEV_WORK_STATE_UNINIT)
  378. {
  379. if(!led_info.uninit_led.flag)//未打开,打开
  380. {
  381. timeout_start(&led_info.uninit_led,0xff);
  382. }
  383. }
  384. else
  385. {
  386. if(led_info.uninit_led.flag)//已打开,关闭
  387. {
  388. timeout_stop(&led_info.uninit_led);
  389. }
  390. }
  391. }
  392. //运行指示灯
  393. if(timeout_isOut(&led_info.run_led))
  394. {
  395. LED_RUN = !LED_RUN;
  396. }
  397. //未初始化运行指示灯
  398. if(timeout_isOut(&led_info.uninit_led))
  399. {
  400. Led_Single_State_Set(LED_ALL,uninit_led_state);
  401. uninit_led_state = !uninit_led_state;
  402. }
  403. //报税口指示灯
  404. if(timeout_isOut(&led_info.tax1_rcv_led))
  405. {
  406. Led_Single_State_Set(TAX1_RCV_LED,LED_ON);
  407. }
  408. if(timeout_isOut(&led_info.tax1_send_led))
  409. {
  410. Led_Single_State_Set(TAX1_SEND_LED,LED_ON);
  411. }
  412. if(timeout_isOut(&led_info.tax2_rcv_led))
  413. {
  414. Led_Single_State_Set(TAX2_RCV_LED,LED_ON);
  415. }
  416. if(timeout_isOut(&led_info.tax2_send_led))
  417. {
  418. Led_Single_State_Set(TAX2_SEND_LED,LED_ON);
  419. }
  420. //lora指示灯
  421. if(timeout_isOut(&led_info.lora_rcv_led))
  422. {
  423. Led_Single_State_Set(LORA_RCV_LED,LED_ON);
  424. }
  425. if(timeout_isOut(&led_info.lora_send_led))
  426. {
  427. Led_Single_State_Set(LORA_SEND_LED,LED_ON);
  428. }
  429. //显示屏指示灯
  430. if(timeout_isOut(&led_info.display_rcv_led))
  431. {
  432. Led_Single_State_Set(DISPLAY_RCV_LED,LED_ON);
  433. }
  434. if(timeout_isOut(&led_info.display_send_led))
  435. {
  436. Led_Single_State_Set(DISPLAY_SEND_LED,LED_ON);
  437. }
  438. //lora信道指示灯
  439. if(timeout_isOut(&led_info.tt_loraindex_led_state))
  440. {
  441. loraindex_led_flag = 0;
  442. close_all_led();
  443. key_info[KEY0_PRES-1].execute = 0;
  444. }
  445. }
  446. ////明文密文指示灯运行
  447. void Encryption_type_led_run_state(uint8_t state)
  448. {
  449. int i;
  450. uint8_t cip_led = LED_ON;//密文指示灯
  451. OS_ERR err;
  452. if(state == CIPHERTEXT) //密文
  453. {
  454. //8个灯快闪
  455. for(i = 0; i < 5; i++)
  456. {
  457. led_run_set(LED_ALL,cip_led);
  458. cip_led = !cip_led;
  459. OSTimeDlyHMSM(0, 0, 0, CIPHERTEXT_LED_TIME, OS_OPT_TIME_DLY, &err);
  460. }
  461. led_run_set(LED_ALL,LED_OFF);
  462. }
  463. else if(state == PLAINTEXT)//明文
  464. {
  465. //8个灯全亮
  466. led_run_set(LED_ALL,LED_ON);
  467. OSTimeDlyHMSM(0, 0, PLAINTEXT_LED_TIME_S, 0, OS_OPT_TIME_DLY, &err);
  468. led_run_set(LED_ALL,LED_OFF);
  469. }
  470. }
  471. //升级开始指示灯处理
  472. void ota_start_led_init(void)
  473. {
  474. close_all_led();
  475. Led_Single_State_Set(UPDATA_START_LED,LED_ON);
  476. }
  477. //led显示一个数的后N位,bit最大为8
  478. void Data_lastNbit_led(uint32_t data, uint8_t bit, uint8_t signal)
  479. {
  480. int i;
  481. int state = 0,signal_tmp = 0;
  482. if(bit <= 4)
  483. {
  484. if(signal == 0)
  485. {
  486. signal_tmp = 0;
  487. }
  488. else
  489. {
  490. signal_tmp = 4;
  491. }
  492. for(i = 0; i < bit; i++)
  493. {
  494. state = (data>>i) & 0x00000001;
  495. Led_Single_State_Set(i+signal_tmp,state);
  496. }
  497. }
  498. else if(bit <= 8)
  499. {
  500. Data_last4bit_led(SOFTWARE_VERSION_APP,1);
  501. for(i = 0; i < bit-4; i++)
  502. {
  503. state = (data>>i) & 0x00000001;
  504. Led_Single_State_Set(i+0,state);
  505. }
  506. }
  507. }
  508. //显示一个数的后4位
  509. void Data_last4bit_led(uint32_t data, uint8_t signal)
  510. {
  511. int i;
  512. int state = 0,signal_tmp = 0;
  513. if(signal == 0)
  514. {
  515. signal_tmp = 0;
  516. }
  517. else
  518. {
  519. signal_tmp = 4;
  520. }
  521. for(i = 0; i < 4; i++)
  522. {
  523. state = (data>>i) & 0x00000001;
  524. Led_Single_State_Set(i+signal_tmp,state);
  525. }
  526. }
  527. //APP版本指示灯运行
  528. void APP_edittion_led_run(void)
  529. {
  530. OS_ERR err;
  531. Data_last4bit_led(SOFTWARE_VERSION_APP,1);
  532. Data_last4bit_led((SOFTWARE_VERSION_APP>>4),0);
  533. OSTimeDlyHMSM(0, 0, 0, LED_APP_TIME, OS_OPT_TIME_DLY, &err);
  534. led_run_set(LED_ALL,LED_OFF);
  535. }