diff --git a/UDS/diagnosis_mid.c b/UDS/diagnosis_mid.c index f5df57d..05ce200 100644 --- a/UDS/diagnosis_mid.c +++ b/UDS/diagnosis_mid.c @@ -1,1357 +1,1368 @@ -#include "uds_config.h" -#include "uds_nvm.h" -#include "BSP_CAN.h" -#include "crc.h" -#if BOOTLOADER_CODE_FLAG == 0 -#include "can.h" -#include "Car_CANIDInfo.h" - -const uint8_t SWFingerPrint[12] __attribute__((at(APP_FlagAddress))) = - {'S','5','0','8','_','D','C','U','2','4','0','1'}; -#else - -#endif - - -//INT32U g_ulRand=0; -DIDs gDIDCache; - - -//uint8_t g_testerprogramdateflag = false; -//uint8_t g_testerserialnubnerflag = false; - -//extern INT8U strMcuAppst[4]; -//extern INT8U strMcuAppDate[4]; -extern INT32U ParseCanRxCnt; -extern uint32_t FBL_AppSize; - - -//_HSCANERROR HsCanError; -uint32_t g_ulCanStatus; - -VehicleInfo2UdsType vehicleInfo2uds; -UdsInfo2VehicleType udsInfo2Vehicle = { - .NcmRxEnable = true, - .NcmTxEnable = true, - .NmcmRxEnable = true, - .NmcmTxEnable = true, - .UdsOffLine = true, -}; - - -uint16_t diagStart_InitTimer = DIAG_START_INIT_TIME; -uint16_t diagStart_Timer = DIAG_START_TIME; -DTC_STRUCT dtcComm; -DTC_StatusType dtcStatusBak; -DTC_Fault_Flags faultInfo; //故障信息 -DTC_Options dtcOptions; -const uint32_t DTC_LIST_TABLE[DTC_ID_NUM] = { - DTC_FOREACH(GENERATE_DTC_VALUE_ARRAY) -}; -uint8_t dtcsnapshotNumberTotal; -uint16_t dtcSnapshotDataBuf[DTC_ID_NUM]; -static uint16_t BMS_CommLossTimer = 0; -static uint16_t VCU_CommLossTimer = 0; - -void UdsDidUpdateVehicle(void) -{ - udsInfo2Vehicle.ChargeTempProtVal = gDIDCache.DID_DCUVariousTempProtectVal[0]; - udsInfo2Vehicle.BoardTempProtVal = gDIDCache.DID_DCUVariousTempProtectVal[1]; - udsInfo2Vehicle.DCVoltProtVal = WORD(gDIDCache.DID_DCVoltProtectVal[0], gDIDCache.DID_DCVoltProtectVal[1]); - udsInfo2Vehicle.InsulDetVoltVal = WORD(gDIDCache.DID_InsulationDectVolt[0], gDIDCache.DID_InsulationDectVolt[1]); -} - -void UdsDtcUpdateVehicle(void) -{ - uint8_t index; - uint8_t num, list[DTC_ID_NUM]; - static DTC_Fault_Flags fflag = {.w = 0}; - - if (fflag.w != faultInfo.w) { - fflag = faultInfo; - num = 0; - for (index = 0; index < DTC_ID_NUM; index++) { - if (dtcComm.DTCStatus.recordData[index].status == ((1 << DTC_STATUS_Test_Failed) | (1 << DTC_STATUS_Confirmed_DTC))) { - list[num++] = index + 1; - } - } - udsInfo2Vehicle.DTCNum = num; - memset(udsInfo2Vehicle.DTCList, 0, DTC_ID_NUM); - memcpy(udsInfo2Vehicle.DTCList, list, num); - } -} - -void DID_SignalInit(void) -{ - uint8_t i; - uint8_t index; - uint16_t size; - uint8_t *cachePtr, *didPtr; - uint8_t *nvmDidPtr; - DIDS_NvmType *dids; - Param_NvmType *param; - - EE_Read(NVM_IMAGE_DID_ADDR, (uint8_t **)&dids); - cachePtr = (uint8_t *)&gDIDCache; - - for (i = 0; i < DID_StoreInFlash_NUM; i++) { - index = GetDIDIndexByID(DIDStoreInFlashId[i]); - - if (index != 0xff) { - didPtr = cachePtr + DIDOffset[index]; - size = DIDStoreInFlashSize[i]; - nvmDidPtr = (uint8_t *)dids + DIDStoreInFlashOffset[i]; - - if (CRC16_DataCheck(nvmDidPtr, size) == 0) { - memcpy(didPtr, nvmDidPtr, size); - } - } - } - UdsDidUpdateVehicle(); - - EE_Read(NVM_IMAGE_PARAM_ADDR, (uint8_t **)¶m); - if (CRC16_DataCheck((uint8_t *)param, sizeof(Param_NvmType)-2) == 0) { - UdsParam.SA_FailureCounter = param->Param.SA_FailureCounter; - UdsService.KeyErrCnt = UdsParam.SA_FailureCounter; - if (UDS_27SERVICE_ERR_NUM_MAX <= UdsService.KeyErrCnt) { - UdsService.KeyErrLockTimer = UDS_27SERVICE_KEY_ERRLOCK_TIME; - UdsService.KeyLockFlg = true; - } - } else { - UdsService.KeyErrLockTimer = 0; - UdsService.KeyLockFlg = false; - UdsService.KeyErrCnt = 0; - } -} - -void DTC_SignalInit(void) -{ -#if BOOTLOADER_CODE_FLAG == 0 - uint8_t index; - uint8_t size; - DTCS_NvmType *dtc, *dtcBak; - - EE_Read(NVM_IMAGE_DTC_ADDR, (uint8_t **)&dtc); - size = sizeof(DTC_RecordDataBufType); - - for (index = 0; index < DTC_ID_NUM; index++) { - if (CRC16_DataCheck((uint8_t *)&dtc->DTC_Status.recordData[index], size - 2) == 0) { - memcpy((uint8_t *)&dtcComm.DTCStatus.recordData[index], (uint8_t *)&dtc->DTC_Status.recordData[index], size); - memcpy((uint8_t *)&dtcStatusBak.recordData[index], (uint8_t *)&dtc->DTC_Status.recordData[index], size); - } - - if (dtcComm.DTCStatus.recordData[index].status == ((1 << DTC_STATUS_Test_Failed) | (1 << DTC_STATUS_Confirmed_DTC))) { - faultInfo.w |= 1 << index; - } - } - // UdsDtcUpdateVehicle(); - // diagStart_InitTimer = DIAG_START_INIT_TIME; - // diagStart_Timer = DIAG_START_TIME; - dtcOptions.w = 0xffffffff; - SnapshotRecordNumberGet(dtcComm.DTCStatus.recordData, dtcSnapshotDataBuf, &dtcsnapshotNumberTotal); -#endif -} - -void UDS_ServiceInit(void) -{ - // //ECU 上电或复位后默认处于闭锁状态,同时错误计数器重置为零。 - // UdsService.KeyErrLockTimer = 0; - // UdsService.KeyLockFlg = false; - // UdsService.KeyErrCnt = 0; - - UdsService.SessionDiagModel = _UDS_DEFAULT_SESSION; - UdsService.SeedKeyIsOK = 0; - UdsService.AlreadSendSeed = false; - UdsService.GenerateSeedReq_Non = false; - UdsService.SessionTimer = 0; - UdsService.NcmDisRxAndTx = 0; - UdsService.NmcmDisRxAndTx = 0; - UdsService.DisDTCRecord = 0; -} - -void DTC_SignalRecover(void) -{ - -} - - -void GenRand(void) -{ - -} - - -#if BOOTLOADER_CODE_FLAG == 0 - -void SnapshotRecordLoad(DTC_RecordDataBufType *record) -{ - record->snapshot = vehicleInfo2uds.Snapshot; -} - -uint8_t SnapshotRecordFill(uint8_t *data, DTC_SnapshotType *snapshot) -{ - uint8_t j = 0; - uint16_t dataId; - - dataId = 0xCF00; - data[j++] = (uint8_t)(dataId >> 8); - data[j++] = (uint8_t)(dataId & 0x00ff); - data[j++] = snapshot->BatVolt; - dataId = 0xCF01; - data[j++] = (uint8_t)(dataId >> 8); - data[j++] = (uint8_t)(dataId & 0x00ff); - data[j++] = snapshot->SOCH; - data[j++] = snapshot->SOCL; - dataId = 0xCF02; - data[j++] = (uint8_t)(dataId >> 8); - data[j++] = (uint8_t)(dataId & 0x00ff); - data[j++] = snapshot->DCInVolH; - data[j++] = snapshot->DCInVolL; - dataId = 0xCF03; - data[j++] = (uint8_t)(dataId >> 8); - data[j++] = (uint8_t)(dataId & 0x00ff); - data[j++] = snapshot->GunSts; - dataId = 0xCF04; - data[j++] = (uint8_t)(dataId >> 8); - data[j++] = (uint8_t)(dataId & 0x00ff); - data[j++] = snapshot->DCRealySts; - dataId = 0xCF05; - data[j++] = (uint8_t)(dataId >> 8); - data[j++] = (uint8_t)(dataId & 0x00ff); - data[j++] = snapshot->ACRealySts; - dataId = 0xCF06; - data[j++] = (uint8_t)(dataId >> 8); - data[j++] = (uint8_t)(dataId & 0x00ff); - data[j++] = snapshot->CC2ResistorH; - data[j++] = snapshot->CC2ResistorL; - dataId = 0xCF07; - data[j++] = (uint8_t)(dataId >> 8); - data[j++] = (uint8_t)(dataId & 0x00ff); - data[j++] = snapshot->CommSts; - - return j; -} - -void SnapshotRecordNumberGet(DTC_RecordDataBufType *record_data, uint16_t *dataBuf, uint8_t *num) -{ - uint8_t i = 0; - uint8_t k = 0, j = 0; - uint16_t temp; - - *num = 0; - for (i=0; i(uint8_t)dataBuf[k+1]) { - temp = dataBuf[k+1]; - dataBuf[k+1] = dataBuf[k]; - dataBuf[k] = temp; - } - } - } - } -} - -uint8_t DiagDtcReportSnapshotFill(uint8_t sub_func, DTC_RecordDataBufType *record_data, uint8_t *data_buf, uint8_t *length) -{ - uint8_t ii = 0; - uint8_t ret = 1; - uint8_t num = 0, index; - uint32_t dtc_record; - uint16_t *snap_buf = dtcSnapshotDataBuf; - - data_buf[(*length)++] = DIAG_SERVE_READ_DTC|0x40; - data_buf[(*length)++] = sub_func; - - SnapshotRecordNumberGet(record_data, snap_buf, &num); - - for (ii=0; ii>8); - dtc_record = DTC_LIST_TABLE[index]; - data_buf[(*length)++] = (uint8_t)(dtc_record>>16); - data_buf[(*length)++] = (uint8_t)(dtc_record>>8); - data_buf[(*length)++] = (uint8_t)(dtc_record>>0); - data_buf[(*length)++] = record_data[index].snapNumber; - } - return 0; -} - -uint8_t DiagDtcSnapshotRecordFill(uint8_t sub_func, DTC_MaskRecordTpye mask_record, - uint8_t snap_record_num, DTC_RecordDataBufType *record_data, uint8_t *data_buf, uint8_t *length) -{ - uint8_t ii = 0; - uint8_t ret = 1; - - data_buf[(*length)++] = DIAG_SERVE_READ_DTC|0x40; - data_buf[(*length)++] = sub_func; - - for (ii=0; ii= DTC_ID_NUM) { - return; - } - if (dtc_record_data->status != status) { - if (status == ((1<snapNumber) { - (*snapshot_number_total)++; - dtc_record_data->snapNumber = *snapshot_number_total; - } - - if (dtc_record_data->extended.FaultCounter != 0xff) { - dtc_record_data->extended.FaultCounter ++; - } - } - // dtc_record_data->extended.FaultAgingCounter = 0; - } - - dtc_record_data->status = status; -} - - -//电压正且非busoff、电源ON下 -void DiagFaultsMonitor(void) -{ - - // if (CheckIsBatteryHigh())return; - - // if (CheckIsBatteryLow())return; - - // if (CheckIsIgnON()) { - - if (vehicleInfo2uds.InOverVoltFault) { - faultInfo.b.fINPUT_OVERVOLTAGE = 1; - } else { - faultInfo.b.fINPUT_OVERVOLTAGE = 0; - } - - if (vehicleInfo2uds.InUnderVoltFault) { - faultInfo.b.fINPUT_UNDERVOLTAGE = 1; - } else { - faultInfo.b.fINPUT_UNDERVOLTAGE = 0; - } - - if (vehicleInfo2uds.ChargeTempDerateFault) { - faultInfo.b.fCHARGE_TEMP_DERATE = 1; - } else { - faultInfo.b.fCHARGE_TEMP_DERATE = 0; - } - - if (vehicleInfo2uds.InterTempDerateFault) { - faultInfo.b.fINTER_TEMP_DERATE = 1; - } else { - faultInfo.b.fINTER_TEMP_DERATE = 0; - } - - if (vehicleInfo2uds.InterOverTempFault) { - faultInfo.b.fINTER_OVERTEMP = 1; - } else { - faultInfo.b.fINTER_OVERTEMP = 0; - } - - if (vehicleInfo2uds.ChargeOverTempFault) { - faultInfo.b.fCHARGE_OVERTEMP = 1; - } else { - faultInfo.b.fCHARGE_OVERTEMP = 0; - } - - if (vehicleInfo2uds.DcPosRelayAdhFault) { - faultInfo.b.fDC_POS_RELAY_ADH = 1; - } else { - faultInfo.b.fDC_POS_RELAY_ADH = 0; - } - - if (vehicleInfo2uds.DcNegRelayAdhFault) { - faultInfo.b.fDC_NEG_RELAY_ADH = 1; - } else { - faultInfo.b.fDC_NEG_RELAY_ADH = 0; - } - - if (vehicleInfo2uds.AcPosRelayAdhFault) { - faultInfo.b.fAC_POS_RELAY_ADH = 1; - } else { - faultInfo.b.fAC_POS_RELAY_ADH = 0; - } - - if (vehicleInfo2uds.AcNegRelayAdhFault) { - faultInfo.b.fAC_NEG_RELAY_ADH = 1; - } else { - faultInfo.b.fAC_NEG_RELAY_ADH = 0; - } - - if (vehicleInfo2uds.HvInterlockFault) { - faultInfo.b.fHV_INTERLOCK = 1; - } else { - faultInfo.b.fHV_INTERLOCK = 0; - } - - if (vehicleInfo2uds.CcCc2RelayCtrlInv) { - faultInfo.b.fCC_CC2_RELAY_CTRL_INV = 1; - } else { - faultInfo.b.fCC_CC2_RELAY_CTRL_INV = 0; - } - - if (vehicleInfo2uds.CpCc1RelayCtrlInv) { - faultInfo.b.fCP_CC1_RELAY_CTRL_INV = 1; - } else { - faultInfo.b.fCP_CC1_RELAY_CTRL_INV = 0; - } - - if (CheckIsCanBusoff()) { - if (vehicleInfo2uds.BusoffCnt >= 8) - { - faultInfo.b.fECU_ENTER_BUSOFF = 1; - } - } else { - faultInfo.b.fECU_ENTER_BUSOFF = 0; - } - - if (CheckIsCanBusoff())return; - - // if (diagStart_Timer) { - // diagStart_Timer --; - // if (diagStart_Timer == 0) { - // BMS_CommLossTimer = 0; - // } - // return; - // } else { - if (++BMS_CommLossTimer > 200) { - faultInfo.b.fBMS_COMM_LOSE = 1; - BMS_CommLossTimer = 0; - } - if (++VCU_CommLossTimer > 300) { - faultInfo.b.fVCU_COMM_LOSE = 1; - VCU_CommLossTimer = 0; - } - // } - // } else { - // diagStart_Timer = DIAG_START_TIME; - // } - -} - -void Uds_SetMsgMonitorTimer(uint16_t msgid) -{ -#if BOOTLOADER_CODE_FLAG == 0 - if (!udsInfo2Vehicle.NcmRxEnable) return; - switch (msgid) { - case Bms_104: - faultInfo.b.fBMS_COMM_LOSE = 0; - BMS_CommLossTimer = 0; - break; - case Vcu_state_111: - faultInfo.b.fVCU_COMM_LOSE = 0; - VCU_CommLossTimer = 0; - default: - break; - } -#endif -} - -void GetBatteryStatus(void) -{ - if (CheckIsBatteryHigh()) { - faultInfo.b.fECU_VOLTAGE_HIGH = 1; - } else { - faultInfo.b.fECU_VOLTAGE_HIGH = 0; - } - - if (CheckIsBatteryLow()) { - faultInfo.b.fECU_VOLTAGE_LOW = 1; - } else { - faultInfo.b.fECU_VOLTAGE_LOW = 0; - } -} - -#if 0 -void DtcAging_Process(void) -{ - uint8_t index; - DTC_RecordDataBufType *dtc_record_data; - static uint8_t ignStsBak = 1; - - if (ignStsBak != vehicleInfo2uds.IgnSts) { - ignStsBak = vehicleInfo2uds.IgnSts; - - if (vehicleInfo2uds.IgnSts) { - for (index = 0; index < DTC_ID_NUM; index++) { - dtc_record_data = &dtcComm.DTCStatus.recordData[index]; - if (dtc_record_data->status == (1 << DTC_STATUS_Confirmed_DTC)) { - dtc_record_data->extended.FaultAgingCounter++; - if (dtc_record_data->extended.FaultAgingCounter >= 40) { - dtc_record_data->extended.FaultAgingCounter = 0; - dtc_record_data->status = 0; - if (dtc_record_data->extended.FaultCounterOfAge != 0xff) { - dtc_record_data->extended.FaultCounterOfAge++; - } - } - } - } - } - } -} -#endif - -void ClearHardwareFault(void) -{ - UdsApi_HardwareFault_ForceClear(); -} - -void GetFaultInfo(void) -{ - uint8_t shift, status; - uint8_t size; - uint16_t crc16; - DTC_Fault_Flags littleFault; - DTC_RecordDataBufType *pDtcRecordData; - static uint8_t wrIndex = 0; - static uint8_t timer100ms; - - if (diagStart_InitTimer > 0) { //电压正常后才计数 - diagStart_InitTimer --; - - return; - } - GetBatteryStatus(); - - DiagFaultsMonitor(); - - if (UdsService.DisDTCRecord) { - return; - } - - // DtcAging_Process(); - - if (DTC_ID_NUM <= 32) { - //littleFault.w= BigLittleSwap32(faultInfo.w); - littleFault.w = faultInfo.w; - - for (shift = 0; shift < DTC_ID_NUM; shift++) { - - if ((littleFault.w >> shift) & 0x00000001) { - status = (1 << DTC_STATUS_Test_Failed) | (1 << DTC_STATUS_Confirmed_DTC); //当前故障 - } else { - status = dtcComm.DTCStatus.recordData[shift].status & (~(1 << DTC_STATUS_Test_Failed)); - } - - DiagUpdateDtcValue(shift, status); - } - } else { - //超出32个的,需要特殊处理 - } - - size = sizeof(DTC_RecordDataBufType); - pDtcRecordData = &dtcComm.DTCStatus.recordData[wrIndex]; - if (pDtcRecordData->status != dtcStatusBak.recordData[wrIndex].status \ - /*|| pDtcRecordData->extended.FaultAgingCounter != dtcStatusBak.recordData[wrIndex].extended.FaultAgingCounter*/) { - crc16 = CRC_Cal16_WithCfg((uint8_t *)pDtcRecordData, size - 2); - pDtcRecordData->crc16[0] = (uint8_t)crc16; - pDtcRecordData->crc16[1] = (uint8_t)(crc16 >> 8); - - dtcStatusBak.recordData[wrIndex].status = pDtcRecordData->status; - // dtcStatusBak.recordData[wrIndex].extended.FaultAgingCounter = pDtcRecordData->extended.FaultAgingCounter; - EE_Write(NVM_IMAGE_DTC_ADDR + (size * wrIndex), (uint8_t *)pDtcRecordData, size, NULL); - } - wrIndex++; - if (wrIndex >= DTC_ID_NUM) { - wrIndex = 0; - } - - if (++timer100ms >= 10) { - timer100ms = 0; - UdsDtcUpdateVehicle(); - } -} - - -void ClearDtc(void) -{ - uint8_t shift; - uint16_t crc16; - DTC_RecordDataBufType *pDtcRecordData; - - faultInfo.w = 0; - dtcsnapshotNumberTotal = 0; - for (shift = 0; shift < DTC_ID_NUM; shift++) { - pDtcRecordData = &dtcComm.DTCStatus.recordData[shift]; - - memset((uint8_t *)pDtcRecordData, 0x00, sizeof(DTC_RecordDataBufType) - 2); - crc16 = CRC_Cal16_WithCfg((uint8_t *)pDtcRecordData, sizeof(DTC_RecordDataBufType) - 2); - pDtcRecordData->crc16[0] = (uint8_t)crc16; - pDtcRecordData->crc16[1] = (uint8_t)(crc16 >> 8); - } - - memcpy((uint8_t *)&dtcStatusBak, (uint8_t *)&dtcComm.DTCStatus, sizeof(DTC_StatusType)); - EE_Write(NVM_IMAGE_DTC_ADDR, (uint8_t *)&dtcComm.DTCStatus, sizeof(DTC_StatusType), NULL); - ClearHardwareFault(); -} - - -bool GetDtcStatusMask(uint8_t *pOut, uint8_t *len, uint8_t subFunc, uint8_t mask) -{ - bool retValue = FALSE; - uint8_t ii = 0; - uint8_t j = 0; - - dtcComm.DTCcount.map = 0; - pOut[j++] = DIAG_SERVE_READ_DTC | 0x40; - pOut[j++] = subFunc; - pOut[j++] = DTC_STATUS_Support_Bit_Status; - - for (ii = 0; ii < DTC_ID_NUM; ii++) { - /*if (((dtcComm.DTCStatus[ii]&DTC_STATUS_Support_Bit_Status) == (mask&DTC_STATUS_Support_Bit_Status))\ - ||(subFunc == DTC_ReportSupportedDTCs))*/ - if ((dtcComm.DTCStatus.recordData[ii].status & mask) \ - || (dtcComm.DTCStatus.recordData[ii].status == mask)\ - || (subFunc == DTC_ReportSupportedDTCs)) { - if ((dtcOptions.w >> ii) & 0x00000001) { - retValue = TRUE; - dtcComm.DTCcount.map++; - pOut[j++] = (uint8_t)(DTC_LIST_TABLE[ii] >> 16); - pOut[j++] = (uint8_t)(DTC_LIST_TABLE[ii] >> 8); - pOut[j++] = (uint8_t)(DTC_LIST_TABLE[ii] >> 0); - pOut[j++] = dtcComm.DTCStatus.recordData[ii].status; - } - } - } - - *len = j; - return retValue; -} -#endif - -void DiagDIDStoreFlash(uint16_t id) -{ - uint8_t didIndex, nvmDidIndex; - //uint16_t offset; - uint16_t size; - uint8_t *cachePtr, *didPtr, *nvmDidPtr = NULL; - uint16_t crc16; - bool storage_flag = false; - - nvmDidIndex = GetDIDStoreInFlashIndexByID(id); - - if (nvmDidIndex != 0xFF) { - didIndex = GetDIDIndexByID(id); - - if (didIndex != 0xFF) { - size = DIDSize[didIndex]; - cachePtr = (uint8_t *)&gDIDCache; - didPtr = cachePtr + DIDOffset[didIndex]; - crc16 = CRC_Cal16_WithCfg(didPtr, size); - didPtr[size] = (uint8_t)crc16; - size++; - didPtr[size] = (uint8_t)(crc16 >> 8); - size++; - nvmDidPtr = (uint8_t *)NVM_IMAGE_DID_ADDR + DIDStoreInFlashOffset[nvmDidIndex]; - - if (nvmDidPtr != NULL) { - EE_Write(nvmDidPtr, didPtr, size, NULL); - } - UdsDidUpdateVehicle(); - } - } -} - -void CheckDtcHsCanError(void) -{ - static uint16_t Timer100msCnt = 0; -#if BOOTLOADER_CODE_FLAG == 0 - static uint16_t Timer10msCnt = 0; -#endif - uint16_t crc16; - - -#if BOOTLOADER_CODE_FLAG == 0 - - if (++Timer10msCnt >= 10) { - Timer10msCnt = 0; - GetFaultInfo(); - // IgnChangeProcess(); 没有老化 - } - gDIDCache.DID_CurrentDCVolt[0] = MSB(vehicleInfo2uds.CurrDcVolt); - gDIDCache.DID_CurrentDCVolt[1] = LSB(vehicleInfo2uds.CurrDcVolt); - gDIDCache.DID_DCUVariousCurrentTempVal[0] = vehicleInfo2uds.ChargeTemp; - gDIDCache.DID_DCUVariousCurrentTempVal[1] = vehicleInfo2uds.BoardTemp; - -#endif - if (++Timer100msCnt >= 100) { - Timer100msCnt = 0; - - if (UdsParam.SA_FailureCounter != UdsService.KeyErrCnt) { - UdsParam.SA_FailureCounter = UdsService.KeyErrCnt; - crc16 = CRC_Cal16_WithCfg((uint8_t *)&UdsParam, sizeof(UdsParam) - 2); - UdsParam.crc16[0] = (uint8_t)crc16; - UdsParam.crc16[1] = (uint8_t)(crc16 >> 8); - EE_Write(NVM_IMAGE_PARAM_ADDR, (uint8_t*)&UdsParam, sizeof(UdsParam), NULL); - } - } - - if ((UdsService.UdsTxFlg == true) && (UdsService.UdsTxCompFlg == true)) { - UdsService.UdsTxFlg = false; - UdsService.UdsTxCompFlg = false; - HAL_UDS_Tx_Callback(); - //UdsQueueCanOut(); - UdsService.TxCompFlg = true; - //Debug("HAL_UDS_Tx_Callback \r\n"); // - } -} - -#if BOOTLOADER_CODE_FLAG == 0 -INT8U Get0x19SerDiagData(INT8U *pOut, INT8U Type, INT8U *pdata) -{ - INT8U RstLen = 0; -// INT16U i=0; -// INT32U dtc_code = 0; -// INT8U num = 0; - uint8_t dtcReportSubFunction; - uint8_t dtcRecordNumber; - uint8_t dtcStatusMask; - DTC_MaskRecordTpye dtcMaskRecord; - - dtcReportSubFunction = Type; - dtcStatusMask = pdata[1]; - - switch (dtcReportSubFunction) { - case DTC_ReportNumberOfDTCByStatusMask: - case DTC_ReportDTCByStatusMask: - case DTC_ReportSupportedDTCs: - if (GetDtcStatusMask(pOut, &RstLen, dtcReportSubFunction, dtcStatusMask) == FALSE) { - RstLen = 0; - pOut[RstLen++] = DIAG_SERVE_READ_DTC | 0x40; //0x59; - pOut[RstLen++] = dtcReportSubFunction; - pOut[RstLen++] = DTC_STATUS_Support_Bit_Status; - } - - if (dtcReportSubFunction == DTC_ReportNumberOfDTCByStatusMask) { - RstLen = 0; - pOut[RstLen++] = DIAG_SERVE_READ_DTC|0x40;//0x59; - pOut[RstLen++] = dtcReportSubFunction; - pOut[RstLen++] = DTC_STATUS_Support_Bit_Status; - pOut[RstLen++] = ISO15031_6_DTCformat; - pOut[RstLen++] = dtcComm.DTCcount.b.DTCcountHighByte; - pOut[RstLen++] = dtcComm.DTCcount.b.DTCcountLowByte; - } - - break; - case DTC_ReportDTCSnapshotIdentification: - DiagDtcReportSnapshotFill(dtcReportSubFunction, dtcComm.DTCStatus.recordData, pOut, &RstLen); - break; - case DTC_ReportDTCSnapshotRecordByDTCNumber: - dtcMaskRecord.DTCHightByte = pdata[1]; - dtcMaskRecord.DTCMiddleByte = pdata[2]; - dtcMaskRecord.DTCLowByte = pdata[3]; - dtcRecordNumber = pdata[4]; - if (DiagDtcSnapshotRecordFill(dtcReportSubFunction, dtcMaskRecord, dtcRecordNumber, - dtcComm.DTCStatus.recordData, pOut, &RstLen) != 0) { - RstLen = 0; - } - break; - case DTC_ReportDTCExtendedDataRecordByDTCNumber: - dtcMaskRecord.DTCHightByte = pdata[1]; - dtcMaskRecord.DTCMiddleByte = pdata[2]; - dtcMaskRecord.DTCLowByte = pdata[3]; - dtcRecordNumber = pdata[4]; - if (DiagDtcExtendedDataRecordFill(dtcReportSubFunction, dtcMaskRecord, dtcRecordNumber, - dtcComm.DTCStatus.recordData, pOut, &RstLen) != 0) { - RstLen = 0; - } - break; - default: - break; - } - - return RstLen; -} -#endif - - - -INT16U Get0x22SerDiagData(INT8U *pOut) -{ - INT16U RstLen = 0; - INT16U ReqId = 0; -// INT16U length = 0; - uint8_t i; - uint8_t *cachePtr; - uint8_t size; - - ReqId = ((UdsService.ReqCmdBuf[0] << 8) + UdsService.ReqCmdBuf[1]); - - pOut[RstLen++] = 0x62; - pOut[RstLen++] = ((ReqId >> 8) & 0xFF); - pOut[RstLen++] = (ReqId & 0xFF); - - cachePtr = (uint8_t *)&gDIDCache; - - for (i = 0; i < DID_NUM; i++) { - if (ReqId == DIDId[i]) { - break; - } - } - - if (i == DID_NUM) { - RstLen = 2; - } else { -#if BOOTLOADER_CODE_FLAG - - if (!CheckIsSupportBootloaderRead_Sid22(ReqId)) { - RstLen = 2; - } - -#endif - } - - if (RstLen != 2) { - size = DIDSize[i]; - - memcpy(&pOut[RstLen], (cachePtr + DIDOffset[i]), size); - RstLen += size; - } - - return RstLen; -} - -#if BOOTLOADER_CODE_FLAG - -INT8U Set0x36DiagData(INT8U *pIn, INT16U PLen, INT8U *pOut, INT16U *RLen) -{ - uint8_t /*i=0,*/ucErrCode = 0; - uint8_t sn = 0; - - - sn = pIn[0]; - UdsUpData.totalRecvLength += (UdsService.RxDlc - 2); - - if (CheckIsBatteryHigh()) { - ucErrCode = 0x92; - } else if (CheckIsBatteryLow()) { - ucErrCode = 0x93; - } else if (UdsService.RxDlc > (FMC_PAGE_SIZE + 2)) { - ucErrCode = 0x13; - } else if ((UdsUpData.DownloadSeq != DOWNLOAD_SEQUENCE_34) && (UdsUpData.DownloadSeq != DOWNLOAD_SEQUENCE_36)) { - ucErrCode = 0x24; - } else if (sn != UdsUpData.Sn) { - ucErrCode = 0x73; - } else if (UdsUpData.totalRecvLength > FBL_AppSize) { - ucErrCode = 0x71; - } else { - UdsUpData.RxProgramFlag = true; - UdsUpData.DownloadSeq = DOWNLOAD_SEQUENCE_36; - memcpy(UdsUpData.Buf, &TP_Buffer[2], (UdsService.RxDlc - 2)); - ucErrCode = 0x78; - } - - return ucErrCode; - -} -#endif - -INT8U Set0x31DiagData(INT8U *pIn, INT16U PLen, INT8U *pOut, INT16U *RLen) -{ - - uint8_t service_buf[50]; - uint8_t /*i=0,*/ucErrCode = 0, ucRsp = 0; - uint16_t ReqId = 0; - uint16_t dlen = 0; - uint8_t result = 0; - - if (UdsService.RxDlc < 4) { - return 0x13; - } - - ucRsp = pIn[0]; - ReqId = pIn[1] << 8 | pIn[2]; - - service_buf[dlen++] = 0x71; - service_buf[dlen++] = pIn[0]; - service_buf[dlen++] = pIn[1]; - service_buf[dlen++] = pIn[2]; - -#if BOOTLOADER_CODE_FLAG == 0 - - static bool routineStartFlg = false; - if(0x01 == ucRsp) { - ReqId = pIn[1]<<8 | pIn[2]; - if((true == CheckUdsDlcIsOk(UdsService.RxDlc,4) && (ReqId == 0x0203))\ - ||(true == CheckUdsDlcIsOk(UdsService.RxDlc,4) && (ReqId == 0x0204)) - ||(true == CheckUdsDlcIsOk(UdsService.RxDlc,5) && (ReqId == 0x0207))) { - if (UdsService.SeedKeyIsOK) { - if (true == CheckVechileStatus()) { - switch (ReqId) { - case 0x0204: - result = 0x00; //correctResult - service_buf[dlen++] = result; - break; - case 0x0207: - if (pIn[3] <= 1) { - result = 0x00; //correctResult - udsInfo2Vehicle.DCDCEnable = pIn[3]; - } else { - result = 0x01; //incorrectResult - } - service_buf[dlen++] = result; - - break; - case 0x0203: - // if (UdsService.BattErrFlg == false) { - UdsService.ChkProgPreconditionFlg = true; - UdsService.ProgrammingPassTimer = PROGRAMMING_PASS_TIMEOUT_TIME; - // } - result = 0x00; //correctResult - service_buf[dlen++] = result; - break; - default: - break; - } - } else { - ucErrCode = 0x22; - } - if (!ucErrCode) { - routineStartFlg = true; - } - } else { - ucErrCode = 0x33; - } - } else if ((ReqId == 0x0203) || (ReqId == 0x0204) || (ReqId == 0x0207)) { - ucErrCode = 0x13; - } else { - ucErrCode = 0x31; - } - } else if(0x03 == ucRsp) { - ReqId = pIn[1]<<8 | pIn[2]; - if ((true == CheckUdsDlcIsOk(UdsService.RxDlc,4) && (ReqId == 0x0204))) { - if (UdsService.SeedKeyIsOK) { - if (true == CheckVechileStatus()) { - if (true == routineStartFlg) { - routineStartFlg = false; - switch (ReqId) { - case 0x0204: - result = vehicleInfo2uds.OtaModeSts; - service_buf[dlen++] = result; - break; - default: - break; - } - } else { - ucErrCode = 0x24; - } - } else { - ucErrCode = 0x22; - } - } else { - ucErrCode = 0x33; - } - } else if ((ReqId == 0x0204)) { - ucErrCode = 0x13; - } else { - ucErrCode = 0x31; - } - } else if (0x02 == ucRsp) { - if ((true == CheckUdsDlcIsOk(UdsService.RxDlc, 4) && (ReqId == 0x0204))) { - if (UdsService.SeedKeyIsOK) { - switch (ReqId) { - case 0x0204: - result = 0x00; //correctResult - service_buf[dlen++] = result; - break; - default: - break; - } - } else { - ucErrCode = 0x33; - } - } else if ((ReqId == 0x0204)) { - ucErrCode = 0x13; - } else { - ucErrCode = 0x31; - } - } else { - if (true == UdsService.PhyFlg) { - UdsService.PhyFlg = false; - ucErrCode = 0x12; - } - } - -#endif - *RLen = dlen; - - if (ucErrCode == 0) { - memcpy(pOut, service_buf, dlen); - } - - return ucErrCode; - -} - -INT8U Set0x2EDidDiagData(INT8U *pIn, INT16U PLen) -{ - INT8U Rst = 0; - INT16U ReqId = 0; - - ReqId = ((pIn[0] << 8) + pIn[1]); - -#if BOOTLOADER_CODE_FLAG == 0 - if (ReqId == DIDId[VehicleIdentificationNumber]) { - if(PLen == DIDSize[VehicleIdentificationNumber]) { - if (UdsService.SeedKeyIsOK) { - if (CheckVechileStatus()) { - memcpy(gDIDCache.DID_VehicleIdentificationNumber,&pIn[2],PLen); - } else { - Rst = 0x22; - } - } else { - Rst = 0x33; - } - } else { - Rst = 0x13; - } - } else if (ReqId == DIDId[EOLData]) { - if(PLen == DIDSize[EOLData]) { - if (UdsService.SeedKeyIsOK) { - if (CheckVechileStatus()) { - memcpy(gDIDCache.DID_EOLData,&pIn[2],PLen); - } else { - Rst = 0x22; - } - } else { - Rst = 0x33; - } - } else { - Rst = 0x13; - } - } else if (ReqId == DIDId[DCUVariousTempProtectVal]) { - if(PLen == DIDSize[DCUVariousTempProtectVal]) { - if (UdsService.SeedKeyIsOK) { - if (CheckVechileStatus()) { - memcpy(gDIDCache.DID_DCUVariousTempProtectVal,&pIn[2],PLen); - } else { - Rst = 0x22; - } - } else { - Rst = 0x33; - } - } else { - Rst = 0x13; - } - } else if (ReqId == DIDId[DCVoltProtectVal]) { - if(PLen == DIDSize[DCVoltProtectVal]) { - if (UdsService.SeedKeyIsOK) { - if (CheckVechileStatus()) { - memcpy(gDIDCache.DID_DCVoltProtectVal,&pIn[2],PLen); - } else { - Rst = 0x22; - } - } else { - Rst = 0x33; - } - } else { - Rst = 0x13; - } - } else if (ReqId == DIDId[InsulationDectVolt]) { - if(PLen == DIDSize[InsulationDectVolt]) { - if (UdsService.SeedKeyIsOK) { - if (CheckVechileStatus()) { - memcpy(gDIDCache.DID_InsulationDectVolt,&pIn[2],PLen); - } else { - Rst = 0x22; - } - } else { - Rst = 0x33; - } - } else { - Rst = 0x13; - } - } else { - Rst = 0x31; - } - -#else - if (ReqId == DIDId[FingerPrint]) { - if(PLen == DIDSize[FingerPrint]) { - if (UdsService.SeedKeyIsOK) { - memcpy(gDIDCache.DID_FingerPrint,&pIn[2],PLen); - } else { - Rst = 0x33; - } - } else { - Rst = 0x13; - } - } else { - Rst = 0x31; - } - -#endif - - if (Rst == 0) { - DiagDIDStoreFlash(ReqId); - } - - return Rst; -} - -#if BOOTLOADER_CODE_FLAG == 0 -INT8U Set0x2FDiagData(INT8U *pIn, INT16U PLen, INT8U *pOut, INT16U *RLen) -{ - INT8U ucErrCode = 0; - - return ucErrCode; -} -#endif - -void UdsQueueCanOut(void) -{ - //if(Frame_Tx_Complete != false) return; - //if(TP_Tx_Message_DLC) return; - while ((UdsQueueData.In != UdsQueueData.Out)) { - if (UdsQueueData.Out >= CAN0_MAX_RX) { - UdsQueueData.Out = 0; - } - - gUdsBusOffCanOutBak = UdsQueueData.Out; - ParseUdsCan(UdsQueueData.CanMsg[UdsQueueData.Out]); - UdsQueueData.Out++; - ParseCanRxCnt++; - // break; - } - - //return; -} - - -uint8_t GenerateSID27SeedValue(uint8_t *seed) -{ - uint32_t random; - - random *= UdsApi_GetRandom(); - if (random == 0xffffffff) { - random *= 0xaa; - } else if (random == 0) { - random += UdsApi_GetRandom(); - } - seed[0] = (uint8_t)(random >> 0); - seed[1] = (uint8_t)(random >> 16); - seed[2] = (uint8_t)(random >> 8); - seed[3] = (uint8_t)(random >> 0); - return 0; -} - -#if BOOTLOADER_CODE_FLAG - extern void RAMFLASHInit(void); -#endif - -uint8_t GenerateSID27KeyValue(uint8_t levelType,uint8_t *seed,uint8_t *key) -{ - uint8_t i = 0; - - uint8_t cal[4] = {0}; - uint8_t xor_data[4] = {0x90,0x23,0xB0,0x21}; - - if(levelType == 1) { //Level 1 - for (i=0;i<4;i++) - { - cal[i] = seed[i] ^ xor_data[i]; - } - key[0] = ((cal[0]&0x0f)<<4) | (cal[1] & 0xf0); - key[1] = ((cal[1]&0x0f)<<4) | ((cal[2] & 0xf0)>>4); - key[2] = ((cal[2]&0xf0)) | ((cal[3] & 0xf0)>>4); - key[3] = ((cal[3]&0x0f)<<4) | (cal[0] & 0x0f); - } else { //FBL_Level - for (i=0;i<4;i++) - { - cal[i] = seed[i] ^ xor_data[i]; - } - key[0] = ((cal[0] & 0x0f) << 4) | (cal[1] & 0x0f); - key[1] = ((cal[1] & 0xf0) >> 4) | ((cal[2] & 0x0f) << 4); - key[2] = ((cal[2] & 0xf0) >> 4) | ((cal[3] & 0xf0)); - key[3] = ((cal[3] & 0x0f)) | ((cal[0] & 0xf0) >> 4); - } - - return 0; -} - -//extern EReturnMsg bsp_flash_erase_sector(INT32U nFlashAddr); -//extern EReturnMsg bsp_flash_write_buff(INT32U nFlashAddr, INT8U *pBuff, INT32U nLen); -//extern EReturnMsg bsp_flash_read_buff(INT32U nFlashAddr, INT8U *pBuff, INT32U nLen); - -uint8_t EE_Write(uint8_t *pImage, const uint8_t *pData, uint32_t Len, void (*pCbFn)(uint32_t)) -{ - uds_service_nvm_write(pImage, pData, Len, pCbFn); - return TRUE; -} - - -uint8_t EE_Read(uint8_t *pImage, uint8_t **pData) -{ - if (NVM_IMAGE_DTC_ADDR == pImage) { - *pData = (uint8_t *)NVM_IMAGE_DTC_ADDR; - } else if (NVM_IMAGE_DID_ADDR == pImage) { - *pData = (uint8_t *)NVM_IMAGE_DID_ADDR; - } else if (NVM_IMAGE_PARAM_ADDR == pImage) { - *pData = (uint8_t *)NVM_IMAGE_PARAM_ADDR; - } else { - return FALSE; - } - - return TRUE; -} - -void SetUdsUpdataFlag(void) -{ -#if (BOOTLOADER_CODE_FLAG == 0) - SetExternProgrammingRequest(); -#endif - -} - - -bool CheckVechileStatus(void) -{ - bool cbRst = false; - // uint16_t speed = WORD(vehicleInfo2uds.Snapshot.VehSpeedH, vehicleInfo2uds.Snapshot.VehSpeedL); - - // if (speed <= 80) { - // cbRst = true; - // } - cbRst = true; - - return cbRst; -} - -bool CheckIsBatteryLow(void) -{ - bool bRst = false; - - if (vehicleInfo2uds.BattLow) { - bRst = true; - } - - return bRst; -} - -bool CheckIsBatteryHigh(void) -{ - bool bRst = false; - - if (vehicleInfo2uds.BattHigh) { - bRst = true; - } - - return bRst; -} - -bool CheckIsIgnON(void) -{ - bool bRst = false; - - if (vehicleInfo2uds.IgnSts) { - bRst = true; - } - - return bRst; -} - -//bool CheckIsIgnOff2ON(void) -//{ -// bool bRst=false; -// -// if (vehicleInfo2uds.IgnOff2On) { -// bRst = true; -// } -// return bRst; -//} -#if BOOTLOADER_CODE_FLAG == 0 - - -bool CheckIsCanBusoff(void) -{ - bool bRst = false; - - if (vehicleInfo2uds.BusoffCnt) { - bRst = true; - } - - return bRst; -} - -#endif - +#include "uds_config.h" +#include "uds_nvm.h" +#include "BSP_CAN.h" +#include "crc.h" +#if BOOTLOADER_CODE_FLAG == 0 +#include "can.h" +#include "Car_CANIDInfo.h" + +const uint8_t SWFingerPrint[12] __attribute__((at(APP_FlagAddress))) = + {'S','5','0','8','_','D','C','U','2','4','0','1'}; +#else + +#endif + + +//INT32U g_ulRand=0; +DIDs gDIDCache; + + +//uint8_t g_testerprogramdateflag = false; +//uint8_t g_testerserialnubnerflag = false; + +//extern INT8U strMcuAppst[4]; +//extern INT8U strMcuAppDate[4]; +extern INT32U ParseCanRxCnt; +extern uint32_t FBL_AppSize; + + +//_HSCANERROR HsCanError; +uint32_t g_ulCanStatus; + +VehicleInfo2UdsType vehicleInfo2uds; +UdsInfo2VehicleType udsInfo2Vehicle = { + .NcmRxEnable = true, + .NcmTxEnable = true, + .NmcmRxEnable = true, + .NmcmTxEnable = true, + .UdsOffLine = true, +}; + + +uint16_t diagStart_InitTimer = DIAG_START_INIT_TIME; +uint16_t diagStart_Timer = DIAG_START_TIME; +DTC_STRUCT dtcComm; +DTC_StatusType dtcStatusBak; +DTC_Fault_Flags faultInfo; //故障信息 +DTC_Options dtcOptions; +const uint32_t DTC_LIST_TABLE[DTC_ID_NUM] = { + DTC_FOREACH(GENERATE_DTC_VALUE_ARRAY) +}; +uint8_t dtcsnapshotNumberTotal; +uint16_t dtcSnapshotDataBuf[DTC_ID_NUM]; +static uint16_t BMS_CommLossTimer = 0; +static uint16_t VCU_CommLossTimer = 0; + +void UdsDidUpdateVehicle(void) +{ + udsInfo2Vehicle.ChargeTempProtVal = gDIDCache.DID_DCUVariousTempProtectVal[0]; + udsInfo2Vehicle.BoardTempProtVal = gDIDCache.DID_DCUVariousTempProtectVal[1]; + udsInfo2Vehicle.DCVoltProtVal = WORD(gDIDCache.DID_DCVoltProtectVal[0], gDIDCache.DID_DCVoltProtectVal[1]); + udsInfo2Vehicle.InsulDetVoltVal = WORD(gDIDCache.DID_InsulationDectVolt[0], gDIDCache.DID_InsulationDectVolt[1]); +} + +void UdsDtcUpdateVehicle(void) +{ + uint8_t index; + uint8_t num, list[DTC_ID_NUM]; + static DTC_Fault_Flags fflag = {.w = 0}; + + if (fflag.w != faultInfo.w) { + fflag = faultInfo; + num = 0; + for (index = 0; index < DTC_ID_NUM; index++) { + if (dtcComm.DTCStatus.recordData[index].status == ((1 << DTC_STATUS_Test_Failed) | (1 << DTC_STATUS_Confirmed_DTC))) { + list[num++] = index + 1; + } + } + udsInfo2Vehicle.DTCNum = num; + memset(udsInfo2Vehicle.DTCList, 0, DTC_ID_NUM); + memcpy(udsInfo2Vehicle.DTCList, list, num); + } +} + +void DID_SignalInit(void) +{ + uint8_t i; + uint8_t index; + uint16_t size; + uint8_t *cachePtr, *didPtr; + uint8_t *nvmDidPtr; + DIDS_NvmType *dids; + Param_NvmType *param; + + EE_Read(NVM_IMAGE_DID_ADDR, (uint8_t **)&dids); + cachePtr = (uint8_t *)&gDIDCache; + + for (i = 0; i < DID_StoreInFlash_NUM; i++) { + index = GetDIDIndexByID(DIDStoreInFlashId[i]); + + if (index != 0xff) { + didPtr = cachePtr + DIDOffset[index]; + size = DIDStoreInFlashSize[i]; + nvmDidPtr = (uint8_t *)dids + DIDStoreInFlashOffset[i]; + + if (CRC16_DataCheck(nvmDidPtr, size) == 0) { + memcpy(didPtr, nvmDidPtr, size); + } + } + } + UdsDidUpdateVehicle(); + + EE_Read(NVM_IMAGE_PARAM_ADDR, (uint8_t **)¶m); + if (CRC16_DataCheck((uint8_t *)param, sizeof(Param_NvmType)-2) == 0) { + UdsParam.SA_FailureCounter = param->Param.SA_FailureCounter; + UdsService.KeyErrCnt = UdsParam.SA_FailureCounter; + if (UDS_27SERVICE_ERR_NUM_MAX <= UdsService.KeyErrCnt) { + UdsService.KeyErrLockTimer = UDS_27SERVICE_KEY_ERRLOCK_TIME; + UdsService.KeyLockFlg = true; + } + } else { + UdsService.KeyErrLockTimer = 0; + UdsService.KeyLockFlg = false; + UdsService.KeyErrCnt = 0; + } +} + +void DTC_SignalInit(void) +{ +#if BOOTLOADER_CODE_FLAG == 0 + uint8_t index; + uint8_t size; + DTCS_NvmType *dtc, *dtcBak; + + EE_Read(NVM_IMAGE_DTC_ADDR, (uint8_t **)&dtc); + size = sizeof(DTC_RecordDataBufType); + + for (index = 0; index < DTC_ID_NUM; index++) { + if (CRC16_DataCheck((uint8_t *)&dtc->DTC_Status.recordData[index], size - 2) == 0) { + memcpy((uint8_t *)&dtcComm.DTCStatus.recordData[index], (uint8_t *)&dtc->DTC_Status.recordData[index], size); + memcpy((uint8_t *)&dtcStatusBak.recordData[index], (uint8_t *)&dtc->DTC_Status.recordData[index], size); + } + + if (dtcComm.DTCStatus.recordData[index].status == ((1 << DTC_STATUS_Test_Failed) | (1 << DTC_STATUS_Confirmed_DTC))) { + faultInfo.w |= 1 << index; + } + } + // UdsDtcUpdateVehicle(); + // diagStart_InitTimer = DIAG_START_INIT_TIME; + // diagStart_Timer = DIAG_START_TIME; + dtcOptions.w = 0xffffffff; + SnapshotRecordNumberGet(dtcComm.DTCStatus.recordData, dtcSnapshotDataBuf, &dtcsnapshotNumberTotal); +#endif +} + +void UDS_ServiceInit(void) +{ + // //ECU 上电或复位后默认处于闭锁状态,同时错误计数器重置为零。 + // UdsService.KeyErrLockTimer = 0; + // UdsService.KeyLockFlg = false; + // UdsService.KeyErrCnt = 0; + + UdsService.SessionDiagModel = _UDS_DEFAULT_SESSION; + UdsService.SeedKeyIsOK = 0; + UdsService.AlreadSendSeed = false; + UdsService.GenerateSeedReq_Non = false; + UdsService.SessionTimer = 0; + UdsService.NcmDisRxAndTx = 0; + UdsService.NmcmDisRxAndTx = 0; + UdsService.DisDTCRecord = 0; +} + +void DTC_SignalRecover(void) +{ + +} + + +void GenRand(void) +{ + +} + + +#if BOOTLOADER_CODE_FLAG == 0 + +void SnapshotRecordLoad(DTC_RecordDataBufType *record) +{ + record->snapshot = vehicleInfo2uds.Snapshot; +} + +uint8_t SnapshotRecordFill(uint8_t *data, DTC_SnapshotType *snapshot) +{ + uint8_t j = 0; + uint16_t dataId; + + dataId = 0xCF00; + data[j++] = (uint8_t)(dataId >> 8); + data[j++] = (uint8_t)(dataId & 0x00ff); + data[j++] = snapshot->BatVolt; + dataId = 0xCF01; + data[j++] = (uint8_t)(dataId >> 8); + data[j++] = (uint8_t)(dataId & 0x00ff); + data[j++] = snapshot->SOCH; + data[j++] = snapshot->SOCL; + dataId = 0xCF02; + data[j++] = (uint8_t)(dataId >> 8); + data[j++] = (uint8_t)(dataId & 0x00ff); + data[j++] = snapshot->DCInVolH; + data[j++] = snapshot->DCInVolL; + dataId = 0xCF03; + data[j++] = (uint8_t)(dataId >> 8); + data[j++] = (uint8_t)(dataId & 0x00ff); + data[j++] = snapshot->GunSts; + dataId = 0xCF04; + data[j++] = (uint8_t)(dataId >> 8); + data[j++] = (uint8_t)(dataId & 0x00ff); + data[j++] = snapshot->DCRealySts; + dataId = 0xCF05; + data[j++] = (uint8_t)(dataId >> 8); + data[j++] = (uint8_t)(dataId & 0x00ff); + data[j++] = snapshot->ACRealySts; + dataId = 0xCF06; + data[j++] = (uint8_t)(dataId >> 8); + data[j++] = (uint8_t)(dataId & 0x00ff); + data[j++] = snapshot->CC2ResistorH; + data[j++] = snapshot->CC2ResistorL; + dataId = 0xCF07; + data[j++] = (uint8_t)(dataId >> 8); + data[j++] = (uint8_t)(dataId & 0x00ff); + data[j++] = snapshot->CommSts; + + return j; +} + +void SnapshotRecordNumberGet(DTC_RecordDataBufType *record_data, uint16_t *dataBuf, uint8_t *num) +{ + uint8_t i = 0; + uint8_t k = 0, j = 0; + uint16_t temp; + + *num = 0; + for (i=0; i(uint8_t)dataBuf[k+1]) { + temp = dataBuf[k+1]; + dataBuf[k+1] = dataBuf[k]; + dataBuf[k] = temp; + } + } + } + } +} + +uint8_t DiagDtcReportSnapshotFill(uint8_t sub_func, DTC_RecordDataBufType *record_data, uint8_t *data_buf, uint8_t *length) +{ + uint8_t ii = 0; + uint8_t ret = 1; + uint8_t num = 0, index; + uint32_t dtc_record; + uint16_t *snap_buf = dtcSnapshotDataBuf; + + data_buf[(*length)++] = DIAG_SERVE_READ_DTC|0x40; + data_buf[(*length)++] = sub_func; + + SnapshotRecordNumberGet(record_data, snap_buf, &num); + + for (ii=0; ii>8); + dtc_record = DTC_LIST_TABLE[index]; + data_buf[(*length)++] = (uint8_t)(dtc_record>>16); + data_buf[(*length)++] = (uint8_t)(dtc_record>>8); + data_buf[(*length)++] = (uint8_t)(dtc_record>>0); + data_buf[(*length)++] = record_data[index].snapNumber; + } + return 0; +} + +uint8_t DiagDtcSnapshotRecordFill(uint8_t sub_func, DTC_MaskRecordTpye mask_record, + uint8_t snap_record_num, DTC_RecordDataBufType *record_data, uint8_t *data_buf, uint8_t *length) +{ + uint8_t ii = 0; + uint8_t ret = 1; + + data_buf[(*length)++] = DIAG_SERVE_READ_DTC|0x40; + data_buf[(*length)++] = sub_func; + + for (ii=0; ii= DTC_ID_NUM) { + return; + } + if (dtc_record_data->status != status) { + if (status == ((1<snapNumber) { + (*snapshot_number_total)++; + dtc_record_data->snapNumber = *snapshot_number_total; + } + + if (dtc_record_data->extended.FaultCounter != 0xff) { + dtc_record_data->extended.FaultCounter ++; + } + } + // dtc_record_data->extended.FaultAgingCounter = 0; + } + + dtc_record_data->status = status; +} + + +//电压正且非busoff、电源ON下 +void DiagFaultsMonitor(void) +{ + + // if (CheckIsBatteryHigh())return; + + // if (CheckIsBatteryLow())return; + + // if (CheckIsIgnON()) { + + if (vehicleInfo2uds.InOverVoltFault) { + faultInfo.b.fINPUT_OVERVOLTAGE = 1; + } else { + faultInfo.b.fINPUT_OVERVOLTAGE = 0; + } + + if (vehicleInfo2uds.InUnderVoltFault) { + faultInfo.b.fINPUT_UNDERVOLTAGE = 1; + } else { + faultInfo.b.fINPUT_UNDERVOLTAGE = 0; + } + + if (vehicleInfo2uds.ChargeTempDerateFault) { + faultInfo.b.fCHARGE_TEMP_DERATE = 1; + } else { + faultInfo.b.fCHARGE_TEMP_DERATE = 0; + } + + if (vehicleInfo2uds.InterTempDerateFault) { + faultInfo.b.fINTER_TEMP_DERATE = 1; + } else { + faultInfo.b.fINTER_TEMP_DERATE = 0; + } + + if (vehicleInfo2uds.InterOverTempFault) { + faultInfo.b.fINTER_OVERTEMP = 1; + } else { + faultInfo.b.fINTER_OVERTEMP = 0; + } + + if (vehicleInfo2uds.ChargeOverTempFault) { + faultInfo.b.fCHARGE_OVERTEMP = 1; + } else { + faultInfo.b.fCHARGE_OVERTEMP = 0; + } + + if (vehicleInfo2uds.DcPosRelayAdhFault) { + faultInfo.b.fDC_POS_RELAY_ADH = 1; + } else { + faultInfo.b.fDC_POS_RELAY_ADH = 0; + } + + if (vehicleInfo2uds.DcNegRelayAdhFault) { + faultInfo.b.fDC_NEG_RELAY_ADH = 1; + } else { + faultInfo.b.fDC_NEG_RELAY_ADH = 0; + } + + if (vehicleInfo2uds.AcPosRelayAdhFault) { + faultInfo.b.fAC_POS_RELAY_ADH = 1; + } else { + faultInfo.b.fAC_POS_RELAY_ADH = 0; + } + + if (vehicleInfo2uds.AcNegRelayAdhFault) { + faultInfo.b.fAC_NEG_RELAY_ADH = 1; + } else { + faultInfo.b.fAC_NEG_RELAY_ADH = 0; + } + + if (vehicleInfo2uds.HvInterlockFault) { + faultInfo.b.fHV_INTERLOCK = 1; + } else { + faultInfo.b.fHV_INTERLOCK = 0; + } + + if (vehicleInfo2uds.CcCc2RelayCtrlInv) { + faultInfo.b.fCC_CC2_RELAY_CTRL_INV = 1; + } else { + faultInfo.b.fCC_CC2_RELAY_CTRL_INV = 0; + } + + if (vehicleInfo2uds.CpCc1RelayCtrlInv) { + faultInfo.b.fCP_CC1_RELAY_CTRL_INV = 1; + } else { + faultInfo.b.fCP_CC1_RELAY_CTRL_INV = 0; + } + + if (CheckIsCanBusoff()) { + if (vehicleInfo2uds.BusoffCnt >= 8) + { + faultInfo.b.fECU_ENTER_BUSOFF = 1; + } + } else { + faultInfo.b.fECU_ENTER_BUSOFF = 0; + } + + if (CheckIsCanBusoff() || CheckIsBatteryHigh() || CheckIsBatteryLow()) { + BMS_CommLossTimer = 0; + VCU_CommLossTimer = 0; + return; + } + + // if (diagStart_Timer) { + // diagStart_Timer --; + // if (diagStart_Timer == 0) { + // BMS_CommLossTimer = 0; + // } + // return; + // } else { + if (++BMS_CommLossTimer > 200) { + faultInfo.b.fBMS_COMM_LOSE = 1; + BMS_CommLossTimer = 0; + } + if (++VCU_CommLossTimer > 300) { + faultInfo.b.fVCU_COMM_LOSE = 1; + VCU_CommLossTimer = 0; + } + // } + // } else { + // diagStart_Timer = DIAG_START_TIME; + // } + +} + +void Uds_SetMsgMonitorTimer(uint16_t msgid) +{ +#if BOOTLOADER_CODE_FLAG == 0 + if (!udsInfo2Vehicle.NcmRxEnable) return; + switch (msgid) { + case Bms_104: + faultInfo.b.fBMS_COMM_LOSE = 0; + BMS_CommLossTimer = 0; + break; + case Vcu_state_111: + faultInfo.b.fVCU_COMM_LOSE = 0; + VCU_CommLossTimer = 0; + default: + break; + } +#endif +} + +void ClearMsgMonitorTimer(void) +{ + BMS_CommLossTimer = 0; + VCU_CommLossTimer = 0; +} + +void GetBatteryStatus(void) +{ + if (CheckIsBatteryHigh()) { + faultInfo.b.fECU_VOLTAGE_HIGH = 1; + } else { + faultInfo.b.fECU_VOLTAGE_HIGH = 0; + } + + if (CheckIsBatteryLow()) { + faultInfo.b.fECU_VOLTAGE_LOW = 1; + } else { + faultInfo.b.fECU_VOLTAGE_LOW = 0; + } +} + +#if 0 +void DtcAging_Process(void) +{ + uint8_t index; + DTC_RecordDataBufType *dtc_record_data; + static uint8_t ignStsBak = 1; + + if (ignStsBak != vehicleInfo2uds.IgnSts) { + ignStsBak = vehicleInfo2uds.IgnSts; + + if (vehicleInfo2uds.IgnSts) { + for (index = 0; index < DTC_ID_NUM; index++) { + dtc_record_data = &dtcComm.DTCStatus.recordData[index]; + if (dtc_record_data->status == (1 << DTC_STATUS_Confirmed_DTC)) { + dtc_record_data->extended.FaultAgingCounter++; + if (dtc_record_data->extended.FaultAgingCounter >= 40) { + dtc_record_data->extended.FaultAgingCounter = 0; + dtc_record_data->status = 0; + if (dtc_record_data->extended.FaultCounterOfAge != 0xff) { + dtc_record_data->extended.FaultCounterOfAge++; + } + } + } + } + } + } +} +#endif + +void ClearHardwareFault(void) +{ + UdsApi_HardwareFault_ForceClear(); +} + +void GetFaultInfo(void) +{ + uint8_t shift, status; + uint8_t size; + uint16_t crc16; + DTC_Fault_Flags littleFault; + DTC_RecordDataBufType *pDtcRecordData; + static uint8_t wrIndex = 0; + static uint8_t timer100ms; + + if (diagStart_InitTimer > 0) { //电压正常后才计数 + diagStart_InitTimer --; + + return; + } + GetBatteryStatus(); + + DiagFaultsMonitor(); + + if (UdsService.DisDTCRecord) { + return; + } + + // DtcAging_Process(); + + if (DTC_ID_NUM <= 32) { + //littleFault.w= BigLittleSwap32(faultInfo.w); + littleFault.w = faultInfo.w; + + for (shift = 0; shift < DTC_ID_NUM; shift++) { + + if ((littleFault.w >> shift) & 0x00000001) { + status = (1 << DTC_STATUS_Test_Failed) | (1 << DTC_STATUS_Confirmed_DTC); //当前故障 + } else { + status = dtcComm.DTCStatus.recordData[shift].status & (~(1 << DTC_STATUS_Test_Failed)); + } + + DiagUpdateDtcValue(shift, status); + } + } else { + //超出32个的,需要特殊处理 + } + + size = sizeof(DTC_RecordDataBufType); + pDtcRecordData = &dtcComm.DTCStatus.recordData[wrIndex]; + if (pDtcRecordData->status != dtcStatusBak.recordData[wrIndex].status \ + /*|| pDtcRecordData->extended.FaultAgingCounter != dtcStatusBak.recordData[wrIndex].extended.FaultAgingCounter*/) { + crc16 = CRC_Cal16_WithCfg((uint8_t *)pDtcRecordData, size - 2); + pDtcRecordData->crc16[0] = (uint8_t)crc16; + pDtcRecordData->crc16[1] = (uint8_t)(crc16 >> 8); + + dtcStatusBak.recordData[wrIndex].status = pDtcRecordData->status; + // dtcStatusBak.recordData[wrIndex].extended.FaultAgingCounter = pDtcRecordData->extended.FaultAgingCounter; + EE_Write(NVM_IMAGE_DTC_ADDR + (size * wrIndex), (uint8_t *)pDtcRecordData, size, NULL); + } + wrIndex++; + if (wrIndex >= DTC_ID_NUM) { + wrIndex = 0; + } + + if (++timer100ms >= 10) { + timer100ms = 0; + UdsDtcUpdateVehicle(); + } +} + + +void ClearDtc(void) +{ + uint8_t shift; + uint16_t crc16; + DTC_RecordDataBufType *pDtcRecordData; + + faultInfo.w = 0; + dtcsnapshotNumberTotal = 0; + for (shift = 0; shift < DTC_ID_NUM; shift++) { + pDtcRecordData = &dtcComm.DTCStatus.recordData[shift]; + + memset((uint8_t *)pDtcRecordData, 0x00, sizeof(DTC_RecordDataBufType) - 2); + crc16 = CRC_Cal16_WithCfg((uint8_t *)pDtcRecordData, sizeof(DTC_RecordDataBufType) - 2); + pDtcRecordData->crc16[0] = (uint8_t)crc16; + pDtcRecordData->crc16[1] = (uint8_t)(crc16 >> 8); + } + + memcpy((uint8_t *)&dtcStatusBak, (uint8_t *)&dtcComm.DTCStatus, sizeof(DTC_StatusType)); + EE_Write(NVM_IMAGE_DTC_ADDR, (uint8_t *)&dtcComm.DTCStatus, sizeof(DTC_StatusType), NULL); + ClearHardwareFault(); + ClearMsgMonitorTimer(); +} + + +bool GetDtcStatusMask(uint8_t *pOut, uint8_t *len, uint8_t subFunc, uint8_t mask) +{ + bool retValue = FALSE; + uint8_t ii = 0; + uint8_t j = 0; + + dtcComm.DTCcount.map = 0; + pOut[j++] = DIAG_SERVE_READ_DTC | 0x40; + pOut[j++] = subFunc; + pOut[j++] = DTC_STATUS_Support_Bit_Status; + + for (ii = 0; ii < DTC_ID_NUM; ii++) { + /*if (((dtcComm.DTCStatus[ii]&DTC_STATUS_Support_Bit_Status) == (mask&DTC_STATUS_Support_Bit_Status))\ + ||(subFunc == DTC_ReportSupportedDTCs))*/ + if ((dtcComm.DTCStatus.recordData[ii].status & mask) \ + || (dtcComm.DTCStatus.recordData[ii].status == mask)\ + || (subFunc == DTC_ReportSupportedDTCs)) { + if ((dtcOptions.w >> ii) & 0x00000001) { + retValue = TRUE; + dtcComm.DTCcount.map++; + pOut[j++] = (uint8_t)(DTC_LIST_TABLE[ii] >> 16); + pOut[j++] = (uint8_t)(DTC_LIST_TABLE[ii] >> 8); + pOut[j++] = (uint8_t)(DTC_LIST_TABLE[ii] >> 0); + pOut[j++] = dtcComm.DTCStatus.recordData[ii].status; + } + } + } + + *len = j; + return retValue; +} +#endif + +void DiagDIDStoreFlash(uint16_t id) +{ + uint8_t didIndex, nvmDidIndex; + //uint16_t offset; + uint16_t size; + uint8_t *cachePtr, *didPtr, *nvmDidPtr = NULL; + uint16_t crc16; + bool storage_flag = false; + + nvmDidIndex = GetDIDStoreInFlashIndexByID(id); + + if (nvmDidIndex != 0xFF) { + didIndex = GetDIDIndexByID(id); + + if (didIndex != 0xFF) { + size = DIDSize[didIndex]; + cachePtr = (uint8_t *)&gDIDCache; + didPtr = cachePtr + DIDOffset[didIndex]; + crc16 = CRC_Cal16_WithCfg(didPtr, size); + didPtr[size] = (uint8_t)crc16; + size++; + didPtr[size] = (uint8_t)(crc16 >> 8); + size++; + nvmDidPtr = (uint8_t *)NVM_IMAGE_DID_ADDR + DIDStoreInFlashOffset[nvmDidIndex]; + + if (nvmDidPtr != NULL) { + EE_Write(nvmDidPtr, didPtr, size, NULL); + } + UdsDidUpdateVehicle(); + } + } +} + +void CheckDtcHsCanError(void) +{ + static uint16_t Timer100msCnt = 0; +#if BOOTLOADER_CODE_FLAG == 0 + static uint16_t Timer10msCnt = 0; +#endif + uint16_t crc16; + + +#if BOOTLOADER_CODE_FLAG == 0 + + if (++Timer10msCnt >= 10) { + Timer10msCnt = 0; + GetFaultInfo(); + // IgnChangeProcess(); 没有老化 + } + gDIDCache.DID_CurrentDCVolt[0] = MSB(vehicleInfo2uds.CurrDcVolt); + gDIDCache.DID_CurrentDCVolt[1] = LSB(vehicleInfo2uds.CurrDcVolt); + gDIDCache.DID_DCUVariousCurrentTempVal[0] = vehicleInfo2uds.ChargeTemp; + gDIDCache.DID_DCUVariousCurrentTempVal[1] = vehicleInfo2uds.BoardTemp; + +#endif + if (++Timer100msCnt >= 100) { + Timer100msCnt = 0; + + if (UdsParam.SA_FailureCounter != UdsService.KeyErrCnt) { + UdsParam.SA_FailureCounter = UdsService.KeyErrCnt; + crc16 = CRC_Cal16_WithCfg((uint8_t *)&UdsParam, sizeof(UdsParam) - 2); + UdsParam.crc16[0] = (uint8_t)crc16; + UdsParam.crc16[1] = (uint8_t)(crc16 >> 8); + EE_Write(NVM_IMAGE_PARAM_ADDR, (uint8_t*)&UdsParam, sizeof(UdsParam), NULL); + } + } + + if ((UdsService.UdsTxFlg == true) && (UdsService.UdsTxCompFlg == true)) { + UdsService.UdsTxFlg = false; + UdsService.UdsTxCompFlg = false; + HAL_UDS_Tx_Callback(); + //UdsQueueCanOut(); + UdsService.TxCompFlg = true; + //Debug("HAL_UDS_Tx_Callback \r\n"); // + } +} + +#if BOOTLOADER_CODE_FLAG == 0 +INT8U Get0x19SerDiagData(INT8U *pOut, INT8U Type, INT8U *pdata) +{ + INT8U RstLen = 0; +// INT16U i=0; +// INT32U dtc_code = 0; +// INT8U num = 0; + uint8_t dtcReportSubFunction; + uint8_t dtcRecordNumber; + uint8_t dtcStatusMask; + DTC_MaskRecordTpye dtcMaskRecord; + + dtcReportSubFunction = Type; + dtcStatusMask = pdata[1]; + + switch (dtcReportSubFunction) { + case DTC_ReportNumberOfDTCByStatusMask: + case DTC_ReportDTCByStatusMask: + case DTC_ReportSupportedDTCs: + if (GetDtcStatusMask(pOut, &RstLen, dtcReportSubFunction, dtcStatusMask) == FALSE) { + RstLen = 0; + pOut[RstLen++] = DIAG_SERVE_READ_DTC | 0x40; //0x59; + pOut[RstLen++] = dtcReportSubFunction; + pOut[RstLen++] = DTC_STATUS_Support_Bit_Status; + } + + if (dtcReportSubFunction == DTC_ReportNumberOfDTCByStatusMask) { + RstLen = 0; + pOut[RstLen++] = DIAG_SERVE_READ_DTC|0x40;//0x59; + pOut[RstLen++] = dtcReportSubFunction; + pOut[RstLen++] = DTC_STATUS_Support_Bit_Status; + pOut[RstLen++] = ISO15031_6_DTCformat; + pOut[RstLen++] = dtcComm.DTCcount.b.DTCcountHighByte; + pOut[RstLen++] = dtcComm.DTCcount.b.DTCcountLowByte; + } + + break; + case DTC_ReportDTCSnapshotIdentification: + DiagDtcReportSnapshotFill(dtcReportSubFunction, dtcComm.DTCStatus.recordData, pOut, &RstLen); + break; + case DTC_ReportDTCSnapshotRecordByDTCNumber: + dtcMaskRecord.DTCHightByte = pdata[1]; + dtcMaskRecord.DTCMiddleByte = pdata[2]; + dtcMaskRecord.DTCLowByte = pdata[3]; + dtcRecordNumber = pdata[4]; + if (DiagDtcSnapshotRecordFill(dtcReportSubFunction, dtcMaskRecord, dtcRecordNumber, + dtcComm.DTCStatus.recordData, pOut, &RstLen) != 0) { + RstLen = 0; + } + break; + case DTC_ReportDTCExtendedDataRecordByDTCNumber: + dtcMaskRecord.DTCHightByte = pdata[1]; + dtcMaskRecord.DTCMiddleByte = pdata[2]; + dtcMaskRecord.DTCLowByte = pdata[3]; + dtcRecordNumber = pdata[4]; + if (DiagDtcExtendedDataRecordFill(dtcReportSubFunction, dtcMaskRecord, dtcRecordNumber, + dtcComm.DTCStatus.recordData, pOut, &RstLen) != 0) { + RstLen = 0; + } + break; + default: + break; + } + + return RstLen; +} +#endif + + + +INT16U Get0x22SerDiagData(INT8U *pOut) +{ + INT16U RstLen = 0; + INT16U ReqId = 0; +// INT16U length = 0; + uint8_t i; + uint8_t *cachePtr; + uint8_t size; + + ReqId = ((UdsService.ReqCmdBuf[0] << 8) + UdsService.ReqCmdBuf[1]); + + pOut[RstLen++] = 0x62; + pOut[RstLen++] = ((ReqId >> 8) & 0xFF); + pOut[RstLen++] = (ReqId & 0xFF); + + cachePtr = (uint8_t *)&gDIDCache; + + for (i = 0; i < DID_NUM; i++) { + if (ReqId == DIDId[i]) { + break; + } + } + + if (i == DID_NUM) { + RstLen = 2; + } else { +#if BOOTLOADER_CODE_FLAG + + if (!CheckIsSupportBootloaderRead_Sid22(ReqId)) { + RstLen = 2; + } + +#endif + } + + if (RstLen != 2) { + size = DIDSize[i]; + + memcpy(&pOut[RstLen], (cachePtr + DIDOffset[i]), size); + RstLen += size; + } + + return RstLen; +} + +#if BOOTLOADER_CODE_FLAG + +INT8U Set0x36DiagData(INT8U *pIn, INT16U PLen, INT8U *pOut, INT16U *RLen) +{ + uint8_t /*i=0,*/ucErrCode = 0; + uint8_t sn = 0; + + + sn = pIn[0]; + UdsUpData.totalRecvLength += (UdsService.RxDlc - 2); + + if (CheckIsBatteryHigh()) { + ucErrCode = 0x92; + } else if (CheckIsBatteryLow()) { + ucErrCode = 0x93; + } else if (UdsService.RxDlc > (FMC_PAGE_SIZE + 2)) { + ucErrCode = 0x13; + } else if ((UdsUpData.DownloadSeq != DOWNLOAD_SEQUENCE_34) && (UdsUpData.DownloadSeq != DOWNLOAD_SEQUENCE_36)) { + ucErrCode = 0x24; + } else if (sn != UdsUpData.Sn) { + ucErrCode = 0x73; + } else if (UdsUpData.totalRecvLength > FBL_AppSize) { + ucErrCode = 0x71; + } else { + UdsUpData.RxProgramFlag = true; + UdsUpData.DownloadSeq = DOWNLOAD_SEQUENCE_36; + memcpy(UdsUpData.Buf, &TP_Buffer[2], (UdsService.RxDlc - 2)); + ucErrCode = 0x78; + } + + return ucErrCode; + +} +#endif + +INT8U Set0x31DiagData(INT8U *pIn, INT16U PLen, INT8U *pOut, INT16U *RLen) +{ + + uint8_t service_buf[50]; + uint8_t /*i=0,*/ucErrCode = 0, ucRsp = 0; + uint16_t ReqId = 0; + uint16_t dlen = 0; + uint8_t result = 0; + + if (UdsService.RxDlc < 4) { + return 0x13; + } + + ucRsp = pIn[0]; + ReqId = pIn[1] << 8 | pIn[2]; + + service_buf[dlen++] = 0x71; + service_buf[dlen++] = pIn[0]; + service_buf[dlen++] = pIn[1]; + service_buf[dlen++] = pIn[2]; + +#if BOOTLOADER_CODE_FLAG == 0 + + static bool routineStartFlg = false; + if(0x01 == ucRsp) { + ReqId = pIn[1]<<8 | pIn[2]; + if((true == CheckUdsDlcIsOk(UdsService.RxDlc,4) && (ReqId == 0x0203))\ + ||(true == CheckUdsDlcIsOk(UdsService.RxDlc,4) && (ReqId == 0x0204)) + ||(true == CheckUdsDlcIsOk(UdsService.RxDlc,5) && (ReqId == 0x0207))) { + if (UdsService.SeedKeyIsOK) { + if (true == CheckVechileStatus()) { + switch (ReqId) { + case 0x0204: + result = 0x00; //correctResult + service_buf[dlen++] = result; + break; + case 0x0207: + if (pIn[3] <= 1) { + result = 0x00; //correctResult + udsInfo2Vehicle.DCDCEnable = pIn[3]; + } else { + result = 0x01; //incorrectResult + } + service_buf[dlen++] = result; + + break; + case 0x0203: + // if (UdsService.BattErrFlg == false) { + UdsService.ChkProgPreconditionFlg = true; + UdsService.ProgrammingPassTimer = PROGRAMMING_PASS_TIMEOUT_TIME; + // } + result = 0x00; //correctResult + service_buf[dlen++] = result; + break; + default: + break; + } + } else { + ucErrCode = 0x22; + } + if (!ucErrCode) { + routineStartFlg = true; + } + } else { + ucErrCode = 0x33; + } + } else if ((ReqId == 0x0203) || (ReqId == 0x0204) || (ReqId == 0x0207)) { + ucErrCode = 0x13; + } else { + ucErrCode = 0x31; + } + } else if(0x03 == ucRsp) { + ReqId = pIn[1]<<8 | pIn[2]; + if ((true == CheckUdsDlcIsOk(UdsService.RxDlc,4) && (ReqId == 0x0204))) { + if (UdsService.SeedKeyIsOK) { + if (true == CheckVechileStatus()) { + if (true == routineStartFlg) { + routineStartFlg = false; + switch (ReqId) { + case 0x0204: + result = vehicleInfo2uds.OtaModeSts; + service_buf[dlen++] = result; + break; + default: + break; + } + } else { + ucErrCode = 0x24; + } + } else { + ucErrCode = 0x22; + } + } else { + ucErrCode = 0x33; + } + } else if ((ReqId == 0x0204)) { + ucErrCode = 0x13; + } else { + ucErrCode = 0x31; + } + } else if (0x02 == ucRsp) { + if ((true == CheckUdsDlcIsOk(UdsService.RxDlc, 4) && (ReqId == 0x0204))) { + if (UdsService.SeedKeyIsOK) { + switch (ReqId) { + case 0x0204: + result = 0x00; //correctResult + service_buf[dlen++] = result; + break; + default: + break; + } + } else { + ucErrCode = 0x33; + } + } else if ((ReqId == 0x0204)) { + ucErrCode = 0x13; + } else { + ucErrCode = 0x31; + } + } else { + if (true == UdsService.PhyFlg) { + UdsService.PhyFlg = false; + ucErrCode = 0x12; + } + } + +#endif + *RLen = dlen; + + if (ucErrCode == 0) { + memcpy(pOut, service_buf, dlen); + } + + return ucErrCode; + +} + +INT8U Set0x2EDidDiagData(INT8U *pIn, INT16U PLen) +{ + INT8U Rst = 0; + INT16U ReqId = 0; + + ReqId = ((pIn[0] << 8) + pIn[1]); + +#if BOOTLOADER_CODE_FLAG == 0 + if (ReqId == DIDId[VehicleIdentificationNumber]) { + if(PLen == DIDSize[VehicleIdentificationNumber]) { + if (UdsService.SeedKeyIsOK) { + if (CheckVechileStatus()) { + memcpy(gDIDCache.DID_VehicleIdentificationNumber,&pIn[2],PLen); + } else { + Rst = 0x22; + } + } else { + Rst = 0x33; + } + } else { + Rst = 0x13; + } + } else if (ReqId == DIDId[EOLData]) { + if(PLen == DIDSize[EOLData]) { + if (UdsService.SeedKeyIsOK) { + if (CheckVechileStatus()) { + memcpy(gDIDCache.DID_EOLData,&pIn[2],PLen); + } else { + Rst = 0x22; + } + } else { + Rst = 0x33; + } + } else { + Rst = 0x13; + } + } else if (ReqId == DIDId[DCUVariousTempProtectVal]) { + if(PLen == DIDSize[DCUVariousTempProtectVal]) { + if (UdsService.SeedKeyIsOK) { + if (CheckVechileStatus()) { + memcpy(gDIDCache.DID_DCUVariousTempProtectVal,&pIn[2],PLen); + } else { + Rst = 0x22; + } + } else { + Rst = 0x33; + } + } else { + Rst = 0x13; + } + } else if (ReqId == DIDId[DCVoltProtectVal]) { + if(PLen == DIDSize[DCVoltProtectVal]) { + if (UdsService.SeedKeyIsOK) { + if (CheckVechileStatus()) { + memcpy(gDIDCache.DID_DCVoltProtectVal,&pIn[2],PLen); + } else { + Rst = 0x22; + } + } else { + Rst = 0x33; + } + } else { + Rst = 0x13; + } + } else if (ReqId == DIDId[InsulationDectVolt]) { + if(PLen == DIDSize[InsulationDectVolt]) { + if (UdsService.SeedKeyIsOK) { + if (CheckVechileStatus()) { + memcpy(gDIDCache.DID_InsulationDectVolt,&pIn[2],PLen); + } else { + Rst = 0x22; + } + } else { + Rst = 0x33; + } + } else { + Rst = 0x13; + } + } else { + Rst = 0x31; + } + +#else + if (ReqId == DIDId[FingerPrint]) { + if(PLen == DIDSize[FingerPrint]) { + if (UdsService.SeedKeyIsOK) { + memcpy(gDIDCache.DID_FingerPrint,&pIn[2],PLen); + } else { + Rst = 0x33; + } + } else { + Rst = 0x13; + } + } else { + Rst = 0x31; + } + +#endif + + if (Rst == 0) { + DiagDIDStoreFlash(ReqId); + } + + return Rst; +} + +#if BOOTLOADER_CODE_FLAG == 0 +INT8U Set0x2FDiagData(INT8U *pIn, INT16U PLen, INT8U *pOut, INT16U *RLen) +{ + INT8U ucErrCode = 0; + + return ucErrCode; +} +#endif + +void UdsQueueCanOut(void) +{ + //if(Frame_Tx_Complete != false) return; + //if(TP_Tx_Message_DLC) return; + while ((UdsQueueData.In != UdsQueueData.Out)) { + if (UdsQueueData.Out >= CAN0_MAX_RX) { + UdsQueueData.Out = 0; + } + + gUdsBusOffCanOutBak = UdsQueueData.Out; + ParseUdsCan(UdsQueueData.CanMsg[UdsQueueData.Out]); + UdsQueueData.Out++; + ParseCanRxCnt++; + // break; + } + + //return; +} + + +uint8_t GenerateSID27SeedValue(uint8_t *seed) +{ + uint32_t random; + + random *= UdsApi_GetRandom(); + if (random == 0xffffffff) { + random *= 0xaa; + } else if (random == 0) { + random += UdsApi_GetRandom(); + } + seed[0] = (uint8_t)(random >> 0); + seed[1] = (uint8_t)(random >> 16); + seed[2] = (uint8_t)(random >> 8); + seed[3] = (uint8_t)(random >> 0); + return 0; +} + +#if BOOTLOADER_CODE_FLAG + extern void RAMFLASHInit(void); +#endif + +uint8_t GenerateSID27KeyValue(uint8_t levelType,uint8_t *seed,uint8_t *key) +{ + uint8_t i = 0; + + uint8_t cal[4] = {0}; + uint8_t xor_data[4] = {0x90,0x23,0xB0,0x21}; + + if(levelType == 1) { //Level 1 + for (i=0;i<4;i++) + { + cal[i] = seed[i] ^ xor_data[i]; + } + key[0] = ((cal[0]&0x0f)<<4) | (cal[1] & 0xf0); + key[1] = ((cal[1]&0x0f)<<4) | ((cal[2] & 0xf0)>>4); + key[2] = ((cal[2]&0xf0)) | ((cal[3] & 0xf0)>>4); + key[3] = ((cal[3]&0x0f)<<4) | (cal[0] & 0x0f); + } else { //FBL_Level + for (i=0;i<4;i++) + { + cal[i] = seed[i] ^ xor_data[i]; + } + key[0] = ((cal[0] & 0x0f) << 4) | (cal[1] & 0x0f); + key[1] = ((cal[1] & 0xf0) >> 4) | ((cal[2] & 0x0f) << 4); + key[2] = ((cal[2] & 0xf0) >> 4) | ((cal[3] & 0xf0)); + key[3] = ((cal[3] & 0x0f)) | ((cal[0] & 0xf0) >> 4); + } + + return 0; +} + +//extern EReturnMsg bsp_flash_erase_sector(INT32U nFlashAddr); +//extern EReturnMsg bsp_flash_write_buff(INT32U nFlashAddr, INT8U *pBuff, INT32U nLen); +//extern EReturnMsg bsp_flash_read_buff(INT32U nFlashAddr, INT8U *pBuff, INT32U nLen); + +uint8_t EE_Write(uint8_t *pImage, const uint8_t *pData, uint32_t Len, void (*pCbFn)(uint32_t)) +{ + uds_service_nvm_write(pImage, pData, Len, pCbFn); + return TRUE; +} + + +uint8_t EE_Read(uint8_t *pImage, uint8_t **pData) +{ + if (NVM_IMAGE_DTC_ADDR == pImage) { + *pData = (uint8_t *)NVM_IMAGE_DTC_ADDR; + } else if (NVM_IMAGE_DID_ADDR == pImage) { + *pData = (uint8_t *)NVM_IMAGE_DID_ADDR; + } else if (NVM_IMAGE_PARAM_ADDR == pImage) { + *pData = (uint8_t *)NVM_IMAGE_PARAM_ADDR; + } else { + return FALSE; + } + + return TRUE; +} + +void SetUdsUpdataFlag(void) +{ +#if (BOOTLOADER_CODE_FLAG == 0) + SetExternProgrammingRequest(); +#endif + +} + + +bool CheckVechileStatus(void) +{ + bool cbRst = false; + // uint16_t speed = WORD(vehicleInfo2uds.Snapshot.VehSpeedH, vehicleInfo2uds.Snapshot.VehSpeedL); + + // if (speed <= 80) { + // cbRst = true; + // } + cbRst = true; + + return cbRst; +} + +bool CheckIsBatteryLow(void) +{ + bool bRst = false; + + if (vehicleInfo2uds.BattLow) { + bRst = true; + } + + return bRst; +} + +bool CheckIsBatteryHigh(void) +{ + bool bRst = false; + + if (vehicleInfo2uds.BattHigh) { + bRst = true; + } + + return bRst; +} + +bool CheckIsIgnON(void) +{ + bool bRst = false; + + if (vehicleInfo2uds.IgnSts) { + bRst = true; + } + + return bRst; +} + +//bool CheckIsIgnOff2ON(void) +//{ +// bool bRst=false; +// +// if (vehicleInfo2uds.IgnOff2On) { +// bRst = true; +// } +// return bRst; +//} +#if BOOTLOADER_CODE_FLAG == 0 + + +bool CheckIsCanBusoff(void) +{ + bool bRst = false; + + if (vehicleInfo2uds.BusoffCnt) { + bRst = true; + } + + return bRst; +} + +#endif + diff --git a/UDS/uds_api.c b/UDS/uds_api.c index 953d989..4a3c480 100644 Binary files a/UDS/uds_api.c and b/UDS/uds_api.c differ diff --git a/UDS/uds_dtc.h b/UDS/uds_dtc.h index 7d1f754..0c3c010 100644 Binary files a/UDS/uds_dtc.h and b/UDS/uds_dtc.h differ