汽车PEPS.无钥匙启动.PDU.APP代码

来源:互联网 发布:linux怎么装exe 编辑:程序博客网 时间:2024/04/27 15:53




/*****************************************************************************

** Filename  : pdu_app.c
** Project   : KUWE (PM01 PEPS)
** Module  :
** Processor : Freescale mc9s12g128
** Date/Time : 2015-09-28, 9:00
** Abstract  :
** Contents  :
** Author    : Zhou Xiao
** http  : www.kuwe.com
** mail  : 382823480@qq.com
**  --------------------------------------------------------------------------
**  
**  --------------------------------------------------------------------------
******************************************************************************/


/*****************************************************************************
* Include Files
*****************************************************************************/
#include "OsekOs_include.h"
#include "pdu_cfg.h"
#include "pdu_app.h"
#include "os_tmr.h"
#include "os_time.h"
#include "Com_Cfg.h"
#include "OsekOs_com.h"
#include "keyboard_drive.h"


#include "common.h"
#include "ems_app.h"
#include "cmd_app.h"
#include "dcm_app.h"
#include "nvm_app.h"
#include "uhf_app.h"




/*****************************************************************************
* Defines
*****************************************************************************/
//#define PDU_APP_TEST //开启TEST代码


#define PDU_P_EN 0x01
#define PDU_N_EN 0x02
#define PDU_SPEED_EN 0x04
#define PDU_PEDAL_EN 0x08


/*****************************************************************************
* Macros
*****************************************************************************/


/*****************************************************************************
* Type Defines
*****************************************************************************/

/*事件重新整理*/
#define PDU_EVENT_PS_SHORT_PRESSED EVENT1
#define PDU_EVENT_PS_QUICKLY_PRESSED EVENT2
#define PDU_EVENT_PS_LONG_PRESSED EVENT3


#define PDU_EVENT_AUTH_KEY EVENT6
#define PDU_EVENT_AUTH_ESCL EVENT7
#define PDU_EVENT_AUTH_EMS  EVENT8

#define PDU_EVENT_POWER_MODE_TIME_OUT   EVENT10
#define PDU_EVENT_CRANK_STOP  EVENT11


#define PDU_EVENT_UPDATE_WARNING  EVENT12




typedef struct 
{
PduGearBoxTypeGearBox;
PduShiflLeverTypeShiflLever;
u8 BrakesSw;
u8 ClutchSw;
u16 Speed;
bool SatisfyUpdate;
bool SatisfyNew;
bool SatisfyCrank;
bool SatisfyStop;
}PduConditionType;


typedef struct 
{
bool Status;
u8 Time;
}PduAppTimeOutType;


typedef struct 
{ /*Pdu模块成员*/
TaskType AppTask;
bool Sleep;
PduPowerModeType Mode;
PduPowerModeType OldMode;
PduPowerModeType NewMode;
u16 ModeSaveDelay;
u32 ModeTimeOut;
u8 DcmControl;
u16 SsbSwDelay;
u16 WarningTick;
u8 WarningTimeOut;
u8 DtcTick;
u8 DtcFault;
u8 ModeAccCnt;
PduAppAuthTypeAuth;
PduConditionTypeCondition;
PduDcmType     Dcm;
PduDtcRelayTypeRelay[4];
#ifdef PDU_APP_TEST
bool WarningTickFlag;
PepsCanEmsTypeEms;
u8 KeyLowPower;
#endif
}mPduAppType;


/*****************************************************************************
*Static Variable
*****************************************************************************/


/*****************************************************************************
*Global Variable
*****************************************************************************/
mPduAppType mPduApp;


/*****************************************************************************
*Constant
*****************************************************************************/
#define PDU_TIME_OUT_AUTH_KEY (u16)(7* OS_TIME_TICK)
#define PDU_TIME_OUT_AUTH_ESCL (u16)(5* OS_TIME_TICK)
#define PDU_TIME_OUT_AUTH_EMS (u16)(10* OS_TIME_TICK)


#define PDU_POWER_MODE_ACC_TIME_OUT (u32)(360000)/*1h   = 60*60*100 */


#define PDU_POWER_MODE_SAVE_DELAY (u16)(500)/*5S */


#define PDU_PS_STOP_TIMER_OUT (u16)(3* OS_TIME_TICK)
#define PDU_PS_SHORT_TIMER_OUT (u16)(0.1* OS_TIME_TICK)


#define PDU_CRANK_SPEED_VALUE 0x59/*vehicle speed 5km/h */
#define PDU_GET_POWER_MODE(mode) (mPduApp.Mode == mode)
#define PDU_GET_POWER_MODE_NO(mode) (mPduApp.Mode != mode)
//#define PDU_REST_RELAY_IC GPIO_J7


#define PDU_APP_EVENT_NUM 6
const CmdTabEventType PduAppTabEvent[PDU_APP_EVENT_NUM] = 
{
/*01*/ {CMD_PDU_APP_AUTH_KEY,PDU_EVENT_AUTH_KEY},
/*02*/ {CMD_PDU_APP_AUTH_ESCL,PDU_EVENT_AUTH_ESCL},
/*03*/ {CMD_PDU_APP_AUTH_EMS,PDU_EVENT_AUTH_EMS},
/*04*/ {CMD_PDU_APP_PS_SHORT_PRESSED,PDU_EVENT_PS_SHORT_PRESSED},
/*05*/ {CMD_PDU_APP_PS_QUICKLY_PRESSED,PDU_EVENT_PS_QUICKLY_PRESSED},
/*06*/ {CMD_PDU_APP_PS_LONG_PRESSED,PDU_EVENT_PS_LONG_PRESSED},
};
#define PDU_APP_POWER_MODE_NUM 5
const CmdTabCmdType PduAppTabPowerMode[PDU_APP_POWER_MODE_NUM] = 
{
/*01*/ {PDU_POWER_MODE_OFF,0},
/*02*/ {PDU_POWER_MODE_ACC,PDU_DRIVE_CMD_ACC},
/*03*/ {PDU_POWER_MODE_ON,PDU_DRIVE_CMD_ACC|PDU_DRIVE_CMD_IG1|PDU_DRIVE_CMD_IG2},
/*04*/ {PDU_POWER_MODE_CRANK,PDU_DRIVE_CMD_ACC|PDU_DRIVE_CMD_IG1|PDU_DRIVE_CMD_IG2|PDU_DRIVE_CMD_ST},
/*05*/ {PDU_POWER_MODE_RUN,PDU_DRIVE_CMD_ACC|PDU_DRIVE_CMD_IG1|PDU_DRIVE_CMD_IG2}, 
};


#define PDU_APP_ADMIN_NUM 1
const CmdTabAdminType PduAppTabAdmin[PDU_APP_ADMIN_NUM] = 
{
/*00*/ {CMD_PDU_APP_DCM},
};
/*****************************************************************************
*Function Prototype
*****************************************************************************/ 
static void Pdu_AppPsShortPressed(void);
static void Pdu_AppPsQuicklyPressed(void);
static void Pdu_AppPsLongPressed(void);
static void Pdu_AppPowerModeTimeOut(void);


static void Pdu_AppDcmRetIo(void);


static void Pdu_AppRecoveryRelays(void);
static bool Pdu_AppGetCondition(u8 cAllEn);
static bool Pdu_AppGetStopMode(void);
static bool Pdu_AppGetCrankMode(void);
static bool Pdu_AppGetNewMode(void);
static bool Pdu_AppSetNewMode(PduPowerModeType Mode);
static void Pdu_AppPowerMode(PduPowerModeType Mode);/*With tips*/
static void Pdu_AppPowerModeOut(PduPowerModeType Mode);/*No With tips*/
static bool Pdu_AppAuthKeyAndEscl(void);
static bool Pdu_AppAuthEms(void);
static void Pdu_AppDtcStart(PduPowerModeType Mode);
static void Pdu_AppModeTick(void);
static void Pdu_AppDtcTick(void);
static void Pdu_AppDtcRelayEnable(PduDtcRelayType *DtcRelay,u8 Enable);
static void Pdu_AppDtcRelayIn(PduDtcRelayType *DtcRelay,KeyIdType KeyId);
static void Pdu_AppDtcRelayOut(PduDtcRelayType *DtcRelay,u8 Status);
static void Pdu_AppDtcRelayTick(PduDtcRelayType *DtcRelay);


static void Pdu_AppClrWarningTick(void);
static void Pdu_AppUpdateWarning(void);


/*****************************************************************************
|Prototype         : 
|Called by         : 
|Preconditions     : -
|Input parameters  : None
|Output parameters : None
|Return value      : None
|Description       : 
*****************************************************************************/
void Pdu_AppInit(void)
{  
Pdu_AppInitIo();
mPduApp.AppTask = OsTask13;
mPduApp.Mode = PDU_POWER_MODE_UNKNOWN;
mPduApp.Sleep = FALSE;
mPduApp.ModeAccCnt = 0;
}/* End of function */


/*****************************************************************************
|Prototype         : 
|Called by         : 
|Preconditions     : -
|Input parameters  : None
|Output parameters : None
|Return value      : None
|Description       : 
*****************************************************************************/
void Pdu_AppTask(void)
{
EventMaskType event;
 
//(void)GetTaskID(&mPduApp.AppTask);
//Pdu_AppInit();
Pdu_AppRecoveryRelays();/*pdu recovery relays*/
for(;;)
{
(void)WaitEvent(PDU_EVENT_PS_SHORT_PRESSED
|PDU_EVENT_PS_QUICKLY_PRESSED
|PDU_EVENT_PS_LONG_PRESSED
|PDU_EVENT_UPDATE_WARNING
|PDU_EVENT_POWER_MODE_TIME_OUT);
(void)GetEvent(mPduApp.AppTask,&event);
(void)ClearEvent(event);
if(event&PDU_EVENT_PS_SHORT_PRESSED)
{
mPduApp.WarningTimeOut = 0; /* 8s*/
Pdu_AppPsShortPressed();
mPduApp.WarningTimeOut = 80;/* 8s*/
}
if(event&PDU_EVENT_PS_QUICKLY_PRESSED)
{
Pdu_AppPsQuicklyPressed();
}
if(event&PDU_EVENT_PS_LONG_PRESSED)
{
Pdu_AppPsLongPressed();
}
if(event & PDU_EVENT_POWER_MODE_TIME_OUT)
{
Pdu_AppPowerModeTimeOut();
}
if(event & PDU_EVENT_UPDATE_WARNING)
{
Pdu_AppUpdateWarning();
}
}
}/* End of function */




/*****************************************************************************
|Prototype         : 
|Called by         : 
|Preconditions     : -
|Input parameters  : None
|Output parameters : None
|Return value      : None
|Description       : 
*****************************************************************************/
static void Pdu_AppPsShortPressed(void)
{
if(mPduApp.SsbSwDelay != 0) {return;}

mPduApp.SsbSwDelay = PDU_PS_SHORT_TIMER_OUT;


switch(mPduApp.Mode)
{
case PDU_POWER_MODE_OFF:
if(Pdu_AppAuthKeyAndEscl())
{
if(Pdu_AppGetCondition(PDU_PEDAL_EN))
{
Pdu_AppPowerMode(PDU_POWER_MODE_CRANK);
}
else
{
Pdu_AppPowerMode(PDU_POWER_MODE_ACC);
}
}
break;
case PDU_POWER_MODE_ACC:
if(Pdu_AppAuthKeyAndEscl())
{
if(Pdu_AppGetCondition(PDU_PEDAL_EN))
{
Pdu_AppPowerMode(PDU_POWER_MODE_CRANK);
}
else
{
Pdu_AppPowerMode(PDU_POWER_MODE_ON);
}
}
break;
case PDU_POWER_MODE_ON: 
if(Pdu_AppGetCondition(PDU_PEDAL_EN))
{
Pdu_AppPowerMode(PDU_POWER_MODE_CRANK);
}
else if(Pdu_AppGetCondition(PDU_SPEED_EN))
{
Pdu_AppPowerMode(PDU_POWER_MODE_OFF);
}
else
{
Pdu_AppPowerMode(PDU_POWER_MODE_ACC);
}
break;
case PDU_POWER_MODE_RUN:
if(Pdu_AppGetCondition(PDU_SPEED_EN))
{
Pdu_AppPowerMode(PDU_POWER_MODE_OFF);
}
else
{
Pdu_AppPowerMode(PDU_POWER_MODE_ACC);
}
break;
case PDU_POWER_MODE_UNKNOWN:
Pdu_AppPowerModeOut(PDU_POWER_MODE_OFF);
break;
default:
break;
}
}
/*****************************************************************************
|Prototype         : 
|Called by         : 
|Preconditions     : -
|Input parameters  : None
|Output parameters : None
|Return value      : None
|Description       : 
*****************************************************************************/
static void Pdu_AppPsQuicklyPressed(void)
{
/*STOP RUN GOTO OFF || ON SPEED GOTO OFF*/
switch(mPduApp.Mode)
{
case PDU_POWER_MODE_OFF:
case PDU_POWER_MODE_ACC:
if(mPduApp.SsbSwDelay > PDU_PS_SHORT_TIMER_OUT)
{
mPduApp.SsbSwDelay = PDU_PS_STOP_TIMER_OUT;
}
break;
case PDU_POWER_MODE_RUN:
if(Pdu_AppGetCondition(PDU_P_EN |PDU_SPEED_EN) == FALSE)
{
Pdu_AppPowerModeOut(PDU_POWER_MODE_ACC);
mPduApp.SsbSwDelay = PDU_PS_STOP_TIMER_OUT;
}
break;
default:
break;
}
}
/*****************************************************************************
|Prototype         : 
|Called by         : 
|Preconditions     : -
|Input parameters  : None
|Output parameters : None
|Return value      : None
|Description       : 
*****************************************************************************/
static void Pdu_AppPsLongPressed(void)
{
//mPduApp.SsbSwDelay = PDU_PS_STOP_TIMER_OUT;
switch(mPduApp.Mode)
{
case PDU_POWER_MODE_OFF:
case PDU_POWER_MODE_ACC:
if(mPduApp.SsbSwDelay > PDU_PS_SHORT_TIMER_OUT)
{
mPduApp.SsbSwDelay = PDU_PS_STOP_TIMER_OUT;
}
break;
case PDU_POWER_MODE_RUN:
if(Pdu_AppGetCondition(PDU_P_EN |PDU_SPEED_EN) == FALSE)
{
Pdu_AppPowerModeOut(PDU_POWER_MODE_ACC);
mPduApp.SsbSwDelay = PDU_PS_STOP_TIMER_OUT;
}
break;
default:
break;
}
}
/*****************************************************************************
|Prototype         : 
|Called by         : 
|Preconditions     : -
|Input parameters  : None
|Output parameters : None
|Return value      : None
|Description       : 
*****************************************************************************/
static void Pdu_AppPowerModeTimeOut(void)
{ /*PDU POWER MODE TIME OUT*/
if(mPduApp.Mode == PDU_POWER_MODE_ACC)
{
Pdu_AppPowerModeOut(PDU_POWER_MODE_OFF);
}
}


/*****************************************************************************
|Prototype         : 
|Called by         : With tips
|Preconditions     : -
|Input parameters  : None
|Output parameters : None
|Return value      : None
|Description       : 
*****************************************************************************/
static void Pdu_AppPowerMode(PduPowerModeType Mode)
{
switch(Mode)
{ //电源模式切换
case PDU_POWER_MODE_OFF:
if(Pdu_AppSetNewMode(Mode) == FALSE){break;}else{;}
Pdu_AppPowerModeOut(PDU_POWER_MODE_OFF);
break;
case PDU_POWER_MODE_ON:
if(Pdu_AppSetNewMode(Mode) == FALSE){break;}else{;}
Pdu_AppPowerModeOut(PDU_POWER_MODE_ON);
(void)Ems_AppSetCmd(CMD_EMS_APP_AUTH);
break;
case PDU_POWER_MODE_CRANK:
switch(mPduApp.Mode)
{
case PDU_POWER_MODE_OFF:
if(Pdu_AppSetNewMode(Mode) == FALSE){break;}else{;}
Pdu_AppPowerModeOut(PDU_POWER_MODE_ACC);
OsTimeDly((OS_TIME_TICK * 0.05));
case PDU_POWER_MODE_ACC:
if(Pdu_AppSetNewMode(Mode) == FALSE){break;}else{;}
Pdu_AppPowerModeOut(PDU_POWER_MODE_ON);
(void)Ems_AppSetCmd(CMD_EMS_APP_AUTH);
OsTimeDly((OS_TIME_TICK * 0.05));
case PDU_POWER_MODE_ON:
if(Pdu_AppGetEmsState()== TRUE)
{ /* ems run */
Pdu_AppPowerModeOut(PDU_POWER_MODE_RUN);
break;
}
if(Pdu_AppSetNewMode(Mode) == FALSE){break;}else{;}
Pdu_AppPowerModeOut(PDU_POWER_MODE_CRANK);
if((Pdu_AppAuthEms() == TRUE) ||(Pdu_AppGetEmsState()== TRUE))
{
Pdu_AppPowerModeOut(PDU_POWER_MODE_RUN);
}
else
{
(void)Pdu_AppSetNewMode(Mode);
Pdu_AppPowerModeOut(PDU_POWER_MODE_ON);
}
break;
default:
break;
}
break;
default:
if(Pdu_AppSetNewMode(Mode) == FALSE){break;}else{;}
Pdu_AppPowerModeOut(Mode);
break;
}
}/* End of function */




/*****************************************************************************
|Prototype         : 
|Called by         : NO With tips
|Preconditions     : -
|Input parameters  : None
|Output parameters : None
|Return value      : None
|Description       : 
*****************************************************************************/
static void Pdu_AppPowerModeOut(PduPowerModeType Mode)
{
u8 cMode;

if(mPduApp.Mode == Mode){return;}else{;}
if((Mode == PDU_POWER_MODE_OFF)){mPduApp.Sleep = TRUE;}else{mPduApp.Sleep = FALSE;}
if((Mode == PDU_POWER_MODE_ACC)){mPduApp.ModeAccCnt++;}
if((Mode == PDU_POWER_MODE_CRANK)){mPduApp.ModeAccCnt = 0;}

cMode = (u8)Cmd_GetNewCmd(Mode,PduAppTabPowerMode,PDU_APP_POWER_MODE_NUM);
(void)Pdu_DriveWrite(cMode);
(void)Pdu_AppDtcStart(Mode);
(void)Pdu_AppSetCanPowerMode(Mode);

if(mPduApp.ModeSaveDelay){return;}else{;}
Pdu_AppSavePowerMode(Mode);

mPduApp.OldMode = mPduApp.Mode;
mPduApp.Mode = Mode;
}/* End of function */


/*****************************************************************************
|Prototype         : 
|Called by         : 
|Preconditions     : -
|Input parameters  : None
|Output parameters : None
|Return value      : None
|Description       : 
*****************************************************************************/
static bool Pdu_AppGetCondition(u8 cAllEn)
{
bool cStatus = 0;
PduCanConditionType cCanCondition;

Pdu_AppGetCanCondition(&cCanCondition);
mPduApp.Condition.GearBox= cCanCondition.GearBox;
mPduApp.Condition.Speed= cCanCondition.VehicleSpeed;
mPduApp.Condition.ClutchSw= Keyboard_GetNow(KEY_CLUTCH);
mPduApp.Condition.BrakesSw= Keyboard_GetNow(KEY_BRAKING);

if((mPduApp.Mode == PDU_POWER_MODE_ON)
||(mPduApp.Mode == PDU_POWER_MODE_RUN))
{
mPduApp.Condition.ShiflLever = cCanCondition.ShiftLever;
}
else
{
mPduApp.Condition.ShiflLever = cCanCondition.GsShiftLever;
}

if((cAllEn & PDU_PEDAL_EN)
&&(mPduApp.Condition.GearBox == PDU_GEAR_BOX_MT)
&&(mPduApp.Condition.ClutchSw == TRUE))
{
cStatus |= PDU_PEDAL_EN;
}
if((cAllEn & PDU_PEDAL_EN)
&&(mPduApp.Condition.GearBox != PDU_GEAR_BOX_MT)
&&(mPduApp.Condition.BrakesSw == TRUE))
{
cStatus |= PDU_PEDAL_EN;
}
if((cAllEn & PDU_SPEED_EN)
&&(mPduApp.Condition.Speed < PDU_CRANK_SPEED_VALUE))
{
cStatus |= PDU_SPEED_EN;
}
if((cAllEn & PDU_P_EN)
&&(mPduApp.Condition.ShiflLever == PDU_SHIFL_LEVER_P))
{
cStatus |= PDU_P_EN;
}
if((cAllEn & PDU_N_EN)
&&(mPduApp.Condition.ShiflLever == PDU_SHIFL_LEVER_N))
{
cStatus |= PDU_N_EN;
}
if(cStatus == cAllEn){return TRUE;}else{return FALSE;}
}
static bool Pdu_AppGetCrankMode(void)
{
u8 cRet = FALSE;

switch(mPduApp.Mode)
{
case PDU_POWER_MODE_OFF:
if(Pdu_AppGetCondition(PDU_P_EN | PDU_PEDAL_EN))
{ cRet = TRUE;}
else{;}
break;
case PDU_POWER_MODE_ACC:
case PDU_POWER_MODE_ON:
case PDU_POWER_MODE_CRANK:
if((Pdu_AppGetCondition(PDU_P_EN | PDU_PEDAL_EN))
||(Pdu_AppGetCondition(PDU_N_EN | PDU_PEDAL_EN)))
{ cRet = TRUE;}
else{;}
break;
default:
break;
}
mPduApp.Condition.SatisfyCrank = cRet;
return cRet;
}
static bool Pdu_AppGetStopMode(void)
{
u8 cRet = FALSE;

if(Pdu_AppGetCondition(PDU_P_EN | PDU_SPEED_EN))
{ cRet = TRUE;}
else{;}
mPduApp.Condition.SatisfyStop = cRet;
return cRet;
}
static bool Pdu_AppGetNewMode(void)
{
bool cRet = TRUE;

switch(mPduApp.NewMode)
{
case PDU_POWER_MODE_OFF:
if((Pdu_AppGetCondition(PDU_P_EN) == FALSE))
{
Pdu_AppSetWarning(PDU_WARNING_SHIFT_P_N,FALSE);
Pdu_AppSetWarning(PDU_WARNING_SHIFT_N,FALSE);
Pdu_AppSetWarning(PDU_WARNING_SHIFT_P,TRUE);
cRet = FALSE;
}
else{;}
break;
case PDU_POWER_MODE_ACC:
if((Pdu_AppGetCondition(PDU_P_EN) == FALSE))
{
Pdu_AppSetWarning(PDU_WARNING_SHIFT_P_N,FALSE);
Pdu_AppSetWarning(PDU_WARNING_SHIFT_N,FALSE);
Pdu_AppSetWarning(PDU_WARNING_SHIFT_P,TRUE);
cRet = FALSE;
}
else{;}
if((Pdu_AppGetCondition(PDU_PEDAL_EN)== FALSE) 
&& ((mPduApp.Mode == PDU_POWER_MODE_OFF))
&& ((mPduApp.ModeAccCnt %2) == 1))
{ /*OFF-->ACC X2*/
Pdu_AppSetWarning(PDU_WARNING_PRESS_CLUTCH,TRUE);
Pdu_AppSetWarning(PDU_WARNING_PRESS_BRAKE,TRUE);
}
else{;}
break;
case PDU_POWER_MODE_ON:
if((Pdu_AppGetCondition(PDU_P_EN) == FALSE)
&& (Pdu_AppGetCondition(PDU_N_EN) == FALSE))
{
Pdu_AppSetWarning(PDU_WARNING_SHIFT_P,FALSE);
Pdu_AppSetWarning(PDU_WARNING_SHIFT_N,FALSE);
Pdu_AppSetWarning(PDU_WARNING_SHIFT_P_N,TRUE);
cRet = FALSE;
}
else{;}
if((mPduApp.Mode == PDU_POWER_MODE_ACC))
{ /* ACC--> ON*/
Pdu_AppSetWarning(PDU_WARNING_PRESS_CLUTCH,FALSE);
Pdu_AppSetWarning(PDU_WARNING_PRESS_BRAKE,FALSE);
}
else{;}
break;
case PDU_POWER_MODE_CRANK:
if((mPduApp.Mode == PDU_POWER_MODE_OFF))
{
if((Pdu_AppGetCondition(PDU_P_EN) == FALSE))
{
Pdu_AppSetWarning(PDU_WARNING_SHIFT_P_N,FALSE);
Pdu_AppSetWarning(PDU_WARNING_SHIFT_N,FALSE);
Pdu_AppSetWarning(PDU_WARNING_SHIFT_P,TRUE);
cRet = FALSE;
}
else{;}
}
else
{
if((Pdu_AppGetCondition(PDU_P_EN) == FALSE)
&& (Pdu_AppGetCondition(PDU_N_EN)== FALSE))
{
Pdu_AppSetWarning(PDU_WARNING_SHIFT_P,FALSE);
Pdu_AppSetWarning(PDU_WARNING_SHIFT_N,FALSE);
Pdu_AppSetWarning(PDU_WARNING_SHIFT_P_N,TRUE);
cRet = FALSE;
}
else{;}
}
if((Pdu_AppGetCondition(PDU_PEDAL_EN)== FALSE))
{
if((mPduApp.Condition.GearBox == PDU_GEAR_BOX_MT))
{
Pdu_AppSetWarning(PDU_WARNING_PRESS_CLUTCH,TRUE);
}
else
{
Pdu_AppSetWarning(PDU_WARNING_PRESS_BRAKE,TRUE);
}
cRet = FALSE;
}
else{;}
break;
default:
cRet = FALSE;
break;
}
mPduApp.Condition.SatisfyNew = cRet;
return cRet;
}
static bool Pdu_AppSetNewMode(PduPowerModeType Mode)
{
mPduApp.NewMode = Mode;
return Pdu_AppGetNewMode();
}






static void Pdu_AppUpdateWarning(void)
{
if((Pdu_AppGetCondition(PDU_P_EN)))
{
Pdu_AppSetWarning(PDU_WARNING_SHIFT_P,FALSE);
Pdu_AppSetWarning(PDU_WARNING_SHIFT_P_N,FALSE);
}
else{;}

if((Pdu_AppGetCondition(PDU_N_EN)))
{
Pdu_AppSetWarning(PDU_WARNING_SHIFT_N,FALSE);
Pdu_AppSetWarning(PDU_WARNING_SHIFT_P_N,FALSE);
}
else{;}

if((Pdu_AppGetCondition(PDU_PEDAL_EN)))
{
Pdu_AppSetWarning(PDU_WARNING_PRESS_CLUTCH,FALSE);
Pdu_AppSetWarning(PDU_WARNING_PRESS_BRAKE,FALSE);
}
else{;}
return ;
}
/*****************************************************************************
|Prototype         : 
|Called by         : 
|Preconditions     : -
|Input parameters  : None
|Output parameters : None
|Return value      : None
|Description       : 
*****************************************************************************/
void Pdu_AppRecoveryRelays(void)
{
u8 cMode;
PduPowerModeType cPduPowerMode;

OsTimeDly( OS_TIMER_TICK*0.1);/*上电延时*/
Pdu_AppResetPowerMode(&cPduPowerMode);
switch(cPduPowerMode)
{
case PDU_POWER_MODE_ON:
case PDU_POWER_MODE_RUN:
cMode = (u8)Cmd_GetNewCmd(PDU_POWER_MODE_ON,PduAppTabPowerMode,PDU_APP_POWER_MODE_NUM);
(void)Pdu_DriveWrite(cMode);
break;
default:
cMode = (u8)Cmd_GetNewCmd(PDU_POWER_MODE_OFF,PduAppTabPowerMode,PDU_APP_POWER_MODE_NUM);
(void)Pdu_DriveWrite(cMode);
break;
}
mPduApp.ModeSaveDelay = PDU_POWER_MODE_SAVE_DELAY;
}/* End of function */
/*****************************************************************************
|Prototype         : 
|Called by         : 
|Preconditions     : -
|Input parameters  : None
|Output parameters : None
|Return value      : None
|Description       : 
*****************************************************************************/
static bool Pdu_AppAuthKeyAndEscl(void)
{
EventMaskType event;


mPduApp.Auth.Key= FALSE;
mPduApp.Auth.Escl= FALSE;


/* Auth key*/
(void)ClearEvent(PDU_EVENT_AUTH_KEY);
Pdu_AppSetPeps(PDU_PEPS_AUTH);
(void)WaitEventExt(PDU_EVENT_AUTH_KEY|PDU_EVENT_PS_SHORT_PRESSED,PDU_TIME_OUT_AUTH_KEY);
(void)GetEvent(mPduApp.AppTask,&event);


if(event & PDU_EVENT_PS_SHORT_PRESSED)
{
(void)ClearEvent(PDU_EVENT_PS_SHORT_PRESSED);
return FALSE;
}

if((mPduApp.Auth.Key == FALSE))
{
return FALSE;
}

/* Auth Escl*/
(void)ClearEvent(PDU_EVENT_AUTH_ESCL);
Pdu_AppSetEscl(PDU_ESCL_AUTH);
(void)WaitEventExt(PDU_EVENT_AUTH_ESCL|PDU_EVENT_PS_SHORT_PRESSED,PDU_TIME_OUT_AUTH_ESCL);
(void)GetEvent(mPduApp.AppTask,&event);


if(event & PDU_EVENT_PS_SHORT_PRESSED)
{
(void)ClearEvent(PDU_EVENT_PS_SHORT_PRESSED);
return FALSE;
}

if((mPduApp.Auth.Escl == FALSE))
{
return FALSE;
}


return TRUE;
}/* End of function */


/*****************************************************************************
|Prototype         : 
|Called by         : 
|Preconditions     : -
|Input parameters  : None
|Output parameters : None
|Return value      : None
|Description       : 
*****************************************************************************/
static bool Pdu_AppAuthEms(void)
{
EventMaskType event;

if(mPduApp.Auth.Ems == TRUE)
{
return TRUE;
}
(void)ClearEvent(PDU_EVENT_AUTH_EMS|PDU_EVENT_CRANK_STOP);
(void)Ems_AppSetCmd(CMD_EMS_APP_AUTH);
(void)WaitEventExt(PDU_EVENT_AUTH_EMS|PDU_EVENT_PS_SHORT_PRESSED|PDU_EVENT_CRANK_STOP,PDU_TIME_OUT_AUTH_EMS);
(void)GetEvent(mPduApp.AppTask,&event);

if(event & PDU_EVENT_PS_SHORT_PRESSED)
{
(void)ClearEvent(PDU_EVENT_PS_SHORT_PRESSED);
}
if(event & PDU_EVENT_CRANK_STOP)
{
(void)ClearEvent(PDU_EVENT_CRANK_STOP);
}

if(mPduApp.Auth.Ems == FALSE)
{
return FALSE;
}
return TRUE;
}/* End of function */


/*****************************************************************************
|Prototype         : 
|Called by         : 
|Preconditions     : -
|Input parameters  : None
|Output parameters : None
|Return value      : None
|Description       : 
*****************************************************************************/
static void Pdu_AppDtcStart(PduPowerModeType Mode)
{
switch(Mode)
{
case PDU_POWER_MODE_OFF:
Pdu_AppDtcRelayOut(&mPduApp.Relay[0],FALSE);
Pdu_AppDtcRelayOut(&mPduApp.Relay[1],FALSE);
Pdu_AppDtcRelayOut(&mPduApp.Relay[2],FALSE);
Pdu_AppDtcRelayOut(&mPduApp.Relay[3],FALSE);
break;
case PDU_POWER_MODE_ACC:
Pdu_AppDtcRelayOut(&mPduApp.Relay[0],TRUE);
Pdu_AppDtcRelayOut(&mPduApp.Relay[1],FALSE);
Pdu_AppDtcRelayOut(&mPduApp.Relay[2],FALSE);
Pdu_AppDtcRelayOut(&mPduApp.Relay[3],FALSE);
break;
case PDU_POWER_MODE_ON:
case PDU_POWER_MODE_RUN:
Pdu_AppDtcRelayOut(&mPduApp.Relay[0],TRUE);
Pdu_AppDtcRelayOut(&mPduApp.Relay[1],TRUE);
Pdu_AppDtcRelayOut(&mPduApp.Relay[2],TRUE);
Pdu_AppDtcRelayOut(&mPduApp.Relay[3],FALSE);
break;
case PDU_POWER_MODE_CRANK:
Pdu_AppDtcRelayOut(&mPduApp.Relay[0],FALSE);
Pdu_AppDtcRelayOut(&mPduApp.Relay[1],TRUE);
Pdu_AppDtcRelayOut(&mPduApp.Relay[2],FALSE);
Pdu_AppDtcRelayOut(&mPduApp.Relay[3],TRUE);
break;
default:
break;
}
Pdu_AppDtcRelayEnable(&mPduApp.Relay[0],TRUE);
Pdu_AppDtcRelayEnable(&mPduApp.Relay[1],TRUE);
Pdu_AppDtcRelayEnable(&mPduApp.Relay[2],TRUE);
Pdu_AppDtcRelayEnable(&mPduApp.Relay[3],TRUE);
}
/*****************************************************************************
|Prototype         : 
|Called by         : 
|Preconditions     : -
|Input parameters  : None
|Output parameters : None
|Return value      : None
|Description       : 
*****************************************************************************/
static void Pdu_AppDtcRelayTick(PduDtcRelayType *DtcRelay)
{
if((DtcRelay->Enable))
{ // 20*100MS=2000MS
if(DtcRelay->OutStatus != DtcRelay->InStatus)
{
if(DtcRelay->Time < 0xffff) DtcRelay->Time ++;
if(DtcRelay->Time == 20)
{ // 0.1s*50 = 2s
if(DtcRelay->OutStatus)
{
DtcRelay->ShortToGnd = TRUE;
DtcRelay->Fault= 0x14;
}
else
{
DtcRelay->ShortToBat = TRUE;
DtcRelay->Fault= 0x12;
}
}
}
else
{
DtcRelay->Time = 0;
if(DtcRelay->DurationTime == 10) 
{
if(DtcRelay->ShortToGnd | DtcRelay->ShortToBat)
{
DtcRelay->ShortToGnd = FALSE;
DtcRelay->ShortToBat = FALSE;
DtcRelay->Fault= 0x00;
}
}
}
}
}/* End of function */


/*****************************************************************************
|Prototype         : 
|Called by         : 
|Preconditions     : -
|Input parameters  : None
|Output parameters : None
|Return value      : None
|Description       : 
*****************************************************************************/
static void Pdu_AppDtcRelayEnable(PduDtcRelayType *DtcRelay,u8 Enable)
{
if(DtcRelay->Enable == Enable)return;
DtcRelay->Enable = Enable;
}/* End of function */


/*****************************************************************************
|Prototype         : 
|Called by         : 
|Preconditions     : -
|Input parameters  : None
|Output parameters : None
|Return value      : None
|Description       : 
*****************************************************************************/
static void Pdu_AppDtcRelayIn(PduDtcRelayType *DtcRelay,KeyIdType KeyId)
{
DtcRelay->InStatus = Keyboard_GetNow(KeyId);
DtcRelay->DurationTime = Keyboard_GetTime(KeyId);
}/* End of function */


/*****************************************************************************
|Prototype         : 
|Called by         : 
|Preconditions     : -
|Input parameters  : None
|Output parameters : None
|Return value      : None
|Description       : 
*****************************************************************************/
static void Pdu_AppDtcRelayOut(PduDtcRelayType *DtcRelay,u8 Status)
{
DtcRelay->OutStatus = Status;
if(Status) DtcRelay->Time = 0;
}/* End of function */


/*****************************************************************************
|Prototype         : 
|Called by         : 
|Preconditions     : -
|Input parameters  : None
|Output parameters : None
|Return value      : None
|Description       : 
*****************************************************************************/
static void Pdu_AppDtcTick(void)
{ // 10ms
PduRelayType cPduRelay;


mPduApp.DtcTick++;
if(mPduApp.DtcTick < 10)return;
mPduApp.DtcTick = 0;

Pdu_AppDtcRelayIn(&mPduApp.Relay[0],DTC_IN_ACC);
Pdu_AppDtcRelayIn(&mPduApp.Relay[1],DTC_IN_IGN1);
Pdu_AppDtcRelayIn(&mPduApp.Relay[2],DTC_IN_IGN2);
Pdu_AppDtcRelayIn(&mPduApp.Relay[3],DTC_IN_ST);


Pdu_AppDtcRelayTick(&mPduApp.Relay[0]);
Pdu_AppDtcRelayTick(&mPduApp.Relay[1]);
Pdu_AppDtcRelayTick(&mPduApp.Relay[2]);
Pdu_AppDtcRelayTick(&mPduApp.Relay[3]);

cPduRelay.RelayKLR= mPduApp.Relay[0].InStatus;
cPduRelay.RelayKL15= mPduApp.Relay[1].InStatus;
cPduRelay.RelayKL50= mPduApp.Relay[3].InStatus;
Pdu_AppSetCanRelay(cPduRelay);
}/* End of function */


/*****************************************************************************
|Prototype         : 
|Called by         : 
|Preconditions     : -
|Input parameters  : None
|Output parameters : None
|Return value      : None
|Description       : 
*****************************************************************************/
static void Pdu_AppModeTick(void)
{
if(mPduApp.SsbSwDelay)mPduApp.SsbSwDelay --;
if(mPduApp.ModeSaveDelay)mPduApp.ModeSaveDelay --;

switch(mPduApp.Mode)
{
case PDU_POWER_MODE_ACC:
if(mPduApp.ModeTimeOut)
{
mPduApp.ModeTimeOut--;
if(mPduApp.ModeTimeOut == 0)
{
if(mPduApp.AppTask == 0)break;
(void)SetEvent(mPduApp.AppTask,PDU_EVENT_POWER_MODE_TIME_OUT);
}
}
break;
case PDU_POWER_MODE_CRANK:
if((Pdu_AppGetCrankMode() == FALSE)
||(Pdu_AppGetEmsState() == TRUE))
{
if(mPduApp.AppTask == 0)break;
(void)SetEvent(mPduApp.AppTask,PDU_EVENT_CRANK_STOP);
}
break;
default:
mPduApp.ModeTimeOut = PDU_POWER_MODE_ACC_TIME_OUT;
break;
}
}/* End of function */
/*****************************************************************************
|Prototype         : 
|Called by         : 
|Preconditions     : -
|Input parameters  : None
|Output parameters : None
|Return value      : None
|Description       : 
*****************************************************************************/
static void Pdu_AppClrWarningTick(void)
{
UhfAppReadType cUhfAppRead;

if(mPduApp.WarningTick){mPduApp.WarningTick --;return;}


mPduApp.WarningTick = 10;


if(mPduApp.WarningTimeOut)
{
mPduApp.WarningTimeOut--;
if((mPduApp.AppTask))
{
(void)SetEvent(mPduApp.AppTask,PDU_EVENT_UPDATE_WARNING);
}
}
}
/*****************************************************************************
|Prototype         : 
|Called by         : 
|Preconditions     : -
|Input parameters  : None
|Output parameters : None
|Return value      : None
|Description       : 
*****************************************************************************/
void Pdu_AppTick(void)
{ // 10ms
Pdu_AppDtcTick();
Pdu_AppModeTick();
Pdu_AppDcmRetIo();
Pdu_AppClrWarningTick();
}/* End of function */


/*****************************************************************************
|Prototype         : 
|Called by         : 
|Preconditions     : -
|Input parameters  : None
|Output parameters : None
|Return value      : None
|Description       : 
*****************************************************************************/
StateType Pdu_AppRead(PduAppCmdType cmd,PduAppReadType *data)
{
Common_CompNullSp(data);
switch(cmd)
{
case CMD_PDU_APP_SLEEP:
data->Sleep = mPduApp.Sleep;
break;
case CMD_PDU_APP_READ:
data->PowerMode = mPduApp.Mode;
data->DtcFault = mPduApp.DtcFault;
data->SatisfyCrank= Pdu_AppGetCrankMode();
data->SatisfyStop= Pdu_AppGetStopMode();
break;
default:
return STATE_ERROR;
break;
}
return STATE_SUCCESS;
}/* End of function */


/*****************************************************************************
|Prototype         : 
|Called by         : 
|Preconditions     : -
|Input parameters  : None
|Output parameters : None
|Return value      : None
|Description       : 
*****************************************************************************/
StateType Pdu_AppWrite(PduAppCmdType cmd,PduAppWriteType *data)
{
EventMaskType Mask;


Common_CompNullSp(data);
#ifdef DCM_APP_USER_EN
if(Dcm_AppGetUser(DCM_USER_PDU))
{
if(Cmd_SearchCmd(cmd,PduAppTabAdmin,PDU_APP_ADMIN_NUM) == FALSE)
{ /* Search  FALSE*/
return STATE_FAILED;
}
}
#endif
switch(cmd)
{
case CMD_PDU_APP_AUTH_KEY:
mPduApp.Auth.Key= data->Auth.Key;
break;
case CMD_PDU_APP_AUTH_ESCL:
mPduApp.Auth.Escl = data->Auth.Escl;
break;
case CMD_PDU_APP_AUTH_EMS:
mPduApp.Auth.Ems= data->Auth.Ems;
break;
case CMD_PDU_APP_DCM:
mPduApp.DcmControl= data->DcmControl;
(void)Pdu_DriveWrite(mPduApp.DcmControl);
break;
default:
break;
}
Mask = Cmd_GetEvent(cmd,PduAppTabEvent,PDU_APP_EVENT_NUM);
if(Mask == 0xff)return STATE_ERROR;
if(mPduApp.AppTask == 0)return STATE_FAILED;
(void)SetEvent(mPduApp.AppTask,Mask);
return STATE_SUCCESS;
}
/*****************************************************************************
|Prototype         : 
|Called by         : 
|Preconditions     : -
|Input parameters  : None
|Output parameters : None
|Return value      : None
|Description       : 
*****************************************************************************/
StateType Pdu_AppSetCmd(PduAppCmdType cmd)
{
PduAppWriteType tPduAppWrite;

return Pdu_AppWrite(cmd,&tPduAppWrite);
}


/*****************************************************************************
|Prototype         : 
|Called by         : 
|Preconditions     : -
|Input parameters  : None
|Output parameters : None
|Return value      : None
|Description       : 
*****************************************************************************/
static void Pdu_AppDcmRetIo(void)
{
#ifdef DCM_APP_USER_EN
u8 cMode;


if(mPduApp.DcmControl)
{
if(Dcm_AppGetUser(DCM_USER_PDU) != TRUE)
{
mPduApp.DcmControl = 0;
cMode = (u8)Cmd_GetNewCmd(mPduApp.Mode,PduAppTabPowerMode,PDU_APP_POWER_MODE_NUM);
(void)Pdu_DriveWrite(cMode);
}
}
#endif
}
0 0
原创粉丝点击