Index: firmware/App/Controllers/ConcentratePumps.c =================================================================== diff -u -r329409d63c11fd7d7fc8c3d3dd1d96e4e5a109dc -r5e3a46112ebab361a33b9f7cadb619eb12b44c0f --- firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 329409d63c11fd7d7fc8c3d3dd1d96e4e5a109dc) +++ firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 5e3a46112ebab361a33b9f7cadb619eb12b44c0f) @@ -194,10 +194,10 @@ calcMeasuredPumpsSpeed( CONCENTRATEPUMPS_CP1_ACID, getFPGACP1HallSensePulseWidth() ); calcMeasuredPumpsSpeed( CONCENTRATEPUMPS_CP2_BICARB, getFPGACP2HallSensePulseWidth() ); - concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].parked.data = (U32)getFPGAAcidPumpIsParked(); - concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].parked.data = (U32)getFPGABicarbPumpIsParked(); - concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].parked.data = (U32)getFPGAAcidPumpParkFault(); - concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].parked.data = (U32)getFPGABicarbPumpParkFault(); + concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].parked.data = (U32)getFPGAAcidPumpIsParked(); + concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].parked.data = (U32)getFPGABicarbPumpIsParked(); + concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].parkFaulted.data = (U32)getFPGAAcidPumpParkFault(); + concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].parkFaulted.data = (U32)getFPGABicarbPumpParkFault(); #ifndef _RELEASE_ if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_CONC_PUMPS_SPEED_ALARM ) != SW_CONFIG_ENABLE_VALUE ) @@ -234,9 +234,9 @@ F32 cp2Speed = getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP2_BICARB ); F32 cp2TgtSpeed = concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].pumpTargetSpeed; - if ( 0 != fpgaConcPumpsFault ) + if ( fpgaConcPumpsFault != 0 ) { - //SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DG_CONCENTRATE_PUMP_FAULT, fpgaConcPumpsFault ); + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_DG_CONCENTRATE_PUMP_FAULT, fpgaConcPumpsFault ); } // Use the above values to prepare the broadcast data @@ -251,8 +251,8 @@ data.cp1PulseUS = concentratePumps[ CONCENTRATEPUMPS_CP1_ACID ].pulseWidthUS; data.cp2PulseUS = concentratePumps[ CONCENTRATEPUMPS_CP2_BICARB ].pulseWidthUS; data.cp1Parked = getConcPumpIsParked( CONCENTRATEPUMPS_CP1_ACID ); - data.cp2Parked = getConcPumpParkIsFaulted( CONCENTRATEPUMPS_CP1_ACID ); - data.cp1ParkFault = getConcPumpIsParked( CONCENTRATEPUMPS_CP2_BICARB ); + data.cp2Parked = getConcPumpIsParked( CONCENTRATEPUMPS_CP2_BICARB ); + data.cp1ParkFault = getConcPumpParkIsFaulted( CONCENTRATEPUMPS_CP1_ACID ); data.cp2ParkFault = getConcPumpParkIsFaulted( CONCENTRATEPUMPS_CP2_BICARB ); concentratePumpMonitorTimerCounter = 0; @@ -522,10 +522,9 @@ /*********************************************************************//** * @brief * The stopConcentratePump function sets the concentrate pump step speed - * to zero and turns off concentrate pump. Also parks the pump if requested. + * to zero and turns off concentrate pump. Also parks the pump if requested. * @details Inputs: none - * @details Outputs: targetPumpSpeed[], currentPumpSpeed[], turn - * concentrate pumps off + * @details Outputs: concentratePumps * @param pumpId concentrate pump id * @return none *************************************************************************/ @@ -580,8 +579,8 @@ } } else - { #endif + { if ( TRUE == parkPump ) { if ( CONCENTRATEPUMPS_CP1_ACID == pumpId ) @@ -593,8 +592,8 @@ setFPGABicarbPumpParkCmd(); } } -#ifndef _RELEASE_ } +#ifndef _RELEASE_ } #endif } @@ -647,6 +646,8 @@ state = CONCENTRATE_PUMP_RAMP_TO_TARGET_SPEED_STATE; } + // In case we are in a mode that the concentrate pumps are off but they still need to be parked, then the stop function + // is called to park the pumps if ( TRUE == concentratePumps[ pumpId ].hasParkBeenRequested ) { stopConcentratePump( pumpId ); @@ -1056,10 +1057,9 @@ * @brief * The testSetConcentratePumpParkCommand function commands the given pump * to park. - * @details Inputs: none - * @details Outputs: measuredPumpSpeed[] + * @details Inputs: concentratePumps + * @details Outputs: concentratePumps * @param pumpId concentrate pump id - * @param value override concentrate pump measured speed * @return TRUE if override successful, FALSE if not *************************************************************************/ BOOL testSetConcentratePumpParkCommand( U32 pumpId ) Index: firmware/App/Controllers/ConductivitySensors.c =================================================================== diff -u -r9426334142cbfdea9ee99e3040fc08ff0247da7b -r5e3a46112ebab361a33b9f7cadb619eb12b44c0f --- firmware/App/Controllers/ConductivitySensors.c (.../ConductivitySensors.c) (revision 9426334142cbfdea9ee99e3040fc08ff0247da7b) +++ firmware/App/Controllers/ConductivitySensors.c (.../ConductivitySensors.c) (revision 5e3a46112ebab361a33b9f7cadb619eb12b44c0f) @@ -334,6 +334,10 @@ checkPersistentAlarm( ALARM_ID_DG_CLEANING_MODE_INLET_WATER_COND_TOO_LOW, isConductTooLow, conductivity, MAX_COND_SENSOR_CPI_WARNING_LOW_US_PER_CM ); } break; + + default: + // NOTE: Do nothing for the rest of the modes + break; } } } Index: firmware/App/Controllers/Pressures.c =================================================================== diff -u -r9426334142cbfdea9ee99e3040fc08ff0247da7b -r5e3a46112ebab361a33b9f7cadb619eb12b44c0f --- firmware/App/Controllers/Pressures.c (.../Pressures.c) (revision 9426334142cbfdea9ee99e3040fc08ff0247da7b) +++ firmware/App/Controllers/Pressures.c (.../Pressures.c) (revision 5e3a46112ebab361a33b9f7cadb619eb12b44c0f) @@ -204,6 +204,10 @@ checkPersistentAlarm( ALARM_ID_DG_CLEANING_MODE_INLET_WATER_PRESSURE_TOO_LOW, isPressureTooLow, pressure, MIN_INLET_WATER_PRESSURE_WARNING_LOW_PSIG ); } break; + + default: + // NOTE: Do nothing for the rest of the modes + break; } } } Index: firmware/App/Controllers/TemperatureSensors.c =================================================================== diff -u -r9426334142cbfdea9ee99e3040fc08ff0247da7b -r5e3a46112ebab361a33b9f7cadb619eb12b44c0f --- firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision 9426334142cbfdea9ee99e3040fc08ff0247da7b) +++ firmware/App/Controllers/TemperatureSensors.c (.../TemperatureSensors.c) (revision 5e3a46112ebab361a33b9f7cadb619eb12b44c0f) @@ -93,6 +93,10 @@ #define BARO_SENSOR_REFERENCE_TEMP_C 2000 ///< Barometric sensor reference temperature in C. #define BARO_SENSOR_WAIT_FOR_COEFF_TIME_OUT_MS ( 20 * MS_PER_SECOND ) ///< Barometric sensor wait for coefficients timeout in milliseconds. +#define TDI_TRO_TEMP_SENSORS_MAX_DEVIATION_C 1.0F ///< Dialysate temperature sensors maximum allowed deviation in C. +#define DIALYSATE_TEMP_SNSRS_OUT_OF_RANGE_TIMEOUT_MS ( 10 * MS_PER_SECOND ) ///< Dialysate temperature sensors drift timeout in milliseconds. +#define TDI_TRO_TEMP_SENSORS_MAX_DEVIATION_IN_HEAT_DIS_C 3.0F ///< Dialysate temperature sensors maximum allowed deviation in heat disinfect in C. + /// Temperature sensor exec states. typedef enum tempSensors_Exec_States { @@ -329,6 +333,7 @@ // Persistent alarm for the temperature sensors range check initPersistentAlarm( ALARM_ID_DG_TEMPERATURE_SENSORS_ADC_FAULT, TEMP_SENSORS_OUT_OF_RANGE_TIME_OUT_MS, TEMP_SENSORS_OUT_OF_RANGE_TIME_OUT_MS ); + initPersistentAlarm( ALARM_ID_DG_DIALYSATE_TEMPERATURE_SENSORS_OUT_OF_RANGE, 0, DIALYSATE_TEMP_SNSRS_OUT_OF_RANGE_TIMEOUT_MS ); // Initialize the FPGA persistent alarms initFPGAPersistentAlarm( FPGA_PERS_ERROR_TWO_WIRE_ADC_TEMP_SENSORS, ALARM_ID_DG_TWO_WIRE_SENSORS_FPGA_FAULT, TEMP_SENSORS_FPGA_ERROR_TIMEOUT_MS, TEMP_SENSORS_FPGA_ERROR_TIMEOUT_MS); @@ -398,6 +403,9 @@ // Monitor the temperature values monitorTemperatureSenors(); + // Check the TDi/TRo drift + checkDialysateTemperatureSensors(); + // Publish the data publishTemperatureSensorsData(); } @@ -446,6 +454,10 @@ checkPersistentAlarm( ALARM_ID_DG_CLEANING_MODE_INLET_WATER_TEMP_TOO_LOW, isWaterTempInLowRange, temperature, MAX_WATER_TEMPERATURE_WARNING_LOW_RANGE ); } break; + + default: + // NOTE: Do nothing in the rest of the modes + break; } } } @@ -527,6 +539,31 @@ /*********************************************************************//** * @brief + * The checkDialysateTemperatureSensors function checks whether the + * dialysate temperature sensors have drifted. If they are drifted, it raises + * an alarm. + * @details Inputs: none + * @details Outputs: None + * @return none + *************************************************************************/ +void checkDialysateTemperatureSensors( void ) +{ +#ifndef _RELEASE_ + if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_TEMPERATURE_SENSORS_ALARM ) != SW_CONFIG_ENABLE_VALUE ) +#endif + { + F32 TDi = getTemperatureValue( TEMPSENSORS_INLET_DIALYSATE ); + F32 TRo = getTemperatureValue( TEMPSENSORS_OUTLET_REDUNDANT ); + DG_OP_MODE_T op = getCurrentOperationMode(); + F32 driftC = ( DG_MODE_HEAT == op ? TDI_TRO_TEMP_SENSORS_MAX_DEVIATION_IN_HEAT_DIS_C : TDI_TRO_TEMP_SENSORS_MAX_DEVIATION_C ); + BOOL isDriftOut = ( fabs( TDi - TRo ) > driftC ? TRUE : FALSE ); + + checkPersistentAlarm( ALARM_ID_DG_DIALYSATE_TEMPERATURE_SENSORS_OUT_OF_RANGE, isDriftOut, fabs( TDi - TRo ), driftC ); + } +} + +/*********************************************************************//** + * @brief * The getADC2TempConversion function calculates the temperature from the * moving average ADC samples. * @details Inputs: tempEquationCoeffA, tempEquationCoeffB Index: firmware/App/Controllers/TemperatureSensors.h =================================================================== diff -u -rb3e53e10da033307b084161e6008fa5ed7710ccf -r5e3a46112ebab361a33b9f7cadb619eb12b44c0f --- firmware/App/Controllers/TemperatureSensors.h (.../TemperatureSensors.h) (revision b3e53e10da033307b084161e6008fa5ed7710ccf) +++ firmware/App/Controllers/TemperatureSensors.h (.../TemperatureSensors.h) (revision 5e3a46112ebab361a33b9f7cadb619eb12b44c0f) @@ -71,6 +71,8 @@ F32 getTemperatureValue( U32 sensorIndex ); S32 getBaroSensorTemperatureDiff( void ); +void checkDialysateTemperatureSensors( void ); + BOOL testSetMeasuredTemperatureOverride( U32 sensorIndex, F32 temperature ); BOOL testResetMeasuredTemperatureOverride( U32 sensorIndex ); Index: firmware/App/Modes/ModeFill.c =================================================================== diff -u -r0b121a7c92a8d86f8369b7094b0bce21389f3747 -r5e3a46112ebab361a33b9f7cadb619eb12b44c0f --- firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision 0b121a7c92a8d86f8369b7094b0bce21389f3747) +++ firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision 5e3a46112ebab361a33b9f7cadb619eb12b44c0f) @@ -79,8 +79,6 @@ #define PRIME_CONCENTRATE_LINES_TIME_OUT_MS ( 95 * MS_PER_SECOND ) ///< Time required to prime the concentrate lines. #define FLUSH_BUBBLES_PUMP_TIME_OUT_MS ( 2 * MS_PER_SECOND ) ///< RO pump on during flush bubble interval in ms. #define DIALYSATE_TEMPERATURE_TOLERANCE_C 2.0F ///< Dialysate temperature tolerance in degree C. -#define DIALYSATE_TEMPERATURE_SENSORS_MAX_DEVIATION_C 1.0F ///< Dialysate temperature sensors maximum allowed deviation in C. -#define DIALYSATE_TEMP_SNSRS_OUT_OF_RANGE_TIMEOUT_MS ( 10 * MS_PER_SECOND ) ///< Dialysate temperature sensors drift timeout in milliseconds. #define DATA_PUBLISH_COUNTER_START_COUNT 63 ///< Data publish counter start count. /// Multiplier to convert flow (mL/min) into volume (mL) for period of general task interval. @@ -151,7 +149,6 @@ static DG_FILL_MODE_STATE_T handlePausedState( void ); static BOOL areInletWaterConditionsAlarmsActive( void ); -static void checkDialysateTemperatureSensors( void ); static void handleDialysateMixing( F32 measuredROFlowRate_mL_min, F32 acidMixingRatio, F32 bicarbMixingRatio ); static void setFillInfoToRTCRAM( void ); static BOOL isValueWithinPercentRange( F32 testValue, F32 baseValue, F32 percentFactor ); @@ -189,8 +186,6 @@ totalBicarbConductivity = 0.0F; totalAcidConductivity = 0.0F; havePauseActuatorsBeenSet = FALSE; - - initPersistentAlarm( ALARM_ID_DG_DIALYSATE_TEMPERATURE_SENSORS_OUT_OF_RANGE, 0, DIALYSATE_TEMP_SNSRS_OUT_OF_RANGE_TIMEOUT_MS ); } /*********************************************************************//** @@ -912,30 +907,6 @@ /*********************************************************************//** * @brief - * The checkDialysateTemperatureSensors function checks whether the - * dialysate temperature sensors have drifted. If they are drifted, it raises - * an alarm. - * @details Inputs: none - * @details Outputs: None - * @return none - *************************************************************************/ -static void checkDialysateTemperatureSensors( void ) -{ - F32 TDi = getTemperatureValue( TEMPSENSORS_INLET_DIALYSATE ); - F32 TRo = getTemperatureValue( TEMPSENSORS_OUTLET_REDUNDANT ); - BOOL isDriftOut = ( fabs( TDi - TRo ) >= DIALYSATE_TEMPERATURE_SENSORS_MAX_DEVIATION_C ? TRUE : FALSE ); - -#ifndef _RELEASE_ - if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_TEMPERATURE_SENSORS_ALARM ) != SW_CONFIG_ENABLE_VALUE ) -#endif - { - checkPersistentAlarm( ALARM_ID_DG_DIALYSATE_TEMPERATURE_SENSORS_OUT_OF_RANGE, isDriftOut, fabs( TDi - TRo ), - DIALYSATE_TEMPERATURE_SENSORS_MAX_DEVIATION_C ); - } -} - -/*********************************************************************//** - * @brief * The isValueWithinPercentRange function validates if the test value * is within the percentage range specified by the baseValue and * percentFactor. Index: firmware/App/Modes/ModeFlush.c =================================================================== diff -u -r022c733838d8c06b1562dbafa64f1643cb1bb8c8 -r5e3a46112ebab361a33b9f7cadb619eb12b44c0f --- firmware/App/Modes/ModeFlush.c (.../ModeFlush.c) (revision 022c733838d8c06b1562dbafa64f1643cb1bb8c8) +++ firmware/App/Modes/ModeFlush.c (.../ModeFlush.c) (revision 5e3a46112ebab361a33b9f7cadb619eb12b44c0f) @@ -800,7 +800,7 @@ * flush with fresh water state. It runs the circulation state with fresh * water for the defined period of time. * @details Inputs: stateTimerStart - * @details Outputs: none + * @details Outputs: flushUIState * @return next state of the flush state machine *************************************************************************/ static DG_FLUSH_STATE_T handleFlushModeFlushWithFreshWaterState( void ) @@ -811,7 +811,7 @@ { deenergizeActuators( NO_PARK_CONC_PUMPS ); flushUIState = FLUSH_UI_STATE_COMPLETE; - state = DG_FLUSH_STATE_COMPLETE; + state = DG_FLUSH_STATE_COMPLETE; } return state; @@ -942,7 +942,7 @@ /*********************************************************************//** * @brief * The failFlushMode function sets the alarm that failed the flush mode. - * @details Inputs: alarm, prevHeatDisinfectState + * @details Inputs: prevHeatDisinfectState * @details Outputs: none * @return none *************************************************************************/ Index: firmware/App/Modes/ModeHeatDisinfect.c =================================================================== diff -u -r329409d63c11fd7d7fc8c3d3dd1d96e4e5a109dc -r5e3a46112ebab361a33b9f7cadb619eb12b44c0f --- firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 329409d63c11fd7d7fc8c3d3dd1d96e4e5a109dc) +++ firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 5e3a46112ebab361a33b9f7cadb619eb12b44c0f) @@ -51,10 +51,6 @@ #define MAX_ALLOWED_STATE_TRIALS 1 ///< Max allowed trials on a state. This is general among all the states. #define HEAT_DISINFECT_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Mode heat disinfect data publish interval in counts. -// Start state defines -#define MIN_INLET_PRESSURE_PSI 30.0F ///< Minimum water inlet pressure in psi. -#define MAX_START_STATE_TEMP_SENSORS_DIFF_C 3.0F ///< Max start state TDi and TRo difference tolerance in C. - // Drain R1 & R2 states defines #define DRAIN_PUMP_TARGET_RPM 2400 ///< Drain pump target RPM during drain. #define RSRVRS_INITIAL_DRAIN_TIME_OUT_MS ( 2 * SEC_PER_MIN * MS_PER_SECOND ) ///< Reservoirs 1 & 2 initial drain time out in milliseconds. @@ -86,7 +82,7 @@ // Fill and heat water #define HEAT_DISINFECT_TARGET_TEMPERATURE_C 82.0F ///< Heat disinfect target water temperature in C. -#define HEAT_DISINFECT_START_TEMPERATURE_C 48.0F // 81.00 ///< Heat disinfect minimum acceptable temperature in C. +#define HEAT_DISINFECT_START_TEMPERATURE_C 81.00F ///< Heat disinfect minimum acceptable temperature in C. // R1 to R2 & R2 to R1 heat disinfect circulation #define HEAT_DISINFECT_TARGET_RO_FLOW_LPM 1.3F ///< Heat disinfect target RO flow rate in L/min. @@ -430,40 +426,18 @@ static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectStartState( void ) { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_DRAIN_R1; - F32 ppiPressure = getMeasuredDGPressure( PRESSURE_SENSOR_RO_PUMP_INLET ); - F32 TDiTemp = getTemperatureValue( TEMPSENSORS_INLET_DIALYSATE ); - F32 TRoTemp = getTemperatureValue( TEMPSENSORS_OUTLET_REDUNDANT ); + overallHeatDisinfectTimer = getMSTimerCount(); + heatDisinfectUIState = HEAT_DISINFECT_UI_STATE_FLUSH_BEFORE_DISINFECT; + rsrvrFillStableTimeCounter = 0; + rsrvr1Status = DG_RESERVOIR_ABOVE_TARGET; + stateTimer = getMSTimerCount(); - // Start overall heat disinfect timer - overallHeatDisinfectTimer = getMSTimerCount(); + // Close VPi to prevent wasting water + setValveState( VPI, VALVE_STATE_CLOSED ); + setValveState( VPO, VALVE_STATE_FILL_C_TO_NC); + setValveState( VRD1, VALVE_STATE_OPEN ); + setDrainPumpTargetRPM( DRAIN_PUMP_TARGET_RPM ); - // If the inlet pressure is less than or equal to the threshold or TDi and TRo difference is greater than 3 C, the cycle - // should be canceled - if ( ( ppiPressure <= MIN_INLET_PRESSURE_PSI ) || ( fabs( TDiTemp - TRoTemp ) > MAX_START_STATE_TEMP_SENSORS_DIFF_C ) ) - { - prevHeatDisinfectState = state; - alarmDetectedPendingTrigger = ALARM_ID_DG_HEAT_DISINFECT_INLET_PRES_AND_TEMP_SNSRS_OUT; - state = DG_HEAT_DISINFECT_STATE_CANCEL_BASIC_PATH; - } - else - { - // Set the heat disinfect UI state - heatDisinfectUIState = HEAT_DISINFECT_UI_STATE_FLUSH_BEFORE_DISINFECT; - - // Close VPi to prevent wasting water - setValveState( VPI, VALVE_STATE_CLOSED ); - setValveState( VPO, VALVE_STATE_FILL_C_TO_NC); - - // Set the actuators to drain R1 - setValveState( VRD1, VALVE_STATE_OPEN ); - setDrainPumpTargetRPM( DRAIN_PUMP_TARGET_RPM ); - - rsrvrFillStableTimeCounter = 0; - // Assume reservoir 1 is full and drain it - rsrvr1Status = DG_RESERVOIR_ABOVE_TARGET; - stateTimer = getMSTimerCount(); - } - return state; } @@ -1044,7 +1018,6 @@ break; case HEAT_DISINFECT_COMPLETE: - requestConcentratePumpOff( CONCENTRATEPUMPS_CP1_ACID, FALSE ); requestConcentratePumpOff( CONCENTRATEPUMPS_CP2_BICARB, FALSE ); // Set the valves to transfer hot water from R1 to R2 and fill up R2. @@ -1202,10 +1175,8 @@ static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectCoolDownHeatersState( void ) { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_COOL_DOWN_HEATERS; + heatDisinfectUIState = HEAT_DISINFECT_UI_STATE_COOL_DOWN_DEVICE; - // Set the heat disinfect UI state - heatDisinfectUIState = HEAT_DISINFECT_UI_STATE_COOL_DOWN_DEVICE; - writeDisinfectDataToNV( USAGE_INFO_HEAT_DIS ); if ( TRUE == didTimeout( stateTimer, POST_HEAT_DISINFECT_WAIT_TIME_MS ) ) @@ -1216,15 +1187,14 @@ { // Stop the drain pump and the RO pump to exit the closed loop signalDrainPumpHardStop(); + setValveState( VRD1, VALVE_STATE_CLOSED ); } else { - - + rsrvr1Status = DG_RESERVOIR_ABOVE_TARGET; + stateTimer = getMSTimerCount(); + state = DG_HEAT_DISINFECT_STATE_MIX_DRAIN_R1; } - - stateTimer = getMSTimerCount(); - state = DG_HEAT_DISINFECT_STATE_MIX_DRAIN_R1; } return state; @@ -1251,7 +1221,13 @@ { isDrainPumpInMixDrainOn = TRUE; + setValveState( VPI, VALVE_STATE_OPEN ); setValveState( VRD1, VALVE_STATE_OPEN ); + setValveState( VBF, VALVE_STATE_CLOSED ); + setValveState( VPO, VALVE_STATE_NOFILL_C_TO_NO ); + setValveState( VDR, VALVE_STATE_DRAIN_C_TO_NO ); + setValveState( VRC, VALVE_STATE_DRAIN_C_TO_NO ); + setValveState( VRO, VALVE_STATE_R1_C_TO_NO ); // Turn on the drain pump to drain the reservoirs in open loop mode setDrainPumpTargetRPM( DRAIN_PUMP_RPM_IN_MIX_DRAIN ); } @@ -1578,9 +1554,9 @@ if ( TRUE == isDrainComplete ) { - if ( ( DG_HEAT_DISINFECT_STATE_FLUSH_R2_AND_DRAIN_R1 == heatDisinfectState) && ( DG_RESERVOIR_1 == r) ) + if ( ( DG_HEAT_DISINFECT_STATE_FLUSH_R2_AND_DRAIN_R1 == heatDisinfectState) && ( DG_RESERVOIR_1 == r ) ) { - if ( ( DG_RESERVOIR_REACHED_TARGET == rsrvr2Status) && ( 0 == getDrainPumpTargetRPM() ) ) + if ( ( DG_RESERVOIR_REACHED_TARGET == rsrvr2Status ) && ( 0 == getDrainPumpTargetRPM() ) ) { stateTimer = getMSTimerCount(); } @@ -1821,6 +1797,7 @@ areInletWaterAlarmsActive |= isAlarmActive( ALARM_ID_DG_CLEANING_MODE_INLET_WATER_PRESSURE_TOO_LOW ); areInletWaterAlarmsActive |= isAlarmActive( ALARM_ID_DG_CLEANING_MODE_INLET_WATER_COND_TOO_HIGH ); areInletWaterAlarmsActive |= isAlarmActive( ALARM_ID_DG_CLEANING_MODE_INLET_WATER_COND_TOO_LOW ); + areInletWaterAlarmsActive |= isAlarmActive( ALARM_ID_DG_DIALYSATE_TEMPERATURE_SENSORS_OUT_OF_RANGE ); if ( ( TRUE == areInletWaterAlarmsActive ) ) { Index: firmware/App/Modes/ModeHeatDisinfectActiveCool.c =================================================================== diff -u -rf2ac7396ceab9a8c0a995c58a49be54ba66eda4f -r5e3a46112ebab361a33b9f7cadb619eb12b44c0f --- firmware/App/Modes/ModeHeatDisinfectActiveCool.c (.../ModeHeatDisinfectActiveCool.c) (revision f2ac7396ceab9a8c0a995c58a49be54ba66eda4f) +++ firmware/App/Modes/ModeHeatDisinfectActiveCool.c (.../ModeHeatDisinfectActiveCool.c) (revision 5e3a46112ebab361a33b9f7cadb619eb12b44c0f) @@ -180,6 +180,9 @@ static DG_HEAT_DISINFECT_ACTIVE_COOL_STATE_T handleHeatDisinfectActiveCoolStartState( void ) { DG_HEAT_DISINFECT_ACTIVE_COOL_STATE_T state = DG_HEAT_DISINFECT_ACTIVE_COOL_STATE_COOL_DOWN_RO_FILTER; + overallHeatDisinfectActiveCoolTimer = getMSTimerCount(); + ROFCoolingTimer = 0; + stateTimer = getMSTimerCount(); // De-energize all the valves that are not in the path anymore // and wait for the RO membrane to be cooled down. @@ -192,9 +195,6 @@ setValveState( VPO, VALVE_STATE_NOFILL_C_TO_NO ); setROPumpTargetFlowRateLPM( ROF_COOL_DOWN_TARGET_FLOW_LPM, HEAT_DISINFECT_ACTIVE_COOL_MAX_RO_PRESSURE_PSI ); - ROFCoolingTimer = 0; - stateTimer = getMSTimerCount(); - return state; } Index: firmware/App/Modes/OperationModes.c =================================================================== diff -u -r7c844610f28a5dc50de86bd21d616a2316bb82d1 -r5e3a46112ebab361a33b9f7cadb619eb12b44c0f --- firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision 7c844610f28a5dc50de86bd21d616a2316bb82d1) +++ firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision 5e3a46112ebab361a33b9f7cadb619eb12b44c0f) @@ -62,7 +62,7 @@ static const DG_OP_MODE_T MODE_TRANSITION_TABLE[ NUM_OF_DG_MODES - 1 ][ NUM_OF_DG_MODES - 1 ] = { // from to-> FAULT SERVICE INIT STANBY STBY-SOLO GEN-IDLE FILL DRAIN FLUSH HEAT DIS CHEM DIS CHEM_FLUSH HEAT_COOL - /* FAUL */{ DG_MODE_FAUL, DG_MODE_SERV, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_CHFL, DG_MODE_HCOL }, + /* FAUL */{ DG_MODE_FAUL, DG_MODE_SERV, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG }, /* SERV */{ DG_MODE_FAUL, DG_MODE_SERV, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG }, /* INIT */{ DG_MODE_FAUL, DG_MODE_NLEG, DG_MODE_INIT, DG_MODE_STAN, DG_MODE_SOLO, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG }, /* STAN */{ DG_MODE_FAUL, DG_MODE_SERV, DG_MODE_NLEG, DG_MODE_STAN, DG_MODE_SOLO, DG_MODE_GENE, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_FLUS, DG_MODE_HEAT, DG_MODE_CHEM, DG_MODE_CHFL, DG_MODE_HCOL }, @@ -74,10 +74,9 @@ /* HEAT */{ DG_MODE_FAUL, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_STAN, DG_MODE_SOLO, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_HEAT, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_HCOL }, /* CHEM */{ DG_MODE_FAUL, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_STAN, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_CHEM, DG_MODE_CHFL, DG_MODE_NLEG }, /* CHFL */{ DG_MODE_FAUL, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_STAN, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_CHFL, DG_MODE_NLEG }, - /* HCOL */{ DG_MODE_FAUL, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_STAN, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_CHFL, DG_MODE_HCOL }, + /* HCOL */{ DG_MODE_FAUL, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_STAN, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_NLEG, DG_MODE_HCOL }, }; - // ********** private function prototypes ********** static DG_OP_MODE_T arbitrateModeRequest( void ); Index: firmware/App/Services/AlarmMgmt.c =================================================================== diff -u -r9426334142cbfdea9ee99e3040fc08ff0247da7b -r5e3a46112ebab361a33b9f7cadb619eb12b44c0f --- firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 9426334142cbfdea9ee99e3040fc08ff0247da7b) +++ firmware/App/Services/AlarmMgmt.c (.../AlarmMgmt.c) (revision 5e3a46112ebab361a33b9f7cadb619eb12b44c0f) @@ -375,6 +375,10 @@ case DG_MODE_SERV: status = FALSE; break; + + default: + // NOTE: Do nothing for the other modes + break; } return status; Index: firmware/App/Services/Reservoirs.c =================================================================== diff -u -r0b121a7c92a8d86f8369b7094b0bce21389f3747 -r5e3a46112ebab361a33b9f7cadb619eb12b44c0f --- firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision 0b121a7c92a8d86f8369b7094b0bce21389f3747) +++ firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision 5e3a46112ebab361a33b9f7cadb619eb12b44c0f) @@ -824,8 +824,7 @@ *************************************************************************/ BOOL hasTargetDrainVolumeBeenReached( DG_RESERVOIR_ID_T reservoirId, U32 timeout ) { - BOOL result = FALSE; - + BOOL result = FALSE; F32 loadcellWeightML = getLoadCellSmallFilteredWeight( associatedLoadCell[ reservoirId ] ); U32 drainPumpFeedbackRPM = getDrainPumpMeasuredRPM(); Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r5d3e28c19ae10a99a5ce1fc5c010ac944975a6a1 -r5e3a46112ebab361a33b9f7cadb619eb12b44c0f --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 5d3e28c19ae10a99a5ce1fc5c010ac944975a6a1) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 5e3a46112ebab361a33b9f7cadb619eb12b44c0f) @@ -3071,16 +3071,19 @@ U32 totalMessages; U32 payloadLength; - memcpy(¤tMessage, payloadPtr, sizeof(U32)); - payloadPtr += sizeof(U32); + if ( message->hdr.payloadLen >= ( sizeof(currentMessage) + sizeof(totalMessages) + sizeof(payloadLength) ) ) + { + memcpy(¤tMessage, payloadPtr, sizeof(U32)); + payloadPtr += sizeof(U32); - memcpy(&totalMessages, payloadPtr, sizeof(U32)); - payloadPtr += sizeof(U32); + memcpy(&totalMessages, payloadPtr, sizeof(U32)); + payloadPtr += sizeof(U32); - memcpy(&payloadLength, payloadPtr, sizeof(U32)); - payloadPtr += sizeof(U32); + memcpy(&payloadLength, payloadPtr, sizeof(U32)); + payloadPtr += sizeof(U32); - status = receiveRecordFromDialin( NVDATAMGMT_CALIBRATION_RECORD, currentMessage, totalMessages, payloadLength, payloadPtr ); + status = receiveRecordFromDialin( NVDATAMGMT_CALIBRATION_RECORD, currentMessage, totalMessages, payloadLength, payloadPtr ); + } // Respond to request sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, status ); @@ -3130,16 +3133,19 @@ U32 totalMessages; U32 payloadLength; - memcpy(¤tMessage, payloadPtr, sizeof(U32)); - payloadPtr += sizeof(U32); + if ( message->hdr.payloadLen >= ( sizeof(currentMessage) + sizeof(totalMessages) + sizeof(payloadLength) ) ) + { + memcpy(¤tMessage, payloadPtr, sizeof(U32)); + payloadPtr += sizeof(U32); - memcpy(&totalMessages, payloadPtr, sizeof(U32)); - payloadPtr += sizeof(U32); + memcpy(&totalMessages, payloadPtr, sizeof(U32)); + payloadPtr += sizeof(U32); - memcpy(&payloadLength, payloadPtr, sizeof(U32)); - payloadPtr += sizeof(U32); + memcpy(&payloadLength, payloadPtr, sizeof(U32)); + payloadPtr += sizeof(U32); - status = receiveRecordFromDialin( NVDATAMGMT_SYSTEM_RECORD, currentMessage, totalMessages, payloadLength, payloadPtr ); + status = receiveRecordFromDialin( NVDATAMGMT_SYSTEM_RECORD, currentMessage, totalMessages, payloadLength, payloadPtr ); + } // Respond to request sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, status ); @@ -3216,16 +3222,19 @@ U32 totalMessages; U32 payloadLength; - memcpy(¤tMessage, payloadPtr, sizeof(U32)); - payloadPtr += sizeof(U32); + if ( message->hdr.payloadLen >= ( sizeof(currentMessage) + sizeof(totalMessages) + sizeof(payloadLength) ) ) + { + memcpy(¤tMessage, payloadPtr, sizeof(U32)); + payloadPtr += sizeof(U32); - memcpy(&totalMessages, payloadPtr, sizeof(U32)); - payloadPtr += sizeof(U32); + memcpy(&totalMessages, payloadPtr, sizeof(U32)); + payloadPtr += sizeof(U32); - memcpy(&payloadLength, payloadPtr, sizeof(U32)); - payloadPtr += sizeof(U32); + memcpy(&payloadLength, payloadPtr, sizeof(U32)); + payloadPtr += sizeof(U32); - status = receiveRecordFromDialin( NVDATAMGMT_SERVICE_RECORD, currentMessage, totalMessages, payloadLength, payloadPtr ); + status = receiveRecordFromDialin( NVDATAMGMT_SERVICE_RECORD, currentMessage, totalMessages, payloadLength, payloadPtr ); + } // Respond to request sendTestAckResponseMsg( (MSG_ID_T)message->hdr.msgID, status );