diff --git a/CanUds.c b/CanUds.c index bbbe97e..bc3a944 100644 --- a/CanUds.c +++ b/CanUds.c @@ -300,7 +300,7 @@ static uint16_t DiagnosticSessionControl_10(tCanUds *env) { // Нормальный таймаут. Важно: Клиент может отправлять TesterPresent для поддержания сессии // 50 мс - diagnosticSessionsType->P2 = 50; + diagnosticSessionsType->P2 = 500; // Расширенный таймаут. Например, ECU может обрабатывать сложный запрос 2 секунды и отправлять NRC 0x78, затем ответ // 5000 мс @@ -777,7 +777,8 @@ static uint16_t UDS_ReadDTCInformation_19(tCanUds *env) { } if ((com->sub_function != UDS_dtc_reportNumberOfDTCByStatusMask) && - (com->sub_function != UDS_dtc_reportDTCByStatusMask)) { + (com->sub_function != UDS_dtc_reportDTCByStatusMask) && + (com->sub_function != UDS_dtc_reportDTCBySupport)) { return setResponseError(env, UDS_ReadDTCInformation, UDS_error_sub_functionNotSupported); } @@ -794,9 +795,9 @@ static uint16_t UDS_ReadDTCInformation_19(tCanUds *env) { env->dataResponse[1] = env->data->data[1] & 0b01111111; // sub-function // доступные биты статусов - env->dataResponse[2] = 0xFF; + env->dataResponse[2] = 0x09; // формат кодирования DTC - env->dataResponse[3] = 1; + env->dataResponse[3] = 0; // старший байт количества DTC env->dataResponse[4] = 0; @@ -813,7 +814,7 @@ static uint16_t UDS_ReadDTCInformation_19(tCanUds *env) { env->dataResponse[1] = env->data->data[1] & 0b01111111; // sub-function // доступные биты статусов - env->dataResponse[2] = 0xFF; + env->dataResponse[2] = 0x09; response_size = 3; @@ -821,6 +822,19 @@ static uint16_t UDS_ReadDTCInformation_19(tCanUds *env) { response_size += SetGetDiagnosticData(env->Diagnostic, DIAGNOSTIC_UDS_ReadDTCInformation_19_2, &diagnosticDTC); } + if (com->sub_function == UDS_dtc_reportDTCBySupport) { + + env->dataResponse[1] = env->data->data[1] & 0b01111111; // sub-function + + // доступные биты статусов + env->dataResponse[2] = 0x09; + + response_size = 3; + + tDiagnosticDTC diagnosticDTC = {env->data->data[2], &env->dataResponse[response_size]}; + response_size += SetGetDiagnosticData(env->Diagnostic, DIAGNOSTIC_UDS_ReadDTCInformation_19_A, &diagnosticDTC); + } + return response_size; } // конец --------------------------- Чтение ошибок --------------------------------------------------------- diff --git a/CanUds.h b/CanUds.h index 73710de..5832598 100644 --- a/CanUds.h +++ b/CanUds.h @@ -81,8 +81,9 @@ typedef enum { } eUdsIO; typedef enum { - UDS_dtc_reportNumberOfDTCByStatusMask = 0x1, - UDS_dtc_reportDTCByStatusMask = 0x2 + UDS_dtc_reportNumberOfDTCByStatusMask = 0x01, + UDS_dtc_reportDTCByStatusMask = 0x02, + UDS_dtc_reportDTCBySupport = 0x0A } eUdsDtc; typedef enum {