bikelight.c 13 KB

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