From fc4048ef4841eefdec935881adddbccb91e2b873 Mon Sep 17 00:00:00 2001 From: cfif Date: Thu, 29 Jan 2026 13:11:32 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CanUds.c | 82 +++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 51 insertions(+), 31 deletions(-) diff --git a/CanUds.c b/CanUds.c index 530b532..3a5168d 100644 --- a/CanUds.c +++ b/CanUds.c @@ -252,6 +252,50 @@ static uint16_t ReadDataByIdentifier_22(tCanUds *env) { static uint16_t WriteDataByIdentifier_2E(tCanUds *env) { + if (env->data.len < 3) { + return setResponseError(env, UDS_WriteDataByIdentifier, UDS_error_incorrectMessageLengthOrInvalidFormat); + } + + uint8_t dataIdentifier_hi = env->data.data[1]; + uint8_t dataIdentifier_lo = env->data.data[2]; +// uint16_t dataIdentifier = (dataIdentifier_hi << 8) | dataIdentifier_lo; + + if (dataIdentifier_hi == 0xCF) { + + if (uds_WriteDataByIdentifier_2E_com_CF[dataIdentifier_lo].data != NULL) { + uint16_t size = uds_WriteDataByIdentifier_2E_com_CF[dataIdentifier_lo].size; + + if (env->data.len != size + 3) { + return setResponseError(env, UDS_WriteDataByIdentifier, + UDS_error_incorrectMessageLengthOrInvalidFormat); + } + + env->dataResponse[0] = UDS_WriteDataByIdentifier | 0b1000000; + env->dataResponse[1] = dataIdentifier_hi; + env->dataResponse[2] = dataIdentifier_lo; + memcpy(uds_WriteDataByIdentifier_2E_com_CF[dataIdentifier_lo].data, &env->data.data[3], size); + + return 3; + } + + } + + if (dataIdentifier_hi == 0xF1) { + + if (uds_WriteDataByIdentifier_2E_com_F1[dataIdentifier_lo].data != NULL) { + uint16_t size = uds_WriteDataByIdentifier_2E_com_F1[dataIdentifier_lo].size; + + env->dataResponse[0] = UDS_WriteDataByIdentifier | 0b1000000; + env->dataResponse[1] = dataIdentifier_hi; + env->dataResponse[2] = dataIdentifier_lo; + memcpy(uds_WriteDataByIdentifier_2E_com_F1[dataIdentifier_lo].data, &env->data.data[3], size); + + return 3; + } + + } + + return setResponseError(env, UDS_WriteDataByIdentifier, UDS_error_requestOutOfRange); } // конец --------------------------- Запись --------------------------------------------------------- @@ -324,7 +368,7 @@ static uint16_t UDS_ClearDiagnosticInformation_14(tCanUds *env) { UDS_error_incorrectMessageLengthOrInvalidFormat); } - setDiagnosticData(env->Diagnostic, DIAGNOSTIC_SET_UDS_ClearDiagnosticInformation_14); + SetGetDiagnosticData(env->Diagnostic, DIAGNOSTIC_UDS_ClearDiagnosticInformation_14, NULL); env->dataResponse[0] = UDS_ClearDiagnosticInformation | 0b1000000; @@ -338,34 +382,6 @@ static uint16_t UDS_ClearDiagnosticInformation_14(tCanUds *env) { // начало --------------------------- Чтение ошибок --------------------------------------------------------- // начало --------------------------- Чтение ошибок --------------------------------------------------------- -void SetUdsDTC_error(tCanUds *env, uint8_t mask, uint16_t *sizeResponse) { - - for (uint8_t i = 0; i < COUNT_DTC_CODE_ERROR; ++i) { - - if (dtc_state_error[i] & mask) { - env->dataResponse[*sizeResponse] = dtc_codes[i].DTCHighByte; - env->dataResponse[*sizeResponse + 1] = dtc_codes[i].DTCMiddleByte; - env->dataResponse[*sizeResponse + 2] = dtc_codes[i].DTCLowByte; - env->dataResponse[*sizeResponse + 3] = dtc_state_error[i] & mask; - *sizeResponse += 4; - } - } -} - -uint8_t GetCountUdsDTC_error(uint8_t mask) { - - uint8_t count = 0; - - for (uint8_t i = 0; i < COUNT_DTC_CODE_ERROR; ++i) { - - if (dtc_state_error[i] & mask) { - ++count; - } - } - - return count; -} - static uint16_t UDS_ReadDTCInformation_19(tCanUds *env) { tUdsServiceCommand *com = (tUdsServiceCommand *) env->data.data; @@ -393,8 +409,11 @@ static uint16_t UDS_ReadDTCInformation_19(tCanUds *env) { env->dataResponse[3] = 1; // старший байт количества DTC env->dataResponse[4] = 0; + + tDiagnosticDTC diagnosticDTC = {env->data.data[2], NULL}; // младший байт количества DTC - env->dataResponse[5] = GetCountUdsDTC_error(env->data.data[2]); + env->dataResponse[5] = SetGetDiagnosticData(env->Diagnostic, DIAGNOSTIC_UDS_ReadDTCInformation_19_1, + &diagnosticDTC); response_size = 6; } @@ -408,7 +427,8 @@ static uint16_t UDS_ReadDTCInformation_19(tCanUds *env) { response_size = 3; - SetUdsDTC_error(env, env->data.data[2], &response_size); + tDiagnosticDTC diagnosticDTC = {env->data.data[2], &env->dataResponse[response_size]}; + response_size += SetGetDiagnosticData(env->Diagnostic, DIAGNOSTIC_UDS_ReadDTCInformation_19_2, &diagnosticDTC); } return response_size;