Index: firmware/App/Modes/ModeChemicalDisinfect.c =================================================================== diff -u -r224f096c4d255526eccba9aaa13e36e0e7499f14 -r1e34d32fcfac88792ed72e55953dee721bacd9d5 --- firmware/App/Modes/ModeChemicalDisinfect.c (.../ModeChemicalDisinfect.c) (revision 224f096c4d255526eccba9aaa13e36e0e7499f14) +++ firmware/App/Modes/ModeChemicalDisinfect.c (.../ModeChemicalDisinfect.c) (revision 1e34d32fcfac88792ed72e55953dee721bacd9d5) @@ -130,7 +130,6 @@ typedef struct { BOOL hasDisStatusBeenWrittenToNV; ///< Boolean flag to indicate whether the disinfect status been written to NV or not. - BOOL hasDisCompleteDateBeenWrittenToNV; ///< Boolean flag to indicate whether the disinfect complete date been written to NV or not. } DISINFECT_NV_OPS_T; // ********** private data ********** @@ -213,27 +212,26 @@ *************************************************************************/ void initChemicalDisinfectMode( void ) { - chemDisinfectState = DG_CHEM_DISINFECT_STATE_START; - prevChemDisinfectState = DG_CHEM_DISINFECT_STATE_START; - stateTimer = 0; - isThisLastDrain = FALSE; - stateTrialCounter = 0; - areTempSensorsInRange = FALSE; - rsrvr1Status = NUM_OF_DG_RESERVOIR_STATUS; - rsrvr2Status = NUM_OF_DG_RESERVOIR_STATUS; - R1ChemDisinfectVol = 0.0; - R2ChemDisinfectVol = 0.0; - overallChemDisinfectTimer = 0; - cancellationMode = CANCELLATION_MODE_NONE; - rsrvrFillStableTimeCounter = 0; - isPartialDisinfectInProgress = FALSE; - numberOfPostDisinfectRinses = 0; - primeAcidSteadyStateCounter = 0; - chemDisinfectUIState = CHEM_DISINFECT_UI_STATE_NOT_RUNNING; - haveDrainParamsBeenInit[ DG_RESERVOIR_1 ] = FALSE; - haveDrainParamsBeenInit[ DG_RESERVOIR_2 ] = FALSE; - disinfectNVOps.hasDisCompleteDateBeenWrittenToNV = FALSE; - disinfectNVOps.hasDisStatusBeenWrittenToNV = FALSE; + chemDisinfectState = DG_CHEM_DISINFECT_STATE_START; + prevChemDisinfectState = DG_CHEM_DISINFECT_STATE_START; + stateTimer = 0; + isThisLastDrain = FALSE; + stateTrialCounter = 0; + areTempSensorsInRange = FALSE; + rsrvr1Status = NUM_OF_DG_RESERVOIR_STATUS; + rsrvr2Status = NUM_OF_DG_RESERVOIR_STATUS; + R1ChemDisinfectVol = 0.0; + R2ChemDisinfectVol = 0.0; + overallChemDisinfectTimer = 0; + cancellationMode = CANCELLATION_MODE_NONE; + rsrvrFillStableTimeCounter = 0; + isPartialDisinfectInProgress = FALSE; + numberOfPostDisinfectRinses = 0; + primeAcidSteadyStateCounter = 0; + chemDisinfectUIState = CHEM_DISINFECT_UI_STATE_NOT_RUNNING; + haveDrainParamsBeenInit[ DG_RESERVOIR_1 ] = FALSE; + haveDrainParamsBeenInit[ DG_RESERVOIR_2 ] = FALSE; + disinfectNVOps.hasDisStatusBeenWrittenToNV = FALSE; } /*********************************************************************//** @@ -2185,11 +2183,6 @@ *************************************************************************/ static void writeDisinfectDataToNV( void ) { - if ( FALSE == disinfectNVOps.hasDisCompleteDateBeenWrittenToNV ) - { - disinfectNVOps.hasDisCompleteDateBeenWrittenToNV = setDisinfectStatus( TRUE ); - } - if ( FALSE == disinfectNVOps.hasDisStatusBeenWrittenToNV ) { disinfectNVOps.hasDisStatusBeenWrittenToNV = setLastDisinfectDate( USAGE_INFO_CHEM_DIS, getRTCTimestamp() ); Index: firmware/App/Modes/ModeFlush.c =================================================================== diff -u -r19934ca6e36e2dcabd6a6083a9a1f15b1ed32189 -r1e34d32fcfac88792ed72e55953dee721bacd9d5 --- firmware/App/Modes/ModeFlush.c (.../ModeFlush.c) (revision 19934ca6e36e2dcabd6a6083a9a1f15b1ed32189) +++ firmware/App/Modes/ModeFlush.c (.../ModeFlush.c) (revision 1e34d32fcfac88792ed72e55953dee721bacd9d5) @@ -24,10 +24,12 @@ #include "MessageSupport.h" #include "ModeFault.h" #include "ModeFlush.h" +#include "NVDataMgmt.h" #include "OperationModes.h" #include "Pressures.h" #include "Reservoirs.h" #include "ROPump.h" +#include "RTC.h" #include "SystemCommMessages.h" #include "TaskGeneral.h" #include "Timers.h" @@ -64,7 +66,7 @@ #define BICARB_PUMP_SPEED_ML_PER_MIN 30.6F ///< Bicarb pump speed in mL/min. // Flush and drain R1 and R2 state defines -#define RSRVRS_FULL_VOL_ML 1800.0F ///< Reservoirs 1 & 2 full volume in mL. TODo original value was 1900 +#define RSRVRS_FULL_VOL_ML 1900.0F ///< Reservoirs 1 & 2 full volume in mL. #define RSRVRS_PARTIAL_FILL_VOL_ML 500.0F ///< Reservoirs 1 & 2 partial volume in mL. #define RSRVRS_FULL_STABLE_TIME_COUNT ( ( 4 * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ) ///< Reservoirs 1 & 2 full stable time in counts. #define RSRVRS_FILL_UP_TIMEOUT_MS ( 5 * 60 * MS_PER_SECOND ) ///< Reservoirs 1 & 2 full fill up timeout in ms. @@ -98,6 +100,7 @@ static BOOL hasWaterCancellationBeenSet; ///< Water cancellation set/not set boolean flag. static F32 flushLinesVolumeL; ///< Volume of water pumped by RO pump during flush lines state. static BOOL haveDrainParamsBeenInit[ NUM_OF_DG_RESERVOIRS ]; ///< Boolean flag to indicate whether the drain parameters have been reset or not. +static BOOL hasFlushStatusBeenWrittenToNV; ///< Boolean flag to indicate whether the flush status has been written to NV or not. // ********** private function prototypes ********** @@ -121,6 +124,7 @@ static DG_RESERVOIR_STATUS_T getRsrvrDrainStatus( DG_RESERVOIR_ID_T r, U32 drainSteadyStateTimeout, U32 timeout ); static void publishFlushData( void ); static void monitorModeFlush( void ); +static void writeDisinfectDataToNV( DG_USAGE_INFO_ITEMS_T info ); /*********************************************************************//** * @brief @@ -129,7 +133,8 @@ * @details Outputs: flushState, prevFlushState, rsrvrFillStableTimeCounter, * overallFlushElapsedTime, isThisInitialDrain, dataPublishCounter, * rsrvr1Status, rsrvr2Status, hasWaterCancellationBeenSet, - * flushLinesVolumeL, haveDrainParamsBeenInit, stateTimerStart + * flushLinesVolumeL, haveDrainParamsBeenInit, stateTimerStart, + * hasFlushStatusBeenWrittenToNV * @return none *************************************************************************/ void initFlushMode( void ) @@ -149,6 +154,7 @@ haveDrainParamsBeenInit[ DG_RESERVOIR_1 ] = FALSE; haveDrainParamsBeenInit[ DG_RESERVOIR_2 ] = FALSE; stateTimerStart = 0; + hasFlushStatusBeenWrittenToNV = FALSE; } /*********************************************************************//** @@ -481,6 +487,8 @@ { DG_FLUSH_STATE_T state = DG_FLUSH_STATE_FLUSH_DIALYSATE; + writeDisinfectDataToNV( USAGE_INFO_FILTER_FLUSH ); + if ( TRUE == didTimeout( stateTimerStart, FLUSH_DIALYSATE_WAIT_TIME_MS ) ) { // Turn the pumps on in reverse @@ -491,7 +499,10 @@ requestConcentratePumpOn( CONCENTRATEPUMPS_CP1_ACID ); requestConcentratePumpOn( CONCENTRATEPUMPS_CP2_BICARB ); - stateTimerStart = getMSTimerCount(); + // Set the timer for the next state + // Set the NV data flag to FALSE since it should be ready for another write while the mode is running + stateTimerStart = getMSTimerCount(); + hasFlushStatusBeenWrittenToNV = FALSE; state = DG_FLUSH_STATE_FLUSH_CONCENTRATE_STRAWS; } @@ -716,6 +727,8 @@ { DG_FLUSH_STATE_T state = DG_FLUSH_STATE_FLUSH_CIRCULATION_DRAIN_LINE; + writeDisinfectDataToNV( USAGE_INFO_FILTER_FLUSH ); + F32 waterFlowRate = getMeasuredFlowRateLPM( RO_FLOW_SENSOR ); F32 waterVolume = ( ( waterFlowRate / SEC_PER_MIN ) / ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ); @@ -1098,4 +1111,20 @@ } } +/*********************************************************************//** + * @brief + * The writeDisinfectDataToNV function writes the disinfection data to the + * non-volatile memory. + * @details Inputs: hasFlushStatusBeenWrittenToNV + * @details Outputs: hasFlushStatusBeenWrittenToNV + * @return: none + *************************************************************************/ +static void writeDisinfectDataToNV( DG_USAGE_INFO_ITEMS_T info ) +{ + if ( FALSE == hasFlushStatusBeenWrittenToNV ) + { + hasFlushStatusBeenWrittenToNV = setLastDisinfectDate( info, getRTCTimestamp() ); + } +} + /**@}*/ Index: firmware/App/Modes/ModeHeatDisinfect.c =================================================================== diff -u -r224f096c4d255526eccba9aaa13e36e0e7499f14 -r1e34d32fcfac88792ed72e55953dee721bacd9d5 --- firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 224f096c4d255526eccba9aaa13e36e0e7499f14) +++ firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 1e34d32fcfac88792ed72e55953dee721bacd9d5) @@ -145,20 +145,18 @@ typedef struct { BOOL hasDisStatusBeenWrittenToNV; ///< Boolean flag to indicate whether the disinfect status been written to NV or not. - BOOL hasDisCompleteDateBeenWrittenToNV; ///< Boolean flag to indicate whether the disinfect complete date been written to NV or not. } DISINFECT_NV_OPS_T; // ********** private data ********** -static DG_HEAT_DISINFECT_STATE_T heatDisinfectState; ///< Current active heat disinfect state. -static DG_HEAT_DISINFECT_STATE_T prevHeatDisinfectState; ///< Previous active heat disinfect state before alarm. -static DG_HEAT_DISINFECT_UI_STATE_T heatDisinfectUIState; ///< Current active heat disinfect UI state. -static U32 overallHeatDisinfectTimer; ///< Heat disinfect cycle total timer. -static U32 stateTimer; ///< Heat disinfect state timer to be used in different states. -static U32 stateTrialCounter; ///< Heat disinfect state trial counter to be used for retries in different states. -static BOOL areTempSensorsInRange; ///< Heat disinfect temperature sensors in/out range flag. -static U32 concentratePumpsPrimeTimer; ///< Concentrate pumps prime timer. -/// Boolean flag to check whether draining R1 and R2 is at the end of the heat disinfect cycle or in the beginning. So the drain states can be reused. +static DG_HEAT_DISINFECT_STATE_T heatDisinfectState; ///< Current active heat disinfect state. +static DG_HEAT_DISINFECT_STATE_T prevHeatDisinfectState; ///< Previous active heat disinfect state before alarm. +static DG_HEAT_DISINFECT_UI_STATE_T heatDisinfectUIState; ///< Current active heat disinfect UI state. +static U32 overallHeatDisinfectTimer; ///< Heat disinfect cycle total timer. +static U32 stateTimer; ///< Heat disinfect state timer to be used in different states. +static U32 stateTrialCounter; ///< Heat disinfect state trial counter to be used for retries in different states. +static BOOL areTempSensorsInRange; ///< Heat disinfect temperature sensors in/out range flag. +static U32 concentratePumpsPrimeTimer; ///< Concentrate pumps prime timer. static DG_RESERVOIR_STATUS_T rsrvr1Status; ///< Reservoir 1 status. static DG_RESERVOIR_STATUS_T rsrvr2Status; ///< Reservoir 2 status. static F32 R1HeatDisinfectVol; ///< Reservoir 1 full volume during heat disinfect. @@ -207,7 +205,7 @@ static HEAT_DISINFECT_STATUS_T getHeatDisinfectStatus( void ); static void publishHeatDisinfectData( void ); static void monitorModeHeatDisinfect( void ); -static void writeDisinfectDataToNV( void ); +static void writeDisinfectDataToNV( DG_USAGE_INFO_ITEMS_T info ); /*********************************************************************//** * @brief @@ -227,34 +225,33 @@ *************************************************************************/ void initHeatDisinfectMode( void ) { - heatDisinfectState = DG_HEAT_DISINFECT_STATE_START; - prevHeatDisinfectState = DG_HEAT_DISINFECT_STATE_START; - heatDisinfectUIState = HEAT_DISINFECT_UI_STATE_NOT_RUNNING; - stateTimer = 0; - stateTrialCounter = 0; - areTempSensorsInRange = FALSE; - rsrvr1Status = NUM_OF_DG_RESERVOIR_STATUS; - rsrvr2Status = NUM_OF_DG_RESERVOIR_STATUS; - R1HeatDisinfectVol = 0.0F; - R2HeatDisinfectVol = 0.0F; - overallHeatDisinfectTimer = 0; - cancellationMode = CANCELLATION_MODE_NONE; - rsrvrFillStableTimeCounter = 0; - isPartialDisinfectInProgress = FALSE; - isDrainPumpInMixDrainOn = FALSE; - ROFCoolingTimer = 0; - concentratePumpsPrimeTimer = 0; - targetDisinfectTime = 0; - haveDrainParamsBeenInit[ DG_RESERVOIR_1 ] = FALSE; - haveDrainParamsBeenInit[ DG_RESERVOIR_2 ] = FALSE; - tempGradOutOfRangeTimer = 0; - disinfectNVOps.hasDisCompleteDateBeenWrittenToNV = FALSE; - disinfectNVOps.hasDisStatusBeenWrittenToNV = FALSE; - alarmDetectedPendingTrigger = ALARM_ID_NO_ALARM; - heatDisinfectTimer = 0; - rsrvrsVolMonitorTimer = 0; - areRsrvrsLeaking = FALSE; - dataPublishCounter = 0; + heatDisinfectState = DG_HEAT_DISINFECT_STATE_START; + prevHeatDisinfectState = DG_HEAT_DISINFECT_STATE_START; + heatDisinfectUIState = HEAT_DISINFECT_UI_STATE_NOT_RUNNING; + stateTimer = 0; + stateTrialCounter = 0; + areTempSensorsInRange = FALSE; + rsrvr1Status = NUM_OF_DG_RESERVOIR_STATUS; + rsrvr2Status = NUM_OF_DG_RESERVOIR_STATUS; + R1HeatDisinfectVol = 0.0F; + R2HeatDisinfectVol = 0.0F; + overallHeatDisinfectTimer = 0; + cancellationMode = CANCELLATION_MODE_NONE; + rsrvrFillStableTimeCounter = 0; + isPartialDisinfectInProgress = FALSE; + isDrainPumpInMixDrainOn = FALSE; + ROFCoolingTimer = 0; + concentratePumpsPrimeTimer = 0; + targetDisinfectTime = 0; + haveDrainParamsBeenInit[ DG_RESERVOIR_1 ] = FALSE; + haveDrainParamsBeenInit[ DG_RESERVOIR_2 ] = FALSE; + tempGradOutOfRangeTimer = 0; + disinfectNVOps.hasDisStatusBeenWrittenToNV = FALSE; + alarmDetectedPendingTrigger = ALARM_ID_NO_ALARM; + heatDisinfectTimer = 0; + rsrvrsVolMonitorTimer = 0; + areRsrvrsLeaking = FALSE; + dataPublishCounter = 0; } /*********************************************************************//** @@ -648,6 +645,8 @@ { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_FLUSH_CIRCULATION; + writeDisinfectDataToNV( USAGE_INFO_FILTER_FLUSH ); + // Check if the flush circulation time has elapsed and the temperature sensors are not in range yet if ( ( TRUE == didTimeout( stateTimer, FLUSH_CICRCULATION_WAIT_TIME_MS ) ) && ( FALSE == areTempSensorsInRange ) ) { @@ -676,8 +675,8 @@ else { alarmDetectedPendingTrigger = ALARM_ID_DG_TEMP_SENSORS_DIFF_OUT_OF_RANGE; - prevHeatDisinfectState = state; - state = DG_HEAT_DISINFECT_STATE_CANCEL_BASIC_PATH; + prevHeatDisinfectState = state; + state = DG_HEAT_DISINFECT_STATE_CANCEL_BASIC_PATH; } } else @@ -712,8 +711,10 @@ setHeaterTargetTemperature( DG_PRIMARY_HEATER, HEAT_DISINFECT_TARGET_TEMPERATURE_C ); startHeater( DG_PRIMARY_HEATER ); - stateTimer = getMSTimerCount(); - state = DG_HEAT_DISINFECT_STATE_FLUSH_R1_AND_R2; + // Set the NV data to FLASE to be able to write another NV data ops + disinfectNVOps.hasDisStatusBeenWrittenToNV = FALSE; + stateTimer = getMSTimerCount(); + state = DG_HEAT_DISINFECT_STATE_FLUSH_R1_AND_R2; } } @@ -908,14 +909,14 @@ setValveState( VRD1, VALVE_STATE_OPEN ); setValveState( VRD2, VALVE_STATE_CLOSED ); // Start the timer for drain timeout - stateTimer = getMSTimerCount(); + stateTimer = getMSTimerCount(); rsrvr1Status = DG_RESERVOIR_ABOVE_TARGET; - state = DG_HEAT_DISINFECT_STATE_FLUSH_DRAIN_R1; + state = DG_HEAT_DISINFECT_STATE_FLUSH_DRAIN_R1; } else if ( DG_RESERVOIR_NOT_REACHED_TARGET == rsrvr2Status ) { prevHeatDisinfectState = state; - state = DG_HEAT_DISINFECT_STATE_CANCEL_BASIC_PATH; + state = DG_HEAT_DISINFECT_STATE_CANCEL_BASIC_PATH; } return state; @@ -1218,9 +1219,6 @@ stopHeater( DG_TRIMMER_HEATER ); stateTimer = getMSTimerCount(); state = DG_HEAT_DISINFECT_STATE_COOL_DOWN_HEATERS; - - // Set the disinfect flags - setDisinfectStatus( TRUE ); break; case HEAT_DISINFECT_HEAT_UP_IN_PROGRESS: @@ -1248,7 +1246,7 @@ // Set the heat disinfect UI state heatDisinfectUIState = HEAT_DISINFECT_UI_STATE_COOL_DOWN_DEVICE; - writeDisinfectDataToNV(); + writeDisinfectDataToNV( USAGE_INFO_HEAT_DIS ); if ( TRUE == didTimeout( stateTimer, POST_HEAT_DISINFECT_WAIT_TIME_MS ) ) { @@ -1739,7 +1737,7 @@ BOOL gradientOutOfRange = ( fabs( TPoTemp - ThdTemp ) > HEAT_DISINFECT_MAX_TEMP_GRADIENT_C ) ? TRUE : FALSE; // Perform check if no pending alarm - if (ALARM_ID_NO_ALARM == alarmDetectedPendingTrigger) + if ( ALARM_ID_NO_ALARM == alarmDetectedPendingTrigger ) { if ( TRUE != gradientOutOfRange ) { @@ -1757,7 +1755,7 @@ } // Perform check if no pending alarm - if (ALARM_ID_NO_ALARM == alarmDetectedPendingTrigger) + if ( ALARM_ID_NO_ALARM == alarmDetectedPendingTrigger ) { // Check if either reservoir 1 or reservoir 2 are losing volume more than allowed volume if ( ( TRUE == isR1OutOfRange ) || ( TRUE == isR2OutOfRange ) ) @@ -1784,7 +1782,7 @@ } // Perform check if no pending alarm - if (ALARM_ID_NO_ALARM == alarmDetectedPendingTrigger) + if ( ALARM_ID_NO_ALARM == alarmDetectedPendingTrigger ) { // If the coldest spot which is THd is less than minimum heat disinfect temperature, // reset the heat disinfect timers and check whether heating up has timed out @@ -1827,7 +1825,7 @@ } // Perform check if no pending alarm - if (ALARM_ID_NO_ALARM == alarmDetectedPendingTrigger) + if ( ALARM_ID_NO_ALARM == alarmDetectedPendingTrigger ) { // If heat disinfect temperature has been reached, check if this stage of heat disinfect is done if ( ( TRUE == isPartialDisinfectInProgress ) && ( TRUE == didTimeout( heatDisinfectTimer, HEAT_DISINFECT_TIME_MS ) ) ) @@ -1932,16 +1930,11 @@ * @details Outputs: disinfectNVOps * @return: none *************************************************************************/ -static void writeDisinfectDataToNV( void ) +static void writeDisinfectDataToNV( DG_USAGE_INFO_ITEMS_T info ) { - if ( FALSE == disinfectNVOps.hasDisCompleteDateBeenWrittenToNV ) - { - disinfectNVOps.hasDisCompleteDateBeenWrittenToNV = setDisinfectStatus( TRUE ); - } - if ( FALSE == disinfectNVOps.hasDisStatusBeenWrittenToNV ) { - disinfectNVOps.hasDisStatusBeenWrittenToNV = setLastDisinfectDate( USAGE_INFO_HEAT_DIS, getRTCTimestamp() ); + disinfectNVOps.hasDisStatusBeenWrittenToNV = setLastDisinfectDate( info, getRTCTimestamp() ); } } Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -r0c296cef29037819be204c45a23d4d38a52b2718 -r1e34d32fcfac88792ed72e55953dee721bacd9d5 --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 0c296cef29037819be204c45a23d4d38a52b2718) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 1e34d32fcfac88792ed72e55953dee721bacd9d5) @@ -22,6 +22,7 @@ #include "MessageSupport.h" #include "ModeFault.h" #include "ModeStandby.h" +#include "NVDataMgmt.h" #include "OperationModes.h" #include "Pressures.h" #include "Reservoirs.h" @@ -414,7 +415,10 @@ if ( ( DG_MODE_STAN == getCurrentOperationMode() ) && ( DG_STANDBY_MODE_STATE_IDLE == standbyState ) || ( DG_MODE_SOLO == getCurrentOperationMode() ) ) { DG_CMD_RESPONSE_T cmdResponse; + DG_USAGE_INFO_RECORD_T usageInfo; + getNVRecord2Driver( GET_USAGE_RECORD, (U08*)&usageInfo, sizeof( DG_USAGE_INFO_RECORD_T ), 0, ALARM_ID_NO_ALARM ); + OPN_CLS_STATE_T concCap = getSwitchStatus( CONCENTRATE_CAP ); OPN_CLS_STATE_T diaCap = getSwitchStatus( DIALYSATE_CAP ); cmdResponse.commandID = DG_CMD_START_FLUSH; @@ -426,6 +430,9 @@ { concCap = STATE_CLOSED; diaCap = STATE_CLOSED; + // Using the caps switch to disable the chemical disinfect date checks + usageInfo.lastChemDisFlushCompleteDateEpoch = 40; + usageInfo.lastChemDisCompleteDateEpoch = 32; } #endif @@ -435,6 +442,11 @@ cmdResponse.rejectCode = ( STATE_OPEN == getSwitchStatus( DIALYSATE_CAP ) ? REQUEST_REJECT_REASON_DG_DIALYSATE_CAP_OPEN : REQUEST_REJECT_REASON_DG_CONCENTRATE_CAP_OPEN ); } + else if ( usageInfo.lastChemDisFlushCompleteDateEpoch < usageInfo.lastChemDisCompleteDateEpoch ) + { + cmdResponse.rejected = TRUE; + cmdResponse.rejectCode = REQUEST_REJECT_REASON_DG_CHEM_FLUSH_NOT_COMPLETED; + } else { pendingStartDGFlushRequest = TRUE; @@ -462,7 +474,10 @@ if ( ( DG_MODE_STAN == getCurrentOperationMode() ) && ( DG_STANDBY_MODE_STATE_IDLE == standbyState ) || ( DG_MODE_SOLO == getCurrentOperationMode() ) ) { DG_CMD_RESPONSE_T cmdResponse; + DG_USAGE_INFO_RECORD_T usageInfo; + getNVRecord2Driver( GET_USAGE_RECORD, (U08*)&usageInfo, sizeof( DG_USAGE_INFO_RECORD_T ), 0, ALARM_ID_NO_ALARM ); + cmdResponse.commandID = DG_CMD_START_HEAT_DISINFECT; cmdResponse.rejected = FALSE; cmdResponse.rejectCode = DG_CMD_REQUEST_REJECT_REASON_NONE; @@ -474,6 +489,9 @@ { concCap = STATE_CLOSED; diaCap = STATE_CLOSED; + // Using the caps switch to disable the chemical disinfect date checks + usageInfo.lastChemDisFlushCompleteDateEpoch = 40; + usageInfo.lastChemDisCompleteDateEpoch = 32; } #endif @@ -483,6 +501,11 @@ cmdResponse.rejectCode = ( STATE_OPEN == getSwitchStatus( DIALYSATE_CAP ) ? REQUEST_REJECT_REASON_DG_DIALYSATE_CAP_OPEN : REQUEST_REJECT_REASON_DG_CONCENTRATE_CAP_OPEN ); } + else if ( usageInfo.lastChemDisFlushCompleteDateEpoch < usageInfo.lastChemDisCompleteDateEpoch ) + { + cmdResponse.rejected = TRUE; + cmdResponse.rejectCode = REQUEST_REJECT_REASON_DG_CHEM_FLUSH_NOT_COMPLETED; + } else { pendingStartDGHeatDisinfectRequest = TRUE; Index: firmware/App/Services/Reservoirs.c =================================================================== diff -u -r9cc5da6947aa143a10f95519eb7f366c1b095d61 -r1e34d32fcfac88792ed72e55953dee721bacd9d5 --- firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision 9cc5da6947aa143a10f95519eb7f366c1b095d61) +++ firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision 1e34d32fcfac88792ed72e55953dee721bacd9d5) @@ -179,12 +179,6 @@ } } - if ( ( FALSE == nvOps.hasDisStatusBeenWrittenToNV ) && ( MODE_TREA == hdModes.hdMode ) ) - { - // If the disinfect status has not been set and we are in treatment mode, void the disinfect (chemical or heat disinfects) - nvOps.hasDisStatusBeenWrittenToNV = setDisinfectStatus( FALSE ); - } - // publish active reservoir, fill/drain volume targets at 1 Hz. if ( ++dataPublishCounter >= RESERVOIR_DATA_PUB_INTERVAL ) { Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r224f096c4d255526eccba9aaa13e36e0e7499f14 -r1e34d32fcfac88792ed72e55953dee721bacd9d5 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 224f096c4d255526eccba9aaa13e36e0e7499f14) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 1e34d32fcfac88792ed72e55953dee721bacd9d5) @@ -1451,7 +1451,7 @@ // Create a message record blankMessage( &msg ); msg.hdr.msgID = MSG_ID_DG_USAGE_DATA; - msg.hdr.payloadLen = sizeof( U32 ) + sizeof( U32 ) + sizeof( BOOL ); + msg.hdr.payloadLen = sizeof( DG_USAGE_INFO_RECORD_T ); // Get the service record. There are no arrays of service to check and also, raise no alarm since the service record // has been already checked in POST @@ -1460,11 +1460,7 @@ if ( 0 == message->hdr.payloadLen ) { // Fill message payload - memcpy( payloadPtr, &usageInfo.lastHeatDisCompleteDateEpoch, sizeof( U32 ) ); - payloadPtr += sizeof( U32 ); - memcpy( payloadPtr, &usageInfo.lastChemDisCompleteDateEpoch, sizeof( U32 ) ); - payloadPtr += sizeof( U32 ); - memcpy( payloadPtr, &usageInfo.isDisinfected, sizeof( BOOL ) ); + memcpy( payloadPtr, &usageInfo, sizeof( DG_USAGE_INFO_RECORD_T ) ); } // Serialize the message (w/ sync, CRC, and appropriate CAN padding) and add serialized message data to appropriate comm buffer