Index: firmware/.cproject =================================================================== diff -u -r7138d8ca7496d3ee0f788ea1d9a34bb47e45da6e -r7478d513d7493d08484a880f5cd6c296c9616e70 --- firmware/.cproject (.../.cproject) (revision 7138d8ca7496d3ee0f788ea1d9a34bb47e45da6e) +++ firmware/.cproject (.../.cproject) (revision 7478d513d7493d08484a880f5cd6c296c9616e70) @@ -84,7 +84,9 @@ - + + Index: firmware/App/Modes/Dialysis.c =================================================================== diff -u -rca8a81beba20b62acf98cea4d934354ce512bcfe -r7478d513d7493d08484a880f5cd6c296c9616e70 --- firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision ca8a81beba20b62acf98cea4d934354ce512bcfe) +++ firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision 7478d513d7493d08484a880f5cd6c296c9616e70) @@ -462,7 +462,7 @@ // if we've reached target UF volume, UF is complete if ( measUFVolume >= maxUFVolumeML ) { - result = UF_OFF_STATE; + result = UF_COMPLETED_STATE; } // TODO - test code - remove later 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; } Index: firmware/App/Services/AlarmMgmt.h =================================================================== diff -u -r744b177ec4114c62303e976aed1677b820f7a281 -r7478d513d7493d08484a880f5cd6c296c9616e70 --- firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 744b177ec4114c62303e976aed1677b820f7a281) +++ firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 7478d513d7493d08484a880f5cd6c296c9616e70) @@ -168,6 +168,7 @@ SW_FAULT_ID_DIALYSIS_INVALID_UF_STATE, SW_FAULT_ID_NVDATAMGMT_EXEC_INVALID_STATE, SW_FAULT_ID_NVDATAMGMT_INVALID_SELF_TEST_STATE, + SW_FAULT_ID_MODE_TREATMENT_INVALID_STATE, NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T; Index: firmware/source/sys_main.c =================================================================== diff -u -r9b262ba08e3180f121c3cf19d8d25e565183f87d -r7478d513d7493d08484a880f5cd6c296c9616e70 --- firmware/source/sys_main.c (.../sys_main.c) (revision 9b262ba08e3180f121c3cf19d8d25e565183f87d) +++ firmware/source/sys_main.c (.../sys_main.c) (revision 7478d513d7493d08484a880f5cd6c296c9616e70) @@ -71,6 +71,7 @@ #include "FPGA.h" #include "InternalADC.h" #include "MsgQueues.h" +#include "NVDataMgmt.h" #include "OperationModes.h" #include "PresOccl.h" #include "RTC.h" @@ -175,6 +176,7 @@ initDialOutFlow(); initOperationModes(); initRTC(); + initNVDataMgmt(); } /*************************************************************************