/******************************************************************************** * * File name: FrntWiperCtrl.c * *********************************************************************************/ /********************************************************************************* * Includes *********************************************************************************/ // #include "Rte_App.h" // #include "PassiveStart.h" #include "FrntWiperCtrl.h" // #include "Eeprom_Ctl.h" /********************************************************************************* * Local Macros *********************************************************************************/ #define PAR_FW_WAIT_STALL_TIME Delay_Base5ms(t1s(18)) #define PAR_FW_WASHER_MAX_ACTIVATION Delay_Base5ms(t1s(12)) #define PAR_FW_WASH_WIPING_DELAY Delay_Base5ms(t1ms(280)) #define PAR_FW_WIPING_DELAY_TIME Delay_Base5ms(t1ms(600)) #define PAR_FW_PROLON_WIPE_CYCLE 3 #define PAR_FW_DRIP_WIPE_WAIT_TIME Delay_Base5ms(t1s(1)) #define PAR_FW_WASHER_SW_STUCK_TIME Delay_Base5ms(t1s(60)) #define PAR_FW_MAINTENANCE_MODE_ACTIVE_DELAY_TIMER Delay_Base5ms(t1s(20)) #define FWIPER_CTL_OFF 0x00 #define FWIPER_CTL_LOW 0x01 #define FWIPER_CTL_HIGH 0x02 #define FWIPER_CTL_INT 0x03 #define FWIPER_CTL_AUTO 0x04 #define FWIPER_CTL_MAINTAIN 0x05 /* Front Wiper State */ #define FWIPER_REQ_STS_OFF 0x01 #define FWIPER_REQ_STS_INT 0x02 #define FWIPER_REQ_STS_LOW 0x03 #define FWIPER_REQ_STS_HIGH 0x04 /* added macros */ #define PWRMODE_OFF 0x00 /* added dummy signal for MATLAB */ uint8_t Rte_Read_AppPs_PwrMod_Matlab; uint8_t Rte_Write_ComCan_FrntWiprParkStsSwt_Matlab; uint8_t Rte_Read_AppVfmm_RefrshModRestrntFctCmd_Matlab; uint8_t Rte_Read_ComCan_ICC_BCMWipeLevel_Matlab; uint8_t Rte_Write_ComCan_WipeLevelFB_Matlab; uint8_t Rte_Read_Input_FrontWiperParkSts_Matlab; uint8_t Rte_Read_ComCan_CIM_FWiperSwtFault_Matlab; uint8_t Rte_Read_ComCan_CIM_FWiperSwtReq_Matlab; uint8_t Rte_Read_ComCan_CIM_FWiperMistReq_Matlab; uint8_t Rte_Write_ComCan_FrnWiprOutpSts_Matlab; uint8_t Rte_Read_ComCan_VehSpdVld_Matlab; uint8_t Rte_Read_ComCan_VehSpd_Matlab; uint8_t Rte_Read_AppPm_VoltMode_Matlab; uint8_t Rte_Read_ComCan_ICC_WiprMntnModSwt_Matlab; uint8_t Rte_Read_ComCan_CIM_FWiperWashReq_Matlab; uint8_t Rte_Write_ComCan_FrntWiprMntnSts_Matlab; uint8_t Rte_Read_ComLin_RLS_SplashReq_Matlab; uint8_t Rte_Read_ComLin_RLS_WIPRSPDREQ_Matlab; uint8_t Rte_Write_ComCan_FrntWshrCmd_Matlab; uint8_t Rte_Read_Input_HoodAjarSts_Matlab; uint16_t debug_signal_Matlab = 0; //for debug uint8_t CFG_RAIN_LIGHT_SENSOR_ENABLED; uint8_t CFG_FRONT_WIPER_INT; uint8_t PAR_FW_MAINTENANCE_MODE_RUNNING_TIMER; /* wiper control */ uint8_t WP_Front_Wiper_Enable_CMD; uint8_t WP_Front_Wiper_Speed_CMD; uint8_t WP_Front_Washer_CMD; /* added dummy function TODO need to verify the function signature */ uint8_t Rte_Read_AppPs_PwrMod(void){ return Rte_Read_AppPs_PwrMod_Matlab; } void Rte_Write_ComCan_FrntWiprParkStsSwt(uint8_t status){ Rte_Write_ComCan_FrntWiprParkStsSwt_Matlab = status; } uint8_t Rte_Read_AppVfmm_RefrshModRestrntFctCmd(void){ return Rte_Read_AppVfmm_RefrshModRestrntFctCmd_Matlab; } uint8_t Rte_Read_ComCan_ICC_BCMWipeLevel(void){ return Rte_Read_ComCan_ICC_BCMWipeLevel_Matlab; } void Rte_Write_ComCan_WipeLevelFB(uint8_t fWipeLevel){ Rte_Write_ComCan_WipeLevelFB_Matlab = fWipeLevel; } uint8_t Rte_Read_Input_FrontWiperParkSts(void){ return Rte_Read_Input_FrontWiperParkSts_Matlab; } uint8_t Rte_Read_ComCan_CIM_FWiperSwtFault(void){ return Rte_Read_ComCan_CIM_FWiperSwtFault_Matlab; } uint8_t Rte_Read_ComCan_CIM_FWiperSwtReq(void){ return Rte_Read_ComCan_CIM_FWiperSwtReq_Matlab; } uint8_t Rte_Read_ComCan_CIM_FWiperMistReq(void){ return Rte_Read_ComCan_CIM_FWiperMistReq_Matlab; } void Rte_Write_ComCan_FrnWiprOutpSts(uint8_t wiper_status){ Rte_Write_ComCan_FrnWiprOutpSts_Matlab = wiper_status; } uint8_t Rte_Read_ComCan_VehSpdVld(void){ return Rte_Read_ComCan_VehSpdVld_Matlab; } uint8_t Rte_Read_ComCan_VehSpd(void){ return Rte_Read_ComCan_VehSpd_Matlab; } uint8_t Rte_Read_AppPm_VoltMode(void){ return Rte_Read_AppPm_VoltMode_Matlab; } uint8_t Rte_Read_ComCan_ICC_WiprMntnModSwt(void){ return Rte_Read_ComCan_ICC_WiprMntnModSwt_Matlab; } uint8_t Rte_Read_ComCan_CIM_FWiperWashReq(void){ return Rte_Read_ComCan_CIM_FWiperWashReq_Matlab; } void Rte_Write_ComCan_FrntWiprMntnSts(uint8_t status){ Rte_Write_ComCan_FrntWiprMntnSts_Matlab = status; } uint8_t Rte_Read_ComLin_RLS_SplashReq(void){ return Rte_Read_ComLin_RLS_SplashReq_Matlab; } uint8_t Rte_Read_ComLin_RLS_WIPRSPDREQ(void){ return Rte_Read_ComLin_RLS_WIPRSPDREQ_Matlab; } void Rte_Write_ComCan_FrntWshrCmd(uint8_t WshrCmd){ Rte_Write_ComCan_FrntWshrCmd_Matlab = WshrCmd; } uint8_t Rte_Read_Input_HoodAjarSts(void){ return Rte_Read_Input_HoodAjarSts_Matlab; } uint8_t Rte_Read_EepCfg_RAIN_LIGHT_SENSOR_ENABLED(void){ return CFG_RAIN_LIGHT_SENSOR_ENABLED; } uint8_t Rte_Read_EepCfg_FRONT_WIPER_INT(void){ return CFG_FRONT_WIPER_INT; } uint8_t Rte_Read_Did_FWipeMntnRuningTime(void){ return PAR_FW_MAINTENANCE_MODE_RUNNING_TIMER; } /* added function implementation with MATLAB */ void Rte_Write_Output_FrontWiperEnableOUT(uint8_t enable){ WP_Front_Wiper_Enable_CMD = enable; } void Rte_Write_Output_FrontWiperSpeedOUT(uint8_t speed){ WP_Front_Wiper_Speed_CMD = speed; } void Rte_Write_Output_FrontWasherOUT(uint8_t wash){ WP_Front_Washer_CMD = wash; } // TODO the value returned should be relating to the step time of solver of the matlab model // assuming it is 1ms uint16_t t1ms(uint16_t ms){ return ms; } uint16_t t1s(uint16_t s){ return s*1000; } // TODO it should be renamed for MATLAB case uint16_t Delay_Base5ms(uint16_t v){ return v; } /********************************************************************************* * Local Struct *********************************************************************************/ /********************************************************************************* * Global Variables *********************************************************************************/ /********************************************************************************* * Local Variables *********************************************************************************/ FWIPER_FLAG_UNION g_uFwiperFlg; uint8_t g_FwiperPwrMode; uint8_t g_FwiperDrvMode; uint8_t g_FwiperSwReqSts; uint8_t g_FwiperPosSts; uint8_t g_FwiperCtl; uint8_t g_FwiperSubStep; uint16_t g_FwiperIntDly; uint8_t g_FWipeLevel; uint8_t g_FwasherStep; uint8_t g_FrntWiperServiceSts; uint8_t g_FwiperChangeOffReqSts; /********************************************************************************* * Local Functions *********************************************************************************/ /********************************************************************************* * Description: * Para: NULL * Para1: NULL * Para2: NULL * Return: NULL *********************************************************************************/ void Fwiper_DrvSet(uint8_t Speed) { g_FwiperDrvMode = Speed; if (WIPER_SPEED_OFF == Speed) { Rte_Write_Output_FrontWiperEnableOUT(0x00); Rte_Write_Output_FrontWiperSpeedOUT(0x00); Rte_Write_ComCan_FrnWiprOutpSts(WIPER_SPEED_OFF); /* Update CAN Sig: Fwiper OFF */ } else if (WIPER_SPEED_LOW == Speed) { if (0x00 == g_uFwiperFlg.Bits.Blocked) /* Blocked , not allowed to control wiper */ { Rte_Write_Output_FrontWiperEnableOUT(0x01); Rte_Write_Output_FrontWiperSpeedOUT(0x00); Rte_Write_ComCan_FrnWiprOutpSts(WIPER_SPEED_LOW); /* Update CAN Sig: Fwiper Low */ } } else if (WIPER_SPEED_HIGH == Speed) { if (0x00 == g_uFwiperFlg.Bits.Blocked) /* Blocked , not allowed to control wiper */ { Rte_Write_Output_FrontWiperEnableOUT(0x01); Rte_Write_Output_FrontWiperSpeedOUT(0x01); Rte_Write_ComCan_FrnWiprOutpSts(WIPER_SPEED_HIGH); /* Update CAN Sig: Fwiper High */ } } } /********************************************************************************* * Description: * Para: NULL * Para1: NULL * Para2: NULL * Return: NULL *********************************************************************************/ static void Fwiper_ReqCtl(uint8_t Req) { if ((WIPER_SPEED_OFF != g_FwiperDrvMode) && (FWIPER_CTL_OFF == Req)) { g_FwiperChangeOffReqSts = 0x01; } else { g_FwiperChangeOffReqSts = 0x00; } g_FwiperCtl = Req; g_FwiperSubStep = 0x00; } /********************************************************************************* * Description: * Para: NULL * Para1: NULL * Para2: NULL * Return: NULL *********************************************************************************/ static void Parking_PosChk(void) { static uint16_t FwiperPosBackDly = 0x00; static uint16_t FwiperPosAwayDly = 0x00; static uint8_t FwiperAwayCnt = 0x00; static uint8_t FwiperBackCnt = 0x00; static uint8_t s_PrvPwrModeSts = 0x00; if (0x00 == Rte_Read_Input_FrontWiperParkSts()) /* Home Position */ { FwiperAwayCnt = 0x00; FwiperBackCnt++; if ((WIPER_POS_HOME != g_FwiperPosSts) && (Delay_Base5ms(t1ms(18)) <= FwiperBackCnt)) { g_FwiperPosSts = WIPER_POS_HOME; Rte_Write_ComCan_FrntWiprParkStsSwt(0x01); } } else { FwiperAwayCnt++; FwiperBackCnt = 0x00; if ((WIPER_POS_AWAY != g_FwiperPosSts) && (Delay_Base5ms(t1ms(18)) <= FwiperAwayCnt)) { g_FwiperPosSts = WIPER_POS_AWAY; Rte_Write_ComCan_FrntWiprParkStsSwt(0x02); } } if (0x00 == g_uFwiperFlg.Bits.Blocked) { if (WIPER_SPEED_OFF != g_FwiperDrvMode) { if (WIPER_POS_AWAY == g_FwiperPosSts) { FwiperPosBackDly = 0x00; FwiperPosAwayDly++; if (FwiperPosAwayDly >= PAR_FW_WAIT_STALL_TIME) { g_uFwiperFlg.Bits.Blocked = 0x01; Fwiper_DrvSet(WIPER_SPEED_OFF); FwiperPosBackDly = 0x00; FwiperPosAwayDly = 0x00; /*TODO ADD WIPER BLOCK DTC*/ } else { /*TODO CLEAR WIPER BLOCK DTC*/ } } else { FwiperPosAwayDly = 0x00; FwiperPosBackDly++; if (FwiperPosBackDly >= PAR_FW_WAIT_STALL_TIME) { g_uFwiperFlg.Bits.Blocked = 0x01; Fwiper_DrvSet(WIPER_SPEED_OFF); FwiperPosBackDly = 0x00; FwiperPosAwayDly = 0x00; /*TODO ADD WIPER BLOCK DTC*/ } else { /*TODO CLEAR WIPER BLOCK DTC*/ } } } else { FwiperPosBackDly = 0x00; FwiperPosAwayDly = 0x00; } } else { if ((s_PrvPwrModeSts != g_FwiperPwrMode) && (PWRMODE_ON == g_FwiperPwrMode)) { g_uFwiperFlg.Bits.Blocked = 0x00; g_FwiperSwReqSts = FWIPER_CTL_OFF; } } s_PrvPwrModeSts = g_FwiperPwrMode; } /********************************************************************************* * Description: * Para: NULL * Para1: NULL * Para2: NULL * Return: NULL *********************************************************************************/ static void FwiperSw_ReqChk(void) { uint8_t Tmpg_FwiperSwReqSts; if (0x00 == g_FrntWiperServiceSts) { if (0x01 == Rte_Read_ComCan_CIM_FWiperSwtFault()) { Tmpg_FwiperSwReqSts = FWIPER_REQ_STS_INT; } else { Tmpg_FwiperSwReqSts = Rte_Read_ComCan_CIM_FWiperSwtReq(); } if ((FWIPER_REQ_STS_HIGH != Tmpg_FwiperSwReqSts) && (0x02 == Rte_Read_ComCan_CIM_FWiperMistReq())) { Tmpg_FwiperSwReqSts = FWIPER_REQ_STS_LOW; } } else { Tmpg_FwiperSwReqSts = FWIPER_CTL_MAINTAIN; } if (g_FwiperSwReqSts == Tmpg_FwiperSwReqSts) { return; } if (PWRMODE_ON != g_FwiperPwrMode) { return; } g_FwiperSwReqSts = Tmpg_FwiperSwReqSts; switch (g_FwiperSwReqSts) { case FWIPER_REQ_STS_OFF: Fwiper_ReqCtl(FWIPER_CTL_OFF); break; case FWIPER_REQ_STS_LOW: g_uFwiperFlg.Bits.Washer = 0x00; Fwiper_ReqCtl(FWIPER_CTL_LOW); break; case FWIPER_REQ_STS_HIGH: g_uFwiperFlg.Bits.Washer = 0x00; Fwiper_ReqCtl(FWIPER_CTL_HIGH); break; case FWIPER_REQ_STS_INT: if (0x01 == Rte_Read_EepCfg_RAIN_LIGHT_SENSOR_ENABLED()) /*Auto*/ { Fwiper_ReqCtl(FWIPER_CTL_AUTO); } else { Fwiper_ReqCtl(FWIPER_CTL_INT); } break; } } /********************************************************************************* * Description: * Para: NULL * Para1: NULL * Para2: NULL * Return: NULL *********************************************************************************/ static void FwiperService_ReqChk(void) { static uint32_t s_FwiperMntnTime = 0x00; static uint8_t s_PrvPwrMode = 0x00; static uint8_t s_Prvg_FwiperSwReqSts = 0x00; uint32_t Tmpg_FwiperSwReqSts = 0; if (0x02 == Rte_Read_ComCan_CIM_FWiperMistReq()) { Tmpg_FwiperSwReqSts = FWIPER_REQ_STS_LOW; } else { Tmpg_FwiperSwReqSts = Rte_Read_ComCan_CIM_FWiperSwtReq(); } if (s_FwiperMntnTime) { s_FwiperMntnTime--; } if (0x00 == g_FrntWiperServiceSts) { if (s_PrvPwrMode != g_FwiperPwrMode) { if (PWRMODE_OFF == g_FwiperPwrMode) { s_FwiperMntnTime = PAR_FW_MAINTENANCE_MODE_ACTIVE_DELAY_TIMER; } else { s_FwiperMntnTime = 0x00; } } if ((0x01 == Rte_Read_ComCan_ICC_WiprMntnModSwt()) && (PWRMODE_ON == g_FwiperPwrMode) && (WIPER_SPEED_OFF == g_FwiperDrvMode) && (DOOR_AJAR_CLOSE == Rte_Read_Input_HoodAjarSts())) { s_FwiperMntnTime = 0x00; g_FrntWiperServiceSts = 0x01; Fwiper_ReqCtl(FWIPER_CTL_MAINTAIN); Rte_Write_ComCan_FrntWiprMntnSts(0x01); } else if ((0x02 == Rte_Read_ComCan_CIM_FWiperMistReq()) && (0x00 != s_FwiperMntnTime) && (WIPER_POS_HOME == g_FwiperPosSts) && (DOOR_AJAR_CLOSE == Rte_Read_Input_HoodAjarSts())) { s_FwiperMntnTime = 0x00; g_FrntWiperServiceSts = 0x02; Fwiper_ReqCtl(FWIPER_CTL_MAINTAIN); Rte_Write_ComCan_FrntWiprMntnSts(0x01); } } else { if (((0x02 == Rte_Read_ComCan_ICC_WiprMntnModSwt()) && (0x01 == g_FrntWiperServiceSts) && (PWRMODE_ON == g_FwiperPwrMode)) || ((0x02 == g_FrntWiperServiceSts) && (((s_PrvPwrMode != g_FwiperPwrMode) && (PWRMODE_OFF == g_FwiperPwrMode)) || (0x02 == Rte_Read_ComCan_CIM_FWiperWashReq()) || ((FWIPER_REQ_STS_OFF == s_Prvg_FwiperSwReqSts) && (FWIPER_REQ_STS_OFF != Tmpg_FwiperSwReqSts))))) { g_FrntWiperServiceSts = 0x00; Rte_Write_ComCan_FrntWiprMntnSts(0x02); } } s_PrvPwrMode = g_FwiperPwrMode; s_Prvg_FwiperSwReqSts = Tmpg_FwiperSwReqSts; } /********************************************************************************* * Description: * Para: NULL * Para1: NULL * Para2: NULL * Return: NULL *********************************************************************************/ static void FwiperWash_ReqChk(void) { static uint32_t FwasherDly; static uint8_t FwasherValid = 0x00; static uint8_t FwasherSwBlk = 0x00; uint8_t TmpWasherReqSts = 0x00; if ((PWRMODE_ON != g_FwiperPwrMode) || ((VOLT_MODE_NORMAL != Rte_Read_AppPm_VoltMode()) && (VOLT_MODE_HIGH != Rte_Read_AppPm_VoltMode()))) { if (0x01 == g_uFwiperFlg.Bits.WashSw) { g_uFwiperFlg.Bits.WashSw = 0x00; Rte_Write_Output_FrontWasherOUT(0x00); Rte_Write_ComCan_FrntWshrCmd(0x00); } return; } FwasherDly++; TmpWasherReqSts = Rte_Read_ComCan_CIM_FWiperWashReq(); if (0x00 == g_uFwiperFlg.Bits.WashSw) { if (0x02 == TmpWasherReqSts) { if (0x00 == FwasherSwBlk) { g_uFwiperFlg.Bits.WashSw = 0x01; FwasherDly = 0x00; FwasherValid = 0x00; Rte_Write_Output_FrontWasherOUT(0x01); Rte_Write_ComCan_FrntWshrCmd(0x01); /*TODO CLEAR WASH BLOCK DTC*/ } else { if (PAR_FW_WASHER_SW_STUCK_TIME <= FwasherDly) { /*TODO ADD WASH BLOCK DTC*/ } } } else { FwasherSwBlk = 0x00; } } else { if (0x02 == TmpWasherReqSts) { if ((0x00 == FwasherValid) && (PAR_FW_WASH_WIPING_DELAY == FwasherDly)) { FwasherValid = 0x01; } else if (PAR_FW_WASHER_MAX_ACTIVATION <= FwasherDly) { FwasherSwBlk = 0x01; g_uFwiperFlg.Bits.WashSw = 0x00; Rte_Write_Output_FrontWasherOUT(0x00); Rte_Write_ComCan_FrntWshrCmd(0x00); } } else { FwasherSwBlk = 0x00; g_uFwiperFlg.Bits.WashSw = 0x00; Rte_Write_Output_FrontWasherOUT(0x00); Rte_Write_ComCan_FrntWshrCmd(0x00); } } if ((0x01 == FwasherValid) && (PAR_FW_WIPING_DELAY_TIME <= FwasherDly) && (((FWIPER_CTL_AUTO == g_FwiperCtl) && (WIPER_SPEED_OFF == g_FwiperDrvMode)) || (FWIPER_CTL_INT == g_FwiperCtl) || (FWIPER_CTL_OFF == g_FwiperCtl))) { FwasherValid = 0x00; g_FwasherStep = WASHER_STEP_START; g_uFwiperFlg.Bits.Washer = 0x01; /* Enable Washer Operation */ g_uFwiperFlg.Bits.Blocked = 0x00; } } /********************************************************************************* * Description: * Para: NULL * Para1: NULL * Para2: NULL * Return: NULL *********************************************************************************/ static void FwiperWasher_OutputCtrl(void) { static uint16_t FwasherDly = 0x00; static uint8_t FwasherCnt = 0x00; if (0x00 == g_uFwiperFlg.Bits.Washer) { return; } if ((PWRMODE_ON != g_FwiperPwrMode) || ((VOLT_MODE_NORMAL != Rte_Read_AppPm_VoltMode()) && (VOLT_MODE_HIGH != Rte_Read_AppPm_VoltMode()))) { g_uFwiperFlg.Bits.WashSw = 0x00; g_uFwiperFlg.Bits.Washer = 0x00; Rte_Write_Output_FrontWasherOUT(0x00); Rte_Write_ComCan_FrntWshrCmd(0x00); g_FwiperSwReqSts = FWIPER_REQ_STS_OFF; Fwiper_ReqCtl(FWIPER_CTL_OFF); return; } switch (g_FwasherStep) { case WASHER_STEP_START: /* directly start Low Speed, no matter last state */ FwasherCnt = 0x00; Fwiper_DrvSet(WIPER_SPEED_LOW); if (0x00 == g_uFwiperFlg.Bits.WashSw) /* Washer Switch Released */ { g_FwasherStep = WASHER_STEP_EXTRA_AWAY; } else { g_FwasherStep = WASHER_STEP_CHK_AWAY; } break; case WASHER_STEP_CHK_AWAY: /* make sure WIPER away from STOP position */ if (WIPER_POS_HOME != g_FwiperPosSts) { g_FwasherStep = WASHER_STEP_CHK_BACK; } break; case WASHER_STEP_CHK_BACK: if (WIPER_POS_HOME == g_FwiperPosSts) { Fwiper_DrvSet(WIPER_SPEED_LOW); if (0x00 == g_uFwiperFlg.Bits.WashSw) /* Washer Switch Released */ { g_FwasherStep = WASHER_STEP_EXTRA_AWAY; } else { g_FwasherStep = WASHER_STEP_CHK_AWAY; } } break; case WASHER_STEP_EXTRA_AWAY: if (WIPER_POS_HOME != g_FwiperPosSts) { FwasherCnt++; g_FwasherStep = WASHER_STEP_EXTRA_BACK; } break; case WASHER_STEP_EXTRA_BACK: if (WIPER_POS_HOME == g_FwiperPosSts) { FwasherCnt++; if (FwasherCnt >= PAR_FW_PROLON_WIPE_CYCLE) /* WIPER execute 3 loop */ { Fwiper_DrvSet(WIPER_SPEED_OFF); FwasherDly = 0x00; g_FwasherStep = WASHER_STEP_WAIT_DLY; } else { Fwiper_DrvSet(WIPER_SPEED_LOW); g_FwasherStep = WASHER_STEP_EXTRA_AWAY; } } break; case WASHER_STEP_WAIT_DLY: FwasherDly++; if(FwasherDly >= PAR_FW_DRIP_WIPE_WAIT_TIME) { Fwiper_DrvSet(WIPER_SPEED_LOW); /* WIPER execute extra one loop */ g_FwasherStep = WASHER_STEP_LAST_AWAY; } break; case WASHER_STEP_LAST_AWAY: if(WIPER_POS_HOME != g_FwiperPosSts) { g_FwasherStep = WASHER_STEP_LAST_BACK; } break; case WASHER_STEP_LAST_BACK: if(WIPER_POS_HOME == g_FwiperPosSts) { Fwiper_DrvSet(WIPER_SPEED_OFF); g_FwasherStep = WASHER_STEP_LAST_WAIT; } break; case WASHER_STEP_LAST_WAIT: g_uFwiperFlg.Bits.Washer = 0x00; if (FWIPER_CTL_INT == g_FwiperCtl) { Fwiper_DrvSet(WIPER_SPEED_OFF); g_FwiperIntDly = 0x00; g_FwiperSubStep = INT_STEP_WAIT_DLY; } else if (FWIPER_CTL_AUTO == g_FwiperCtl) { Fwiper_DrvSet(WIPER_SPEED_OFF); g_FwiperSubStep = AUTO_STEP_AUTO_CHK; } break; default: g_FwasherStep = WASHER_STEP_START; break; } } /********************************************************************************* * Description: * Para: NULL * Para1: NULL * Para2: NULL * Return: NULL *********************************************************************************/ static void Fwiper_OffCtl(void) { if (g_uFwiperFlg.Bits.Washer) { return; } switch (g_FwiperSubStep) { case OFF_STEP_START: /* directly start Low Speed, no matter last state */ if (0xFF == g_FwiperPosSts) { break; } if(WIPER_POS_HOME != g_FwiperPosSts) { Fwiper_DrvSet(WIPER_SPEED_LOW); g_FwiperSubStep = OFF_STEP_CHK_BACK; } else { if (0x01 == g_FwiperChangeOffReqSts) { Fwiper_DrvSet(WIPER_SPEED_LOW); g_FwiperSubStep = OFF_STEP_WAIT_AWAY; } else { Fwiper_DrvSet(WIPER_SPEED_OFF); g_FwiperSubStep = OFF_STEP_IDLE; } } g_FwiperChangeOffReqSts = 0x00; break; case OFF_STEP_WAIT_AWAY: /* Wait currently LOOP end*/ if (WIPER_POS_HOME != g_FwiperPosSts) { g_FwiperSubStep = OFF_STEP_CHK_BACK; } break; case OFF_STEP_CHK_BACK: /* Wait currently LOOP end*/ if (WIPER_POS_HOME == g_FwiperPosSts) { g_FwiperSubStep = OFF_STEP_WAIT_MORE; } break; case OFF_STEP_WAIT_MORE: if (WIPER_POS_HOME == g_FwiperPosSts) { Fwiper_DrvSet(WIPER_SPEED_OFF); g_FwiperSubStep = OFF_STEP_IDLE; } else { g_FwiperSubStep = OFF_STEP_CHK_BACK; } break; case OFF_STEP_IDLE: /* Additional Check Make sure Wiper alway Stay Home Postion */ if ((WIPER_POS_HOME != g_FwiperPosSts) && (PWRMODE_ON == g_FwiperPwrMode)) { g_FwiperSubStep = OFF_STEP_START; } break; default: g_FwiperSubStep = OFF_STEP_START; break; } } /********************************************************************************* * Description: * Para: NULL * Para1: NULL * Para2: NULL * Return: NULL *********************************************************************************/ static void Fwiper_LowCtl(void) { if (PWRMODE_ON != g_FwiperPwrMode) { g_FwiperSwReqSts = FWIPER_REQ_STS_OFF; Fwiper_ReqCtl(FWIPER_CTL_OFF); return; } if (0x00 == g_FwiperSubStep) { Fwiper_DrvSet(WIPER_SPEED_LOW); g_FwiperSubStep++; } } /********************************************************************************* * Description: * Para: NULL * Para1: NULL * Para2: NULL * Return: NULL *********************************************************************************/ static void Fwiper_HighCtl(void) { if(PWRMODE_ON != g_FwiperPwrMode) { g_FwiperSwReqSts = FWIPER_REQ_STS_OFF; Fwiper_ReqCtl(FWIPER_CTL_OFF); return; } if(0x00 == g_FwiperSubStep) { Fwiper_DrvSet(WIPER_SPEED_HIGH); g_FwiperSubStep++; } } /********************************************************************************* * Description: * Para: NULL * Para1: NULL * Para2: NULL * Return: NULL *********************************************************************************/ uint8_t Fwiper_IntDwellTimeChk(void) { const uint16_t FwiperIntTime[4][6] = { { Delay_Base5ms(t1ms(18000)), Delay_Base5ms(t1ms(15500)), Delay_Base5ms(t1ms(13000)), Delay_Base5ms(t1ms(11900)), Delay_Base5ms(t1ms(10700)), Delay_Base5ms(t1ms(10100)) }, { Delay_Base5ms(t1ms(8000)), Delay_Base5ms(t1ms(6000)), Delay_Base5ms(t1ms(5000)), Delay_Base5ms(t1ms(4600)), Delay_Base5ms(t1ms(4200)), Delay_Base5ms(t1ms(3900)) }, { Delay_Base5ms(t1ms(5000)), Delay_Base5ms(t1ms(3500)), Delay_Base5ms(t1ms(3000)), Delay_Base5ms(t1ms(2800)), Delay_Base5ms(t1ms(2600)), Delay_Base5ms(t1ms(2500)) }, { Delay_Base5ms(t1ms(2000)), Delay_Base5ms(t1ms(1000)), Delay_Base5ms(t1ms(800)), Delay_Base5ms(t1ms(700)), Delay_Base5ms(t1ms(600)), Delay_Base5ms(t1ms(600)) }, }; uint16_t TmpEspVhelSpd; static uint8_t PrvIntVhelSpdLev = 0x00; uint8_t IntVhelSpdLev = 0x01; uint8_t IntRheostatPosLev; if (VEH_SPEED_VALID == Rte_Read_ComCan_VehSpdVld()) { TmpEspVhelSpd = Rte_Read_ComCan_VehSpd(); switch (PrvIntVhelSpdLev) { case 0x00: if (VEH_SPEED_8KM > TmpEspVhelSpd) { IntVhelSpdLev = 0x00; } else if (((VEH_SPEED_8KM + VEH_SPEED_2KM) <= TmpEspVhelSpd) && (VEH_SPEED_32KM > TmpEspVhelSpd)) { IntVhelSpdLev = 0x01; } else if ((VEH_SPEED_32KM <= TmpEspVhelSpd) && (VEH_SPEED_64KM > TmpEspVhelSpd)) { IntVhelSpdLev = 0x02; } else if ((VEH_SPEED_64KM <= TmpEspVhelSpd) && (VEH_SPEED_96KM > TmpEspVhelSpd)) { IntVhelSpdLev = 0x03; } else if ((VEH_SPEED_96KM <= TmpEspVhelSpd) && (VEH_SPEED_128KM > TmpEspVhelSpd)) { IntVhelSpdLev = 0x04; } else if (VEH_SPEED_128KM <= TmpEspVhelSpd) { IntVhelSpdLev = 0x05; } break; case 0x01: if (VEH_SPEED_8KM > TmpEspVhelSpd) { IntVhelSpdLev = 0x00; } else if ((VEH_SPEED_8KM <= TmpEspVhelSpd) && (VEH_SPEED_32KM > TmpEspVhelSpd)) { IntVhelSpdLev = 0x01; } else if (((VEH_SPEED_32KM + VEH_SPEED_2KM) <= TmpEspVhelSpd) && (VEH_SPEED_64KM > TmpEspVhelSpd)) { IntVhelSpdLev = 0x02; } else if ((VEH_SPEED_64KM <= TmpEspVhelSpd) && (VEH_SPEED_96KM > TmpEspVhelSpd)) { IntVhelSpdLev = 0x03; } else if ((VEH_SPEED_96KM <= TmpEspVhelSpd) && (VEH_SPEED_128KM > TmpEspVhelSpd)) { IntVhelSpdLev = 0x04; } else if (VEH_SPEED_128KM <= TmpEspVhelSpd) { IntVhelSpdLev = 0x05; } break; case 0x02: if (VEH_SPEED_8KM > TmpEspVhelSpd) { IntVhelSpdLev = 0x00; } else if ((VEH_SPEED_8KM <= TmpEspVhelSpd) && (VEH_SPEED_32KM > TmpEspVhelSpd)) { IntVhelSpdLev = 0x01; } else if ((VEH_SPEED_32KM <= TmpEspVhelSpd) && (VEH_SPEED_64KM > TmpEspVhelSpd)) { IntVhelSpdLev = 0x02; } else if (((VEH_SPEED_64KM + VEH_SPEED_2KM) <= TmpEspVhelSpd) && (VEH_SPEED_96KM > TmpEspVhelSpd)) { IntVhelSpdLev = 0x03; } else if ((VEH_SPEED_96KM <= TmpEspVhelSpd) && (VEH_SPEED_128KM > TmpEspVhelSpd)) { IntVhelSpdLev = 0x04; } else if (VEH_SPEED_128KM <= TmpEspVhelSpd) { IntVhelSpdLev = 0x05; } break; case 0x03: if (VEH_SPEED_8KM > TmpEspVhelSpd) { IntVhelSpdLev = 0x00; } else if ((VEH_SPEED_8KM <= TmpEspVhelSpd) && (VEH_SPEED_32KM > TmpEspVhelSpd)) { IntVhelSpdLev = 0x01; } else if ((VEH_SPEED_32KM <= TmpEspVhelSpd) && (VEH_SPEED_64KM > TmpEspVhelSpd)) { IntVhelSpdLev = 0x02; } else if ((VEH_SPEED_64KM <= TmpEspVhelSpd) && (VEH_SPEED_96KM > TmpEspVhelSpd)) { IntVhelSpdLev = 0x03; } else if (((VEH_SPEED_96KM + VEH_SPEED_2KM) <= TmpEspVhelSpd) && (VEH_SPEED_128KM > TmpEspVhelSpd)) { IntVhelSpdLev = 0x04; } else if (VEH_SPEED_128KM <= TmpEspVhelSpd) { IntVhelSpdLev = 0x05; } break; case 0x04: if (VEH_SPEED_8KM > TmpEspVhelSpd) { IntVhelSpdLev = 0x00; } else if ((VEH_SPEED_8KM <= TmpEspVhelSpd) && (VEH_SPEED_32KM > TmpEspVhelSpd)) { IntVhelSpdLev = 0x01; } else if ((VEH_SPEED_32KM <= TmpEspVhelSpd) && (VEH_SPEED_64KM > TmpEspVhelSpd)) { IntVhelSpdLev = 0x02; } else if ((VEH_SPEED_64KM <= TmpEspVhelSpd) && (VEH_SPEED_96KM > TmpEspVhelSpd)) { IntVhelSpdLev = 0x03; } else if ((VEH_SPEED_96KM <= TmpEspVhelSpd) && (VEH_SPEED_128KM > TmpEspVhelSpd)) { IntVhelSpdLev = 0x04; } else if ((VEH_SPEED_128KM + VEH_SPEED_2KM) <= TmpEspVhelSpd) { IntVhelSpdLev = 0x05; } break; case 0x05: if (VEH_SPEED_8KM > TmpEspVhelSpd) { IntVhelSpdLev = 0x00; } else if ((VEH_SPEED_8KM <= TmpEspVhelSpd) && (VEH_SPEED_32KM > TmpEspVhelSpd)) { IntVhelSpdLev = 0x01; } else if ((VEH_SPEED_32KM <= TmpEspVhelSpd) && (VEH_SPEED_64KM > TmpEspVhelSpd)) { IntVhelSpdLev = 0x02; } else if ((VEH_SPEED_64KM <= TmpEspVhelSpd) && (VEH_SPEED_96KM > TmpEspVhelSpd)) { IntVhelSpdLev = 0x03; } else if ((VEH_SPEED_96KM <= TmpEspVhelSpd) && (VEH_SPEED_128KM > TmpEspVhelSpd)) { IntVhelSpdLev = 0x04; } else if (VEH_SPEED_128KM <= TmpEspVhelSpd) { IntVhelSpdLev = 0x05; } break; } } else { IntVhelSpdLev = 0x01; } PrvIntVhelSpdLev = IntVhelSpdLev; if (0x00 == Rte_Read_EepCfg_FRONT_WIPER_INT()) { IntRheostatPosLev = 0x02; } else { IntRheostatPosLev = g_FWipeLevel; } PrvIntVhelSpdLev = IntVhelSpdLev; return FwiperIntTime[IntRheostatPosLev][IntVhelSpdLev]; } /********************************************************************************* * Description: * Para: NULL * Para1: NULL * Para2: NULL * Return: NULL *********************************************************************************/ static void Fwiper_IntCtl(void) { static uint8_t s_PrvFWipeLevel = 0x00; if ((g_uFwiperFlg.Bits.Washer) || (PWRMODE_ON != g_FwiperPwrMode)) { g_FwiperSwReqSts = FWIPER_REQ_STS_OFF; Fwiper_ReqCtl(FWIPER_CTL_OFF); return; } switch (g_FwiperSubStep) { case INT_STEP_START: /* directly start Low Speed, no matter last state */ Fwiper_DrvSet(WIPER_SPEED_LOW); if (WIPER_POS_HOME != g_FwiperPosSts) { g_FwiperSubStep = INT_STEP_CHK_BACK; } else { g_FwiperSubStep = INT_STEP_CHK_AWAY; } break; case INT_STEP_CHK_AWAY: /* make sure WIPER away from STOP position */ if (WIPER_POS_HOME != g_FwiperPosSts) { g_FwiperSubStep = INT_STEP_CHK_BACK; } break; case INT_STEP_CHK_BACK: /* waiting WIPER back to STOP POS */ if (WIPER_POS_HOME == g_FwiperPosSts) { g_FwiperSubStep = INT_STEP_WAIT_MORE; } break; case INT_STEP_WAIT_MORE: if (WIPER_POS_HOME == g_FwiperPosSts) { Fwiper_DrvSet(WIPER_SPEED_OFF); g_FwiperIntDly = 0x00; g_FwiperSubStep = INT_STEP_WAIT_DLY; } else /* Error: */ { g_FwiperSubStep = INT_STEP_START; /* Start another loop */ } break; case INT_STEP_WAIT_DLY: /* waiting INTERVAL delay */ if ((Fwiper_IntDwellTimeChk() <= g_FwiperIntDly) || (s_PrvFWipeLevel < g_FWipeLevel)) { g_FwiperSubStep = INT_STEP_START; /* Start another loop */ } if (WIPER_POS_HOME != g_FwiperPosSts) { g_FwiperSubStep = INT_STEP_START; } break; default: g_FwiperSubStep = INT_STEP_START; break; } s_PrvFWipeLevel = g_FWipeLevel; } /********************************************************************************* * Description: * Para: NULL * Para1: NULL * Para2: NULL * Return: NULL *********************************************************************************/ static void Fwiper_AutoCtl(void) { static uint8_t s_PrvRlsWiperSpdReq = 0x00; uint8_t TmpRlsWiperSpdReq; if ((g_uFwiperFlg.Bits.Washer) || (PWRMODE_ON != g_FwiperPwrMode) || ((VOLT_MODE_NORMAL != Rte_Read_AppPm_VoltMode()) && (VOLT_MODE_HIGH != Rte_Read_AppPm_VoltMode()))) { g_FwiperSwReqSts = FWIPER_REQ_STS_OFF; Fwiper_ReqCtl(FWIPER_CTL_OFF); return; } if (0x01 == Rte_Read_ComLin_RLS_SplashReq()) { TmpRlsWiperSpdReq = WIPER_SPEED_HIGH; } else { switch (Rte_Read_ComLin_RLS_WIPRSPDREQ()) { case 0x00: TmpRlsWiperSpdReq = WIPER_SPEED_OFF; break; case 0x05: TmpRlsWiperSpdReq = WIPER_SPEED_LOW; break; case 0x0F: TmpRlsWiperSpdReq = WIPER_SPEED_HIGH; break; default: TmpRlsWiperSpdReq = s_PrvRlsWiperSpdReq; break; } } if (0x01 == g_uFwiperFlg.Bits.WashSw) { if (s_PrvRlsWiperSpdReq > TmpRlsWiperSpdReq) { TmpRlsWiperSpdReq = s_PrvRlsWiperSpdReq; } } s_PrvRlsWiperSpdReq = TmpRlsWiperSpdReq; switch (g_FwiperSubStep) { case AUTO_STEP_START: /* directly start Low Speed, no matter last state */ if (WIPER_POS_HOME != g_FwiperPosSts) { Fwiper_DrvSet(WIPER_SPEED_LOW); } g_FwiperSubStep = AUTO_STEP_CHK_BACK; break; case AUTO_STEP_CHK_AWAY: /* make sure WIPER away from STOP position */ if (WIPER_POS_HOME != g_FwiperPosSts) { g_FwiperSubStep = AUTO_STEP_CHK_BACK; } break; case AUTO_STEP_CHK_BACK: /* waiting WIPER back to STOP POS */ if (WIPER_POS_HOME == g_FwiperPosSts) { Fwiper_DrvSet(WIPER_SPEED_OFF); g_FwiperSubStep = AUTO_STEP_CHK_RLS; } break; case AUTO_STEP_CHK_RLS: if (Delay_Base5ms(t1ms(200)) <= g_FwiperIntDly) { g_FwiperSubStep = AUTO_STEP_AUTO_CHK; } break; case AUTO_STEP_AUTO_CHK: if (WIPER_SPEED_OFF != TmpRlsWiperSpdReq) { Fwiper_DrvSet(TmpRlsWiperSpdReq); g_FwiperSubStep = AUTO_STEP_AUTO_AWAY; } if (WIPER_POS_HOME != g_FwiperPosSts) { g_FwiperSubStep = AUTO_STEP_START; } break; case AUTO_STEP_AUTO_AWAY: if (WIPER_POS_HOME != g_FwiperPosSts) { g_FwiperSubStep = AUTO_STEP_AUTO_BACK; } else { if (g_FwiperDrvMode != TmpRlsWiperSpdReq) { if (WIPER_SPEED_OFF == TmpRlsWiperSpdReq) { Fwiper_DrvSet(WIPER_SPEED_LOW); } else { Fwiper_DrvSet(TmpRlsWiperSpdReq); } } } break; case AUTO_STEP_AUTO_BACK: if (WIPER_POS_HOME == g_FwiperPosSts) { if (WIPER_SPEED_OFF == TmpRlsWiperSpdReq) { Fwiper_DrvSet(WIPER_SPEED_OFF); } g_FwiperSubStep = AUTO_STEP_AUTO_CHK; } else { if (g_FwiperDrvMode != TmpRlsWiperSpdReq) { if (WIPER_SPEED_OFF == TmpRlsWiperSpdReq) { Fwiper_DrvSet(WIPER_SPEED_LOW); } else { Fwiper_DrvSet(TmpRlsWiperSpdReq); } } } break; } } /********************************************************************************* * Description: * Para: NULL * Para1: NULL * Para2: NULL * Return: NULL *********************************************************************************/ static void Fwiper_MaintainCtl(void) { static uint16_t FwiperServiceDly; const uint16_t FwiperMntnRuningTime[8] = { Delay_Base5ms(t1ms(500)), Delay_Base5ms(t1ms(600)), Delay_Base5ms(t1ms(700)), Delay_Base5ms(t1ms(800)), Delay_Base5ms(t1ms(900)), Delay_Base5ms(t1ms(1000)), Delay_Base5ms(t1ms(1100)), Delay_Base5ms(t1ms(1200)), }; if(FwiperServiceDly) { FwiperServiceDly--; } switch (g_FwiperSubStep) { case MTMD_STEP_START: /* directly start Low Speed, no matter last state */ Fwiper_DrvSet(WIPER_SPEED_LOW); if (WIPER_POS_HOME != g_FwiperPosSts) { g_FwiperSubStep = MTMD_STEP_WAIT_BACK; } else { g_FwiperSubStep = MTMD_STEP_CHK_AWAY; } break; case MTMD_STEP_WAIT_BACK: /* Wait currently LOOP end*/ if (WIPER_POS_HOME == g_FwiperPosSts) { g_FwiperSubStep = MTMD_STEP_CHK_AWAY; } break; case MTMD_STEP_CHK_AWAY: /* make sure WIPER away from STOP position */ if (WIPER_POS_HOME != g_FwiperPosSts) { FwiperServiceDly = FwiperMntnRuningTime[Rte_Read_Did_FWipeMntnRuningTime()]; g_FwiperSubStep = MTMD_STEP_CHK_DLY; } break; case MTMD_STEP_CHK_DLY: if (0x00 == FwiperServiceDly) { Fwiper_DrvSet(WIPER_SPEED_OFF); g_FwiperSubStep = MTMD_STEP_WAIT; } else if (DOOR_AJAR_OPEN == Rte_Read_Input_HoodAjarSts()) { if (WIPER_SPEED_OFF != g_FwiperDrvMode) { Fwiper_DrvSet(WIPER_SPEED_OFF); } FwiperServiceDly++; } else { if (WIPER_SPEED_LOW != g_FwiperDrvMode) { Fwiper_DrvSet(WIPER_SPEED_LOW); } } break; case MTMD_STEP_WAIT: break; default: g_FwiperSubStep = MTMD_STEP_START; break; } } /********************************************************************************* * Description: * Para: NULL * Para1: NULL * Para2: NULL * Return: NULL *********************************************************************************/ static void Fwiper_ModeCtl(void) { switch (g_FwiperCtl) { case FWIPER_CTL_LOW: Fwiper_LowCtl(); break; case FWIPER_CTL_HIGH: Fwiper_HighCtl(); break; case FWIPER_CTL_INT: Fwiper_IntCtl(); break; case FWIPER_CTL_AUTO: Fwiper_AutoCtl(); break; case FWIPER_CTL_MAINTAIN: Fwiper_MaintainCtl(); break; case FWIPER_CTL_OFF: default: Fwiper_OffCtl(); break; } } /********************************************************************************* * Description: * Para: NULL * Para1: NULL * Para2: NULL * Return: NULL *********************************************************************************/ static void FrntWiper_StsSync(void) { uint8_t Tmp; g_FwiperPwrMode = Rte_Read_AppPs_PwrMod(); if (0x00 == Rte_Read_AppVfmm_RefrshModRestrntFctCmd()) { g_FwiperPwrMode = PWRMODE_OFF; } Tmp = Rte_Read_ComCan_ICC_BCMWipeLevel(); if ((0x01 <= Tmp) && (0x04 >= Tmp)) { g_FWipeLevel = Tmp; } else if (0x00 != Tmp) { g_FWipeLevel = 0x02; } Rte_Write_ComCan_WipeLevelFB(g_FWipeLevel); g_FwiperIntDly++; } /********************************************************************************* * Description: * Para: NULL * Para1: NULL * Para2: NULL * Return: NULL *********************************************************************************/ void FrntWiper_Init(void) { g_uFwiperFlg.Byte = 0x00; g_FwiperPwrMode = Rte_Read_AppPs_PwrMod(); g_FwiperDrvMode = WIPER_SPEED_OFF; g_FwiperPosSts = WIPER_POS_HOME; Rte_Write_ComCan_FrntWiprParkStsSwt(0x01); g_FwiperIntDly = 0x00; g_FwiperSwReqSts = FWIPER_CTL_OFF; g_FwiperCtl = FWIPER_MODE_OFF; g_FwiperSubStep = OFF_STEP_IDLE; g_FwiperChangeOffReqSts = 0x00; g_FwasherStep = 0x00; g_FrntWiperServiceSts = 0x00; } /********************************************************************************* * Description: * Para: NULL * Para1: NULL * Para2: NULL * Return: NULL *********************************************************************************/ void FrntWiper_MainFunction(void) { FrntWiper_StsSync(); Parking_PosChk(); //FrntWiper_IOCtrlChk(); //if(uFwiperIOCtlFlg.Bits.IOCtlFlg) /* DID IO Control State: Not Execute any Application Function */ //{ // return; //} FwiperSw_ReqChk(); FwiperService_ReqChk(); FwiperWash_ReqChk(); FwiperWasher_OutputCtrl(); Fwiper_ModeCtl(); }