Index: firmware/App/Services/TxParams.c =================================================================== diff -u -r880a9762cc029d858dfbaadc678afa2c6f8633a2 -r4a822b31b79b7e8a6bf60b45065be70c16172214 --- firmware/App/Services/TxParams.c (.../TxParams.c) (revision 880a9762cc029d858dfbaadc678afa2c6f8633a2) +++ firmware/App/Services/TxParams.c (.../TxParams.c) (revision 4a822b31b79b7e8a6bf60b45065be70c16172214) @@ -14,6 +14,7 @@ * @date (original) 02-Dec-2025 * ***************************************************************************/ +#include // Used for fabs() and roundf() functions for floating-point comparisons and rounding. #include "AirPump.h" #include "AirTrap.h" @@ -105,6 +106,7 @@ // ********** private data ********** +/// Treatment parameter properties including data type, range limits and default values. static const TREATMENT_PARAMS_PROPERTIES_T TREAT_PARAMS_PROPERTIES[ NUM_OF_TREATMENT_PARAMS ] = { // type min max default { CRITICAL_DATA_TYPE_U32, {.uInt=0}, {.uInt=2}, {.uInt=0} }, // TREATMENT_PARAM_TREATMENT_MODALITY @@ -133,6 +135,7 @@ { CRITICAL_DATA_TYPE_F32, {.sFlt=0.0}, {.sFlt=8.0}, {.sFlt=0.0} }, // TREATMENT_PARAM_UF_VOLUME }; +/// System configuration treatment parameter properties including data type, range limits and default values. static const TREATMENT_PARAMS_PROPERTIES_T SYS_CONFIG_TREAT_PARAMS_PROPERTIES[ NUM_OF_SYS_CONFIG_TREATMENT_PARAMS ] = { // type min max default @@ -2203,6 +2206,7 @@ UI_RESPONSE_PAYLOAD_T response; F32 presUFVolumeMl = getTreatmentParameterF32( TREATMENT_PARAM_UF_VOLUME ) * (F32)ML_PER_LITER; F32 validatedUFRateMlMin = ( validatedUFRateLhr * (F32)ML_PER_LITER ) / (F32)MIN_PER_HOUR; + F32 roundedValidatedUFRateLhr = 0.0F; response.accepted = FALSE; response.rejectionReason = REQUEST_REJECT_REASON_INVALID_REQUEST_FORMAT; @@ -2211,9 +2215,11 @@ { memcpy( &request, &message->payload[ 0 ], sizeof( TREATMENT_DURATION_CONFIRM_REQUEST_PAYLOAD_T ) ); + roundedValidatedUFRateLhr = roundf( validatedUFRateLhr * 100.0F ) / 100.0F; + // Verify confirmed duration and UF rate match previously validated values. if ( ( TRUE == validTreatmentDurationReceived ) && ( request.duration == validatedTreatmentDuration_min ) && - ( fabs( request.ufRate - validatedUFRateLhr ) < NEARLY_ZERO ) && + ( fabs( request.ufRate - roundedValidatedUFRateLhr ) < NEARLY_ZERO ) && ( request.heparinDuration == validatedHeparinDeliveryDuration_min ) ) { setTreatmentParameterU32( TREATMENT_PARAM_TREATMENT_DURATION, validatedTreatmentDuration_min ); @@ -2263,6 +2269,7 @@ UI_RESPONSE_PAYLOAD_T response; F32 validatedUFVolumeGoalMl = 0.0F; F32 validatedUFRateMlMin = 0.0F; + F32 roundedValidatedUFRateLhr = 0.0F; response.accepted = FALSE; response.rejectionReason = REQUEST_REJECT_REASON_INVALID_REQUEST_FORMAT; @@ -2273,10 +2280,11 @@ validatedUFVolumeGoalMl = validatedUFVolumeGoalL * (F32)ML_PER_LITER; validatedUFRateMlMin = ( validatedUFRateLhr * (F32)ML_PER_LITER ) / (F32)MIN_PER_HOUR; + roundedValidatedUFRateLhr = roundf( validatedUFRateLhr * 100.0F ) / 100.0F; // Verify confirmed UF volume and UF rate match previously validated values. if ( ( TRUE == validUFVolumeReceived ) && ( fabs( request.ufVolume - validatedUFVolumeGoalL ) < NEARLY_ZERO ) && - ( fabs( request.ufRate - validatedUFRateLhr ) <= 0.01F ) ) + ( fabs( request.ufRate - roundedValidatedUFRateLhr ) < NEARLY_ZERO ) ) { setTreatmentParameterF32( TREATMENT_PARAM_UF_VOLUME, validatedUFVolumeGoalL ); updateTreatmentBroadcastData( validatedUFRateLhr );