led.c 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542
  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. #if 0 //zhl 屏蔽这方式
  92. u32 slot;
  93. g_led_hmi=0;
  94. // 检查状态板是否配置
  95. slot = equ_get_slot_by_type(BOARD_TYPE_LCD_16LED);
  96. if(slot ==0)
  97. {
  98. slot = equ_get_slot_by_type(BOARD_TYPE_LCD_24LED);
  99. if(slot==0) //jack.liu 2020 增加26个灯灯板定义
  100. slot = equ_get_slot_by_type(BOARD_TYPE_LCD_26LED);
  101. }
  102. // 检查状态板是否配置
  103. if(slot >0)
  104. {
  105. g_led_hmi = &g_led_slot[slot];
  106. }
  107. strcpy(m_Ledgoose,"退出");
  108. strcpy(m_Ledbh,"退出");
  109. strcpy(m_Ledfa,"退出");
  110. strcpy(m_Ledjzs,"退出");
  111. strcpy(m_Bh_chr,"---- ");
  112. strcpy(m_Fa_sl,"----");
  113. strcpy(m_Fa_chr,"---- ");
  114. strcpy(m_Goose_chr,"---- ");
  115. #ifdef GD_AREA_ECZD_2020
  116. strcpy(m_Mode_chr,"----");
  117. strcpy(m_Tqhz_chr,"退出");
  118. strcpy(m_Zdjl_chr,"退出");
  119. strcpy(m_StopFun_chr,"停用所有功能");
  120. strcpy(m_Zdjl_chr,"退出");
  121. #endif
  122. #else
  123. if(g_led_slot[EQU_SLOT_HMI].num)
  124. {
  125. g_led_hmi = &g_led_slot[EQU_SLOT_HMI];
  126. return 0;
  127. }
  128. if(g_hmi_type < HMI_TYPE_NUM)
  129. {
  130. g_led_hmi = &g_led_hmi_default[g_hmi_type];
  131. }
  132. g_led_hmi = 0;
  133. #endif
  134. return 0;
  135. }
  136. /******************************************************************************
  137. 函数名称: led_polling_app
  138. 函数版本: 01.01
  139. 创建作者: xxxxxx
  140. 创建日期: 2015-04-16
  141. 函数说明: LED应用功能
  142. 参数说明: 无
  143. 返回值: 成功返回0.
  144. 修改记录:
  145. */
  146. void _led_update_status(void)
  147. {
  148. int soeno=0;
  149. int i,exerr;
  150. // 电源灯
  151. if(!g_run_stu.dcjlsd)
  152. {
  153. led_set_pub(PUB_LED_POWER, LED_ON);
  154. }
  155. #if defined GD_AREA_GUANGZHOU_FTU || defined GD_AREA_TEST_2020
  156. else
  157. {
  158. led_set_pub(PUB_LED_POWER, LED_OFF);//FTU外置电源灯一般用继电器开出,灯闪烁容易损坏继电器
  159. }
  160. #else
  161. else if (g_run_stu.dcjlsd && (!g_run_stu.dcqy))
  162. {
  163. led_set_pub(PUB_LED_POWER, LED_SLOW);
  164. }
  165. else if (g_run_stu.dcjlsd && g_run_stu.dcqy)
  166. {
  167. led_set_pub(PUB_LED_POWER, LED_QUICK);
  168. }
  169. #endif
  170. // 运行灯
  171. if(rt_err_count())
  172. {
  173. led_set_pub(PUB_LED_RUN, LED_ON);
  174. }
  175. else
  176. {
  177. led_set_pub(PUB_LED_RUN, LED_SLOW);
  178. }
  179. #ifdef GW_AREA_MAIN_2021
  180. // A相指示灯
  181. if (g_run_stu.phayy)
  182. {
  183. led_set_pub(PUB_LED_PHA,LED_OFF);
  184. }
  185. else
  186. {
  187. led_set_pub(PUB_LED_PHA,LED_ON);
  188. }
  189. // B相指示灯
  190. if (g_run_stu.phbyy)
  191. {
  192. led_set_pub(PUB_LED_PHB,LED_OFF);
  193. }
  194. else
  195. {
  196. led_set_pub(PUB_LED_PHB,LED_ON);
  197. }
  198. // C相指示灯
  199. if (g_run_stu.phcyy)
  200. {
  201. led_set_pub(PUB_LED_PHC,LED_OFF);
  202. }
  203. else
  204. {
  205. led_set_pub(PUB_LED_PHC,LED_ON);
  206. }
  207. #endif
  208. //异常灯,以内部异常优先级高
  209. exerr=0;
  210. #ifndef GD_AREA_ZHUHAI_V2 //未储能异常
  211. for(i=0;i<g_sw_num;i++)
  212. {
  213. RUN_STU_SW *prun=&g_tRelay[i].run_stu;
  214. if (prun->exerr)
  215. {
  216. exerr =1;
  217. break;
  218. }
  219. }
  220. #endif
  221. if (rt_err_count())
  222. {
  223. led_set_pub(PUB_LED_ERR, LED_ON);
  224. #if defined FUNC_DRIVE || defined FUNC_DRIVE_JY
  225. gb_drive.b_err = true;
  226. #endif
  227. }
  228. #ifdef GD_AREA_ZHUHAI_V2
  229. else if((soe_check(EV_FUNALL_CHECK+0*EV_SW_NUM)==true)||(soe_check(EV_CHZ_CHECK+0*EV_SW_NUM)==true)||
  230. (soe_check(EV_GOOSE_CHECK+0*EV_SW_NUM)==true)||(soe_check(EV_FA_CHECK+0*EV_SW_NUM)==true)||(soe_check(EV_BH_CHECK+0*EV_SW_NUM)==true))
  231. {
  232. led_set_pub(PUB_LED_ERR, LED_ON);
  233. }
  234. #elif defined GD_AREA_ZHONGSHAN_2020
  235. else if (exerr||soe_check(EV_GOOSE_CONFIG_ERR)==true)//中山2020要求通信异常不允许亮异常灯
  236. {
  237. led_set_pub(PUB_LED_ERR, LED_ON);
  238. }
  239. #else
  240. else if (exerr||(tFAg.commerr>0)) //中山要求,只有本机通信异常点告警灯,系统异常不点灯
  241. {
  242. led_set_pub(PUB_LED_ERR, LED_ON);
  243. #if defined FUNC_DRIVE || defined FUNC_DRIVE_JY
  244. gb_drive.b_err = true;
  245. #endif
  246. }
  247. #endif
  248. else if (soe_check(EV_61850_ERR)==true)
  249. {
  250. led_set_pub(PUB_LED_ERR, LED_ON);
  251. #if defined FUNC_DRIVE || defined FUNC_DRIVE_JY
  252. gb_drive.b_err = true;
  253. #endif
  254. }
  255. else
  256. {
  257. led_set_pub(PUB_LED_ERR, LED_OFF);
  258. #if defined FUNC_DRIVE || defined FUNC_DRIVE_JY
  259. gb_drive.b_err = false;
  260. #endif
  261. }
  262. //#ifdef GD_AREA_ECZD_2020
  263. #if defined GD_AREA_ECZD_2020 || defined GD_AREA_MAIN_2020
  264. for(i=0; i<g_sw_num; i++)
  265. {
  266. RUN_STU_SW *prun=&g_tRelay[i].run_stu;
  267. if (prun->exerr||prun->qyd||prun->qyd||tPT.uPT1DX.bFlag.bPTYC||tPT.uPT2DX.bFlag.bPTYC)
  268. {
  269. exerr =1;
  270. break;
  271. }
  272. }
  273. if(exerr||(tFAg.commerr>0))
  274. {
  275. led_set_pub(PUB_LED_RUN_GJ, LED_ON);
  276. #if defined FUNC_DRIVE || defined FUNC_DRIVE_JY
  277. gb_drive.b_warning = true;
  278. #endif
  279. }
  280. else
  281. {
  282. led_set_pub(PUB_LED_RUN_GJ, LED_OFF);
  283. #if defined FUNC_DRIVE || defined FUNC_DRIVE_JY
  284. gb_drive.b_warning = false;
  285. #endif
  286. }
  287. #endif
  288. //if(g_run_stu.pubdz==1) // ==1 闭锁
  289. //{
  290. //led_set_pub(PUB_LED_DZ,LED_ON);
  291. //}
  292. //else
  293. if(g_run_stu.pubdz==2) // ==2故障动作
  294. {
  295. led_set_pub(PUB_LED_DZ,LED_QUICK);
  296. }
  297. else
  298. {
  299. led_set_pub(PUB_LED_DZ,LED_OFF);
  300. }
  301. if(g_run_stu.yf)
  302. {
  303. led_set_pub(PUB_LED_YF,LED_ON);
  304. }
  305. else
  306. {
  307. led_set_pub(PUB_LED_YF,LED_OFF);
  308. }
  309. #ifdef BAT_STATE_LED
  310. if(soe_check(EV_BAT_OVER)||soe_check(EV_BATERR)||g_run_stu.dcqy)
  311. {
  312. led_set_pub(PUB_LED_BAT,LED_ON);
  313. }
  314. else
  315. {
  316. led_set_pub(PUB_LED_BAT,LED_OFF);
  317. }
  318. if(soe_check(EV_BATERR)||g_run_stu.dcqy)
  319. {
  320. led_set_pub(PUB_LED_BAT_LOW,LED_ON);
  321. }
  322. else
  323. {
  324. led_set_pub(PUB_LED_BAT_LOW,LED_OFF);
  325. }
  326. if(g_run_stu.dchh)
  327. {
  328. led_set_pub(PUB_LED_BAT_HH,LED_ON);
  329. }
  330. else
  331. {
  332. led_set_pub(PUB_LED_BAT_HH,LED_OFF);
  333. }
  334. #endif
  335. #ifdef KZ_OUT_TT
  336. if(!g_run_stu.kz_out_tt)
  337. {
  338. led_set_pub(PUB_LED_KZ_OUT,LED_ON);
  339. }
  340. else
  341. {
  342. led_set_pub(PUB_LED_KZ_OUT,LED_OFF);
  343. }
  344. #endif
  345. #ifdef IEC_ERR_LED
  346. if(getIecLink101Status()||getCommStatus())
  347. {
  348. led_set_pub(PUB_LED_IEC_ERR,LED_ON);
  349. }
  350. else
  351. {
  352. led_set_pub(PUB_LED_IEC_ERR,LED_OFF);
  353. }
  354. #endif
  355. #ifdef LINK_ERR_LED
  356. if(getIecLink101Status())
  357. {
  358. led_set_pub(PUB_LED_LINK_ERR,LED_ON);
  359. }
  360. else
  361. {
  362. led_set_pub(PUB_LED_LINK_ERR,LED_OFF);
  363. }
  364. #endif
  365. #ifdef COMM_STATUS_LED
  366. if(g_bCommStatus)
  367. led_set_pub(PUB_LED_COMM_STATUS, LED_ON);
  368. else
  369. led_set_pub(PUB_LED_COMM_STATUS, LED_OFF);
  370. #endif
  371. if(g_run_stu.jd)
  372. {
  373. led_set_pub(PUB_LED_JD,LED_ON);
  374. }
  375. else
  376. {
  377. led_set_pub(PUB_LED_JD,LED_OFF);
  378. }
  379. for(i=0;i<g_sw_num;i++)
  380. {
  381. bool bflag = 0;
  382. RUN_STU_SW *prun=&g_tRelay[i].run_stu;
  383. // 综合合位灯
  384. if (prun->sw == 0x2)
  385. {
  386. led_set_sw(i,SW_LED_ZHHW, LED_ON);
  387. }
  388. else if (prun->sw == 0x3)
  389. {
  390. led_set_sw(i,SW_LED_ZHHW, LED_SLOW);
  391. }
  392. else
  393. {
  394. led_set_sw(i,SW_LED_ZHHW, LED_OFF);
  395. }
  396. if (prun->sw == 0x1)
  397. {
  398. led_set_sw(i,SW_LED_ZHTW, LED_ON);
  399. }
  400. else if (prun->sw == 0x3)
  401. {
  402. led_set_sw(i,SW_LED_ZHTW, LED_SLOW);
  403. }
  404. else
  405. {
  406. led_set_sw(i,SW_LED_ZHTW, LED_OFF);
  407. }
  408. #ifdef GD_AREA_ZHUHAI_V2
  409. //通讯异常
  410. if(tFAg.bComErr>0)
  411. {
  412. led_set_sw(i,SW_LED_COMMERR, LED_ON);
  413. }
  414. else
  415. {
  416. led_set_sw(i,SW_LED_COMMERR, LED_OFF);
  417. }
  418. #endif
  419. // 合位灯、跳位灯
  420. if (prun->hw)
  421. {
  422. sw_do(i,SW_DO_BHDZ,SW_DO_TYPE_OFF);
  423. led_set_sw(i,SW_LED_HW, LED_ON);
  424. }
  425. else
  426. {
  427. led_set_sw(i,SW_LED_HW, LED_OFF);
  428. }
  429. if (prun->tw)
  430. {
  431. led_set_sw(i,SW_LED_TW, LED_ON);
  432. }
  433. else
  434. {
  435. led_set_sw(i,SW_LED_TW, LED_OFF);
  436. }
  437. // 过流灯
  438. if (prun->gl == 1)
  439. {
  440. led_set_sw(i,SW_LED_GL, LED_ON);
  441. led_set_sw(i,SW_LED_XLGZ, LED_ON); // 暂时将过流作为线路故障判断
  442. bflag = 1;
  443. }
  444. else if (prun->gl == 2)
  445. {
  446. led_set_sw(i,SW_LED_GL, LED_QUICK);
  447. led_set_sw(i,SW_LED_XLGZ, LED_QUICK); // 暂时将过流作为线路故障判断
  448. bflag = 1;
  449. }
  450. if(bflag) //线路故障
  451. {
  452. soeno = EV_SW_FAULT_LED + i*EV_SW_NUM;
  453. if(soe_check(soeno)==false)
  454. {
  455. soe_record_ev(soeno, 1, 0,0,0);
  456. }
  457. }
  458. // 接地灯
  459. if (prun->jd == 1)
  460. {
  461. led_set_sw(i,SW_LED_JD, LED_ON);
  462. }
  463. else if (prun->jd == 2)
  464. {
  465. led_set_sw(i,SW_LED_JD, LED_QUICK);
  466. }
  467. #ifdef SWITCH_GLJD_LED
  468. //隔离刀闸灯
  469. if(prun->gldz)
  470. {
  471. led_set_sw(i,SW_LED_GLDZ, LED_ON);
  472. }
  473. else
  474. {
  475. led_set_sw(i,SW_LED_GLDZ, LED_OFF);
  476. }
  477. //接地刀闸灯
  478. if(prun->jddz)
  479. {
  480. led_set_sw(i,SW_LED_JDDZ, LED_ON);
  481. }
  482. else
  483. {
  484. led_set_sw(i,SW_LED_JDDZ, LED_OFF);
  485. }
  486. #endif
  487. #if defined GD_AREA_GUANGZHOU_FTU || defined GD_AREA_TEST_2020
  488. if (prun->gj_led)
  489. led_set_sw(i,SW_LED_FAULT_GJ, LED_ON);
  490. #endif
  491. #ifdef GD_AREA_ZHUHAI_V2
  492. if((prun->gj_led)|| //故障
  493. (soe_check(EV_TH_WCN+i*EV_SW_NUM)==true)|| //弹簧未储能
  494. (soe_check(EV_KZHL+i*EV_SW_NUM)==true)||//控制回路
  495. (soe_check(EV_FUNALL_CHECK+0*EV_SW_NUM)==true||soe_check(EV_CHZ_CHECK+0*EV_SW_NUM)==true||soe_check(EV_GOOSE_CHECK+0*EV_SW_NUM)==true||soe_check(EV_FA_CHECK+0*EV_SW_NUM)==true||soe_check(EV_BH_CHECK+0*EV_SW_NUM)==true)||//压板不一致
  496. (soe_check(EV_CTYC+i*EV_SW_NUM)==true||soe_check(EV_CTXXYC+i*EV_SW_NUM)==true)||//CT异常+相序异常
  497. (soe_check(EV_PT1ERR)||soe_check(EV_PT2ERR)))//珠海局要求PT断线当做异常告警
  498. {
  499. led_set_sw(i,SW_LED_FAULT_GJ, LED_ON);
  500. }
  501. else//无故障时熄灭
  502. {
  503. led_set_sw(i,SW_LED_FAULT_GJ, LED_OFF);
  504. }
  505. #endif
  506. // 重合闸灯
  507. if (prun->chzdz)
  508. {
  509. led_set_sw(i,SW_LED_CHZ, LED_ON);
  510. }
  511. // 重合闸充电灯
  512. if (prun->chzcd||prun->fa_ll_cd||prun->goose_qccd||prun->goose_glcd||prun->goose_ll_cd)
  513. {
  514. led_set_sw(i,SW_LED_CD, LED_ON);
  515. //led_set_sw(i,SW_LED_CHZBS, LED_OFF);//重合闸闭锁灯与充电灯功能相反
  516. }
  517. else
  518. {
  519. led_set_sw(i,SW_LED_CD, LED_OFF);
  520. //led_set_sw(i,SW_LED_CHZBS, LED_ON);//重合闸闭锁灯与充电灯功能相反
  521. }
  522. #ifdef CHZ_CD_LED
  523. if (prun->chzcd)
  524. led_set_sw(i,SW_LED_CHZ_CD, LED_ON);
  525. else
  526. led_set_sw(i,SW_LED_CHZ_CD, LED_OFF);
  527. #endif
  528. //重合闸闭锁灯跟FA闭锁灯合并
  529. #if 0
  530. if(g_tRelay[i].run_stu.bhtt && !prun->chzcd)//保护与FA区分闭锁灯处理
  531. led_set_sw(i,SW_LED_CHZBS_LOCK, LED_ON);
  532. else if(g_tRelay[i].run_stu.fatt && prun->bs)
  533. led_set_sw(i,SW_LED_CHZBS_LOCK, LED_ON);
  534. else
  535. led_set_sw(i,SW_LED_CHZBS_LOCK, LED_OFF);
  536. #endif
  537. #ifndef GW_AREA_MAIN_2021
  538. #ifdef GD_AREA_ZHONGSHAN_FTU //中山FTU要求手柄手分的时候退出自动化功能,亮闭锁灯
  539. if(prun->bs || prun->bs_bhz||prun->chzbs)
  540. #else
  541. if (prun->bs||prun->chzbs)
  542. #endif
  543. {
  544. led_set_sw(i,SW_LED_CHZBS_LOCK, LED_ON);
  545. #ifdef EQU_RUN_LED
  546. led_set_sw(i, SW_LED_EQU_RUN, LED_OFF);
  547. #endif
  548. }
  549. else
  550. {
  551. led_set_sw(i,SW_LED_CHZBS_LOCK, LED_OFF);
  552. #ifdef EQU_RUN_LED
  553. led_set_sw(i, SW_LED_EQU_RUN, LED_ON);
  554. #endif
  555. }
  556. #endif
  557. // 动作灯
  558. if (prun->dz == RY_DZ_XYBS) //xj 闭锁合闸长亮
  559. {
  560. led_set_sw(i,SW_LED_DZ, LED_ON);
  561. #ifdef TZ_STATE_LED
  562. led_set_sw(i,SW_LED_TZ, LED_ON);
  563. #endif
  564. }
  565. #ifdef GD_AREA_ZHUHAI_V2
  566. else if ((prun->dz == RY_DZ_BHT)||(prun->dz == RY_DZ_HZ)) //动作灯常亮,手动复归
  567. {
  568. led_set_sw(i,SW_LED_DZ, LED_ON);
  569. }
  570. #else
  571. else if (prun->dz == RY_DZ_BHT) //xj 故障状态闪烁
  572. {
  573. led_set_sw(i,SW_LED_DZ, LED_QUICK);
  574. #ifdef TZ_STATE_LED
  575. led_set_sw(i,SW_LED_TZ, LED_ON);
  576. #endif
  577. }
  578. else
  579. {
  580. led_set_sw(i,SW_LED_DZ, LED_OFF);
  581. }
  582. #endif
  583. #ifdef GW_AREA_MAIN_2021
  584. // 隔离开关指示灯
  585. if (g_sw[i].di[SW_DI_GLDZ1] == SW_DI_TYPE_ON)
  586. {
  587. led_set_sw(i,SW_LED_GLDZ, LED_ON);
  588. }
  589. else
  590. {
  591. led_set_sw(i,SW_LED_GLDZ, LED_OFF);
  592. }
  593. // 接地刀闸指示灯
  594. if (g_sw[i].di[SW_DI_JDDZ] == SW_DI_TYPE_ON)
  595. {
  596. led_set_sw(i,SW_LED_DD, LED_ON);
  597. }
  598. else
  599. {
  600. led_set_sw(i,SW_LED_DD, LED_OFF);
  601. }
  602. // 开关远方指示灯
  603. if (g_sw[i].di[SW_DI_KGYF] == SW_DI_TYPE_ON)
  604. {
  605. led_set_sw(i,SW_LED_YF, LED_ON);
  606. }
  607. else
  608. {
  609. led_set_sw(i,SW_LED_YF, LED_OFF);
  610. }
  611. // 控回报警指示灯
  612. if (g_sw[i].di[SW_DI_KZDX] == SW_DI_TYPE_ON)
  613. {
  614. led_set_sw(i,SW_LED_KH, LED_ON);
  615. }
  616. else
  617. {
  618. led_set_sw(i,SW_LED_KH, LED_OFF);
  619. }
  620. #else
  621. if(BH_GOOSE_EN(i)) //智能FA逻辑,联络开关自动查找
  622. {
  623. if(g_tRelay[i].tgoc.tllcd.sta.bFlag.bCD) //本开关为联络开关
  624. {
  625. led_set_sw(i,SW_LED_LL, LED_ON);
  626. led_set_sw(i,SW_LED_FD, LED_OFF);
  627. }
  628. else
  629. {
  630. led_set_sw(i,SW_LED_LL, LED_OFF);
  631. led_set_sw(i,SW_LED_FD, LED_ON);
  632. }
  633. }
  634. else if (FA_ALL_EN(i))
  635. {
  636. if (prun->fa_ls) // 联络
  637. {
  638. led_set_sw(i,SW_LED_LL, LED_ON);
  639. led_set_sw(i,SW_LED_FD, LED_OFF);
  640. }
  641. else
  642. {
  643. led_set_sw(i,SW_LED_LL, LED_OFF);
  644. led_set_sw(i,SW_LED_FD, LED_ON);
  645. }
  646. }
  647. else
  648. {
  649. led_set_sw(i,SW_LED_FD, LED_OFF);
  650. led_set_sw(i,SW_LED_LL, LED_OFF);
  651. }
  652. //运行模式压板灯
  653. if(BH_GOOSE_EN(i))
  654. {
  655. #ifdef GD_AREA_ZHONGSHAN_2020 // 中山要求智能分布式充电完成,亮模式灯,分支亮保护灯
  656. if((prun->goose_qccd||prun->goose_glcd||prun->goose_ll_cd)&&!pRunSet->tSwSet[i].tGocSet.bsw_fz)
  657. {
  658. led_set_sw(i,SW_LED_MODE_GOOSE, LED_ON);
  659. led_set_sw(i,SW_LED_MODE_BH, LED_OFF);
  660. led_set_sw(i,SW_LED_MODE_FA, LED_OFF);
  661. }
  662. else if(pRunSet->tSwSet[i].tGocSet.bsw_fz)
  663. {
  664. led_set_sw(i,SW_LED_MODE_GOOSE, LED_OFF);
  665. led_set_sw(i,SW_LED_MODE_BH, LED_ON);
  666. led_set_sw(i,SW_LED_MODE_FA, LED_OFF);
  667. }
  668. else
  669. {
  670. led_set_sw(i,SW_LED_MODE_GOOSE, LED_OFF);
  671. led_set_sw(i,SW_LED_MODE_BH, LED_OFF);
  672. led_set_sw(i,SW_LED_MODE_FA, LED_OFF);
  673. }
  674. #else
  675. led_set_sw(i,SW_LED_MODE_GOOSE, LED_ON);
  676. led_set_sw(i,SW_LED_MODE_BH, LED_OFF);
  677. led_set_sw(i,SW_LED_MODE_FA, LED_OFF);
  678. #endif
  679. strcpy(m_Ledgoose,"投入");
  680. strcpy(m_Ledbh,"退出");
  681. strcpy(m_Ledfa,"退出");
  682. #ifdef GD_AREA_ECZD_2020
  683. #ifdef GD_AREA_ZHONGSHAN_2020
  684. strcpy(m_Mode_chr,"智能分布式");
  685. #else
  686. strcpy(m_Mode_chr,"智能FA");
  687. #endif
  688. #endif
  689. if(prun->goose_qccd||prun->goose_glcd||prun->goose_ll_cd)
  690. {
  691. strcpy(m_Goose_chr,"已充电");
  692. }
  693. else
  694. {
  695. strcpy(m_Goose_chr,"未充电");
  696. }
  697. strcpy(m_Bh_chr,"---- ");
  698. strcpy(m_Fa_sl,"----");
  699. strcpy(m_Fa_chr,"---- ");
  700. }
  701. else if(BH_GOOSE_COMMERR(i))
  702. {
  703. led_set_sw(i,SW_LED_MODE_GOOSE, LED_OFF);
  704. strcpy(m_Ledgoose,"退出");
  705. if(pRunSet->tSwSet[i].tGocSet.bsw_fz)
  706. {
  707. led_set_sw(i,SW_LED_MODE_BH, LED_ON);
  708. led_set_sw(i,SW_LED_MODE_FA, LED_OFF);
  709. strcpy(m_Ledbh,"投入");
  710. strcpy(m_Ledfa,"退出");
  711. #ifdef GD_AREA_ECZD_2020
  712. #ifdef GD_AREA_ZHONGSHAN_2020
  713. strcpy(m_Mode_chr,"电流型");
  714. #else
  715. strcpy(m_Mode_chr,"常规保护");
  716. #endif
  717. #endif
  718. if(prun->chzcd)
  719. {
  720. strcpy(m_Bh_chr,"已充电");
  721. }
  722. else
  723. {
  724. strcpy(m_Bh_chr,"未充电");
  725. }
  726. strcpy(m_Fa_sl,"----");
  727. strcpy(m_Fa_chr,"---- ");
  728. strcpy(m_Goose_chr,"---- ");
  729. }
  730. else
  731. {
  732. #ifdef GD_AREA_ZHONGSHAN_2020//中山2020要求联络自转电功能未投入不亮FA灯
  733. if(prun->fa_ls)
  734. {
  735. if(soe_check(EV_FA_LL_EN+i*EV_SW_NUM)==true)
  736. led_set_sw(i,SW_LED_MODE_FA, LED_ON);
  737. else
  738. led_set_sw(i,SW_LED_MODE_FA, LED_OFF);
  739. }
  740. else
  741. {
  742. led_set_sw(i,SW_LED_MODE_FA, LED_ON);
  743. }
  744. //闭锁时灭fa模式灯
  745. if(prun->bs)
  746. {
  747. led_set_sw(i,SW_LED_MODE_FA, LED_OFF);
  748. }
  749. #else
  750. led_set_sw(i,SW_LED_MODE_FA, LED_ON);
  751. #endif
  752. led_set_sw(i,SW_LED_MODE_BH, LED_OFF);
  753. strcpy(m_Ledfa,"投入");
  754. strcpy(m_Ledbh,"退出");
  755. #ifdef GD_AREA_ECZD_2020
  756. #ifdef GD_AREA_ZHONGSHAN_2020
  757. strcpy(m_Mode_chr,"电压电流型");
  758. #else
  759. strcpy(m_Mode_chr,"常规FA");
  760. #endif
  761. #endif
  762. if(prun->fa_ls)
  763. {
  764. strcpy(m_Fa_sl,"联络");
  765. if(prun->fa_ll_cd)
  766. {
  767. strcpy(m_Fa_chr,"已充电");
  768. }
  769. else
  770. {
  771. strcpy(m_Fa_chr,"未充电");
  772. }
  773. }
  774. else
  775. {
  776. strcpy(m_Fa_sl,"分段");
  777. strcpy(m_Fa_chr,"---- ");
  778. }
  779. strcpy(m_Bh_chr,"---- ");
  780. strcpy(m_Goose_chr,"---- ");
  781. }
  782. }
  783. else
  784. {
  785. //BH
  786. #ifdef JZS_FUNCTION
  787. strcpy(m_Ledjzs,"退出");
  788. #endif
  789. if (BH_ALL_EN(i))
  790. {
  791. led_set_sw(i,SW_LED_MODE_BH, LED_ON);
  792. #ifdef JZS_FUNCTION
  793. if(JZS_ALL_EN(i))
  794. {
  795. strcpy(m_Ledjzs,"投入");
  796. strcpy(m_Ledbh,"退出");
  797. }
  798. else
  799. {
  800. strcpy(m_Ledbh,"投入");
  801. }
  802. #else
  803. strcpy(m_Ledbh,"投入");
  804. #ifdef GD_AREA_ECZD_2020
  805. #ifdef GD_AREA_ZHONGSHAN_2020
  806. strcpy(m_Mode_chr,"电流型");
  807. #else
  808. strcpy(m_Mode_chr,"常规保护");
  809. #endif
  810. #endif
  811. #endif
  812. }
  813. else
  814. {
  815. led_set_sw(i,SW_LED_MODE_BH, LED_OFF);
  816. strcpy(m_Ledbh,"退出");
  817. }
  818. if(!CHZ_ALL_EN(i))
  819. {
  820. strcpy(m_Bh_chr,"---- ");
  821. }
  822. else
  823. {
  824. if(prun->chzcd)
  825. {
  826. strcpy(m_Bh_chr,"已充电");
  827. }
  828. else
  829. {
  830. strcpy(m_Bh_chr,"未充电");
  831. }
  832. }
  833. //FA
  834. if (FA_ALL_EN(i))
  835. {
  836. #ifdef GD_AREA_ZHONGSHAN_2020//中山2020要求联络自转电功能未投入不亮FA灯
  837. if(prun->fa_ls)
  838. {
  839. if(soe_check(EV_FA_LL_EN+i*EV_SW_NUM)==true)
  840. led_set_sw(i,SW_LED_MODE_FA, LED_ON);
  841. else
  842. led_set_sw(i,SW_LED_MODE_FA, LED_OFF);
  843. }
  844. else
  845. {
  846. led_set_sw(i,SW_LED_MODE_FA, LED_ON);
  847. }
  848. //闭锁时灭fa模式灯
  849. if(prun->bs)
  850. {
  851. led_set_sw(i,SW_LED_MODE_FA, LED_OFF);
  852. }
  853. #else
  854. led_set_sw(i,SW_LED_MODE_FA, LED_ON);
  855. #endif
  856. strcpy(m_Ledfa,"投入");
  857. #ifdef GD_AREA_ECZD_2020
  858. #ifdef GD_AREA_ZHONGSHAN_2020
  859. strcpy(m_Mode_chr,"电压电流型");
  860. #else
  861. strcpy(m_Mode_chr,"常规FA");
  862. #endif
  863. #endif
  864. }
  865. else
  866. {
  867. led_set_sw(i,SW_LED_MODE_FA, LED_OFF);
  868. strcpy(m_Ledfa,"退出");
  869. }
  870. if(!FA_ALL_EN(i))
  871. {
  872. strcpy(m_Fa_sl,"----");
  873. strcpy(m_Fa_chr,"---- ");
  874. }
  875. else
  876. {
  877. if(prun->fa_ls)
  878. {
  879. strcpy(m_Fa_sl,"联络");
  880. if(prun->fa_ll_cd)
  881. {
  882. strcpy(m_Fa_chr,"已充电");
  883. }
  884. else
  885. {
  886. strcpy(m_Fa_chr,"未充电");
  887. }
  888. }
  889. else
  890. {
  891. strcpy(m_Fa_sl,"分段");
  892. strcpy(m_Fa_chr,"---- ");
  893. }
  894. }
  895. //Goose
  896. led_set_sw(i,SW_LED_MODE_GOOSE, LED_OFF);
  897. strcpy(m_Ledgoose,"退出");
  898. strcpy(m_Goose_chr,"---- ");
  899. //no mode
  900. if((!FA_ALL_EN(i))&&(!BH_ALL_EN(i)))
  901. {
  902. strcpy(m_Mode_chr,"----");
  903. }
  904. }
  905. #endif
  906. #ifdef GD_AREA_ZHONGSHAN_2020
  907. if(soe_check(EV_GOOSE_QC_OK+i*EV_SW_NUM)==true //切除OK
  908. ||soe_check(EV_GOOSE_GL_OK+i*EV_SW_NUM)==true //隔离OK
  909. ||soe_check(EV_GOOSE_EXT_TZ+i*EV_SW_NUM)==true //装置越级跳闸
  910. ||soe_check(EV_GOOSE_SDLOST_TZ+i*EV_SW_NUM)==true //首端失压分闸
  911. ) // 故障动作后亮闭锁灯
  912. {
  913. g_tRelay[i].run_stu.fgbs=1;
  914. }
  915. #endif
  916. #ifdef GD_AREA_ZHONGSHAN_FTU //中山FTU要求手柄手分的时候退出自动化功能,亮闭锁灯
  917. if(prun->bs || prun->bs_bhz)
  918. #else
  919. if (prun->bs||prun->fgbs)
  920. #endif
  921. {
  922. led_set_sw(i,SW_LED_LOCK, LED_ON);
  923. #ifdef GD_AREA_ZHONGSHAN_2020//中山2020要求分段的时候,双电源不亮闭锁灯
  924. if(!prun->fa_ls)//分段
  925. {
  926. if(g_tRelay[i].tSDHZ.S_Status == S_BSDOUBLE)
  927. {
  928. led_set_sw(i,SW_LED_LOCK, LED_OFF);
  929. //led_set_sw(i,SW_LED_MODE_FA, LED_OFF);//关闭就地FA灯
  930. }
  931. }
  932. #endif
  933. }
  934. else
  935. {
  936. led_set_sw(i,SW_LED_LOCK, LED_OFF);
  937. #ifdef GD_AREA_ZHONGSHAN_2020
  938. if(!prun->fa_ls)//分段
  939. {
  940. //if(g_tRelay[i].tSDHZ.S_Status == S_BSDOUBLE)
  941. //led_set_sw(i,SW_LED_MODE_FA, LED_OFF);//关闭就地FA灯
  942. }
  943. #endif
  944. }
  945. //储能/未储能灯需分合位合法(有对应遥信点)时才允许点亮
  946. // if(prun->wcn && (prun->sw != 0) && (prun->sw != 3))
  947. if(prun->wcn)
  948. {
  949. led_set_sw(i,SW_LED_WCN, LED_ON);
  950. #ifdef DISP_DOUBLE_CN
  951. led_set_sw(i,SW_LED_YCN, LED_OFF);
  952. #endif
  953. }
  954. else //if(!prun->wcn && (prun->sw != 0) && (prun->sw != 3))
  955. {
  956. led_set_sw(i,SW_LED_WCN, LED_OFF);
  957. #ifdef DISP_DOUBLE_CN
  958. led_set_sw(i,SW_LED_YCN, LED_ON);
  959. #endif
  960. }
  961. #ifdef QYD_STATE_LED
  962. if(prun->qyd)
  963. led_set_sw(i,SW_LED_QYD, LED_ON);
  964. else
  965. led_set_sw(i,SW_LED_QYD, LED_OFF);
  966. #endif
  967. #ifdef CHZ_QUIT_LED //重合闸退出灯(硬件压板或软件压板退出灯亮)
  968. if(CHZ_ALL_EN(i)&&prun->chzcd)
  969. {
  970. led_set_sw(i,SW_LED_CHZ_QUIT, LED_OFF);
  971. }
  972. else
  973. {
  974. led_set_sw(i,SW_LED_CHZ_QUIT, LED_ON);
  975. }
  976. #endif
  977. //#ifdef GD_AREA_ECZD_2020//2020-9-10
  978. #if defined GD_AREA_ECZD_2020 || defined GD_AREA_MAIN_2020
  979. #ifdef TY_BH_FA
  980. if(
  981. #ifdef BH_FA_INONE_SW
  982. pRunSet->tSwSet[i].bTT_BH_ALL_YB &&
  983. #endif
  984. g_tRelay[i].run_stu.safe_auto && g_tRelay[i].run_stu.bTQ && pRunSet->bTT_TQ_YB && !g_tRelay[i].run_stu.tytq)
  985. #else
  986. if(FUN_ALL_EN(i) && g_tRelay[i].run_stu.safe_auto && g_tRelay[i].run_stu.bTQ && pRunSet->bTT_TQ_YB && !g_tRelay[i].run_stu.tytq)
  987. #endif
  988. {
  989. led_set_sw(i,SW_LED_TYTQHZ, LED_OFF);
  990. led_set_sw(i,SW_LED_TQHZ,LED_ON );
  991. strcpy(m_Tqhz_chr,"投入");
  992. }
  993. else
  994. {
  995. led_set_sw(i,SW_LED_TYTQHZ,LED_ON );
  996. led_set_sw(i,SW_LED_TQHZ,LED_OFF );
  997. strcpy(m_Tqhz_chr,"退出");
  998. }
  999. if(JL_ALL_EN(i))
  1000. {
  1001. led_set_sw(i,SW_LED_ZDJL, LED_ON);
  1002. led_set_sw(i,SW_LED_TYZDJL, LED_OFF);
  1003. strcpy(m_Zdjl_chr,"投入");
  1004. }
  1005. else
  1006. {
  1007. led_set_sw(i,SW_LED_ZDJL, LED_OFF);
  1008. led_set_sw(i,SW_LED_TYZDJL, LED_ON);
  1009. strcpy(m_Zdjl_chr,"退出");
  1010. }
  1011. if(!FUN_ALL_EN(i))//停用保护功能总
  1012. {
  1013. led_set_sw(i,SW_LED_TYBHTT, LED_ON);
  1014. strcpy(m_StopFun_chr,"停用所有功能");
  1015. }
  1016. else
  1017. {
  1018. led_set_sw(i,SW_LED_TYBHTT, LED_OFF);
  1019. strcpy(m_StopFun_chr,"退出停用功能");
  1020. }
  1021. if(pRunSet->bTT_EDIT_YB)
  1022. {
  1023. strcpy(m_Yftr_chr,"投入");
  1024. }
  1025. else
  1026. {
  1027. strcpy(m_Yftr_chr,"退出");
  1028. }
  1029. #endif
  1030. #ifdef FUNC_DRIVE
  1031. if(pRunSet->bTT_DRIVE)
  1032. {
  1033. led_set_sw(i,SW_LED_DRIVE, LED_ON);
  1034. }
  1035. else
  1036. {
  1037. led_set_sw(i,SW_LED_DRIVE, LED_OFF);
  1038. }
  1039. #endif
  1040. }
  1041. }
  1042. void led_polling_app(void)
  1043. {
  1044. static uint32_t us0=0;
  1045. uint32_t us;
  1046. // 平时1秒处理一次,AUX板测试时0.5S一次
  1047. us =(g_led_aux_test_st ||g_led_kz_test_st)? (USTIMER_SEC/4) : USTIMER_SEC;
  1048. if(ustimer_delay_origin2(&us0,us) != 1)
  1049. {
  1050. return;
  1051. }
  1052. // 更新灯状态
  1053. _led_update_status();
  1054. #ifdef STORE_PILOTELAMP
  1055. _led_status_save();
  1056. #endif
  1057. #if defined(BSP_DTU3) || defined(BSP_DTU2) || defined(BSP_DTU5)
  1058. // 输出灯状态到can接口的子板(人机板、状态板在各自通讯接口的处理)
  1059. led_to_sub_board();
  1060. #endif
  1061. // 更新网口状态到拓展板指示灯
  1062. led_eth_to_light_board();
  1063. }
  1064. /******************************************************************************
  1065. 函数名称: led_set_sw
  1066. 函数版本: 01.01
  1067. 创建作者: xxxxxx
  1068. 创建日期: 2014-12-16
  1069. 函数说明: 设置开出类LED灯的状态
  1070. 参数说明: led: 灯的序号 LED_RUN,...,KC_LED_NUM
  1071. status: 灯的状态 LED_ON, LED_SLOW, LED_QUICK, LED_OFF
  1072. 返回值: 无
  1073. 修改记录:
  1074. */
  1075. void led_set_pub(u8 no, u8 st)
  1076. {
  1077. g_led_stu[0][no] = st;
  1078. }
  1079. void led_set_sw(u8 sw,u8 no, u8 st)
  1080. {
  1081. g_led_stu[sw+1][no] = st;
  1082. }
  1083. /******************************************************************************
  1084. 函数名称: led_to_hmi
  1085. 函数版本: 01.01
  1086. 创建作者: xxxxxx
  1087. 创建日期: 2014-12-16
  1088. 函数说明: 获取面板LED灯的状态
  1089. 参数说明:
  1090. 返回值: 无
  1091. 修改记录:
  1092. */
  1093. int led_to_hmi(void)
  1094. {
  1095. int i;
  1096. u8 led_tmp=0, stu=0;
  1097. u32 dw[2];
  1098. int ret=0;
  1099. u32 *pdw;
  1100. // 如果没有HMI配置,不执行
  1101. if(g_led_hmi == 0)
  1102. {
  1103. return ret;
  1104. }
  1105. dw[0] = 0;
  1106. dw[1] = 0;
  1107. pdw=&dw[0];
  1108. for (i=0; i<g_led_hmi->num; i++)
  1109. {
  1110. // 未配置灯继续循环
  1111. if (g_led_hmi->sn[i].no == LED_NULL)
  1112. {
  1113. continue;
  1114. }
  1115. // 取出灯状态
  1116. stu = g_led_stu[g_led_hmi->sn[i].sw][g_led_hmi->sn[i].no];
  1117. // 取出灯对应位置
  1118. if(i<16)
  1119. {
  1120. led_tmp = i;
  1121. pdw=&dw[0];
  1122. }
  1123. else
  1124. {
  1125. led_tmp = i-16;
  1126. pdw=&dw[1];
  1127. }
  1128. led_tmp *= 2;
  1129. // 按位置将灯状态置入dwled
  1130. switch(stu)
  1131. {
  1132. case LED_ON:
  1133. *pdw |= (0x3<<led_tmp);
  1134. break;
  1135. case LED_SLOW:
  1136. *pdw |= (0x2<<led_tmp);
  1137. break;
  1138. case LED_QUICK:
  1139. *pdw |= (0x1<<led_tmp);
  1140. break;
  1141. case LED_OFF:
  1142. *pdw |= (0x0<<led_tmp);
  1143. break;
  1144. }
  1145. }
  1146. // 更新面板全局LED状态
  1147. g_dw_led[0] = dw[0];
  1148. g_dw_led[1] = dw[1];
  1149. return ret;
  1150. }
  1151. /*------------------------------ 内部函数 -------------------------------------
  1152. 内部函数以下划线‘_’开头,不需要检查参数的合法性.
  1153. */
  1154. /*------------------------------ 测试函数 -------------------------------------
  1155. 一个实体文件必须带一个本模块的测试函数来进行单元测试,如果的确不方便在本模块中
  1156. 进行单元测试,必须在此注明实际的测试位置(例如在哪个实体文件中使用哪个测试函数).
  1157. */
  1158. int led_info_printf(void)
  1159. {
  1160. int slot,i;
  1161. const char *name;
  1162. struct equ_config_do *cdo;
  1163. cdo = g_equ_config_do;
  1164. rt_printf("\r\nslot\tindex\towner\tno\tvalue\tname\r\n");
  1165. for(slot=0; slot<EQU_SLOT_NUM_MAX; slot++)
  1166. {
  1167. rt_printf("slot%02d:num=%d.\r\n",slot,g_led_slot[slot].num);
  1168. for(i=0; i<g_led_slot[slot].num; i++)
  1169. {
  1170. if(g_led_slot[slot].sn[i].no == LED_NULL)
  1171. {
  1172. continue;
  1173. }
  1174. if(g_led_slot[slot].sn[i].sw == 0)
  1175. {
  1176. name = g_pub_led_name[g_led_slot[slot].sn[i].no];
  1177. }
  1178. else
  1179. {
  1180. name = g_sw_led_name[g_led_slot[slot].sn[i].no];
  1181. }
  1182. rt_printf("%02d\t%02d\t%02d\t%d\t%d\t%s\r\n",
  1183. slot,\
  1184. i,\
  1185. g_led_slot[slot].sn[i].sw,
  1186. g_led_slot[slot].sn[i].no,
  1187. g_led_stu[g_led_slot[slot].sn[i].sw][g_led_slot[slot].sn[i].no],
  1188. name);
  1189. }
  1190. }
  1191. return 0;
  1192. }
  1193. #define LED_FILE_VERSION 0X01010101 //文件版本
  1194. struct file * pf_ledsave=NULL;
  1195. static int _led_savefile(void)
  1196. {
  1197. unsigned int addr,file_length;
  1198. u16 crc;
  1199. char *p;
  1200. loff_t pos;
  1201. struct file * pfile;
  1202. struct cfg_file_head fileled_file;
  1203. // 写文件头
  1204. memset(&fileled_file,0,sizeof(fileled_file));
  1205. fileled_file.signature = SIG_LED_SAVE_FILE;
  1206. fileled_file.version = LED_FILE_VERSION;
  1207. addr = FILE_ADDR_ALGIN(sizeof(fileled_file));
  1208. // 得到文件长度
  1209. file_length = addr + sizeof(g_led_save);
  1210. file_length = FILE_ADDR_ALGIN(file_length);
  1211. // 分配并初始化空间
  1212. p = rt_malloc(file_length + 2);
  1213. if(!p)
  1214. {
  1215. return -1;
  1216. }
  1217. memset(p, 0, file_length + 2);
  1218. // 写入文件头
  1219. memcpy(p, (char *)&fileled_file, sizeof(fileled_file));
  1220. // 写文件列表
  1221. memcpy(p+addr, g_led_save,sizeof(g_led_save));
  1222. // 计算CRC
  1223. crc = CrcStr(p, file_length);
  1224. memcpy(p+file_length, &crc, 2);
  1225. // 创建数据文件
  1226. if(pf_ledsave==NULL)
  1227. {
  1228. pfile = rt_file_open("/app/data/file_led.bin",O_CREAT|O_RDWR,0);
  1229. if(IS_ERR(pfile))
  1230. {
  1231. rt_free(p);
  1232. rt_printf("\r\n create led save file fail");
  1233. return -2;
  1234. }
  1235. pf_ledsave=pfile;
  1236. }
  1237. pos = 0;
  1238. rt_file_write(pf_ledsave, p, file_length+2, &pos);
  1239. rt_free(p);
  1240. return 0;
  1241. }
  1242. int _led_readfile(void)
  1243. {
  1244. u32 len;
  1245. u16 crc;
  1246. u8 *buf;
  1247. loff_t pos;
  1248. struct file * pfile;
  1249. struct cfg_file_head *brh;
  1250. // 创建并打开文件
  1251. pfile = rt_file_open("/app/data/file_led.bin",O_RDONLY,0);
  1252. if(IS_ERR(pfile))
  1253. {
  1254. return -1;
  1255. }
  1256. // 得到文件长度
  1257. len = rt_file_getfile_size(pfile);
  1258. if(len <= 0)
  1259. {
  1260. rt_file_close(pfile,0);
  1261. return -11;
  1262. }
  1263. // 分配内存
  1264. buf = rt_malloc(len);
  1265. if((buf) == NULL)
  1266. {
  1267. rt_file_close(pfile,0);
  1268. return -2;
  1269. }
  1270. // 读出内容
  1271. pos = 0;
  1272. if(rt_file_read(pfile,buf,len,&pos) != len)
  1273. {
  1274. rt_file_close(pfile,0);
  1275. rt_free(buf);
  1276. return -3;
  1277. }
  1278. // 关闭文件
  1279. rt_file_close(pfile,0);
  1280. // 检查CRC
  1281. crc = CrcStr(buf,len-2);
  1282. if(crc != *(u16*)(buf+len-2))
  1283. {
  1284. rt_free(buf);
  1285. return -4;
  1286. }
  1287. // 检查文件签名
  1288. brh = (struct cfg_file_head*)buf;
  1289. if(brh->signature != SIG_LED_SAVE_FILE)
  1290. {
  1291. rt_free(buf);
  1292. return -5;
  1293. }
  1294. // 校验一下文件长度,防止灯配置变化,文件读取正确,导致的灯状态异常
  1295. {
  1296. int filelenth;
  1297. filelenth = FILE_ADDR_ALGIN(sizeof(struct cfg_file_head))+sizeof(g_led_save);
  1298. filelenth = FILE_ADDR_ALGIN(filelenth)+2;
  1299. if(filelenth!=len)
  1300. {
  1301. rt_free(buf);
  1302. return -6;
  1303. }
  1304. }
  1305. memcpy(g_led_stu,buf+FILE_ADDR_ALGIN(sizeof(struct cfg_file_head)),sizeof(g_led_stu));
  1306. //根据保存的灯状态,预置动作标志
  1307. {
  1308. int sw,led;
  1309. for(sw=0;sw<SWITCH_NUM_MAX+1;sw++)
  1310. {
  1311. if(sw==0)
  1312. {
  1313. if(g_led_stu[sw][PUB_LED_DZ]==LED_ON)
  1314. {
  1315. g_run_stu.pubdz=1;
  1316. }
  1317. else if(g_led_stu[sw][PUB_LED_DZ]==LED_QUICK)
  1318. {
  1319. g_run_stu.pubdz=2;
  1320. }
  1321. }
  1322. else
  1323. {
  1324. RUN_STU_SW *prun=&g_tRelay[sw-1].run_stu;
  1325. u8 *pstatus;
  1326. u8 val=0;
  1327. for(led=0;led<SW_LED_NUM;led++)
  1328. {
  1329. pstatus=NULL;
  1330. val=0;
  1331. if(led==SW_LED_GL)pstatus=&prun->gl;
  1332. if(led==SW_LED_JD)pstatus=&prun->jd;
  1333. if(led==SW_LED_CHZ)pstatus=&prun->chzdz;
  1334. if(led==SW_LED_DZ)pstatus=&prun->dz;
  1335. if(g_led_stu[sw][led]==LED_ON)
  1336. {
  1337. val=1;
  1338. }
  1339. else if(g_led_stu[sw][led]==LED_QUICK)
  1340. {
  1341. val=2;
  1342. }
  1343. if(pstatus!=NULL) *pstatus=val;
  1344. }
  1345. }
  1346. }
  1347. }
  1348. _led_update_status();
  1349. memcpy(g_led_save,g_led_stu,sizeof(g_led_stu));
  1350. rt_free(buf);
  1351. return 0;
  1352. }
  1353. int _led_status_save(void)
  1354. {
  1355. int sw,led;
  1356. static uint32_t led_save_us0;
  1357. if(led_save_flag==0)
  1358. {
  1359. for(sw=0;sw<SWITCH_NUM_MAX+1;sw++)
  1360. {
  1361. if(sw==0)
  1362. {
  1363. for(led=0;led<PUB_LED_NUM;led++)
  1364. {
  1365. if(led==PUB_LED_DZ)
  1366. {
  1367. if(g_led_stu[sw][led]!=g_led_save[sw][led])
  1368. {
  1369. led_save_flag=1;
  1370. led_save_us0 = ustimer_get_origin();
  1371. break;
  1372. }
  1373. }
  1374. }
  1375. }
  1376. else
  1377. {
  1378. for(led=0;led<SW_LED_NUM;led++)
  1379. {
  1380. if(led==SW_LED_GL||led==SW_LED_JD||led==SW_LED_CHZ||led==SW_LED_DZ)
  1381. {
  1382. if(g_led_stu[sw][led]!=g_led_save[sw][led])
  1383. {
  1384. led_save_flag=1;
  1385. led_save_us0 = ustimer_get_origin();
  1386. break;
  1387. }
  1388. }
  1389. }
  1390. }
  1391. }
  1392. }
  1393. if(led_save_flag)
  1394. {
  1395. if(ustimer_get_duration(led_save_us0) > USTIMER_SEC*5) // led灯变化10秒后保存灯状态
  1396. {
  1397. memcpy(g_led_save,g_led_stu,sizeof(g_led_stu));
  1398. rt_printf("\r\n led save len=%d",sizeof(g_led_stu));
  1399. _led_savefile();
  1400. led_save_flag=0;
  1401. }
  1402. }
  1403. return 0;
  1404. }
  1405. int led_exit(void)
  1406. {
  1407. if(pf_ledsave != 0)
  1408. {
  1409. rt_file_close(pf_ledsave,0);
  1410. }
  1411. return 0;
  1412. }
  1413. /*------------------------------ 文件结束 -------------------------------------
  1414. */