led.c 25 KB

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