diff --git a/CanUds.c b/CanUds.c index 8368f8c..ecefb4c 100644 --- a/CanUds.c +++ b/CanUds.c @@ -467,13 +467,135 @@ static uint16_t InputOutputControlByIdentifier_2F(tCanUds *env) { env->dataResponse[1] = dataIdentifier_hi; env->dataResponse[2] = dataIdentifier_lo; env->dataResponse[3] = env->data.data[3]; - //memcpy(uds_IoDataByIdentifier_2F_com_CF[dataIdentifier_lo].data, &env->data.data[3], size); + + if (env->data.data[3] == UDS_io_shortTermAdjustment) { + + // Motor_Def...MotorSealingValve (percent) + if ((dataIdentifier_lo >= 0x60) && (dataIdentifier_lo <= 0x78)) { + uint16_t percent = (env->data.data[4] << 8) | env->data.data[5]; + + if (percent > 1000) { + return setResponseError(env, UDS_InputOutputControlByIdentifier, UDS_error_requestOutOfRange); + } + + memcpy(uds_IoDataByIdentifier_2F_com_CF[dataIdentifier_lo].data, &env->data.data[4], size); + return size + 4; + } else { + + switch (dataIdentifier_lo) { + + // Doors Actuator + case 0x50: { + for (uint8_t i = 0; i < 24; i += 2) { + uint16_t percent = (env->data.data[4 + i] << 8) | env->data.data[5 + 1 + i]; + if (percent > 1000) { + return setResponseError(env, UDS_InputOutputControlByIdentifier, + UDS_error_requestOutOfRange); + } + } + break; + } + + // IO + case 0x51: { + for (uint8_t i = 0; i < 8; ++i) { + uint8_t on_off = env->data.data[4 + i]; + if (on_off > 1) { + return setResponseError(env, UDS_InputOutputControlByIdentifier, + UDS_error_requestOutOfRange); + } + } + break; + } + + // PWM + case 0x52: { + + tStatus_Pwm *pwm = (tStatus_Pwm *) &env->data.data[4]; + if ((pwm->Pwm_Front > 1000) || (pwm->Pwm_Rear > 1000)) { + return setResponseError(env, UDS_InputOutputControlByIdentifier, + UDS_error_requestOutOfRange); + } + + break; + } + + // eComp + case 0x53: { + + tStatus_eComp *eComp = (tStatus_eComp *) &env->data.data[4]; + if ((eComp->eComp_Statue_Request > 1) || (eComp->LowTempValve > 1)) { + return setResponseError(env, UDS_InputOutputControlByIdentifier, + UDS_error_requestOutOfRange); + } + + break; + } + + // External + case 0x54: { + + tStatus_External *external = (tStatus_External *) &env->data.data[4]; + if (external->CoolingFan > 1000) { + return setResponseError(env, UDS_InputOutputControlByIdentifier, + UDS_error_requestOutOfRange); + } + + break; + } + + // EMS + case 0x55: { + + tStatus_EMS *ems = (tStatus_EMS *) &env->data.data[4]; + if (ems->EMS_Chiller_Req > 1) { + return setResponseError(env, UDS_InputOutputControlByIdentifier, + UDS_error_requestOutOfRange); + } + + break; + } + + // Ionizer_Aroma + case 0x56: { + + tStatus_Ionizer_Aroma *ionizer_Aroma = (tStatus_Ionizer_Aroma *) &env->data.data[4]; + if ((ionizer_Aroma->Ionizer > 1) || (ionizer_Aroma->AromatizationIntensivity > 3)) { + return setResponseError(env, UDS_InputOutputControlByIdentifier, + UDS_error_requestOutOfRange); + } + + break; + } + + // Duct Select + case 0x79: { + + tStatus_Duct_Select *duct_Select = (tStatus_Duct_Select *) &env->data.data[4]; + if ((duct_Select->Duct_FL > 1) || (duct_Select->Duct_FR > 1) || + (duct_Select->Duct_RL > 1) || (duct_Select->Duct_RR > 1)) { + return setResponseError(env, UDS_InputOutputControlByIdentifier, + UDS_error_requestOutOfRange); + } + + break; + } + + } + + } + + memcpy(uds_IoDataByIdentifier_2F_com_CF[dataIdentifier_lo].data, &env->data.data[4], size); + + return size + 4; + } + return 4; } } - +/* if (dataIdentifier_hi == 0xF1) { if (uds_IoDataByIdentifier_2F_com_F1[dataIdentifier_lo].data != NULL) { @@ -494,7 +616,7 @@ static uint16_t InputOutputControlByIdentifier_2F(tCanUds *env) { UDS_error_incorrectMessageLengthOrInvalidFormat); } - env->dataResponse[0] = UDS_WriteDataByIdentifier | 0b1000000; + env->dataResponse[0] = UDS_InputOutputControlByIdentifier | 0b1000000; env->dataResponse[1] = dataIdentifier_hi; env->dataResponse[2] = dataIdentifier_lo; env->dataResponse[3] = env->data.data[3]; @@ -504,8 +626,8 @@ static uint16_t InputOutputControlByIdentifier_2F(tCanUds *env) { } } - - return setResponseError(env, UDS_WriteDataByIdentifier, UDS_error_requestOutOfRange); +*/ + return setResponseError(env, UDS_InputOutputControlByIdentifier, UDS_error_requestOutOfRange); } // конец --------------------------- Управление --------------------------------------------------------- // конец --------------------------- Управление ---------------------------------------------------------