Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -r9936f4fe6267a4e682709db5c2383d8f9cbfeb82 -rc3c728b43a2d5c9faf461d5e635f62e5fc32da27 --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 9936f4fe6267a4e682709db5c2383d8f9cbfeb82) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision c3c728b43a2d5c9faf461d5e635f62e5fc32da27) @@ -8,7 +8,7 @@ * @file ModeTreatment.c * * @author (last) Dara Navaei -* @date (last) 12-Jul-2023 +* @date (last) 24-Jul-2023 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019 @@ -767,14 +767,7 @@ // Update treatment time (unless delivering a saline bolus) if ( dialysisState != DIALYSIS_SALINE_BOLUS_STATE ) { -#ifdef DIALYZER_REPRIME_ENABLED - if ( dialysisState != DIALYSIS_DIALYZER_REPRIME_STATE ) - { -#endif treatmentTimeMS += msSinceLast; -#ifdef DIALYZER_REPRIME_ENABLED - } -#endif } lastTreatmentTimeStamp = newTime; @@ -925,16 +918,26 @@ * @brief * The handleTreatmentRecircState function executes the re-circulate state of the * Treatment Mode state machine. - * @details Inputs: none - * @details Outputs: treatment re-circulate sub-mode executed. + * @details Inputs: endTreatmentAlarmResponseRequest, rinsebackToStoppedRequest, + * endTreatmentRequest + * @details Outputs: sendLastTreatmentPeriodicData * @return next treatment mode state *************************************************************************/ static TREATMENT_STATE_T handleTreatmentRecircState( void ) { TREATMENT_STATE_T result = TREATMENT_RECIRC_STATE; - // Execute treatment re-circ sub-mode - execTreatmentRecirc(); + // If user requests treatment end, end treatment + if ( TRUE == endTreatmentAlarmResponseRequest ) + { + sendLastTreatmentPeriodicData = TRUE; + requestNewOperationMode( MODE_POST ); + } + else + { + // Execute treatment re-circ sub-mode + execTreatmentRecirc(); + } // Handle signals from treatment re-circ sub-mode if ( TRUE == rinsebackToStoppedRequest ) @@ -1096,6 +1099,9 @@ S32 timeDiff = 0; F32 rateDiff = 0.0; HD_OP_MODE_T currMode = getCurrentOperationMode(); + S32 txSecRem = CALC_TREAT_TIME_REMAINING_IN_SECS(); + S32 txMinEla = CALC_ELAPSED_TREAT_TIME_IN_SECS() / SEC_PER_MIN; + F32 txMinRem = (F32)txSecRem / (F32)SEC_PER_MIN; // Reset pending UF/time settings changes to current values in case request is rejected pendingUFVolumeChange = presMaxUFVolumeML; @@ -1110,9 +1116,12 @@ { DIALYSIS_STATE_T currDialysisState = getDialysisState(); UF_STATE_T currUFState = getUltrafiltrationState(); - F32 uFRate = uFVolume / ((F32)presTreatmentTimeSecs / (F32)SEC_PER_MIN); // What UF rate would be if user selected to adjust it - U32 trtTime = (S32)( uFVolume / presUFRate ) + 1; // What the treatment duration would be if user selected to adjust it - U32 dialVolume = getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ) * trtTime; // What dialysate volume would be if user selected to adjust time + F32 colUFVol = getUltrafiltrationReferenceVolume(); // How much UF volume have we taken so far? + F32 remUFVol = uFVolume - colUFVol; // What would remaining UF volume be after subtracting UF volume already taken + F32 remUFVolCap = RANGE( remUFVol, 0.0F, (F32)MAX_UF_VOLUME_ML ); // Enforce valid range on remaining UF volume + F32 uFRate = remUFVolCap / txMinRem; // What UF rate would be if user selected to adjust it + U32 trtTime = ( fabs( presUFRate ) < NEARLY_ZERO ? txMinEla + 1 : (S32)( remUFVolCap / presUFRate ) + txMinEla + 1 ); // What the treatment duration would be if user selected to adjust it + U32 dialVolume = getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ) * trtTime; // What dialysate volume would be if user selected to adjust time // UF should already be paused but let's make sure. if ( ( TREATMENT_DIALYSIS_STATE == currentTreatmentState ) && @@ -1137,19 +1146,8 @@ { pendingUFRateChange = 0.0; } - // Verify treatment duration change would be valid (leave zero if not valid - UI will disable option) - if ( ( trtTime <= MAX_TREATMENT_TIME_MINUTES ) && ( trtTime >= getMinTreatmentTimeInMinutes() ) && - ( dialVolume <= MAX_DIALYSATE_VOLUME_ML ) ) - { - result = TRUE; - pendingUFVolumeChange = uFVolume; - pendingTreatmentTimeChange = trtTime; - timeDiff = trtTime - ( (U32)( (F32)presTreatmentTimeSecs / (F32)SEC_PER_MIN ) + 1 ); - } - else - { - pendingTreatmentTimeChange = 0; - } + // Treatment duration change is now never valid - leave zero - UI will disable option) + pendingTreatmentTimeChange = 0; // If neither option works, reject for UF rate if ( FALSE == result ) { @@ -1211,14 +1209,9 @@ presMaxUFVolumeML = pendingUFVolumeChange; setTreatmentParameterF32( TREATMENT_PARAM_UF_VOLUME, ( presMaxUFVolumeML / (F32)ML_PER_LITER ) ); - // Which setting does user want to adjust to accommodate the UF volume change? (treatment time or UF rate) - if ( UF_ADJ_TREATMENT_TIME == adjustment ) + // User should only allow UF rate adjustment to achieve UF volume change + if ( UF_ADJ_UF_RATE == adjustment ) { - presTreatmentTimeSecs = pendingTreatmentTimeChange * SEC_PER_MIN; - setTreatmentParameterU32( TREATMENT_PARAM_TREATMENT_DURATION, ( presTreatmentTimeSecs / SEC_PER_MIN ) ); - } - else // Must be adjusting UF rate then - { sendTreatmentLogEventData( UF_RATE_CHANGE_EVENT, presUFRate, pendingUFRateChange ); presUFRate = pendingUFRateChange; signalInitiatePressureStabilization(); @@ -1455,11 +1448,6 @@ payload.txEndState = getCurrentTreatmentEndState(); payload.heparinState = getHeparinState(); payload.dialysisState = getDialysisState(); -#ifdef DIALYZER_REPRIME_ENABLED - payload.dlzReprimeState = getDialyzerRePrimeState(); -#else - payload.dlzReprimeState = 0; -#endif broadcastData( MSG_ID_TREATMENT_STATE_DATA, COMM_BUFFER_OUT_CAN_HD_BROADCAST, (U08*)&payload, sizeof( TREATMENT_STATE_DATA_T ) ); treatmentStateBroadcastTimerCtr = 0;