led.c 26 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034
  1. /******************************************************************************
  2. 版权所有:
  3. 文件名称: led.c
  4. 文件版本: 01.01
  5. 创建作者: xxxxxx
  6. 创建日期: 2013-05-29
  7. 功能说明: LED处理程序
  8. 其它说明:
  9. 修改记录:
  10. */
  11. /*------------------------------- 头文件 --------------------------------------
  12. */
  13. #include "head.h"
  14. #include "ch423s.h"
  15. /*------------------------------- 宏定义 --------------------------------------
  16. */
  17. /*------------------------------ 类型结构 -------------------------------------
  18. */
  19. /*------------------------------ 全局变量 -------------------------------------
  20. */
  21. // 辅助板LED测试状态
  22. u32 g_led_aux_test_st;
  23. u32 g_led_kz_test_st;
  24. int led_save_flag = 0;
  25. // 基于公共、开关的灯状态,
  26. // 数组第一维为公共、开关,0为公共,1~SWITCH_NUM_MAX为开关
  27. // 数组第二维取公共、开关中灯个数的大值
  28. // noted by sunxi: 20220701 加入(u16),以去除335x的编译告警
  29. u8 g_led_stu[SWITCH_NUM_MAX + 1][(((u16)SW_LED_NUM > (u16)PUB_LED_NUM) ? SW_LED_NUM : PUB_LED_NUM)];
  30. u8 g_led_stu_bk[SWITCH_NUM_MAX + 1][(((u16)SW_LED_NUM > (u16)PUB_LED_NUM) ? SW_LED_NUM : PUB_LED_NUM)];
  31. u8 g_led_save[SWITCH_NUM_MAX + 1][(((u16)SW_LED_NUM > (u16)PUB_LED_NUM) ? SW_LED_NUM : PUB_LED_NUM)];
  32. // 当前面板的LED配置
  33. struct led_config *g_led_hmi;
  34. #define LED_FILE_VERSION 0X01010101 // 文件版本
  35. struct file *pf_ledsave = NULL;
  36. #ifdef CPU_FUXI
  37. /* 实际的led地址 */
  38. /* 目前按照标准化的贴膜来配置地址
  39. 面膜灯
  40. DB
  41. 电源 远方 合位 过流 跳闸 充电 重合闸动作 开关传动 异常 分布式 备用 备用
  42. 运行 通讯 分位 接地 告警 未储能 重合闸闭锁 合闸闭锁 常规保护 就地FA 集中FA 备用
  43. DA
  44. 电源 通讯 告警 间隔1通讯 间隔3通讯 间隔5通讯 备用 网口1 串口1 串口3 备用 备用
  45. 运行 异常 级联异常 间隔2通讯 间隔4通讯 间隔6通讯 备用 网口2 串口2 串口4 备用 备用
  46. */
  47. static uint8_t suca_led_hw_addr[LED_MAX_NUM] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
  48. 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23};
  49. #endif
  50. void _led_update_status(void);
  51. static int _led_savefile(void)
  52. {
  53. unsigned int addr, file_length;
  54. u16 crc;
  55. char *p;
  56. loff_t pos;
  57. struct file *pfile;
  58. struct cfg_file_head fileled_file;
  59. // 写文件头
  60. memset(&fileled_file, 0, sizeof(fileled_file));
  61. fileled_file.signature = SIG_LED_SAVE_FILE;
  62. fileled_file.version = LED_FILE_VERSION;
  63. addr = FILE_ADDR_ALGIN(sizeof(fileled_file));
  64. // 得到文件长度
  65. file_length = addr + sizeof(g_led_save);
  66. file_length = FILE_ADDR_ALGIN(file_length);
  67. // 分配并初始化空间
  68. p = rt_malloc(file_length + 2);
  69. if (!p)
  70. {
  71. return -1;
  72. }
  73. memset(p, 0, file_length + 2);
  74. // 写入文件头
  75. memcpy(p, (char *)&fileled_file, sizeof(fileled_file));
  76. // 写文件列表
  77. memcpy(p + addr, g_led_save, sizeof(g_led_save));
  78. // 计算CRC
  79. crc = CrcStr(p, file_length);
  80. memcpy(p + file_length, &crc, 2);
  81. // 创建数据文件
  82. if (pf_ledsave == NULL)
  83. {
  84. pfile = rt_file_open("/app/data/file_led.bin", O_CREAT | O_RDWR, 0);
  85. if (IS_ERR(pfile))
  86. {
  87. rt_free(p);
  88. rt_printf("\r\n create led save file fail");
  89. return -2;
  90. }
  91. pf_ledsave = pfile;
  92. }
  93. pos = 0;
  94. rt_file_write(pf_ledsave, p, file_length + 2, &pos);
  95. rt_free(p);
  96. return 0;
  97. }
  98. int _led_readfile(void)
  99. {
  100. u32 len;
  101. u16 crc;
  102. u8 *buf;
  103. loff_t pos;
  104. struct file *pfile;
  105. struct cfg_file_head *brh;
  106. // 创建并打开文件
  107. pfile = rt_file_open("/app/data/file_led.bin", O_RDONLY, 0);
  108. if (IS_ERR(pfile))
  109. {
  110. return -1;
  111. }
  112. // 得到文件长度
  113. len = rt_file_getfile_size(pfile);
  114. if (len <= 0)
  115. {
  116. rt_file_close(pfile, 0);
  117. return -11;
  118. }
  119. // 分配内存
  120. buf = rt_malloc(len);
  121. if ((buf) == NULL)
  122. {
  123. rt_file_close(pfile, 0);
  124. return -2;
  125. }
  126. // 读出内容
  127. pos = 0;
  128. if (rt_file_read(pfile, buf, len, &pos) != len)
  129. {
  130. rt_file_close(pfile, 0);
  131. rt_free(buf);
  132. return -3;
  133. }
  134. // 关闭文件
  135. rt_file_close(pfile, 0);
  136. // 检查CRC
  137. crc = CrcStr(buf, len - 2);
  138. if (crc != *(u16 *)(buf + len - 2))
  139. {
  140. rt_free(buf);
  141. return -4;
  142. }
  143. // 检查文件签名
  144. brh = (struct cfg_file_head *)buf;
  145. if (brh->signature != SIG_LED_SAVE_FILE)
  146. {
  147. rt_free(buf);
  148. return -5;
  149. }
  150. // 校验一下文件长度,防止灯配置变化,文件读取正确,导致的灯状态异常
  151. {
  152. int filelenth;
  153. filelenth = FILE_ADDR_ALGIN(sizeof(struct cfg_file_head)) + sizeof(g_led_save);
  154. filelenth = FILE_ADDR_ALGIN(filelenth) + 2;
  155. if (filelenth != len)
  156. {
  157. rt_free(buf);
  158. return -6;
  159. }
  160. }
  161. memcpy(g_led_stu, buf + FILE_ADDR_ALGIN(sizeof(struct cfg_file_head)), sizeof(g_led_stu));
  162. // 根据保存的灯状态,预置动作标志
  163. {
  164. int sw, led;
  165. for (sw = 0; sw < SWITCH_NUM_MAX + 1; sw++)
  166. {
  167. if (sw == 0)
  168. {
  169. if (g_led_stu[sw][PUB_LED_DZ] == LED_ON)
  170. {
  171. g_run_stu.pubdz = 1;
  172. }
  173. else if (g_led_stu[sw][PUB_LED_DZ] == LED_QUICK)
  174. {
  175. g_run_stu.pubdz = 2;
  176. }
  177. }
  178. else
  179. {
  180. RUN_STU_SW *prun = &g_tRelay[sw - 1].run_stu;
  181. u8 *pstatus;
  182. u8 val = 0;
  183. for (led = 0; led < SW_LED_NUM; led++)
  184. {
  185. pstatus = NULL;
  186. val = 0;
  187. if (led == SW_LED_GL)
  188. pstatus = &prun->gl;
  189. if (led == SW_LED_JD)
  190. pstatus = &prun->jd;
  191. if (led == SW_LED_CHZ)
  192. pstatus = &prun->chzdz;
  193. if (led == SW_LED_DZ)
  194. pstatus = &prun->dz;
  195. if (g_led_stu[sw][led] == LED_ON)
  196. {
  197. val = 1;
  198. }
  199. else if (g_led_stu[sw][led] == LED_QUICK)
  200. {
  201. val = 2;
  202. }
  203. if (pstatus != NULL)
  204. *pstatus = val;
  205. }
  206. }
  207. }
  208. }
  209. _led_update_status();
  210. memcpy(g_led_save, g_led_stu, sizeof(g_led_stu));
  211. rt_free(buf);
  212. return 0;
  213. }
  214. int _led_status_save(void)
  215. {
  216. int sw, led;
  217. static uint32_t led_save_us0;
  218. if (led_save_flag == 0)
  219. {
  220. for (sw = 0; sw < SWITCH_NUM_MAX + 1; sw++)
  221. {
  222. if (sw == 0)
  223. {
  224. for (led = 0; led < PUB_LED_NUM; led++)
  225. {
  226. if (led == PUB_LED_DZ)
  227. {
  228. if (g_led_stu[sw][led] != g_led_save[sw][led])
  229. {
  230. led_save_flag = 1;
  231. led_save_us0 = ustimer_get_origin();
  232. break;
  233. }
  234. }
  235. }
  236. }
  237. else
  238. {
  239. for (led = 0; led < SW_LED_NUM; led++)
  240. {
  241. if (led == SW_LED_GL || led == SW_LED_JD || led == SW_LED_CHZ || led == SW_LED_DZ)
  242. {
  243. if (g_led_stu[sw][led] != g_led_save[sw][led])
  244. {
  245. led_save_flag = 1;
  246. led_save_us0 = ustimer_get_origin();
  247. break;
  248. }
  249. }
  250. }
  251. }
  252. }
  253. }
  254. if (led_save_flag)
  255. {
  256. if (ustimer_get_duration(led_save_us0) > USTIMER_SEC * 5) // led灯变化10秒后保存灯状态
  257. {
  258. memcpy(g_led_save, g_led_stu, sizeof(g_led_stu));
  259. rt_printf("\r\n led save len=%d", sizeof(g_led_stu));
  260. _led_savefile();
  261. led_save_flag = 0;
  262. }
  263. }
  264. return 0;
  265. }
  266. int led_exit(void)
  267. {
  268. if (pf_ledsave != 0)
  269. {
  270. rt_file_close(pf_ledsave, 0);
  271. }
  272. ch423sio_exit_dev();
  273. return 0;
  274. }
  275. /******************************************************************************
  276. 函数名称: led_init
  277. 函数版本: 01.01
  278. 创建作者: xxxxxx
  279. 创建日期: 2015-04-16
  280. 函数说明: 开出类型LED初始化,找到对应的灯配置索引的GPIO
  281. 参数说明: 无
  282. 返回值: 成功返回0.
  283. 修改记录:
  284. */
  285. int led_init(void)
  286. {
  287. memset(g_led_stu, 0, sizeof(g_led_stu));
  288. memset(g_led_save, 0, sizeof(g_led_stu));
  289. #ifdef STORE_PILOTELAMP
  290. _led_readfile();
  291. #endif
  292. return ch423sio_init_dev();
  293. }
  294. /******************************************************************************
  295. 函数名称: led_init_hmi
  296. 函数版本: 01.01
  297. 创建作者: xxxxxx
  298. 创建日期: 2015-04-16
  299. 函数说明: LED配置初始化
  300. 参数说明: 无
  301. 返回值: 成功返回0.
  302. 修改记录:
  303. */
  304. int led_init_hmi(void)
  305. {
  306. u32 slot;
  307. g_led_hmi = 0;
  308. // 检查状态板是否配置
  309. slot = equ_get_slot_by_type(BOARD_TYPE_FUXI_24LED);
  310. // 检查状态板是否配置
  311. if (slot > 0)
  312. {
  313. g_led_hmi = &g_led_slot[slot];
  314. }
  315. return 0;
  316. }
  317. /******************************************************************************
  318. 函数名称: led_polling_app
  319. 函数版本: 01.01
  320. 创建作者: xxxxxx
  321. 创建日期: 2015-04-16
  322. 函数说明: LED应用功能
  323. 参数说明: 无
  324. 返回值: 成功返回0.
  325. 修改记录:
  326. */
  327. void _led_update_status(void)
  328. {
  329. int i, exerr;
  330. // 电源灯
  331. if (!g_run_stu.dcjlsd)
  332. {
  333. led_set_pub(PUB_LED_POWER, LED_ON);
  334. }
  335. else if (g_run_stu.dcjlsd && (!g_run_stu.dcqy))
  336. {
  337. led_set_pub(PUB_LED_POWER, LED_SLOW);
  338. }
  339. else if (g_run_stu.dcjlsd && g_run_stu.dcqy)
  340. {
  341. led_set_pub(PUB_LED_POWER, LED_QUICK);
  342. }
  343. // 运行灯
  344. if (rt_err_count())
  345. {
  346. led_set_pub(PUB_LED_RUN, LED_ON);
  347. }
  348. else
  349. {
  350. led_set_pub(PUB_LED_RUN, LED_SLOW);
  351. }
  352. // 异常灯,以内部异常优先级高
  353. exerr = 0;
  354. for (i = 0; i < g_sw_num; i++)
  355. {
  356. RUN_STU_SW *prun = &g_tRelay[i].run_stu;
  357. if (prun->exerr)
  358. {
  359. exerr = 1;
  360. break;
  361. }
  362. }
  363. if (rt_err_count())
  364. {
  365. led_set_pub(PUB_LED_ERR, LED_ON);
  366. #if defined FUNC_DRIVE || defined FUNC_DRIVE_JY
  367. gb_drive.b_err = true;
  368. #endif
  369. }
  370. #ifdef defined GD_AREA_ZHONGSHAN_2020
  371. else if (exerr || soe_check(EV_GOOSE_CONFIG_ERR) == true) // 中山2020要求通信异常不允许亮异常灯
  372. {
  373. led_set_pub(PUB_LED_ERR, LED_ON);
  374. }
  375. #else
  376. else if (exerr || (tFAg.commerr > 0)) // 中山要求,只有本机通信异常点告警灯,系统异常不点灯
  377. {
  378. led_set_pub(PUB_LED_ERR, LED_ON);
  379. #if defined FUNC_DRIVE || defined FUNC_DRIVE_JY
  380. gb_drive.b_err = true;
  381. #endif
  382. }
  383. #endif
  384. else if (soe_check(EV_61850_ERR) == true)
  385. {
  386. led_set_pub(PUB_LED_ERR, LED_ON);
  387. #if defined FUNC_DRIVE || defined FUNC_DRIVE_JY
  388. gb_drive.b_err = true;
  389. #endif
  390. }
  391. else
  392. {
  393. led_set_pub(PUB_LED_ERR, LED_OFF);
  394. #if defined FUNC_DRIVE || defined FUNC_DRIVE_JY
  395. gb_drive.b_err = false;
  396. #endif
  397. }
  398. #if defined GD_AREA_ECZD_2020
  399. for (i = 0; i < g_sw_num; i++)
  400. {
  401. RUN_STU_SW *prun = &g_tRelay[i].run_stu;
  402. if (prun->exerr || prun->qyd_bs || prun->qyd_bs || tPT.uPT1DX.bFlag.bPTYC || tPT.uPT2DX.bFlag.bPTYC)
  403. {
  404. exerr = 1;
  405. break;
  406. }
  407. }
  408. if (exerr || (tFAg.commerr > 0))
  409. {
  410. led_set_pub(PUB_LED_RUN_GJ, LED_ON);
  411. #if defined FUNC_DRIVE || defined FUNC_DRIVE_JY
  412. gb_drive.b_warning = true;
  413. #endif
  414. }
  415. else
  416. {
  417. led_set_pub(PUB_LED_RUN_GJ, LED_OFF);
  418. #if defined FUNC_DRIVE || defined FUNC_DRIVE_JY
  419. gb_drive.b_warning = false;
  420. #endif
  421. }
  422. #endif
  423. if (g_run_stu.pubdz == 2) // ==2故障动作
  424. {
  425. led_set_pub(PUB_LED_DZ, LED_QUICK);
  426. }
  427. else
  428. {
  429. led_set_pub(PUB_LED_DZ, LED_OFF);
  430. }
  431. if (g_run_stu.yf)
  432. {
  433. led_set_pub(PUB_LED_YF, LED_ON);
  434. }
  435. else
  436. {
  437. led_set_pub(PUB_LED_YF, LED_OFF);
  438. }
  439. #ifdef KZ_OUT_TT
  440. if (!g_run_stu.kz_out_tt)
  441. {
  442. led_set_pub(PUB_LED_KZ_OUT, LED_ON);
  443. }
  444. else
  445. {
  446. led_set_pub(PUB_LED_KZ_OUT, LED_OFF);
  447. }
  448. #endif
  449. if (getIecLink101Status() || getCommStatus())
  450. {
  451. led_set_pub(PUB_LED_IEC_ERR, LED_ON);
  452. }
  453. else
  454. {
  455. led_set_pub(PUB_LED_IEC_ERR, LED_OFF);
  456. }
  457. if (g_bCommStatus)
  458. led_set_pub(PUB_LED_COMM_STATUS, LED_ON);
  459. else
  460. led_set_pub(PUB_LED_COMM_STATUS, LED_OFF);
  461. if (g_run_stu.jd)
  462. {
  463. led_set_pub(PUB_LED_JD, LED_ON);
  464. }
  465. else
  466. {
  467. led_set_pub(PUB_LED_JD, LED_OFF);
  468. }
  469. for (i = 0; i < g_sw_num; i++)
  470. {
  471. RUN_STU_SW *prun = &g_tRelay[i].run_stu;
  472. #if !defined CPU_FUXI
  473. // 综合合位灯
  474. if (prun->sw == 0x2)
  475. {
  476. led_set_sw(i, SW_LED_ZHHW, LED_ON);
  477. }
  478. else if (prun->sw == 0x3)
  479. {
  480. led_set_sw(i, SW_LED_ZHHW, LED_SLOW);
  481. }
  482. else
  483. {
  484. led_set_sw(i, SW_LED_ZHHW, LED_OFF);
  485. }
  486. if (prun->sw == 0x1)
  487. {
  488. led_set_sw(i, SW_LED_ZHTW, LED_ON);
  489. }
  490. else if (prun->sw == 0x3)
  491. {
  492. led_set_sw(i, SW_LED_ZHTW, LED_SLOW);
  493. }
  494. else
  495. {
  496. led_set_sw(i, SW_LED_ZHTW, LED_OFF);
  497. }
  498. #endif
  499. // 合位灯、跳位灯
  500. if (prun->hw)
  501. {
  502. sw_do(i, SW_DO_BHDZ, SW_DO_TYPE_OFF);
  503. led_set_sw(i, SW_LED_HW, LED_ON);
  504. }
  505. else
  506. {
  507. led_set_sw(i, SW_LED_HW, LED_OFF);
  508. }
  509. if (prun->tw)
  510. {
  511. led_set_sw(i, SW_LED_TW, LED_ON);
  512. }
  513. else
  514. {
  515. led_set_sw(i, SW_LED_TW, LED_OFF);
  516. }
  517. // 过流灯
  518. if (prun->gl == 1)
  519. {
  520. led_set_sw(i, SW_LED_GL, LED_ON);
  521. }
  522. else if (prun->gl == 2)
  523. {
  524. led_set_sw(i, SW_LED_GL, LED_QUICK);
  525. }
  526. // 接地灯
  527. if (prun->jd == 1)
  528. {
  529. led_set_sw(i, SW_LED_JD, LED_ON);
  530. }
  531. else if (prun->jd == 2)
  532. {
  533. led_set_sw(i, SW_LED_JD, LED_QUICK);
  534. }
  535. // 隔离刀闸灯
  536. if (prun->gldz)
  537. {
  538. led_set_sw(i, SW_LED_GLDZ, LED_ON);
  539. }
  540. else
  541. {
  542. led_set_sw(i, SW_LED_GLDZ, LED_OFF);
  543. }
  544. // 接地刀闸灯
  545. if (prun->jddz)
  546. {
  547. led_set_sw(i, SW_LED_JDDZ, LED_ON);
  548. }
  549. else
  550. {
  551. led_set_sw(i, SW_LED_JDDZ, LED_OFF);
  552. }
  553. if (prun->gj_led)
  554. {
  555. led_set_sw(i, SW_LED_FAULT_GJ, LED_ON);
  556. }
  557. // 重合闸灯
  558. if (prun->chzdz)
  559. {
  560. led_set_sw(i, SW_LED_CHZ, LED_ON);
  561. }
  562. // 重合闸充电灯
  563. if (prun->chzcd || prun->fa_ll_cd || prun->goose_qccd || prun->goose_glcd || prun->goose_ll_cd)
  564. {
  565. led_set_sw(i, SW_LED_CD, LED_ON);
  566. // led_set_sw(i,SW_LED_CHZBS, LED_OFF);//重合闸闭锁灯与充电灯功能相反
  567. }
  568. else
  569. {
  570. led_set_sw(i, SW_LED_CD, LED_OFF);
  571. // led_set_sw(i,SW_LED_CHZBS, LED_ON);//重合闸闭锁灯与充电灯功能相反
  572. }
  573. if (prun->chzcd)
  574. led_set_sw(i, SW_LED_CHZ_CD, LED_ON);
  575. else
  576. led_set_sw(i, SW_LED_CHZ_CD, LED_OFF);
  577. // 重合闸闭锁灯跟FA闭锁灯合并
  578. #if 0
  579. if(g_tRelay[i].run_stu.cgbhtt && !prun->chzcd)//保护与FA区分闭锁灯处理
  580. led_set_sw(i,SW_LED_CHZBS_LOCK, LED_ON);
  581. else if(g_tRelay[i].run_stu.fatt && prun->bs)
  582. led_set_sw(i,SW_LED_CHZBS_LOCK, LED_ON);
  583. else
  584. led_set_sw(i,SW_LED_CHZBS_LOCK, LED_OFF);
  585. #endif
  586. if (prun->bs || prun->chzbs)
  587. {
  588. led_set_sw(i, SW_LED_CHZBS_LOCK, LED_ON);
  589. }
  590. else
  591. {
  592. led_set_sw(i, SW_LED_CHZBS_LOCK, LED_OFF);
  593. }
  594. // 动作灯
  595. if (prun->dz == RY_DZ_XYBS) // xj 闭锁合闸长亮
  596. {
  597. led_set_sw(i, SW_LED_DZ, LED_ON);
  598. led_set_sw(i, SW_LED_TZ, LED_ON);
  599. }
  600. else if (prun->dz == RY_DZ_BHT) // xj 故障状态闪烁
  601. {
  602. led_set_sw(i, SW_LED_DZ, LED_QUICK);
  603. led_set_sw(i, SW_LED_TZ, LED_ON);
  604. }
  605. else
  606. {
  607. led_set_sw(i, SW_LED_DZ, LED_OFF);
  608. }
  609. if (BH_GOOSE_EN(i)) // 智能FA逻辑,联络开关自动查找
  610. {
  611. if (g_tRelay[i].tgoc.tllcd.sta.bFlag.bCD) // 本开关为联络开关
  612. {
  613. led_set_sw(i, SW_LED_LL, LED_ON);
  614. led_set_sw(i, SW_LED_FD, LED_OFF);
  615. }
  616. else
  617. {
  618. led_set_sw(i, SW_LED_LL, LED_OFF);
  619. led_set_sw(i, SW_LED_FD, LED_ON);
  620. }
  621. }
  622. else if (FA_ALL_EN(i))
  623. {
  624. if (prun->fa_ls) // 联络
  625. {
  626. led_set_sw(i, SW_LED_LL, LED_ON);
  627. led_set_sw(i, SW_LED_FD, LED_OFF);
  628. }
  629. else
  630. {
  631. led_set_sw(i, SW_LED_LL, LED_OFF);
  632. led_set_sw(i, SW_LED_FD, LED_ON);
  633. }
  634. }
  635. else
  636. {
  637. led_set_sw(i, SW_LED_FD, LED_OFF);
  638. led_set_sw(i, SW_LED_LL, LED_OFF);
  639. }
  640. // 运行模式压板灯
  641. if (BH_GOOSE_EN(i))
  642. {
  643. #ifdef GD_AREA_ZHONGSHAN_2020 // 中山要求智能分布式充电完成,亮模式灯,分支亮保护灯
  644. if ((prun->goose_qccd || prun->goose_glcd || prun->goose_ll_cd) && !pRunSet->tSwSet[i].tGocSet.bsw_fz)
  645. {
  646. led_set_sw(i, SW_LED_MODE_GOOSE, LED_ON);
  647. led_set_sw(i, SW_LED_MODE_BH, LED_OFF);
  648. led_set_sw(i, SW_LED_MODE_FA, LED_OFF);
  649. }
  650. else if (pRunSet->tSwSet[i].tGocSet.bsw_fz)
  651. {
  652. led_set_sw(i, SW_LED_MODE_GOOSE, LED_OFF);
  653. led_set_sw(i, SW_LED_MODE_BH, LED_ON);
  654. led_set_sw(i, SW_LED_MODE_FA, LED_OFF);
  655. }
  656. else
  657. {
  658. led_set_sw(i, SW_LED_MODE_GOOSE, LED_OFF);
  659. led_set_sw(i, SW_LED_MODE_BH, LED_OFF);
  660. led_set_sw(i, SW_LED_MODE_FA, LED_OFF);
  661. }
  662. #else
  663. led_set_sw(i, SW_LED_MODE_GOOSE, LED_ON);
  664. led_set_sw(i, SW_LED_MODE_BH, LED_OFF);
  665. led_set_sw(i, SW_LED_MODE_FA, LED_OFF);
  666. #endif
  667. }
  668. else if (BH_GOOSE_COMMERR(i))
  669. {
  670. led_set_sw(i, SW_LED_MODE_GOOSE, LED_OFF);
  671. if (pRunSet->tSwSet[i].tGocSet.bsw_fz)
  672. {
  673. led_set_sw(i, SW_LED_MODE_BH, LED_ON);
  674. led_set_sw(i, SW_LED_MODE_FA, LED_OFF);
  675. }
  676. else
  677. {
  678. #ifdef GD_AREA_ZHONGSHAN_2020 // 中山2020要求联络自转电功能未投入不亮FA灯
  679. if (prun->fa_ls)
  680. {
  681. if (soe_check(EV_FA_LL_EN + i * EV_SW_NUM) == true)
  682. led_set_sw(i, SW_LED_MODE_FA, LED_ON);
  683. else
  684. led_set_sw(i, SW_LED_MODE_FA, LED_OFF);
  685. }
  686. else
  687. {
  688. led_set_sw(i, SW_LED_MODE_FA, LED_ON);
  689. }
  690. // 闭锁时灭fa模式灯
  691. if (prun->bs)
  692. {
  693. led_set_sw(i, SW_LED_MODE_FA, LED_OFF);
  694. }
  695. #else
  696. led_set_sw(i, SW_LED_MODE_FA, LED_ON);
  697. #endif
  698. led_set_sw(i, SW_LED_MODE_BH, LED_OFF);
  699. }
  700. }
  701. else
  702. {
  703. // BH
  704. if (BH_ALL_EN(i))
  705. {
  706. led_set_sw(i, SW_LED_MODE_BH, LED_ON);
  707. }
  708. else
  709. {
  710. led_set_sw(i, SW_LED_MODE_BH, LED_OFF);
  711. }
  712. // FA
  713. if (FA_ALL_EN(i))
  714. {
  715. #ifdef GD_AREA_ZHONGSHAN_2020 // 中山2020要求联络自转电功能未投入不亮FA灯
  716. if (prun->fa_ls)
  717. {
  718. if (soe_check(EV_FA_LL_EN + i * EV_SW_NUM) == true)
  719. led_set_sw(i, SW_LED_MODE_FA, LED_ON);
  720. else
  721. led_set_sw(i, SW_LED_MODE_FA, LED_OFF);
  722. }
  723. else
  724. {
  725. led_set_sw(i, SW_LED_MODE_FA, LED_ON);
  726. }
  727. // 闭锁时灭fa模式灯
  728. if (prun->bs)
  729. {
  730. led_set_sw(i, SW_LED_MODE_FA, LED_OFF);
  731. }
  732. #else
  733. led_set_sw(i, SW_LED_MODE_FA, LED_ON);
  734. #endif
  735. }
  736. else
  737. {
  738. led_set_sw(i, SW_LED_MODE_FA, LED_OFF);
  739. }
  740. // Goose
  741. led_set_sw(i, SW_LED_MODE_GOOSE, LED_OFF);
  742. }
  743. #ifdef GD_AREA_ZHONGSHAN_2020
  744. if (soe_check(EV_GOOSE_QC_OK + i * EV_SW_NUM) == true // 切除OK
  745. || soe_check(EV_GOOSE_GL_OK + i * EV_SW_NUM) == true // 隔离OK
  746. || soe_check(EV_GOOSE_EXT_TZ + i * EV_SW_NUM) == true // 装置越级跳闸
  747. || soe_check(EV_GOOSE_SDLOST_TZ + i * EV_SW_NUM) == true // 首端失压分闸
  748. ) // 故障动作后亮闭锁灯
  749. {
  750. g_tRelay[i].run_stu.fgbs = 1;
  751. }
  752. #endif
  753. if (prun->bs || prun->fgbs)
  754. {
  755. led_set_sw(i, SW_LED_LOCK, LED_ON);
  756. #ifdef GD_AREA_ZHONGSHAN_2020 // 中山2020要求分段的时候,双电源不亮闭锁灯
  757. if (!prun->fa_ls) // 分段
  758. {
  759. if (g_tRelay[i].tSDHZ.S_Status == S_BSDOUBLE)
  760. {
  761. led_set_sw(i, SW_LED_LOCK, LED_OFF);
  762. // led_set_sw(i,SW_LED_MODE_FA, LED_OFF);//关闭就地FA灯
  763. }
  764. }
  765. #endif
  766. }
  767. else
  768. {
  769. led_set_sw(i, SW_LED_LOCK, LED_OFF);
  770. #ifdef GD_AREA_ZHONGSHAN_2020
  771. if (!prun->fa_ls) // 分段
  772. {
  773. // if(g_tRelay[i].tSDHZ.S_Status == S_BSDOUBLE)
  774. // led_set_sw(i,SW_LED_MODE_FA, LED_OFF);//关闭就地FA灯
  775. }
  776. #endif
  777. }
  778. // 储能/未储能灯需分合位合法(有对应遥信点)时才允许点亮
  779. if (prun->wcn && (prun->sw != 0) && (prun->sw != 3))
  780. {
  781. led_set_sw(i, SW_LED_WCN, LED_ON);
  782. }
  783. else if (!prun->wcn && (prun->sw != 0) && (prun->sw != 3))
  784. {
  785. led_set_sw(i, SW_LED_WCN, LED_OFF);
  786. }
  787. #if !defined CPU_FUXI
  788. if (JL_ALL_EN(i))
  789. {
  790. led_set_sw(i, SW_LED_ZDJL, LED_ON);
  791. led_set_sw(i, SW_LED_TYZDJL, LED_OFF);
  792. }
  793. else
  794. {
  795. led_set_sw(i, SW_LED_ZDJL, LED_OFF);
  796. led_set_sw(i, SW_LED_TYZDJL, LED_ON);
  797. }
  798. if (!FUN_ALL_EN(i)) // 停用保护功能总
  799. {
  800. led_set_sw(i, SW_LED_TYBHTT, LED_ON);
  801. }
  802. else
  803. {
  804. led_set_sw(i, SW_LED_TYBHTT, LED_OFF);
  805. }
  806. #endif
  807. #ifdef FUNC_DRIVE
  808. if (pRunSet->tSwSet[0].btt_gnyb_btdcd)
  809. {
  810. led_set_sw(i, SW_LED_DRIVE, LED_ON);
  811. }
  812. else
  813. {
  814. led_set_sw(i, SW_LED_DRIVE, LED_OFF);
  815. }
  816. #endif
  817. }
  818. }
  819. #ifdef CPU_FUXI
  820. /**
  821. * @brief 处理led
  822. * @author lch (lch_work@foxmail.com)
  823. * @version 1.0
  824. * @date 20251226
  825. * @return * int
  826. * @retval none
  827. *
  828. * @warning none
  829. * @note 现在是1000ms运行一次
  830. */
  831. static int led_updata_led(void)
  832. {
  833. int i = 0;
  834. u8 uc_stu = 0, uc_idx = 0;
  835. u32 ul_time = 0;
  836. enum e_mode_ch423 e_mode = e_io_mode_off;
  837. // 没有配置,不执行
  838. if (g_led_hmi == 0)
  839. {
  840. return -1;
  841. }
  842. for (i = 0; i < g_led_hmi->num; i++)
  843. {
  844. // 未配置灯继续循环
  845. if (g_led_hmi->sn[i].no == LED_NULL)
  846. {
  847. continue;
  848. }
  849. // 硬件地址
  850. uc_idx = suca_led_hw_addr[i];
  851. // 取出灯状态
  852. uc_stu = g_led_stu[g_led_hmi->sn[i].sw][g_led_hmi->sn[i].no];
  853. // 按位置将灯状态置入dwled
  854. switch (uc_stu)
  855. {
  856. case LED_ON:
  857. e_mode = e_io_mode_on;
  858. break;
  859. case LED_SLOW:
  860. case LED_QUICK:
  861. e_mode = e_io_mode_shine;
  862. break;
  863. case LED_OFF:
  864. e_mode = e_io_mode_off;
  865. break;
  866. }
  867. if (uc_stu != g_led_stu_bk[g_led_hmi->sn[i].sw][g_led_hmi->sn[i].no])
  868. {
  869. ch423sio_control_state(uc_idx, e_mode, g_led_hmi->sn[i].time);
  870. g_led_stu_bk[g_led_hmi->sn[i].sw][g_led_hmi->sn[i].no] = uc_stu;
  871. }
  872. }
  873. return 0;
  874. }
  875. #endif
  876. void led_polling_app(void)
  877. {
  878. static uint32_t us0 = 0;
  879. uint32_t us;
  880. ch423sio_handle_mode();
  881. // 平时1秒处理一次,AUX板测试时0.5S一次
  882. us = (g_led_aux_test_st || g_led_kz_test_st) ? (USTIMER_SEC / 4) : USTIMER_SEC;
  883. if (ustimer_delay_origin2(&us0, us) != 1)
  884. {
  885. return;
  886. }
  887. // 更新灯状态
  888. _led_update_status();
  889. #ifdef STORE_PILOTELAMP
  890. _led_status_save();
  891. #endif
  892. #ifdef CPU_FUXI
  893. led_updata_led();
  894. #endif
  895. }
  896. /******************************************************************************
  897. 函数名称: led_set_sw
  898. 函数版本: 01.01
  899. 创建作者: xxxxxx
  900. 创建日期: 2014-12-16
  901. 函数说明: 设置开出类LED灯的状态
  902. 参数说明: led: 灯的序号 LED_RUN,...,KC_LED_NUM
  903. status: 灯的状态 LED_ON, LED_SLOW, LED_QUICK, LED_OFF
  904. 返回值: 无
  905. 修改记录:
  906. */
  907. void led_set_pub(u8 no, u8 st)
  908. {
  909. g_led_stu[0][no] = st;
  910. }
  911. void led_set_sw(u8 sw, u8 no, u8 st)
  912. {
  913. g_led_stu[sw + 1][no] = st;
  914. }
  915. /*------------------------------ 内部函数 -------------------------------------
  916. 内部函数以下划线‘_’开头,不需要检查参数的合法性.
  917. */
  918. /*------------------------------ 测试函数 -------------------------------------
  919. 一个实体文件必须带一个本模块的测试函数来进行单元测试,如果的确不方便在本模块中
  920. 进行单元测试,必须在此注明实际的测试位置(例如在哪个实体文件中使用哪个测试函数).
  921. */
  922. int led_info_printf(void)
  923. {
  924. int slot, i;
  925. const char *name;
  926. struct equ_config_do *cdo;
  927. cdo = g_equ_config_do;
  928. rt_printf("\r\nslot\tindex\towner\tno\ttime\tvalue\tname\r\n");
  929. for (slot = 0; slot < EQU_SLOT_NUM_MAX; slot++)
  930. {
  931. rt_printf("slot%02d:num=%d.\r\n", slot, g_led_slot[slot].num);
  932. for (i = 0; i < g_led_slot[slot].num; i++)
  933. {
  934. if (g_led_slot[slot].sn[i].no == LED_NULL)
  935. {
  936. continue;
  937. }
  938. if (g_led_slot[slot].sn[i].sw == 0)
  939. {
  940. name = g_pub_led_name[g_led_slot[slot].sn[i].no];
  941. }
  942. else
  943. {
  944. name = g_sw_led_name[g_led_slot[slot].sn[i].no];
  945. }
  946. rt_printf("%02d\t%02d\t%02d\t%d\t%d\t%d\t%s\r\n",
  947. slot,
  948. i,
  949. g_led_slot[slot].sn[i].sw,
  950. g_led_slot[slot].sn[i].no,
  951. g_led_slot[slot].sn[i].time,
  952. g_led_stu[g_led_slot[slot].sn[i].sw][g_led_slot[slot].sn[i].no],
  953. name);
  954. }
  955. }
  956. return 0;
  957. }
  958. /*------------------------------ 文件结束 -------------------------------------
  959. */