diff --git a/wiper/FrntWiperCtrl.c b/wiper/FrntWiperCtrl.c
new file mode 100644
index 0000000..0e38e34
--- /dev/null
+++ b/wiper/FrntWiperCtrl.c
@@ -0,0 +1,1290 @@
+/********************************************************************************
+*
+* 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
+
+/*********************************************************************************
+* 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();
+}
diff --git a/wiper/FrntWiperCtrl.h b/wiper/FrntWiperCtrl.h
new file mode 100644
index 0000000..a7a67ca
--- /dev/null
+++ b/wiper/FrntWiperCtrl.h
@@ -0,0 +1,138 @@
+/********************************************************************************
+*
+* File name: FrntWiperCtrl.h
+*
+*********************************************************************************/
+#ifndef __FRNTWIPERCTRL_H__
+#define __FRNTWIPERCTRL_H__
+
+/*********************************************************************************
+* Includes
+*********************************************************************************/
+
+/*********************************************************************************
+* Global Macros
+*********************************************************************************/
+/* Front Wiper Mode */
+#define FWIPER_MODE_OFF 0x00
+#define FWIPER_MODE_LOW 0x01
+#define FWIPER_MODE_HIGH 0x02
+#define FWIPER_MODE_MIST 0x03
+#define FWIPER_MODE_INT 0x04
+#define FWIPER_MODE_RESV1 0x05
+#define FWIPER_MODE_RESV2 0x06
+#define FWIPER_MODE_INVALID 0x07
+#define FWIPER_MODE_RESET 0xFF
+
+#define WIPER_SPEED_OFF 0x02
+#define WIPER_SPEED_LOW 0x03
+#define WIPER_SPEED_HIGH 0x04
+
+#define WIPER_POS_HOME 0x00 /* WIPER position : home position */
+#define WIPER_POS_AWAY 0x01 /* WIPER position : away from home position */
+
+#define FWIPER_STS_OFF 0x00
+#define FWIPER_STS_LOW 0x01
+#define FWIPER_STS_HIGH 0x02
+#define FWIPER_STS_MIST 0x03
+#define FWIPER_STS_INT 0x04
+#define FWIPER_STS_AUTO 0x05
+
+/*********************************************************************************
+* Global Struct
+*********************************************************************************/
+/* Front Wiper State */
+typedef union
+{
+ uint8_t Byte;
+ struct
+ {
+ uint8_t Resv :5;
+ uint8_t Blocked :1; /* Wiper blocked Flag */
+ uint8_t Washer :1; /* Washer Working Flag */
+ uint8_t WashSw :1; /* Washer Swtich Sts */
+ } Bits;
+} FWIPER_FLAG_UNION;
+
+/* Input Output Control Flag */
+typedef union
+{
+ uint8_t Byte;
+ struct
+ {
+ uint8_t IOCtlFlg :1;
+ uint8_t HighOn :1;
+ uint8_t LowOn :1;
+ uint8_t HighOff :1;
+ uint8_t LowOff :1;
+ uint8_t Resv2 :1;
+ uint8_t Resv3 :1;
+ uint8_t Resv4 :1;
+ } Bits;
+} FWIPER_IO_CTL_UNION;
+
+typedef enum
+{
+ INT_STEP_START = 0x00,
+ INT_STEP_CHK_AWAY,
+ INT_STEP_CHK_BACK,
+ INT_STEP_WAIT_MORE, /* Run More time while Arrived Home Position */
+ INT_STEP_WAIT_DLY,
+} FWIPER_INT_STEP_ENUM;
+
+/* Fwiper Auto Control Step */
+typedef enum
+{
+ AUTO_STEP_START = 0x00,
+ AUTO_STEP_CHK_AWAY,
+ AUTO_STEP_CHK_BACK,
+ AUTO_STEP_CHK_RLS, /* Delay and Check RainSensor */
+ AUTO_STEP_AUTO_CHK,
+ AUTO_STEP_AUTO_AWAY,
+ AUTO_STEP_AUTO_BACK,
+} FWIPER_AUTO_STEP_ENUM;
+
+typedef enum
+{
+ OFF_STEP_START = 0x00,
+ OFF_STEP_WAIT_AWAY,
+ OFF_STEP_CHK_BACK,
+ OFF_STEP_WAIT_MORE,
+ OFF_STEP_IDLE,
+} FWIPER_OFF_STEP_ENUM;
+
+/* Washer Control Step */
+typedef enum
+{
+ WASHER_STEP_START = 0x00,
+ WASHER_STEP_CHK_AWAY,
+ WASHER_STEP_CHK_BACK,
+ WASHER_STEP_EXTRA_AWAY,
+ WASHER_STEP_EXTRA_BACK,
+ WASHER_STEP_WAIT_DLY,
+ WASHER_STEP_LAST_AWAY,
+ WASHER_STEP_LAST_BACK,
+ WASHER_STEP_LAST_WAIT,
+} FWASHER_STEP_ENUM;
+
+typedef enum /*Maintain Mode Control Step */
+{
+ MTMD_STEP_START = 0x00,
+ MTMD_STEP_WAIT_BACK,
+ MTMD_STEP_CHK_AWAY,
+ MTMD_STEP_CHK_DLY,
+ MTMD_STEP_WAIT,
+} FWIPER_MAINTAIN_STEP_ENUM;
+
+/*********************************************************************************
+* Global Variables
+*********************************************************************************/
+
+/*********************************************************************************
+* Global Functions
+*********************************************************************************/
+extern void FrntWiper_Init(void);
+extern void FrntWiper_MainFunction(void);
+extern void Fwiper_DrvSet(uint8_t Speed);
+
+#endif // __FRNTWIPERCTRL_H__
diff --git a/wiper/resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/elgRv6gtl2fjr2zUW7FpD819SKcd.xml b/wiper/resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/elgRv6gtl2fjr2zUW7FpD819SKcd.xml
new file mode 100644
index 0000000..7a6326b
--- /dev/null
+++ b/wiper/resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/elgRv6gtl2fjr2zUW7FpD819SKcd.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/wiper/resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/elgRv6gtl2fjr2zUW7FpD819SKcp.xml b/wiper/resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/elgRv6gtl2fjr2zUW7FpD819SKcp.xml
new file mode 100644
index 0000000..c711920
--- /dev/null
+++ b/wiper/resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/elgRv6gtl2fjr2zUW7FpD819SKcp.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/wiper/resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/yQauZiVmwVJaNJ1sTkA8pnDu-pwd.xml b/wiper/resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/yQauZiVmwVJaNJ1sTkA8pnDu-pwd.xml
new file mode 100644
index 0000000..7a6326b
--- /dev/null
+++ b/wiper/resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/yQauZiVmwVJaNJ1sTkA8pnDu-pwd.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/wiper/resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/yQauZiVmwVJaNJ1sTkA8pnDu-pwp.xml b/wiper/resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/yQauZiVmwVJaNJ1sTkA8pnDu-pwp.xml
new file mode 100644
index 0000000..02efe46
--- /dev/null
+++ b/wiper/resources/project/qaw0eS1zuuY1ar9TdPn1GMfrjbQ/yQauZiVmwVJaNJ1sTkA8pnDu-pwp.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file