/** * @file Bikelight.c * @author * @brief light of ebike * @version 0.1 * @date 2023-06-20 * * @copyright Copyright (c) 2021 * */ #define BIKELIGHT_ /************************************************************************ Beginning of File, do not put anything above here except notes Compiler Directives: *************************************************************************/ #include "syspar.h" #include "typedefine.h" #include "bikelight.h" #include "power.h" #include "CodePara.h" #include "adc.h" //---------------------------- static BIKELED_STR BikeLedPara; static BIKELEDCHECK_STR BikeLedCheckF;//前灯参数 static BIKELEDCHECK_STR BikeLedCheckB;//尾灯参数 /*************************************************************** Function: bikelight_voGetBikeLightError; Description: 前后灯电压检测 Call by: 1ms Input Variables:LightPowerVolPu-LED灯的电压值,Ledsta-灯的开关状态,p-内部参数 Output/Return Variables: N/A Subroutine Call: N/A; Reference: N/A ****************************************************************/ void bikelight_voGetBikeLightError(UWORD LightPowerVolPu,BOOL Ledsta,BIKELEDCHECK_STR *p) { //前灯电路检测,开灯故障 if(Ledsta==TRUE) { if( (LightPowerVolPu LedOnVoltMin ) || (LightPowerVolPu > p->LedOnVoltMax)) { p->blBike_LedOnErrCnt++; if(p->blBike_LedOnErrCnt>LEDRISETIME) { if(p->blBike_LedOnErrAddNO< LEDERRTIME) { p->blBike_LedOnErrAddNO++; } else { p->blBike_LedOnErr= TRUE; } p->blBike_LedOnErrCnt=0; } } else { p->blBike_LedOnErrDCnt++; if(p->blBike_LedOnErrDCnt >LEDRISETIME) { if(p->blBike_LedOnErrAddNO> 0) { p->blBike_LedOnErrAddNO--; } else { p->blBike_LedOnErr= FALSE; } p->blBike_LedOnErrDCnt=0; } } p->blBike_LedOffErrCnt=0; p->blBike_LedOffErrDCnt=0; } //----------关灯故障----------- else { if( LightPowerVolPu > p->LedOffVoltMax) { p->blBike_LedOffErrCnt++; if(p->blBike_LedOffErrCnt>LEDFALLTIME) { if(p->blBike_LedOffErrAddNO< LEDERRTIME) { p->blBike_LedOffErrAddNO++; } else { p->blBike_LedOffErr= TRUE; } p->blBike_LedOffErrCnt=0; } } else { p->blBike_LedOffErrDCnt++; if(p->blBike_LedOffErrDCnt >LEDFALLTIME) { if(p->blBike_LedOffErrAddNO> 0) { p->blBike_LedOffErrAddNO--; } else { p->blBike_LedOffErr= FALSE; } p->blBike_LedOffErrDCnt=0; } } } p->blBike_LedOnErrCnt=0; p->blBike_LedOnErrDCnt=0; } /*************************************************************** Function: bikelight_voBikeLightInit; Description: bike light control initialization Call by: FSM_voInit Input Variables: N/A Output/Return Variables: N/A Subroutine Call: N/A; Reference: N/A ****************************************************************/ void bikelight_voBikeLightInit(void) { BikeLedCheckF.blBike_LedOffErr=FALSE; BikeLedCheckF.blBike_LedOffErrAddNO=0; BikeLedCheckF.blBike_LedOffErrCnt=0; BikeLedCheckF.blBike_LedOffErrDCnt=0; BikeLedCheckF.blBike_LedOnErr=FALSE; BikeLedCheckF.blBike_LedOnErrAddNO=0; BikeLedCheckF.blBike_LedOnErrCnt=0; BikeLedCheckF.blBike_LedOnErrDCnt=0; BikeLedCheckF.LedOffVoltMax= ((ULONG)LIGHT_OFFERR_VOLTAGE << 15) / VBASE; // BikeLedCheckB.blBike_LedOffErr=FALSE; BikeLedCheckB.blBike_LedOffErrAddNO=0; BikeLedCheckB.blBike_LedOffErrCnt=0; BikeLedCheckB.blBike_LedOffErrDCnt=0; BikeLedCheckB.blBike_LedOnErr=FALSE; BikeLedCheckB.blBike_LedOnErrAddNO=0; BikeLedCheckB.blBike_LedOnErrCnt=0; BikeLedCheckB.blBike_LedOnErrDCnt=0; BikeLedCheckB.LedOffVoltMax= ((ULONG)LIGHT_OFFERR_VOLTAGE << 15) / VBASE; } /*************************************************************** Function: bikelight_voBikeLightCoef; Description: 滤波时间/阈值电压设定参数更新 Call by: 初始化,接收数据更新 Input Variables: N/A Output/Return Variables: N/A Subroutine Call: N/A; Reference: N/A ****************************************************************/ void bikelight_voBikeLightCoef(UWORD uwLightPara) { UBYTE ubBackLedVolt; UBYTE ubForwardLedVolt; ubBackLedVolt = (UBYTE)((uwLightPara & 0x0F00) >> 8); ubForwardLedVolt = (UBYTE)((uwLightPara & 0x00FF)); //后灯 if( ubBackLedVolt == 12) { BikeLedCheckB.LedOnVoltMin = ((ULONG)LIGHT_ERR_VOLTAGE_MIN << 15) / VBASE; BikeLedCheckB.LedOnVoltMax = ((ULONG)LIGHT_ERR_VOLTAGE_MAX << 15) / VBASE; IO_BACKLED_12V_ENABLE();//12V使能 } else { BikeLedCheckB.LedOnVoltMin = ((ULONG)LIGHT_ERR_VOLTAGE_MIN << 14) / VBASE; BikeLedCheckB.LedOnVoltMax = ((ULONG)LIGHT_ERR_VOLTAGE_MAX << 14) / VBASE; IO_BACKLED_12V_DISABLE();//6V输出使能 } //前灯 if( ubForwardLedVolt == 12) { BikeLedCheckF.LedOnVoltMin = ((ULONG)LIGHT_ERR_VOLTAGE_MIN << 15) / VBASE; BikeLedCheckF.LedOnVoltMax = ((ULONG)LIGHT_ERR_VOLTAGE_MAX << 15) / VBASE; IO_FORWARDLED_12V_ENABLE();//12V使能 } else { BikeLedCheckF.LedOnVoltMin = ((ULONG)LIGHT_ERR_VOLTAGE_MIN << 14) / VBASE; BikeLedCheckF.LedOnVoltMax = ((ULONG)LIGHT_ERR_VOLTAGE_MAX << 14) / VBASE; IO_FORWARDLED_12V_DISABLE();//6V输出使能 } } /*************************************************************** Function: bikelight_voBikeLightInit; Description: bike light control initialization Call by: 10ms Input Variables: switchAction-开灯情况,Brate_Sta-刹车状态,BackLedMode-尾灯模式 Output/Return Variables: N/A Subroutine Call: N/A; Reference: N/A ****************************************************************/ void bikelight_voBikeLightControl(UWORD switchAction, BOOL Brate_Sta,UWORD uwLightPara) /* parasoft-suppress METRICS-28 "本项目圈复杂度无法更改,后续避免" */ { UBYTE ubBackLedMode; ubBackLedMode = (UBYTE)((uwLightPara & 0xF000) >> 12); //if( power_stPowStateOut.powerstate != POWER_ON) //关机状态 if( power_stPowStateOut.blPowerStartupFlg ==FALSE) { IO_FORWARDLED_OFF(); IO_BACKLED_OFF(); BikeLedGloFun.blBike_BackLedSta=FALSE; BikeLedGloFun.blBike_ForwardLedSta=FALSE; BikeLedPara.ubBike_keyLedSta=0; BikeLedPara.uwLedAddcnt=0; } else { // ---------------尾灯6个状态处理------------ switch( ubBackLedMode) { case one_byte: //模式1 { if(Brate_Sta==TRUE) //刹车 { // IO_BACKLED_ON(); BikeLedGloFun.blBike_BackLedSta=TRUE; } else { if(switchAction==1) { BikeLedPara.uwLedAddcnt++; if(BikeLedPara.uwLedAddcnt > BikeLedAddCycle) { BikeLedPara.uwLedAddcnt=0; } if(BikeLedPara.uwLedAddcnt BikeLedFlickerCycle) { BikeLedPara.uwLedAddcnt=0; } if(BikeLedPara.uwLedAddcnt=BikeLedOverSpeedMax) { BikeLedPara.uwLedAddcnt++; if(BikeLedPara.uwLedAddcnt > BikeLedOverSpedCycle) { BikeLedPara.uwLedAddcnt=0; } if(BikeLedPara.uwLedAddcnt