Index: firmware/App/Services/TxParams.c =================================================================== diff -u -re23b34695d4b67bbce65248f97fc346d3acb7aa6 -rf75b9170fa213d0a9cc5fd1bff660e21800be080 --- firmware/App/Services/TxParams.c (.../TxParams.c) (revision e23b34695d4b67bbce65248f97fc346d3acb7aa6) +++ firmware/App/Services/TxParams.c (.../TxParams.c) (revision f75b9170fa213d0a9cc5fd1bff660e21800be080) @@ -1238,10 +1238,12 @@ return value; } + /************************************************************************* * In-treatment treatment parameter edit function *************************************************************************/ + /*********************************************************************//** * @brief * The validateAndSetTreatmentDuration function handles the UI treatment @@ -1252,8 +1254,8 @@ * message containing requested treatment duration (minutes). * @details \b Outputs: * response updated with acceptance status, rejection reason, - * requested duration, prescribed UF volume goal (mL), - * and calculated UF rate (mL/min). When accepted, validated + * requested duration, prescribed UF volume goal (L), + * and calculated UF rate (L/hr). When accepted, validated * values are stored for use during confirmation. * @return TRUE if response message is sent successfully, FALSE otherwise. *************************************************************************/ @@ -1281,7 +1283,6 @@ validTreatmentDurationReceived = FALSE; validatedTreatmentDuration_min = 0U; validatedUFRateMlMin = 0.0F; - validatedUFVolumeGoalMl = 0.0F; if ( message->hdr.payloadLen == sizeof( DURATION_VALIDATE_REQUEST_PAYLOAD_T ) ) { @@ -1303,21 +1304,19 @@ // Calculate new UF rate (mL/min). F32 newUfRateMlMin = remainingUFVolumeMl / remainingTreatmentTimeMin; - response.ufVolumeGoal = presUFVolumeMl; - response.ufRate = newUfRateMlMin; + // Convert UF values for UI response. + response.ufVolumeGoal = presUFVolumeMl / (F32)ML_PER_LITER; + response.ufRate = ( newUfRateMlMin * (F32)MIN_PER_HOUR ) / (F32)ML_PER_LITER; if ( newUfRateMlMin <= MAX_UF_RATE_ML_MIN ) { response.accepted = TRUE; response.rejectionReason = REQUEST_REJECT_REASON_NONE; - response.duration = request.duration; - // Store validated values for confirmation step + // Store validated values for confirmation step. validTreatmentDurationReceived = TRUE; - validatedTreatmentDuration_min = request.duration; - validatedUFVolumeGoalMl = presUFVolumeMl; + validatedTreatmentDuration_min = response.duration; validatedUFRateMlMin = newUfRateMlMin; - } else { @@ -1389,11 +1388,11 @@ * The validateAndSetUFVolume function validates the received ultrafiltration * volume treatment parameter. * @details \b Message \b Sent: MSG_ID_TD_RESP_ULTRAFILTRATION_VOLUME_TO_VALIDATE - * @details \b Inputs: message containing requested UF volume in mL. + * @details \b Inputs: message containing requested UF volume in L. * @details \b Outputs: response with acceptance status, rejection reason, - * UF volume goal, duration, and UF rate. + * UF volume goal (L), duration (minutes), and UF rate (L/hr). * @param message Set message from UI which includes the requested UF volume - * in mL. + * in L. * @return TRUE if response message is sent successfully, FALSE otherwise. *************************************************************************/ BOOL validateAndSetUFVolume( MESSAGE_T *message ) @@ -1428,16 +1427,17 @@ { memcpy( &request, &message->payload[ 0 ], sizeof( UF_VOLUME_VALIDATE_REQUEST_PAYLOAD_T ) ); - requestedUFVolumeMl = request.ufVolume; - requestedUFVolumeL = requestedUFVolumeMl / (F32)ML_PER_LITER; + // Convert requested UF volume from L to mL for firmware calculations. + requestedUFVolumeL = request.ufVolume; + requestedUFVolumeMl = requestedUFVolumeL * (F32)ML_PER_LITER; - response.ufVolumeGoal = requestedUFVolumeMl; + // Send UF volume to UI in L. + response.ufVolumeGoal = requestedUFVolumeL; response.duration = (U32)treatmentDurationMin; - if ( ( requestedUFVolumeL >= minUFVolumeL ) && - ( requestedUFVolumeL <= maxUFVolumeL ) ) + if ( ( requestedUFVolumeL >= minUFVolumeL ) && ( requestedUFVolumeL <= maxUFVolumeL ) ) { - if ( requestedUFVolumeMl >= measuredUFVolumeMl ) + if ( requestedUFVolumeMl > measuredUFVolumeMl ) { if ( treatmentDurationMin > elapsedTreatmentTimeMin ) { @@ -1447,7 +1447,7 @@ // Calculate new UF rate in mL/min. newUfRateMlMin = remainingUFVolumeMl / remainingTreatmentTimeMin; - response.ufRate = newUfRateMlMin; + response.ufRate = ( newUfRateMlMin * (F32)MIN_PER_HOUR ) / (F32)ML_PER_LITER; if ( newUfRateMlMin <= MAX_UF_RATE_ML_MIN ) { @@ -1492,15 +1492,17 @@ * @details \b Message \b Sent: MSG_ID_TD_DURATION_CONFIRM_RESPONSE * @details \b Inputs: message containing confirmed treatment duration. * @details \b Outputs: response updated with acceptance status, rejection - * reason, duration, and UF volume. The confirmed duration is applied - * only when it matches the previously validated duration. + * reason, duration (minutes), UF volume goal (L), and UF rate + * (L/hr). The confirmed duration is applied only when it matches + * the previously validated duration. * @return TRUE if response message is sent successfully, FALSE otherwise. *************************************************************************/ BOOL signalUserConfirmationOfTreatmentDuration( MESSAGE_T *message ) { BOOL result = FALSE; DURATION_CONFIRM_REQUEST_PAYLOAD_T request; DURATION_VALIDATE_RESPONSE_PAYLOAD_T response; + F32 presUFVolumeMl = getTreatmentParameterF32( TREATMENT_PARAM_UF_VOLUME ) * (F32)ML_PER_LITER; response.accepted = FALSE; response.rejectionReason = REQUEST_REJECT_REASON_INVALID_REQUEST_FORMAT; @@ -1512,36 +1514,30 @@ { memcpy( &request, &message->payload[ 0 ], sizeof( DURATION_CONFIRM_REQUEST_PAYLOAD_T ) ); - // Echo values for confirmation screen + // Echo values for confirmation screen. response.duration = request.duration; - response.ufVolumeGoal = validatedUFVolumeGoalMl; - response.ufRate = validatedUFRateMlMin; + response.ufVolumeGoal = presUFVolumeMl / (F32)ML_PER_LITER; + response.ufRate = ( validatedUFRateMlMin * (F32)MIN_PER_HOUR ) / (F32)ML_PER_LITER; - if ( ( TRUE == validTreatmentDurationReceived ) && - ( request.duration == validatedTreatmentDuration_min ) ) + if ( ( TRUE == validTreatmentDurationReceived ) && ( request.duration == validatedTreatmentDuration_min ) ) { - setTreatmentParameterU32( TREATMENT_PARAM_TREATMENT_DURATION, validatedTreatmentDuration_min ); - setDialysisDDParams( getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ), validatedUFVolumeGoalMl, validatedUFRateMlMin ); + setDialysisDDParams( getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ), presUFVolumeMl, validatedUFRateMlMin ); response.accepted = TRUE; response.rejectionReason = REQUEST_REJECT_REASON_NONE; - // Clear stored validated values + // Clear stored validated values. validTreatmentDurationReceived = FALSE; validatedTreatmentDuration_min = 0U; - validatedUFVolumeGoalMl = 0.0F; validatedUFRateMlMin = 0.0F; - } else if ( FALSE == validTreatmentDurationReceived ) { - response.rejectionReason = REQUEST_REJECT_REASON_CONFIRMATION_NOT_EXPECTED; } else { - response.rejectionReason = REQUEST_REJECT_REASON_CONFIRMATION_MISMATCH; } } @@ -1556,7 +1552,7 @@ * The signalUserConfirmationOfUFVolume function handles the UI * confirmation request for ultrafiltration (UF) volume change. * @details \b Message \b Sent: MSG_ID_TD_ULTRAFILTRATION_CHANGE_VALIDATE_RESPONSE - * @details \b Inputs: message containing requested UF volume (mL). + * @details \b Inputs: message containing requested UF volume (L). * @details \b Outputs: response updated with acceptance status and * rejection reason. * @param message set message from UI which includes the user set @@ -1568,6 +1564,8 @@ BOOL result = FALSE; UF_VOLUME_CONFIRM_REQUEST_PAYLOAD_T request; UF_VOLUME_RESPONSE_PAYLOAD_T response; + F32 requestedUFVolumeL = 0.0F; + F32 requestedUFVolumeMl = 0.0F; response.accepted = FALSE; response.rejectionReason = REQUEST_REJECT_REASON_INVALID_REQUEST_FORMAT; @@ -1579,13 +1577,16 @@ { memcpy( &request, &message->payload[ 0 ], sizeof( UF_VOLUME_CONFIRM_REQUEST_PAYLOAD_T ) ); - // Echo values for confirmation screen - response.ufVolumeGoal = request.ufVolume; + // Convert requested UF volume from L to mL for firmware comparison. + requestedUFVolumeL = request.ufVolume; + requestedUFVolumeMl = requestedUFVolumeL * (F32)ML_PER_LITER; + + // Echo values for confirmation screen. + response.ufVolumeGoal = requestedUFVolumeL; response.duration = getTreatmentParameterU32( TREATMENT_PARAM_TREATMENT_DURATION ); - response.ufRate = validatedUFRateMlMin; + response.ufRate = ( validatedUFRateMlMin * (F32)MIN_PER_HOUR ) / (F32)ML_PER_LITER; - if ( ( TRUE == validUFVolumeReceived ) && - ( request.ufVolume == validatedUFVolumeGoalMl ) ) + if ( ( TRUE == validUFVolumeReceived ) && ( requestedUFVolumeMl == validatedUFVolumeGoalMl ) ) { setTreatmentParameterF32( TREATMENT_PARAM_UF_VOLUME, validatedUFVolumeGoalMl / (F32)ML_PER_LITER ); @@ -1594,7 +1595,7 @@ response.accepted = TRUE; response.rejectionReason = REQUEST_REJECT_REASON_NONE; - // Clear stored validated values + // Clear stored validated values. validUFVolumeReceived = FALSE; validatedUFVolumeGoalMl = 0.0F; validatedUFRateMlMin = 0.0F; @@ -1614,6 +1615,7 @@ return result; } + /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/