led.c 25 KB

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