diff --git a/CanUds.c b/CanUds.c index 83bcba4..ac1ebb8 100644 --- a/CanUds.c +++ b/CanUds.c @@ -235,8 +235,6 @@ void setResponseErrorPending(tCanUds *env, eUdsServices service, eUdsResponseErr } - - static void setDefaultSecurityAccess(tCanUds *env) { env->SA.requestSequenceRequestSeed = false; env->SA.stateSecurityAccess = false; @@ -1331,12 +1329,14 @@ static uint16_t RequestDownload_34(tCanUds *env) { requestDownload_Response->ServiceId = UDS_RequestDownload | 0b1000000; requestDownload_Response->lengthFormatIdentifier = 0x20; // 2 байта - длина поля maxNumberOfBlockLength - uint8_t countBlock = 1; + uint8_t countBlock = 8; requestDownload_Response->maxNumberOfBlockLength = countBlock * 128 + 2; env->AdrFlash = 0x1100000; env->SizeWriteFlash = 0; + env->stateDownload = UDS_RequestDownload; + // vCanSerialPortSetMaskCount(env->CanIO->env, 2); return 4; @@ -1367,7 +1367,20 @@ static uint16_t TransferData_36(tCanUds *env) { return setResponseError(env, UDS_RoutineControl, UDS_error_securityAccessDenied); } -// setResponseErrorPending(env, UDS_RoutineControl, UDS_error_requestCorrectlyReceived_ResponsePending); + if (env->stateDownload == UDS_RequestDownload) { + env->stateDownload = UDS_TransferData; + } else { + if (env->stateDownload != UDS_TransferData) { + return setResponseError(env, UDS_RoutineControl, UDS_error_requestSequenceError); + } + } + + if (env->SizeWriteFlash >= DownloadFirmwareSize) { + return setResponseError(env, UDS_RoutineControl, UDS_error_requestSequenceError); + } + + + // setResponseErrorPending(env, UDS_RoutineControl, UDS_error_requestCorrectlyReceived_ResponsePending); if (osMutexAcquire(env->access, 1000) == osOK) { env->currentSessionTesterPresentTimeout = SystemGetMs() + timeout_session_S3_Server; @@ -1383,7 +1396,7 @@ static uint16_t TransferData_36(tCanUds *env) { env->AdrFlash += env->data->len - 2; env->SizeWriteFlash += env->data->len - 2; -// LoggerFormatInfo(LOGGER, LOG_SIGN, "Size Write Flash = %d", env->SizeWriteFlash) + LoggerFormatInfo(LOGGER, LOG_SIGN, "Download: %d of %d kb", env->SizeWriteFlash / 1024 , DownloadFirmwareSize / 1024) tTransferData_Response *transferData_Response = (tTransferData_Response *) env->dataResponse; transferData_Response->ServiceId = UDS_TransferData | 0b1000000; @@ -1406,6 +1419,11 @@ static uint16_t RequestTransferExit_37(tCanUds *env) { return setResponseError(env, UDS_RoutineControl, UDS_error_conditionsNotCorrect); } + if ((env->stateDownload != UDS_TransferData) || (env->SizeWriteFlash < DownloadFirmwareSize)) { + return setResponseError(env, UDS_RoutineControl, UDS_error_requestSequenceError); + } else { + env->stateDownload = UDS_RequestTransferExit; + } tRequestTransferExit_Request *com = (tRequestTransferExit_Request *) env->data->data; diff --git a/CanUds.h b/CanUds.h index ab7cb42..1131da6 100644 --- a/CanUds.h +++ b/CanUds.h @@ -15,6 +15,8 @@ //#define CAN_US_QUEUE_SIZE 1 +#define DownloadFirmwareSize (512 * 1024) + #define MAX_ATTEMPTS_DEFAULT 3 #define BLOCK_TIME_DEFAULT 60000 @@ -189,6 +191,8 @@ typedef struct { uint32_t SizeWriteFlash; uint8_t blockSequenceCounter; + eUdsServices stateDownload; + tStaticThreadBlock(384) T_can_Uds; } tCanUds;