Index: firmware/App/Services/TxParams.c =================================================================== diff -u -r41a1b7a822a45813af610292a9af90e1a0f83763 -r1e8f1e33b885d6b5d64efa37525fa4ea6720b4d5 --- firmware/App/Services/TxParams.c (.../TxParams.c) (revision 41a1b7a822a45813af610292a9af90e1a0f83763) +++ firmware/App/Services/TxParams.c (.../TxParams.c) (revision 1e8f1e33b885d6b5d64efa37525fa4ea6720b4d5) @@ -1475,7 +1475,8 @@ * @brief * The validateAndSetTreatmentDuration function handles the UI treatment * duration validation request during Treatment mode. - * @details \b Message \b Sent: MSG_ID_TD_DURATION_VALIDATE_RESPONSE including acceptance status, rejection reason, requested duration, UF volume goal (L), and calculated UF rate (L/hr). + * @details \b Message \b Sent: MSG_ID_TD_DURATION_VALIDATE_RESPONSE including acceptance status, rejection reason, requested duration, UF volume goal (L), + * calculated UF rate (L/hr) and heparin delivery duration (minutes). * @details \b Inputs: none. * @details \b Outputs: validTreatmentDurationReceived, validatedTreatmentDuration_min, validatedUFRateLhr, validatedHeparinDeliveryDuration_min. * @param message set message from UI which includes the requested treatment duration in minutes. @@ -1504,6 +1505,7 @@ response.duration = 0U; response.ufVolumeGoal = 0.0F; response.ufRate = 0.0F; + response.heparinDuration = 0U; // Clear previously validated values. validTreatmentDurationReceived = FALSE; @@ -1552,13 +1554,15 @@ validatedHeparinDeliveryDuration_min = 0U; } + response.heparinDuration = validatedHeparinDeliveryDuration_min; response.accepted = TRUE; response.rejectionReason = REQUEST_REJECT_REASON_NONE; // Store validated values for confirmation step. validTreatmentDurationReceived = TRUE; validatedTreatmentDuration_min = response.duration; validatedUFRateLhr = response.ufRate; + validatedHeparinDeliveryDuration_min = response.heparinDuration; } else { @@ -1595,7 +1599,7 @@ { BOOL result = FALSE; BOLUS_VOLUME_CHANGE_REQUEST_PAYLOAD_T request; - BOLUS_VOLUME_CHANGE_RESPONSE_PAYLOAD_T response; + UI_RESPONSE_PAYLOAD_T response; U32 minBolusVolume_mL = getU32TreatmentParamLowerRangeLimit( TREATMENT_PARAM_FLUID_BOLUS_VOLUME ); U32 maxBolusVolume_mL = getU32TreatmentParamUpperRangeLimit( TREATMENT_PARAM_FLUID_BOLUS_VOLUME ); @@ -1620,7 +1624,7 @@ } } - result = sendMessage( MSG_ID_TD_BOLUS_VOLUME_CHANGE_RESPONSE, COMM_BUFFER_OUT_CAN_TD_2_UI, (U08 *)&response, sizeof( BOLUS_VOLUME_CHANGE_RESPONSE_PAYLOAD_T ) ); + result = sendMessage( MSG_ID_TD_BOLUS_VOLUME_CHANGE_RESPONSE, COMM_BUFFER_OUT_CAN_TD_2_UI, (U08 *)&response, sizeof( UI_RESPONSE_PAYLOAD_T ) ); return result; } @@ -1811,7 +1815,7 @@ * @brief * The validateAndSetUFVolume function handles the UI ultrafiltration * volume validation request during Treatment mode. - * @details \b Message \b Sent: MSG_ID_TD_RESP_ULTRAFILTRATION_VOLUME_TO_VALIDATE including acceptance status, rejection reason, UF volume goal (L), duration (minutes), and UF rate (L/hr). + * @details \b Message \b Sent: MSG_ID_TD_RESP_ULTRAFILTRATION_VOLUME_TO_VALIDATE including acceptance status, rejection reason, UF volume goal (L), and UF rate (L/hr). * @details \b Inputs: none. * @details \b Outputs: validUFVolumeReceived, validatedUFVolumeGoalL, validatedUFRateLhr. * @param message set message from UI which includes the requested UF volume in L. @@ -1837,7 +1841,6 @@ response.accepted = FALSE; response.rejectionReason = REQUEST_REJECT_REASON_INVALID_REQUEST_FORMAT; response.ufVolumeGoal = 0.0F; - response.duration = 0U; response.ufRate = 0.0F; // Clear previously validated values. @@ -1855,7 +1858,6 @@ // Send UF volume to UI in L. response.ufVolumeGoal = requestedUFVolumeL; - response.duration = (U32)treatmentDurationMin; if ( ( requestedUFVolumeL >= minUFVolumeL ) && ( requestedUFVolumeL <= maxUFVolumeL ) ) { @@ -1902,7 +1904,7 @@ } } - result = sendMessage( MSG_ID_TD_RESP_ULTRAFILTRATION_VOLUME_TO_VALIDATE, COMM_BUFFER_OUT_CAN_TD_2_UI, (U08 *)&response, sizeof( UF_VOLUME_RESPONSE_PAYLOAD_T ) ); + result = sendMessage( MSG_ID_TD_TREATMENT_UF_VOLUME_VALIDATE_RESPONSE, COMM_BUFFER_OUT_CAN_TD_2_UI, (U08 *)&response, sizeof( UF_VOLUME_RESPONSE_PAYLOAD_T ) ); return result; } @@ -2043,7 +2045,7 @@ BOOL result = FALSE; CRITICAL_DATAS_T requestedValue; BLOOD_FLOW_RATE_CHANGE_REQUEST_PAYLOAD_T request; - BLOOD_FLOW_RATE_CHANGE_RESPONSE_PAYLOAD_T response; + UI_RESPONSE_PAYLOAD_T response; memset( &requestedValue, 0, sizeof( requestedValue ) ); memset( &request, 0, sizeof( request ) ); @@ -2060,6 +2062,7 @@ if ( TRUE == isTreatmentParamInRange( TREATMENT_PARAM_BLOOD_FLOW, requestedValue ) ) { setTreatmentParameterU32( TREATMENT_PARAM_BLOOD_FLOW, request.flowRate ); + setDialysisBloodPumpFlowRate( request.flowRate ); response.accepted = TRUE; response.rejectionReason = REQUEST_REJECT_REASON_NONE; @@ -2070,7 +2073,7 @@ } } - result = sendMessage( MSG_ID_TD_TREATMENT_SET_POINT_BLOOD_FLOW_CHANGE_RESPONSE, COMM_BUFFER_OUT_CAN_TD_2_UI, (U08 *)&response, sizeof( BLOOD_FLOW_RATE_CHANGE_RESPONSE_PAYLOAD_T ) ); + result = sendMessage( MSG_ID_TD_TREATMENT_SET_POINT_BLOOD_FLOW_CHANGE_RESPONSE, COMM_BUFFER_OUT_CAN_TD_2_UI, (U08 *)&response, sizeof( UI_RESPONSE_PAYLOAD_T ) ); return result; } @@ -2090,7 +2093,7 @@ BOOL result = FALSE; CRITICAL_DATAS_T requestedValue; DIALYSATE_FLOW_RATE_CHANGE_REQUEST_PAYLOAD_T request; - DIALYSATE_FLOW_RATE_CHANGE_RESPONSE_PAYLOAD_T response; + UI_RESPONSE_PAYLOAD_T response; memset( &requestedValue, 0, sizeof( requestedValue ) ); memset( &request, 0, sizeof( request ) ); @@ -2117,7 +2120,7 @@ } } - result = sendMessage( MSG_ID_TD_TREATMENT_SET_POINT_DIALYSATE_FLOW_CHANGE_RESPONSE, COMM_BUFFER_OUT_CAN_TD_2_UI, (U08 *)&response, sizeof( DIALYSATE_FLOW_RATE_CHANGE_RESPONSE_PAYLOAD_T ) ); + result = sendMessage( MSG_ID_TD_TREATMENT_SET_POINT_DIALYSATE_FLOW_CHANGE_RESPONSE, COMM_BUFFER_OUT_CAN_TD_2_UI, (U08 *)&response, sizeof( UI_RESPONSE_PAYLOAD_T ) ); return result; } @@ -2137,7 +2140,7 @@ BOOL result = FALSE; CRITICAL_DATAS_T requestedValue; DIALYSATE_TEMPERATURE_CHANGE_REQUEST_PAYLOAD_T request; - DIALYSATE_TEMPERATURE_CHANGE_RESPONSE_PAYLOAD_T response; + UI_RESPONSE_PAYLOAD_T response; memset( &requestedValue, 0, sizeof( requestedValue ) ); memset( &request, 0, sizeof( request ) ); @@ -2164,7 +2167,7 @@ } } - result = sendMessage( MSG_ID_TD_TREATMENT_SET_POINT_DIALYSATE_TEMPERATURE_CHANGE_RESPONSE, COMM_BUFFER_OUT_CAN_TD_2_UI, (U08 *)&response, sizeof( DIALYSATE_TEMPERATURE_CHANGE_RESPONSE_PAYLOAD_T ) ); + result = sendMessage( MSG_ID_TD_TREATMENT_SET_POINT_DIALYSATE_TEMP_CHANGE_RESPONSE, COMM_BUFFER_OUT_CAN_TD_2_UI, (U08 *)&response, sizeof( UI_RESPONSE_PAYLOAD_T ) ); return result; } @@ -2173,41 +2176,35 @@ * @brief * The signalUserConfirmationOfTreatmentDuration function handles the UI * treatment duration confirmation request during Treatment mode. - * @details \b Message \b Sent: MSG_ID_TD_DURATION_CONFIRM_RESPONSE including acceptance status, rejection reason, duration (minutes), UF volume goal (L), and UF rate (L/hr). + * @details \b Message \b Sent: MSG_ID_TD_DURATION_CONFIRM_RESPONSE including acceptance status and rejection reason. * @details \b Inputs: validTreatmentDurationReceived, validatedTreatmentDuration_min, validatedUFRateLhr, validatedHeparinDeliveryDuration_min. * @details \b Outputs: validTreatmentDurationReceived, validatedTreatmentDuration_min, validatedUFRateLhr, validatedHeparinDeliveryDuration_min. - * @param message set message from UI which includes the confirmed treatment duration and UF rate. + * @param message set message from UI which includes the confirmed treatment duration, UF rate and heparin delivery 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; + 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; response.accepted = FALSE; response.rejectionReason = REQUEST_REJECT_REASON_INVALID_REQUEST_FORMAT; - response.duration = 0U; - response.ufVolumeGoal = 0.0F; - response.ufRate = 0.0F; if ( message->hdr.payloadLen == sizeof( DURATION_CONFIRM_REQUEST_PAYLOAD_T ) ) { memcpy( &request, &message->payload[ 0 ], sizeof( DURATION_CONFIRM_REQUEST_PAYLOAD_T ) ); - // Echo values for confirmation screen. - response.duration = request.duration; - response.ufVolumeGoal = presUFVolumeMl / (F32)ML_PER_LITER; - response.ufRate = validatedUFRateLhr; - // 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 - validatedUFRateLhr ) < NEARLY_ZERO ) && + ( request.heparinDuration == validatedHeparinDeliveryDuration_min ) ) { setTreatmentParameterU32( TREATMENT_PARAM_TREATMENT_DURATION, validatedTreatmentDuration_min ); setTreatmentParameterU32( TREATMENT_PARAM_HEPARIN_DELIVERY_DURATION, validatedHeparinDeliveryDuration_min ); + updateTreatmentBroadcastData(); setDialysisDDParams( getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ), presUFVolumeMl, validatedUFRateMlMin ); response.accepted = TRUE; @@ -2229,7 +2226,7 @@ } } - result = sendMessage( MSG_ID_TD_DURATION_CONFIRM_RESPONSE, COMM_BUFFER_OUT_CAN_TD_2_UI, (U08 *)&response, sizeof( DURATION_VALIDATE_RESPONSE_PAYLOAD_T ) ); + result = sendMessage( MSG_ID_TD_DURATION_CONFIRM_RESPONSE, COMM_BUFFER_OUT_CAN_TD_2_UI, (U08 *)&response, sizeof( UI_RESPONSE_PAYLOAD_T ) ); return result; } @@ -2238,7 +2235,7 @@ * @brief * The signalUserConfirmationOfUFVolume function handles the UI * ultrafiltration volume confirmation request during Treatment mode. - * @details \b Message \b Sent: MSG_ID_TD_ULTRAFILTRATION_CHANGE_VALIDATE_RESPONSE including acceptance status, rejection reason, UF volume goal (L), duration (minutes), and UF rate (L/hr). + * @details \b Message \b Sent: MSG_ID_TD_ULTRAFILTRATION_CHANGE_CONFIRM_RESPONSE including acceptance status and rejection reason. * @details \b Inputs: validUFVolumeReceived, validatedUFVolumeGoalL, validatedUFRateLhr. * @details \b Outputs: validUFVolumeReceived, validatedUFVolumeGoalL, validatedUFRateLhr. * @param message set message from UI which includes the confirmed UF volume and UF rate. @@ -2248,34 +2245,26 @@ { BOOL result = FALSE; UF_VOLUME_CONFIRM_REQUEST_PAYLOAD_T request; - UF_VOLUME_RESPONSE_PAYLOAD_T response; + UI_RESPONSE_PAYLOAD_T response; F32 validatedUFVolumeGoalMl = 0.0F; F32 validatedUFRateMlMin = 0.0F; response.accepted = FALSE; response.rejectionReason = REQUEST_REJECT_REASON_INVALID_REQUEST_FORMAT; - response.ufVolumeGoal = 0.0F; - response.duration = 0U; - response.ufRate = 0.0F; if ( message->hdr.payloadLen == sizeof( UF_VOLUME_CONFIRM_REQUEST_PAYLOAD_T ) ) { memcpy( &request, &message->payload[ 0 ], sizeof( UF_VOLUME_CONFIRM_REQUEST_PAYLOAD_T ) ); - // Echo values for confirmation screen. - response.ufVolumeGoal = request.ufVolume; - response.duration = getTreatmentParameterU32( TREATMENT_PARAM_TREATMENT_DURATION ); - response.ufRate = validatedUFRateLhr; - validatedUFVolumeGoalMl = validatedUFVolumeGoalL * (F32)ML_PER_LITER; validatedUFRateMlMin = ( validatedUFRateLhr * (F32)ML_PER_LITER ) / (F32)MIN_PER_HOUR; // Verify confirmed UF volume and UF rate match previously validated values. - if ( ( TRUE == validUFVolumeReceived ) && ( fabs( request.ufVolume - validatedUFVolumeGoalL ) < NEARLY_ZERO ) && - ( fabs( request.ufRate - validatedUFRateLhr ) < NEARLY_ZERO ) ) + if ( ( TRUE == validUFVolumeReceived ) && ( fabs( request.ufVolume - validatedUFVolumeGoalL ) < NEARLY_ZERO ) && + ( fabs( request.ufRate - validatedUFRateLhr ) <= 0.01F ) ) { setTreatmentParameterF32( TREATMENT_PARAM_UF_VOLUME, validatedUFVolumeGoalL ); - + updateTreatmentBroadcastData(); setDialysisDDParams( getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ), validatedUFVolumeGoalMl, validatedUFRateMlMin ); response.accepted = TRUE; @@ -2296,7 +2285,7 @@ } } - result = sendMessage( MSG_ID_TD_ULTRAFILTRATION_CHANGE_VALIDATE_RESPONSE, COMM_BUFFER_OUT_CAN_TD_2_UI, (U08 *)&response, sizeof( UF_VOLUME_RESPONSE_PAYLOAD_T ) ); + result = sendMessage( MSG_ID_TD_ULTRAFILTRATION_CHANGE_CONFIRM_RESPONSE, COMM_BUFFER_OUT_CAN_TD_2_UI, (U08 *)&response, sizeof( UI_RESPONSE_PAYLOAD_T ) ); return result; }