Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -r744b177ec4114c62303e976aed1677b820f7a281 -r7478d513d7493d08484a880f5cd6c296c9616e70 --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 744b177ec4114c62303e976aed1677b820f7a281) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 7478d513d7493d08484a880f5cd6c296c9616e70) @@ -97,6 +97,12 @@ lastTreatmentTimeStamp = 0; treatmentTimeBroadcastTimerCtr = 0; + presTreatmentTimeSecs = 0; + presBloodFlowRate = 0; + presDialysateFlowRate = 0; + presMaxUFVolumeML = 0.0; + presUFRate = 0.0; + pendingParamChangesTimer = 0; pendingUFVolumeChange = 0.0; pendingUFRateChange = 0.0; @@ -214,7 +220,8 @@ break; default: - // TODO - s/w fault + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_MODE_TREATMENT_INVALID_STATE, currentTreatmentState ); + currentTreatmentState = TREATMENT_END_STATE; break; } @@ -224,7 +231,7 @@ { stopDialysis(); elapsedTreatmentTimeInSecs = presTreatmentTimeSecs; - currentTreatmentState = TREATMENT_END_STATE; + currentTreatmentState = TREATMENT_DIALYSIS_END_STATE; } // broadcast treatment time and state data at interval if ( ++treatmentTimeBroadcastTimerCtr >= TREATMENT_TIME_DATA_PUB_INTERVAL ) @@ -410,9 +417,9 @@ } else { - if ( MODE_TREA == currMode ) + if ( MODE_TREA != currMode ) { - rejectReason = REQUEST_REJECT_REASON_TREATMENT_TIME_OUT_OF_RANGE; + rejectReason = REQUEST_REJECT_REASON_NOT_IN_TREATMENT_MODE; } else if ( ( currentTreatmentState <= TREATMENT_START_STATE ) || ( currentTreatmentState >= TREATMENT_DIALYSIS_END_STATE ) ) @@ -425,7 +432,7 @@ } } // send response to request - sendChangeTreatmentDurationResponse( result, rejectReason, treatmentTime, presMaxUFVolumeML ); + sendChangeTreatmentDurationResponse( result, rejectReason, presTreatmentTimeSecs / SEC_PER_MIN, presMaxUFVolumeML ); return result; } @@ -448,16 +455,21 @@ F32 rateDiff = 0.0; OP_MODE currMode = getCurrentOperationMode(); + // reset pending UF/time settings changes to current values in case request is rejected + pendingUFVolumeChange = presMaxUFVolumeML; + pendingUFRateChange = presUFRate; + pendingTreatmentTimeChange = presTreatmentTimeSecs / SEC_PER_MIN; + // check if we are in an appropriate treatment state for settings adjustment if ( ( MODE_TREA == currMode ) && ( currentTreatmentState > TREATMENT_START_STATE ) && ( currentTreatmentState < TREATMENT_DIALYSIS_END_STATE ) && ( uFVolume <= MAX_UF_VOLUME_ML ) && - ( CALC_TREAT_TIME_REMAINING_IN_SECS() < PREVENT_UF_VOL_CHANGE_IF_NEARLY_DONE_SEC ) ) + ( CALC_TREAT_TIME_REMAINING_IN_SECS() >= PREVENT_UF_VOL_CHANGE_IF_NEARLY_DONE_SEC ) ) { DIALYSIS_STATE_T currDialysisState = getDialysisState(); UF_STATE_T currUFState = getUltrafiltrationState(); F32 uFRate = uFVolume / ((F32)presTreatmentTimeSecs / (F32)SEC_PER_MIN); // what would UF rate be if user selected to adjust it? - U32 trtTime = (S32)( uFVolume / uFRate ) + 1; // what would the treatment duration be if user selected to adjust it? + U32 trtTime = (S32)( uFVolume / presUFRate ) + 1; // what would the treatment duration be if user selected to adjust it? U32 dialVolume = presDialysateFlowRate * trtTime; // what would dialysate volume be if user selected to adjust time? // UF should already be paused but let's make sure. @@ -471,34 +483,29 @@ // start t/o timer - user must confirm UF changes within 1 minute from now pendingParamChangesTimer = getMSTimerCount(); - // reset pending UF/time settings change - pendingUFVolumeChange = 0.0; - pendingUFRateChange = 0.0; - pendingTreatmentTimeChange = 0; - // verify UF rate change would be valid (this should be as UI is getting regular UF volume range updates) if ( uFRate <= (F32)MAX_UF_RATE_ML_MIN ) { result = TRUE; pendingUFVolumeChange = uFVolume; pendingUFRateChange = uFRate; rateDiff = ( uFRate - presUFRate ); + + // verify treatment duration change would be valid + if ( ( trtTime <= MAX_TREATMENT_TIME_MINUTES ) && ( dialVolume <= MAX_DIALYSATE_VOLUME_ML ) ) + { + pendingTreatmentTimeChange = trtTime; + timeDiff = trtTime - ( (U32)( (F32)presTreatmentTimeSecs / (F32)SEC_PER_MIN ) + 1 ); + } } else { rejectReason = REQUEST_REJECT_REASON_UF_RATE_OUT_OF_RANGE; } - - // verify treatment duration change would be valid - if ( ( trtTime <= MAX_TREATMENT_TIME_MINUTES ) && ( dialVolume <= MAX_DIALYSATE_VOLUME_ML ) ) - { - pendingTreatmentTimeChange = trtTime; - timeDiff = trtTime - ( (U32)( (F32)presTreatmentTimeSecs / (F32)SEC_PER_MIN ) + 1 ); - } } else { - if ( MODE_TREA == currMode ) + if ( MODE_TREA != currMode ) { rejectReason = REQUEST_REJECT_REASON_TREATMENT_TIME_OUT_OF_RANGE; } @@ -517,7 +524,7 @@ } } // respond to UF settings change request - sendChangeUFSettingsResponse( result, rejectReason, pendingUFVolumeChange, pendingTreatmentTimeChange, timeDiff, pendingUFRateChange, rateDiff ); + sendChangeUFSettingsResponse( result, rejectReason, pendingUFVolumeChange, pendingTreatmentTimeChange, pendingUFRateChange, timeDiff, rateDiff ); return result; } @@ -579,7 +586,7 @@ } } // respond to UF settings change confirmation - sendChangeUFSettingsResponse( result, rejectReason, pendingUFVolumeChange, pendingTreatmentTimeChange, 0, pendingUFRateChange, 0 ); + sendChangeUFSettingsResponse( result, rejectReason, presMaxUFVolumeML, presTreatmentTimeSecs / SEC_PER_MIN, presUFRate, 0, 0 ); return result; } @@ -637,7 +644,7 @@ { rejectReason = REQUEST_REJECT_REASON_NOT_IN_TREATMENT_MODE; } - sendChangeBloodDialysateRateChangeResponse( result, (U32)rejectReason, bloodRate, dialRate ); + sendChangeBloodDialysateRateChangeResponse( result, (U32)rejectReason, presBloodFlowRate, presDialysateFlowRate ); return result; }