led.c 25 KB

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