bikelight.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517
  1. /**
  2. * @file Bikelight.c
  3. * @author
  4. * @brief light of ebike
  5. * @version 0.1
  6. * @date 2023-06-20
  7. *
  8. * @copyright Copyright (c) 2021
  9. *
  10. */
  11. #define BIKELIGHT_
  12. /************************************************************************
  13. Beginning of File, do not put anything above here except notes
  14. Compiler Directives:
  15. *************************************************************************/
  16. #include "syspar.h"
  17. #include "typedefine.h"
  18. #include "bikelight.h"
  19. #include "power.h"
  20. #include "CodePara.h"
  21. #include "adc.h"
  22. #include "giant_can.h"
  23. //----------------------------
  24. static BIKELED_STR BikeLedPara;
  25. static BIKELEDCHECK_STR BikeLedCheckF;//前灯参数
  26. static BIKELEDCHECK_STR BikeLedCheckB;//尾灯参数
  27. /***************************************************************
  28. Function: bikelight_voGetBikeLightError;
  29. Description: 前后灯电压检测
  30. Call by: 1ms
  31. Input Variables:LightPowerVolPu-LED灯的电压值,Ledsta-灯的开关状态,p-内部参数
  32. Output/Return Variables: N/A
  33. Subroutine Call: N/A;
  34. Reference: N/A
  35. ****************************************************************/
  36. void bikelight_voGetBikeLightError(UWORD LightPowerVolPu,BOOL Ledsta,BIKELEDCHECK_STR *p)
  37. {
  38. //前灯电路检测,开灯故障
  39. if(Ledsta==TRUE)
  40. {
  41. if((LightPowerVolPu < p->LedOnVoltMin) || (LightPowerVolPu > p->LedOnVoltMax))
  42. {
  43. p->blBike_LedOnErrCnt++;
  44. if(p->blBike_LedOnErrCnt > LEDRISETIME)
  45. {
  46. if(p->blBike_LedOnErrAddNO < LEDERRTIME)
  47. {
  48. p->blBike_LedOnErrAddNO++;
  49. }
  50. else
  51. {
  52. p->blBike_LedOnErr = TRUE;
  53. }
  54. p->blBike_LedOnErrCnt = 0;
  55. }
  56. }
  57. else
  58. {
  59. p->blBike_LedOnErrDCnt++;
  60. if(p->blBike_LedOnErrDCnt > LEDRISETIME)
  61. {
  62. if(p->blBike_LedOnErrAddNO > 0)
  63. {
  64. p->blBike_LedOnErrAddNO--;
  65. }
  66. else
  67. {
  68. p->blBike_LedOnErr = FALSE;
  69. }
  70. p->blBike_LedOnErrDCnt = 0;
  71. }
  72. }
  73. p->blBike_LedOffErrCnt = 0;
  74. p->blBike_LedOffErrDCnt = 0;
  75. }
  76. else//----------关灯故障-----------
  77. {
  78. if(LightPowerVolPu > p->LedOffVoltMax)
  79. {
  80. p->blBike_LedOffErrCnt++;
  81. if(p->blBike_LedOffErrCnt > LEDFALLTIME)
  82. {
  83. if(p->blBike_LedOffErrAddNO < LEDERRTIME)
  84. {
  85. p->blBike_LedOffErrAddNO++;
  86. }
  87. else
  88. {
  89. p->blBike_LedOffErr = TRUE;
  90. }
  91. p->blBike_LedOffErrCnt = 0;
  92. }
  93. }
  94. else
  95. {
  96. p->blBike_LedOffErrDCnt++;
  97. if(p->blBike_LedOffErrDCnt > LEDFALLTIME)
  98. {
  99. if(p->blBike_LedOffErrAddNO > 0)
  100. {
  101. p->blBike_LedOffErrAddNO--;
  102. }
  103. else
  104. {
  105. p->blBike_LedOffErr = FALSE;
  106. }
  107. p->blBike_LedOffErrDCnt = 0;
  108. }
  109. }
  110. }
  111. p->blBike_LedOnErrCnt = 0;
  112. p->blBike_LedOnErrDCnt = 0;
  113. }
  114. /***************************************************************
  115. Function: bikelight_voBikeLightInit;
  116. Description: bike light control initialization
  117. Call by: FSM_voInit
  118. Input Variables: N/A
  119. Output/Return Variables: N/A
  120. Subroutine Call: N/A;
  121. Reference: N/A
  122. ****************************************************************/
  123. void bikelight_voBikeLightInit(void)
  124. {
  125. BikeLedCheckF.blBike_LedOffErr=FALSE;
  126. BikeLedCheckF.blBike_LedOffErrAddNO=0;
  127. BikeLedCheckF.blBike_LedOffErrCnt=0;
  128. BikeLedCheckF.blBike_LedOffErrDCnt=0;
  129. BikeLedCheckF.blBike_LedOnErr=FALSE;
  130. BikeLedCheckF.blBike_LedOnErrAddNO=0;
  131. BikeLedCheckF.blBike_LedOnErrCnt=0;
  132. BikeLedCheckF.blBike_LedOnErrDCnt=0;
  133. BikeLedCheckF.LedOffVoltMax= ((ULONG)LIGHT_OFFERR_VOLTAGE << 15) / VBASE; //
  134. BikeLedCheckB.blBike_LedOffErr=FALSE;
  135. BikeLedCheckB.blBike_LedOffErrAddNO=0;
  136. BikeLedCheckB.blBike_LedOffErrCnt=0;
  137. BikeLedCheckB.blBike_LedOffErrDCnt=0;
  138. BikeLedCheckB.blBike_LedOnErr=FALSE;
  139. BikeLedCheckB.blBike_LedOnErrAddNO=0;
  140. BikeLedCheckB.blBike_LedOnErrCnt=0;
  141. BikeLedCheckB.blBike_LedOnErrDCnt=0;
  142. BikeLedCheckB.LedOffVoltMax= ((ULONG)LIGHT_OFFERR_VOLTAGE << 15) / VBASE;
  143. }
  144. /***************************************************************
  145. Function: bikelight_voBikeLightCoef;
  146. Description: 滤波时间/阈值电压设定参数更新
  147. Call by: 初始化,接收数据更新
  148. Input Variables: N/A
  149. Output/Return Variables: N/A
  150. Subroutine Call: N/A;
  151. Reference: N/A
  152. ****************************************************************/
  153. void bikelight_voBikeLightCoef(UWORD uwLightPara)
  154. {
  155. UBYTE ubBackLedVolt;
  156. UBYTE ubForwardLedVolt;
  157. ubBackLedVolt = (UBYTE)((uwLightPara & 0x0F00) >> 8);
  158. ubForwardLedVolt = (UBYTE)((uwLightPara & 0x00FF));
  159. //后灯
  160. if( ubBackLedVolt == 12)
  161. {
  162. BikeLedCheckB.LedOnVoltMin = ((ULONG)LIGHT_ERR_VOLTAGE_MIN << 15) / VBASE;
  163. BikeLedCheckB.LedOnVoltMax = ((ULONG)LIGHT_ERR_VOLTAGE_MAX << 15) / VBASE;
  164. IO_BACKLED_12V_ENABLE();//12V使能
  165. }
  166. else
  167. {
  168. BikeLedCheckB.LedOnVoltMin = ((ULONG)LIGHT_ERR_VOLTAGE_MIN << 14) / VBASE;
  169. BikeLedCheckB.LedOnVoltMax = ((ULONG)LIGHT_ERR_VOLTAGE_MAX << 14) / VBASE;
  170. IO_BACKLED_12V_DISABLE();//6V输出使能
  171. }
  172. //前灯
  173. if( ubForwardLedVolt == 12)
  174. {
  175. BikeLedCheckF.LedOnVoltMin = ((ULONG)LIGHT_ERR_VOLTAGE_MIN << 15) / VBASE;
  176. BikeLedCheckF.LedOnVoltMax = ((ULONG)LIGHT_ERR_VOLTAGE_MAX << 15) / VBASE;
  177. IO_FORWARDLED_12V_ENABLE();//12V使能
  178. }
  179. else
  180. {
  181. BikeLedCheckF.LedOnVoltMin = ((ULONG)LIGHT_ERR_VOLTAGE_MIN << 14) / VBASE;
  182. BikeLedCheckF.LedOnVoltMax = ((ULONG)LIGHT_ERR_VOLTAGE_MAX << 14) / VBASE;
  183. IO_FORWARDLED_12V_DISABLE();//6V输出使能
  184. }
  185. }
  186. /***************************************************************
  187. Function: bikelight_voBikeLightInit;
  188. Description: bike light control initialization
  189. Call by: 10ms
  190. Input Variables: switchAction-开灯情况,Brate_Sta-刹车状态,BackLedMode-尾灯模式
  191. Output/Return Variables: N/A
  192. Subroutine Call: N/A;
  193. Reference: N/A
  194. ****************************************************************/
  195. void bikelight_voBikeLightControl(UWORD switchAction, BOOL Brate_Sta,UWORD uwLightPara,UWORD uwCycle,UWORD uwDuty) /* parasoft-suppress METRICS-28 "本项目圈复杂度无法更改,后续避免" */
  196. {
  197. UBYTE ubBackLedMode;
  198. UWORD uwBikeLedCycle;
  199. UWORD uwBikeLedDuty;
  200. ubBackLedMode = (UBYTE)((uwLightPara & 0xF000) >> 12);
  201. uwBikeLedCycle = uwCycle;
  202. uwBikeLedDuty = uwDuty;
  203. if(uwDuty>uwCycle)
  204. {
  205. uwBikeLedDuty = uwCycle>>1;
  206. }
  207. //if( power_stPowStateOut.powerstate != POWER_ON) //关机状态
  208. if( power_stPowStateOut.blPowerStartupFlg ==FALSE)
  209. {
  210. IO_FORWARDLED_OFF();
  211. IO_BACKLED_OFF();
  212. BikeLedGloFun.blBike_BackLedSta=FALSE;
  213. BikeLedGloFun.blBike_ForwardLedSta=FALSE;
  214. BikeLedPara.ubBike_keyLedSta=0;
  215. BikeLedPara.uwLedAddcnt=0;
  216. }
  217. else
  218. {
  219. #if(GIANT_ENABLE != 1)
  220. // ---------------尾灯6个状态处理------------
  221. switch( ubBackLedMode)
  222. {
  223. case one_byte: //模式1
  224. {
  225. if(Brate_Sta==TRUE) //刹车
  226. {
  227. // IO_BACKLED_ON();
  228. BikeLedGloFun.blBike_BackLedSta=TRUE;
  229. }
  230. else
  231. {
  232. if(switchAction==1)
  233. {
  234. BikeLedPara.uwLedAddcnt++;
  235. if(BikeLedPara.uwLedAddcnt > uwBikeLedCycle)
  236. {
  237. BikeLedPara.uwLedAddcnt=0;
  238. }
  239. if(BikeLedPara.uwLedAddcnt < uwBikeLedDuty)
  240. {
  241. // IO_BACKLED_ON();
  242. BikeLedGloFun.blBike_BackLedSta=TRUE;
  243. }
  244. else
  245. {
  246. // IO_BACKLED_OFF();
  247. BikeLedGloFun.blBike_BackLedSta=FALSE;
  248. }
  249. }
  250. else
  251. {
  252. // IO_BACKLED_OFF();
  253. BikeLedGloFun.blBike_BackLedSta=FALSE;
  254. BikeLedPara.uwLedAddcnt=0;
  255. }
  256. }
  257. break;
  258. }
  259. case two_byte:
  260. {
  261. if(Brate_Sta==TRUE) //刹车
  262. {
  263. // IO_BACKLED_ON();
  264. BikeLedPara.uwLedAddcnt++;
  265. if(BikeLedPara.uwLedAddcnt > BikeLedFlickerCycle)
  266. {
  267. BikeLedPara.uwLedAddcnt=0;
  268. }
  269. if(BikeLedPara.uwLedAddcnt<BikeLedFlickerDuty)
  270. {
  271. // IO_BACKLED_ON();
  272. BikeLedGloFun.blBike_BackLedSta=TRUE;
  273. }
  274. else
  275. {
  276. // IO_BACKLED_OFF();
  277. BikeLedGloFun.blBike_BackLedSta=FALSE;
  278. }
  279. }
  280. else
  281. {
  282. if(switchAction==1)
  283. {
  284. BikeLedGloFun.blBike_BackLedSta=TRUE;
  285. }
  286. else
  287. {
  288. // IO_BACKLED_OFF();
  289. BikeLedGloFun.blBike_BackLedSta=FALSE;
  290. }
  291. BikeLedPara.uwLedAddcnt=0;
  292. }
  293. break;
  294. }
  295. case Three_byte:
  296. {
  297. if(Brate_Sta==TRUE) //刹车
  298. {
  299. // IO_BACKLED_ON();
  300. BikeLedGloFun.blBike_BackLedSta=TRUE;
  301. }
  302. else
  303. {
  304. // IO_BACKLED_OFF();
  305. BikeLedGloFun.blBike_BackLedSta=FALSE;
  306. }
  307. break;
  308. }
  309. case four_byte:
  310. {
  311. if(Brate_Sta==TRUE) //刹车
  312. {
  313. // IO_BACKLED_ON();
  314. BikeLedPara.uwLedAddcnt++;
  315. if(BikeLedPara.uwLedAddcnt > BikeLedFlickerCycle)
  316. {
  317. BikeLedPara.uwLedAddcnt=0;
  318. }
  319. if(BikeLedPara.uwLedAddcnt<BikeLedFlickerDuty)
  320. {
  321. // IO_BACKLED_ON();
  322. BikeLedGloFun.blBike_BackLedSta=TRUE;
  323. }
  324. else
  325. {
  326. // IO_BACKLED_OFF();
  327. BikeLedGloFun.blBike_BackLedSta=FALSE;
  328. }
  329. }
  330. else
  331. {
  332. // IO_BACKLED_OFF();
  333. BikeLedGloFun.blBike_BackLedSta=FALSE;
  334. BikeLedPara.uwLedAddcnt=0;
  335. }
  336. break;
  337. }
  338. case five_byte:
  339. {
  340. // IO_BACKLED_ON();
  341. BikeLedGloFun.blBike_BackLedSta=TRUE;
  342. break;
  343. }
  344. case six_byte:
  345. {
  346. if(cp_stBikeRunInfoPara.BikeSpeedKmH>=BikeLedOverSpeedMax)
  347. {
  348. BikeLedPara.uwLedAddcnt++;
  349. if(BikeLedPara.uwLedAddcnt > uwBikeLedCycle)
  350. {
  351. BikeLedPara.uwLedAddcnt=0;
  352. }
  353. if(BikeLedPara.uwLedAddcnt<uwBikeLedDuty)
  354. {
  355. // IO_BACKLED_ON();
  356. BikeLedGloFun.blBike_BackLedSta=TRUE;
  357. }
  358. else
  359. {
  360. // IO_BACKLED_OFF();
  361. BikeLedGloFun.blBike_BackLedSta=FALSE;
  362. }
  363. }
  364. else if(cp_stBikeRunInfoPara.BikeSpeedKmH<=BikeLedOverSpeedMin)
  365. {
  366. //IO_BACKLED_OFF();
  367. BikeLedGloFun.blBike_BackLedSta=FALSE;
  368. BikeLedPara.uwLedAddcnt=0;
  369. }
  370. else
  371. {
  372. //do nothing
  373. }
  374. break;
  375. }
  376. default:
  377. {
  378. if(switchAction==1)
  379. {
  380. //IO_BACKLED_ON();
  381. BikeLedGloFun.blBike_BackLedSta=TRUE;
  382. }
  383. else
  384. {
  385. // IO_BACKLED_OFF();
  386. BikeLedGloFun.blBike_BackLedSta=FALSE;
  387. }
  388. break;
  389. }
  390. }
  391. if( BikeLedGloFun.blBike_BackLedSta==TRUE) //尾灯控制
  392. {
  393. IO_BACKLED_ON();
  394. }
  395. else
  396. {
  397. IO_BACKLED_OFF();
  398. }
  399. // ---------------前灯处理------------
  400. if (switchAction == 1)
  401. {
  402. if(BikeLedPara.ubBike_keyLedSta==0)
  403. {
  404. IO_FORWARDLED_ON(); //开前灯
  405. BikeLedPara.ubBike_keyLedSta=1;
  406. BikeLedGloFun.blBike_ForwardLedSta=TRUE;
  407. }
  408. }
  409. if (switchAction == 0)
  410. {
  411. if(BikeLedPara.ubBike_keyLedSta!=0)
  412. {
  413. IO_FORWARDLED_OFF();//关前灯
  414. BikeLedPara.ubBike_keyLedSta=0;
  415. BikeLedGloFun.blBike_ForwardLedSta=FALSE;
  416. }
  417. }
  418. #else
  419. if (stGiantControlParams.FrontLight == 1)
  420. {
  421. if(BikeLedPara.ubBike_keyLedSta==0)
  422. {
  423. IO_FORWARDLED_ON(); //开前灯
  424. BikeLedPara.ubBike_keyLedSta=1;
  425. BikeLedGloFun.blBike_ForwardLedSta=TRUE;
  426. }
  427. }
  428. else if (stGiantControlParams.FrontLight == 0)
  429. {
  430. if(BikeLedPara.ubBike_keyLedSta!=0)
  431. {
  432. IO_FORWARDLED_OFF();//关前灯
  433. BikeLedPara.ubBike_keyLedSta=0;
  434. BikeLedGloFun.blBike_ForwardLedSta=FALSE;
  435. }
  436. }
  437. if (stGiantControlParams.RearLight == 1)
  438. {
  439. IO_BACKLED_ON();
  440. BikeLedGloFun.blBike_BackLedSta = TRUE;
  441. }
  442. else if (stGiantControlParams.RearLight == 0)
  443. {
  444. IO_BACKLED_OFF();
  445. BikeLedGloFun.blBike_BackLedSta = FALSE;
  446. }
  447. #endif
  448. //--------------LED电路检测----------
  449. bikelight_voGetBikeLightError(adc_stUpOut.uwFU6VPu,BikeLedGloFun.blBike_ForwardLedSta,&BikeLedCheckF); //前灯检测
  450. bikelight_voGetBikeLightError(adc_stUpOut.uwRU6VPu,BikeLedGloFun.blBike_BackLedSta,&BikeLedCheckB); //尾灯检测
  451. if((BikeLedCheckF.blBike_LedOffErr == TRUE) ||(BikeLedCheckF.blBike_LedOnErr==TRUE) )
  452. {
  453. BikeLedGloFun.blBike_ForwardLedDetErr=TRUE;
  454. }
  455. else
  456. {
  457. if(BikeLedGloFun.blBike_ForwardLedDetErr!=FALSE)
  458. {
  459. BikeLedGloFun.blBike_ForwardLedDetErr=FALSE;
  460. }
  461. }
  462. if((BikeLedCheckB.blBike_LedOffErr == TRUE) ||(BikeLedCheckB.blBike_LedOnErr==TRUE) )
  463. {
  464. BikeLedGloFun.blBike_BackLedDetErr=TRUE;
  465. }
  466. else
  467. {
  468. if(BikeLedGloFun.blBike_BackLedDetErr!=FALSE)
  469. {
  470. BikeLedGloFun.blBike_BackLedDetErr=FALSE;
  471. }
  472. }
  473. }
  474. }
  475. /*************************************************************************
  476. Local Functions (N/A)
  477. *************************************************************************/
  478. /*************************************************************************
  479. End of this File (EOF)!
  480. Do not put anything after this part!
  481. *************************************************************************/