RabbitECUTeensyMCUXpresso/source/Client/SENSORS.c

871 lines
25 KiB
C

/******************************************************************************/
/* Copyright (c) 2016 MD Automotive Controls. Original Work. */
/* License: http://www.gnu.org/licenses/gpl.html GPL version 2 or higher */
/******************************************************************************/
/* CONTEXT:USER_APP */
/* PACKAGE TITLE: Sensors */
/* DESCRIPTION: This code manages the sensors AD conversions */
/* */
/* */
/* FILE NAME: SENSORS.c */
/* REVISION HISTORY: 28-03-2016 | 1.0 | Initial revision */
/* */
/******************************************************************************/
#define _SENSORS_C
/******************************************************************************/
/* HEADER FILES */
/******************************************************************************/
#include "build.h"
#ifdef BUILD_USER
#include "SENSORS.h"
#include "USERMATH.h"
#include "IAC.h"
#include "FME.h"
/* LOCAL VARIABLE DEFINITIONS (STATIC) ****************************************/
uint32 SENSORS_u32RunCounter;
uint8 SENSORS_au8CANBufferMap[] = SENSORS_nCANBufferMap;
SENSORS_tenADConfig SENSORS_aenADConfig[SENSORS_enADCount];
uint16 SENSORS_au16ADSensorValue[SENSORS_enADCount];
uint16 SENSORS_au16ADSensorFiltered[SENSORS_enADCount];
SPREADAPI_ttSpreadIDX SENSORS_tSpreadPedalTransferIDX;
TABLEAPI_ttTableIDX SENSORS_tTablePedalTransferIDX;
/* LOCAL FUNCTION PROTOTYPES (STATIC) *****************************************/
static void SENSORS_vCEMCallBack(IOAPI_tenEHIOResource enEHIOResource, TEPMAPI_ttEventTime tEventTime);
static void SENSORS_vGetCANSensorData(void);
static void SENSORS_vADCCallBack(IOAPI_tenEHIOResource enEHIOResource, uint32 u32ADCResult);
static void SENSORS_vAddConfiguredAD(SENSORS_tenADConfig enADConfig);
/* GLOBAL FUNCTION DEFINITIONS ************************************************/
void SENSORS_vStart(puint32 const pu32Arg)
{
IOAPI_tenEHIOResource enEHIOResource;
IOAPI_tenEHIOType enEHIOType;
IOAPI_tenDriveStrength enDriveStrength;
TEPMAPI_tstTEPMChannelCB stTEPMChannelCB;
TEPMAPI_tstTEPMResourceCB stTEPMResourceCB;
TEPMAPI_tstTimedUserEvent stTimedEvent;
SENSORS_u32RunCounter = 0;
uint32 u32IDX;
bool boOK;
#ifdef BUILD_CTS_PULLUP_SENSE
enEHIOResource = CTS_nSwitchPin;
SETUP_vSetupDigitalIO(enEHIOResource, enEHIOType, enDriveStrength, pu32Arg);
#endif
/* Request and initialise required Kernel managed spread for pedal transfer */
SENSORS_tSpreadPedalTransferIDX = SETUP_tSetupSpread((void*)&SENSORS_u32PPSMVoltsRamp, (void*)&USERCAL_stRAMCAL.aUserPedalTransferSpread, TYPE_enUInt32, 17, SPREADAPI_enSpread4ms, NULL);
/* Request and initialise required Kernel managed table for coolant sensor */
SENSORS_tTablePedalTransferIDX = SETUP_tSetupTable((void*)&USERCAL_stRAMCAL.aUserPedalTransferTable, (void*)&SENSORS_u16TPSSafeMax, TYPE_enUInt16, 17, SENSORS_tSpreadPedalTransferIDX, NULL);
/* Request and initialise FTM for CRANK_nInput */
enEHIOResource = EH_VIO_FTM3;
enEHIOType = IOAPI_enTEPM;
USER_vSVC(SYSAPI_enRequestIOResource, (void*)&enEHIOResource, (void*)NULL, (void*)NULL);
/* ONLY CONFIGURE THE TC3 MODULE ONCE PER PROJECT! */
if (SYSAPI_enOK == pstSVCDataStruct->enSVCResult)
{
stTEPMResourceCB.enEHIOResource = EH_VIO_FTM3;
stTEPMResourceCB.enPreScalar = SENSORS_nFastFTMDivisor;
stTEPMResourceCB.enCountType = TEPMAPI_enCountUp;
USER_vSVC(SYSAPI_enInitialiseIOResource, (void*)&enEHIOResource,
(void*)&enEHIOType, (void*)&stTEPMResourceCB);
}
/* Request and initialise CRANK_nInput */
enEHIOResource = CRANK_nInput;
enEHIOType = IOAPI_enCaptureCompare;
USER_vSVC(SYSAPI_enRequestIOResource, (void*)&enEHIOResource, (void*)NULL, (void*)NULL);
/* Initialise the TEPM channel CRANK_nInput */
if (SYSAPI_enOK == pstSVCDataStruct->enSVCResult)
{
stTEPMChannelCB.enAction = TEPMAPI_enCapRising;
stTEPMChannelCB.boInterruptEnable = TRUE;
stTEPMChannelCB.enLinkedResource = VR_nPhaseTelltalePin;
stTEPMChannelCB.boRecursive = TRUE;
USER_vSVC(SYSAPI_enInitialiseIOResource, (void*)&enEHIOResource,
(void*)&enEHIOType, (void*)&stTEPMChannelCB);
}
stTimedEvent.enMethod = TEPMAPI_enLinkPrimaryProgram;
stTimedEvent.pfEventCB = &SENSORS_vCEMCallBack;
USER_vSVC(SYSAPI_enConfigureUserTEPMInput, (void*)&enEHIOResource,
(void*)&stTimedEvent, (void*)NULL);
#ifdef BUILD_BSP_AFM_FREQ
/* Request and initialise AFM_FREQ_nInput */
enEHIOResource = AFM_FREQ_nInput;
enEHIOType = IOAPI_enCaptureCompare;
USER_vSVC(SYSAPI_enRequestIOResource, (void*)&enEHIOResource, (void*)NULL, (void*)NULL);
/* Initialise the TEPM channel AFM_FREQ_nInput */
if (SYSAPI_enOK == pstSVCDataStruct->enSVCResult)
{
stTEPMChannelCB.enAction = TEPMAPI_enCapRising;
stTEPMChannelCB.boInterruptEnable = TRUE;
stTEPMChannelCB.boRecursive = FALSE;
USER_vSVC(SYSAPI_enInitialiseIOResource, (void*)&enEHIOResource,
(void*)&enEHIOType, (void*)&stTEPMChannelCB);
}
stTimedEvent.enMethod = TEPMAPI_enLinkFreqInput;
stTimedEvent.pfEventCB = &SENSORS_vCEMCallBack;
#endif //BUILD_BSP_AFM_FREQ
USER_vSVC(SYSAPI_enConfigureUserTEPMInput, (void*)&enEHIOResource,
(void*)&stTimedEvent, (void*)NULL);
/* Enable the Hall-Effect sensor type */
enEHIOResource = VRA_nPullupEnablePin;
enEHIOType = IOAPI_enDIOOutput;
enDriveStrength = IOAPI_enStrong;
SETUP_vSetupDigitalIO(enEHIOResource, enEHIOType, enDriveStrength, pu32Arg);
enEHIOResource = VRB_nPullupEnablePin;
SETUP_vSetupDigitalIO(enEHIOResource, enEHIOType, enDriveStrength, pu32Arg);
enEHIOResource = VRA_nVREnablePin;
SETUP_vSetupDigitalIO(enEHIOResource, enEHIOType, enDriveStrength, pu32Arg);
enEHIOResource = VRB_nVREnablePin;
SETUP_vSetupDigitalIO(enEHIOResource, enEHIOType, enDriveStrength, pu32Arg);
enEHIOResource = VR_nHystHighPin;
SETUP_vSetupDigitalIO(enEHIOResource, enEHIOType, enDriveStrength, pu32Arg);
enEHIOResource = VR_nHystLowPin;
SETUP_vSetupDigitalIO(enEHIOResource, enEHIOType, enDriveStrength, pu32Arg);
enEHIOResource = VVTAB_nPullupEnablePin;
SETUP_vSetupDigitalIO(enEHIOResource, enEHIOType, enDriveStrength, pu32Arg);
enEHIOResource = VVTCD_nPullupEnablePin;
SETUP_vSetupDigitalIO(enEHIOResource, enEHIOType, enDriveStrength, pu32Arg);
enEHIOResource = VR_nPhaseTelltalePin;
SETUP_vSetupDigitalIO(enEHIOResource, enEHIOType, enDriveStrength, pu32Arg);
if (TRUE == USERCAL_stRAMCAL.u8UserPrimaryVREnable)
{
SETUP_vSetDigitalIOHigh(VRA_nVREnablePin);
SETUP_vSetDigitalIOLow(VRA_nPullupEnablePin);
}
else
{
SETUP_vSetDigitalIOLow(VRA_nVREnablePin);
SETUP_vSetDigitalIOHigh(VRA_nPullupEnablePin);
}
if (TRUE == USERCAL_stRAMCAL.u8UserSecondaryVREnable)
{
SETUP_vSetDigitalIOLow(VRB_nPullupEnablePin);
SETUP_vSetDigitalIOHigh(VRB_nVREnablePin);
}
else
{
SETUP_vSetDigitalIOHigh(VRB_nPullupEnablePin);
SETUP_vSetDigitalIOLow(VRB_nVREnablePin);
}
if (TRUE == USERCAL_stRAMCAL.u8VCTABPullupEnable)
{
SETUP_vSetDigitalIOHigh(VVTAB_nPullupEnablePin);
}
else
{
SETUP_vSetDigitalIOLow(VVTAB_nPullupEnablePin);
}
if (TRUE == USERCAL_stRAMCAL.u8VCTCDPullupEnable)
{
SETUP_vSetDigitalIOHigh(VVTCD_nPullupEnablePin);
}
else
{
SETUP_vSetDigitalIOLow(VVTCD_nPullupEnablePin);
}
SETUP_vSetDigitalIOHigh(VR_nHystHighPin);
SETUP_vSetDigitalIOLow(VR_nHystLowPin);
SENSORS_u8CANCTS = 0xff;
SENSORS_u8CANATS = 0xff;
SENSORS_u8CANSTT[0] = 0xff;
SENSORS_u8CANSTT[1] = 0xff;
SENSORS_u8CANLTT[0] = 0xff;
SENSORS_u8CANLTT[1] = 0xff;
DIAG_u8PowerModeActive = 0;
for (u32IDX = 0; u32IDX < SENSORS_enADCount; u32IDX++)
{
SENSORS_aenADConfig[u32IDX] = SENSORS_enADInvalid;
}
/* Start CAN right away */
DIAG_u16PowerModeActiveCount = 1000;
if (EH_IO_Invalid != USERCAL_stRAMCAL.u16AFRADResource)
{
/* Request and initialise the AFR ADC input channel */
boOK = SETUP_boSetupADSE(USERCAL_stRAMCAL.u16AFRADResource, IOAPI_enADSE, ADCAPI_en32Samples, &SENSORS_vADCCallBack, ADCAPI_enTrigger2, pu32Arg);
if (TRUE == boOK)
{
SENSORS_vAddConfiguredAD(SENSORS_enADAFR);
}
}
if (EH_IO_Invalid != USERCAL_stRAMCAL.u16PPSMADResource)
{
/* Request and initialise the PPSM ADC input channel */
boOK = SETUP_boSetupADSE(USERCAL_stRAMCAL.u16PPSMADResource, IOAPI_enADSE, ADCAPI_en32Samples, &SENSORS_vADCCallBack, ADCAPI_enTrigger2, pu32Arg);
if (TRUE == boOK)
{
SENSORS_vAddConfiguredAD(SENSORS_enADPPSM);
}
}
if (EH_IO_Invalid != USERCAL_stRAMCAL.u16PPSSADResource)
{
/* Request and initialise the PPSS ADC input channel */
boOK = SETUP_boSetupADSE(USERCAL_stRAMCAL.u16PPSSADResource, IOAPI_enADSE, ADCAPI_en32Samples, &SENSORS_vADCCallBack, ADCAPI_enTrigger2, pu32Arg);
if (TRUE == boOK)
{
SENSORS_vAddConfiguredAD(SENSORS_enADPPSS);
}
}
if (EH_IO_Invalid != USERCAL_stRAMCAL.au16AuxInputResource[0])
{
/* Request and initialise the PPSS ADC input channel */
boOK = SETUP_boSetupADSE(USERCAL_stRAMCAL.au16AuxInputResource[0], IOAPI_enADSE, ADCAPI_en32Samples, &SENSORS_vADCCallBack, ADCAPI_enTrigger2, pu32Arg);
if (TRUE == boOK)
{
SENSORS_vAddConfiguredAD(SENSORS_enAUX1);
}
}
if (EH_IO_Invalid != USERCAL_stRAMCAL.au16AuxInputResource[1])
{
/* Request and initialise the PPSS ADC input channel */
boOK = SETUP_boSetupADSE(USERCAL_stRAMCAL.au16AuxInputResource[1], IOAPI_enADSE, ADCAPI_en32Samples, &SENSORS_vADCCallBack, ADCAPI_enTrigger2, pu32Arg);
if (TRUE == boOK)
{
SENSORS_vAddConfiguredAD(SENSORS_enAUX2);
}
}
if (EH_IO_Invalid != USERCAL_stRAMCAL.au16AuxInputResource[2])
{
/* Request and initialise the PPSS ADC input channel */
boOK = SETUP_boSetupADSE(USERCAL_stRAMCAL.au16AuxInputResource[2], IOAPI_enADSE, ADCAPI_en32Samples, &SENSORS_vADCCallBack, ADCAPI_enTrigger2, pu32Arg);
if (TRUE == boOK)
{
SENSORS_vAddConfiguredAD(SENSORS_enAUX3);
}
}
if (EH_IO_Invalid != USERCAL_stRAMCAL.au16AuxInputResource[3])
{
/* Request and initialise the PPSS ADC input channel */
boOK = SETUP_boSetupADSE(USERCAL_stRAMCAL.au16AuxInputResource[3], IOAPI_enADSE, ADCAPI_en32Samples, &SENSORS_vADCCallBack, ADCAPI_enTrigger2, pu32Arg);
if (TRUE == boOK)
{
SENSORS_vAddConfiguredAD(SENSORS_enAUX4);
}
}
for (u32IDX = 0; u32IDX < SENSORS_enADCount; u32IDX++)
{
SENSORS_au16ADSensorValue[u32IDX] = 0xffff;
}
}
static void SENSORS_vAddConfiguredAD(SENSORS_tenADConfig enADConfig)
{
uint32 u32IDX;
for (u32IDX = 0; u32IDX < SENSORS_enADCount; u32IDX++)
{
if (SENSORS_enADInvalid == SENSORS_aenADConfig[u32IDX])
{
SENSORS_aenADConfig[u32IDX] = enADConfig;
break;
}
}
}
void SENSORS_vRun(puint32 const pu32Arg)
{
ADCAPI_tenTrigger enTrigger;
uint8 u8TriggerHystLow = 2 - USERCAL_stRAMCAL.u8TriggerPullStrength;
uint8 u8TriggerHystHigh = 4 + USERCAL_stRAMCAL.u8TriggerPullStrength;
uint32 u32AUXIDX = SENSORS_u32RunCounter & 0x7;
uint16 u32Temp;
static bool boSensorRPMHystLimit;
boSensorRPMHystLimit = USERCAL_stRAMCAL.u16SensorHystLimitRPM > CAM_u32RPMFiltered ? FALSE : boSensorRPMHystLimit;
boSensorRPMHystLimit = ((9 * USERCAL_stRAMCAL.u16SensorHystLimitRPM) / 8) < CAM_u32RPMFiltered ?
TRUE : boSensorRPMHystLimit;
if (0 == (SENSORS_u32RunCounter % SENSORS_nFastPeriod))
{
enTrigger = ADCAPI_enTrigger4;
USER_vSVC(SYSAPI_enTriggerADQueue, (void*)&enTrigger, (void*)NULL, (void*)NULL);/*CR1_12*/
}
#ifdef BUILD_CTS_PULLUP_SENSE
static uint32 u32Count;
if (0 == (SENSORS_u32RunCounter % SENSORS_nSlowPeriod))
{
if (0 == (u32Count++ % 2))
{
SENSORS_boCTSACBiasHigh = TRUE;
SETUP_vSetDigitalIOHigh(CTS_nSwitchPin);
}
else
{
SENSORS_boCTSACBiasHigh = FALSE;
SETUP_vSetDigitalIOLow(CTS_nSwitchPin);
}
}
#endif
if (1 == (SENSORS_u32RunCounter % SENSORS_nSlowPeriod))
{
enTrigger = ADCAPI_enTrigger2;
USER_vSVC(SYSAPI_enTriggerADQueue, (void*)&enTrigger, (void*)NULL, (void*)NULL);/*CR1_12*/
}
if (FALSE == boSensorRPMHystLimit)
{
if (0 == SENSORS_u32RunCounter % 0x05)
{
if (0 < u8TriggerHystLow)
{
SETUP_vSetDigitalIOHigh(VR_nHystLowPin);
}
else
{
SETUP_vSetDigitalIOLow(VR_nHystLowPin);
}
if (0 < u8TriggerHystHigh)
{
SETUP_vSetDigitalIOHigh(VR_nHystHighPin);
}
else
{
SETUP_vSetDigitalIOLow(VR_nHystHighPin);
}
}
else if (u8TriggerHystLow == SENSORS_u32RunCounter % 0x05)
{
SETUP_vSetDigitalIOLow(VR_nHystLowPin);
}
if (u8TriggerHystHigh == SENSORS_u32RunCounter % 0x05)
{
SETUP_vSetDigitalIOLow(VR_nHystHighPin);
}
}
else
{
SETUP_vSetDigitalIOLow(VR_nHystLowPin);
SETUP_vSetDigitalIOHigh(VR_nHystHighPin);
}
if (0 == SENSORS_u32RunCounter % 0x08)
{
SENSORS_vGetCANSensorData();
}
SENSORS_au16ADSensorFiltered[u32AUXIDX] =
(SENSORS_au16ADSensorValue[u32AUXIDX] +
3 * SENSORS_au16ADSensorFiltered[u32AUXIDX]) / 4;
SENSORS_aboAUXActive[u32AUXIDX] =
SENSORS_au16ADSensorValueFiltered[u32AUXIDX] <
USERCAL_stRAMCAL.au16AuxInputLowThres[u32AUXIDX - SENSORS_enAUX1] ? FALSE : SENSORS_aboAUXActive[u32AUXIDX];
SENSORS_aboAUXActive[u32AUXIDX] =
SENSORS_au16ADSensorValueFiltered[u32AUXIDX] >
USERCAL_stRAMCAL.au16AuxInputHighThres[u32AUXIDX - SENSORS_enAUX1] ? TRUE : SENSORS_aboAUXActive[u32AUXIDX];
if (SENSORS_enADAFR == u32AUXIDX)
{
SENSORS_au16ADSensorValueFiltered[u32AUXIDX] =
CONV_tADCToVolts(USERCAL_stRAMCAL.u16AFRADResource, SENSORS_au16ADSensorFiltered[u32AUXIDX]);
}
if (SENSORS_enADPPSM == u32AUXIDX)
{
SENSORS_au16ADSensorValueFiltered[u32AUXIDX] =
CONV_tADCToVolts(USERCAL_stRAMCAL.u16PPSMADResource, SENSORS_au16ADSensorFiltered[u32AUXIDX]);
SENSORS_u32PPSMVolts = SENSORS_au16ADSensorValueFiltered[u32AUXIDX];
u32Temp = CONV_tADCToVolts(USERCAL_stRAMCAL.u16PPSMADResource, SENSORS_au16ADSensorValue[u32AUXIDX]);
if (u32Temp < SENSORS_u32PPSMVoltsRamp)
{
if ((SENSORS_u32PPSMVoltsRamp - u32Temp) > PPSM_RAMP_MAX_NEG)
{
if (SENSORS_u32PPSMVoltsRamp > PPSM_RAMP_MAX_NEG)
{
SENSORS_u32PPSMVoltsRamp -= PPSM_RAMP_MAX_NEG;
}
}
else
{
SENSORS_u32PPSMVoltsRamp = u32Temp;
}
}
else
{
if ((u32Temp - SENSORS_u32PPSMVoltsRamp) > PPSM_RAMP_MAX_POS)
{
SENSORS_u32PPSMVoltsRamp += PPSM_RAMP_MAX_POS;
}
else
{
SENSORS_u32PPSMVoltsRamp = u32Temp;
}
}
/* Calculate the current spread for pedal transfer */
USER_vSVC(SYSAPI_enCalculateSpread, (void*)&SENSORS_tSpreadPedalTransferIDX,
NULL, NULL);
/* Lookup the current spread for pedal transfer */
USER_vSVC(SYSAPI_enCalculateTable, (void*)&SENSORS_tTablePedalTransferIDX,
NULL, NULL);
if (3000 > SENSORS_u32PPSMVoltsRamp)
{
if ((0 != TORQUE_u16GearShiftCount) && (TRUE == TORQUE_boDownShift))
{
SENSORS_u16TPSSafeMaxModified = SENSORS_u16TPSSafeMax + FME_nBLIP_THROTTLE_DELTA_MAX;
}
else if (0x1234 != USERCAL_stRAMCAL.u16ETCOverrideKeys)
{
/* No higher than pedal authority */
SENSORS_u16TPSSafeMaxModified = SENSORS_u32PPSMVoltsRamp > (uint32)SENSORS_u16TPSSafeMax ?
SENSORS_u16TPSSafeMax : (uint16)SENSORS_u32PPSMVoltsRamp;
}
else
{
/* Else in short overrides by diag */
SENSORS_u16TPSSafeMaxModified = SENSORS_u16TPSSafeMax + FME_nOVERRIDE_DELTA_MAX;
}
}
else
{
SENSORS_u16TPSSafeMaxModified = (5 * SENSORS_u32PPSMVoltsRamp) / 4;
}
}
if (SENSORS_enADPPSS == u32AUXIDX)
{
SENSORS_au16ADSensorValueFiltered[u32AUXIDX] =
CONV_tADCToVolts(USERCAL_stRAMCAL.u16PPSSADResource, SENSORS_au16ADSensorFiltered[u32AUXIDX]);
}
if ((SENSORS_enAUX1 <= u32AUXIDX) && (SENSORS_enAUX4 <= u32AUXIDX))
{
SENSORS_au16ADSensorValueFiltered[u32AUXIDX] =
CONV_tADCToVolts(USERCAL_stRAMCAL.au16AuxInputResource[u32AUXIDX - SENSORS_enAUX1], SENSORS_au16ADSensorFiltered[u32AUXIDX]);
}
#ifdef BUILD_FME
/* FME calls */
if ((EH_IO_Invalid != USERCAL_stRAMCAL.u16PPSMADResource) &&
(EH_IO_Invalid != USERCAL_stRAMCAL.u16PPSSADResource))
{
FME_enUpdateDiagState(FME_enPPSPair, SENSORS_au16ADSensorFiltered[SENSORS_enADPPSM],
SENSORS_au16ADSensorFiltered[SENSORS_enADPPSS]);
FME_enUpdateDiagState(FME_enPPSMSingle, SENSORS_au16ADSensorFiltered[SENSORS_enADPPSM], 0);
FME_enUpdateDiagState(FME_enPPSSSingle, SENSORS_au16ADSensorFiltered[SENSORS_enADPPSS], 0);
}
/* FME calls */
if ((EH_IO_Invalid != USERCAL_stRAMCAL.u16PPSMADResource) &&
(EH_IO_Invalid != USERCAL_stRAMCAL.u16TPSADResource))
{
FME_enUpdateDiagState(FME_enPedalTransfer, SENSORS_u16TPSSafeMaxModified,
TPS_tSensorVolts);
}
#endif //BUILD_FME
SENSORS_u32RunCounter++;
}
void SENSORS_vInvalidateCAN16Data(uint32 u32MSGIDX, uint32 u32DataOffset)
{
IOAPI_tenEHIOResource enEHIOResource;
puint8 pu8CANDataBuffer;
enEHIOResource = EH_VIO_CAN1;
USER_vSVC(SYSAPI_enGetRawCommsBuffer, (void*)&enEHIOResource, (void*)NULL, (void*)NULL);
if (SYSAPI_enOK == pstSVCDataStruct->enSVCResult)
{
pu8CANDataBuffer = (puint8)pstSVCDataStruct->pvArg1;
pu8CANDataBuffer += (8 * u32MSGIDX);
pu8CANDataBuffer += u32DataOffset;
memset(pu8CANDataBuffer, 0xff, 2);
}
}
static void SENSORS_vGetCANSensorData()
{
IOAPI_tenEHIOResource enEHIOResource;
uint8* pu8CANDataBuffer = {0};
enEHIOResource = EH_VIO_CAN1;
uint16 u16Temp;
sint16 s16Temp;
sint32 s32Temp;
static uint8 u8OldGear;
static uint8 u8OldDistCount;
static sint16 s16OldDistance;
static uint32 u32VSSTimeout = 0;
USER_vSVC(SYSAPI_enGetRawCommsBuffer, (void*)&enEHIOResource, (void*)NULL, (void*)NULL);
if (SYSAPI_enOK == pstSVCDataStruct->enSVCResult)
{
pu8CANDataBuffer = (puint8)pstSVCDataStruct->pvArg1;
}
if (NULL != pu8CANDataBuffer)
{
SENSORS_boCANNewGearPositionSample = pu8CANDataBuffer[11] != 0xff;
if (TRUE == SENSORS_boCANNewGearPositionSample)
{
switch ((pu8CANDataBuffer[11] & 0xf0) >> 4)
{
case 8: DIAG_u8GearSelectorReport = 0; break;
case 7: DIAG_u8GearSelectorReport = 1; break;
case 6: DIAG_u8GearSelectorReport = 2; break;
case 5: DIAG_u8GearSelectorReport = 3; break;
case 12: DIAG_u8GearSelectorReport = 4; break;
case 10: DIAG_u8GearSelectorReport = 5; break;
case 11: DIAG_u8GearSelectorReport = 6; break;
default: DIAG_u8GearSelectorReport = 15; break;
}
SENSORS_boCANNewGearPositionSample = FALSE;
}
SENSORS_boCANNewBrakePressedSample = pu8CANDataBuffer[30] != 0xff;
if (TRUE == SENSORS_boCANNewBrakePressedSample)
{
SENSORS_boBrakePedalPressed = 0 != (pu8CANDataBuffer[30] & 0x40);
SENSORS_boCANNewBrakePressedSample = FALSE;
}
/* Check CAN torque reduction requests */
SENSORS_boCANNewTorqueRequestSample = pu8CANDataBuffer[19] != 0xff;
if (TRUE == SENSORS_boCANNewTorqueRequestSample)
{
if ((0xf & pu8CANDataBuffer[18]) != u8OldGear)
{
TORQUE_u8ATXSelectedGear = 0xf & pu8CANDataBuffer[18];
TORQUE_boDownShift = u8OldGear > (0xf & pu8CANDataBuffer[18]) ? TRUE : FALSE;
u8OldGear = 0xf & pu8CANDataBuffer[18];
if (0 == TORQUE_boDownShift)
{
TORQUE_u16GearShiftCount = USERCAL_stRAMCAL.u16ShiftUpCountLimit;
}
else
{
TORQUE_u16GearShiftCount = USERCAL_stRAMCAL.u16ShiftDownCountLimit;
}
TORQUE_u16GearShiftPressureControlCount = USERCAL_stRAMCAL.u16ShiftCountPressureControlLimit;
}
else
{
TORQUE_u16GearShiftCount = 0 != TORQUE_u16GearShiftCount ? TORQUE_u16GearShiftCount - 1 : 0;
TORQUE_u16GearShiftPressureControlCount = 0 != TORQUE_u16GearShiftPressureControlCount ?
TORQUE_u16GearShiftPressureControlCount - 1 : 0;
}
if (0x80 == (0x80 & pu8CANDataBuffer[19]))
{
if (0 != TORQUE_u16GearShiftCount)
{
/* DSG torque reduction request */
if (EST_nIgnitionReqDSGCutsStage3 != EST_enIgnitionTimingRequest)
{
EST_enIgnitionTimingRequest = EST_nIgnitionReqDSGStage2;
}
}
}
else if (0x05 == (0x05 & pu8CANDataBuffer[19]))
{
/* DSG torque reduction request */
EST_enIgnitionTimingRequest = EST_nIgnitionReqDSGStage1;
}
else
{
/* DSG normal */
EST_enIgnitionTimingRequest = EST_nIgnitionReqPrimary;
}
TORQUE_u32ATXTorqueLimit = pu8CANDataBuffer[16];
}
/* Get power mode */
u16Temp = pu8CANDataBuffer[0] + (pu8CANDataBuffer[1] << 8);
if (DIAG_u16PowerModeCode != u16Temp)
{
DIAG_u8PowerModeActive = TRUE;
DIAG_u16PowerModeActiveCount = 200;
DIAG_u16PowerModeCode = u16Temp;
}
else
{
DIAG_u16PowerModeActiveCount = 0 < DIAG_u16PowerModeActiveCount ?
DIAG_u16PowerModeActiveCount - 1 : DIAG_u16PowerModeActiveCount;
DIAG_u8PowerModeActive = 0 < DIAG_u16PowerModeActiveCount;
}
/* Get VSS */
if (u8OldDistCount != (0x80 & pu8CANDataBuffer[8]))
{
u8OldDistCount = 0x80 & pu8CANDataBuffer[8];
s16Temp = pu8CANDataBuffer[13] * 0x100 + pu8CANDataBuffer[14];
if (s16Temp >= s16OldDistance)
{
s32Temp = (sint32)s16Temp - (sint32)s16OldDistance;
}
else if (s16Temp < s16OldDistance)
{
s32Temp = (sint32)s16Temp - (sint32)s16OldDistance;
s32Temp += 2048;
}
s32Temp *= USERCAL_stRAMCAL.u16VSSCANCal;
s32Temp /= 100;
s32Temp = 0x10000 > s32Temp ? s32Temp : 0xffff;
SENSORS_u16CANVSS = ((uint16)s32Temp / 2) + (SENSORS_u16CANVSS / 2);
s16OldDistance = s16Temp;
u32VSSTimeout = 0;
}
else if (u32VSSTimeout > 125)
{
SENSORS_u16CANVSS = 0;
}
else
{
u32VSSTimeout++;
}
/* Calculate gear */
/* Calculate km/h per 1000 rpm */
s32Temp = SENSORS_u16CANVSS * 1000 / CAM_u32RPMFiltered;
/* Default to no gear */
SENSORS_u8VSSCalcGear = 0;
SENSORS_u16VSSCalcGearRPMSlip = 65535;
for (u16Temp = 0; u16Temp < 8; u16Temp++)
{
s16Temp = (sint16)s32Temp - USERCAL_stRAMCAL.u16VSSPerRPM[u16Temp];
if ((USERCAL_stRAMCAL.u16VSSPerRPM[0] / 4) > (ABS(s16Temp)))
{
/* If small error then this is correct gear */
SENSORS_u8VSSCalcGear = u16Temp + 1;
/* Calculate RPM slip */
s32Temp = (1000 * SENSORS_u16CANVSS) / USERCAL_stRAMCAL.u16VSSPerRPM[u16Temp];
s32Temp -= (sint32)CAM_u32RPMFiltered;
s32Temp = ABS(s32Temp);
SENSORS_u16VSSCalcGearRPMSlip = (uint16)s32Temp;
break;
}
}
}
}
void SENSORS_vTerminate(puint32 const pu32Arg)
{
}
void SENSORS_vCallBack(puint32 const pu32Arg)
{
}
static void SENSORS_vADCCallBack(IOAPI_tenEHIOResource enEHIOResource, uint32 u32ADCResult)
{
sint32 s32Temp;
if (USERCAL_stRAMCAL.u16AFRADResource == enEHIOResource)
{
s32Temp = USERCAL_stRAMCAL.s32AFRADInputGain * (sint32)u32ADCResult;
s32Temp /= 1000;
s32Temp += USERCAL_stRAMCAL.s32AFRADInputOffset;
CLO2_au16AFRMeasured[0] = (uint32)s32Temp;
s32Temp *= (sint32)USERCAL_stRAMCAL.u16AFRFuelTypeGain;
s32Temp /= 1000;
if (65536 > s32Temp)
{
CLO2_au16AFRDisplayMeasured[0] = (uint16)(s32Temp);
}
else
{
CLO2_au16AFRDisplayMeasured[0] = 0xffff;
}
}
else if (USERCAL_stRAMCAL.u16PPSMADResource == enEHIOResource)
{
SENSORS_au16ADSensorValue[SENSORS_enADPPSM] = u32ADCResult;
}
else if (USERCAL_stRAMCAL.u16PPSSADResource == enEHIOResource)
{
SENSORS_au16ADSensorValue[SENSORS_enADPPSS] = u32ADCResult;
}
else if (USERCAL_stRAMCAL.au16AuxInputResource[0] == enEHIOResource)
{
SENSORS_au16ADSensorValue[SENSORS_enAUX1] = (uint16)u32ADCResult;
}
else if (USERCAL_stRAMCAL.au16AuxInputResource[1] == enEHIOResource)
{
SENSORS_au16ADSensorValue[SENSORS_enAUX2] = (uint16)u32ADCResult;
}
else if (USERCAL_stRAMCAL.au16AuxInputResource[2] == enEHIOResource)
{
SENSORS_au16ADSensorValue[SENSORS_enAUX3] = (uint16)u32ADCResult;
}
else if (USERCAL_stRAMCAL.au16AuxInputResource[3] == enEHIOResource)
{
SENSORS_au16ADSensorValue[SENSORS_enAUX4] = (uint16)u32ADCResult;
}
}
static void SENSORS_vCEMCallBack(IOAPI_tenEHIOResource enEHIOResource, TEPMAPI_ttEventTime tEventTime)
{
uint32 u32Hertz;
uint32 u32Temp;
static uint32 au32Hertz[SENSORS_nAFMHertzSamples];
static uint32 u32HertzSampleIDX;
switch (enEHIOResource)
{
case CRANK_nInput:
{
CAM_vEngineSpeedCB(tEventTime);
break;
}
#ifdef BUILD_BSP_AFM_FREQ
case AFM_FREQ_nInput:
{
au32Hertz[u32HertzSampleIDX] = (uint32)SENSORS_nSlowFTMFreq / tEventTime;
u32Hertz = USERMATH_u32DiscardAndAverage32(au32Hertz, SENSORS_nAFMHertzSamples, 1);
u32Temp = 20 + (TPS_tThetaFiltered / 1500);
if ((AFM_tSensorHertz + u32Temp) < u32Hertz)
{
AFM_tSensorHertz += u32Temp;
}
else if (((AFM_tSensorHertz - u32Temp) > u32Hertz) &&
(100u < AFM_tSensorHertz))
{
AFM_tSensorHertz -= u32Temp;
}
else
{
AFM_tSensorHertz = u32Hertz;
}
u32HertzSampleIDX = (u32HertzSampleIDX + 1) % SENSORS_nAFMHertzSamples;
break;
}
#endif //BUILD_BSP_AFM_FREQ
default:
{
break;
}
}
}
bool SENSORS_boGetAuxActive(SENSORS_tenAUXConfig enAUXConfig)
{
uint32 u32IDX;
bool boFound = FALSE;
bool boActiveLow;
bool boActive = FALSE;
for (u32IDX = 0; u32IDX < SENSORS_nAuxChannelCount; u32IDX++)
{
if (USERCAL_stRAMCAL.au16AuxInputFunction[u32IDX] == enAUXConfig)
{
boFound = TRUE;
break;
}
}
if (TRUE == boFound)
{
boActiveLow = (0 == (USERCAL_stRAMCAL.au16AuxInputFunction[u32IDX] & 1));
if (TRUE == boActiveLow)
{
boActive = !SENSORS_aboAUXActive[u32IDX + SENSORS_enAUX1];
}
else
{
boActive = SENSORS_aboAUXActive[u32IDX + SENSORS_enAUX1];
}
}
return boActive;
}
#endif //BUILD_USER