Index: firmware/App/Controllers/DGInterface.c =================================================================== diff -u -rf760ffc4b10556e5186e9ceb90294262063440ca -rd0f8958c30ff294da7e5088b89226f0ac30f3a36 --- firmware/App/Controllers/DGInterface.c (.../DGInterface.c) (revision f760ffc4b10556e5186e9ceb90294262063440ca) +++ firmware/App/Controllers/DGInterface.c (.../DGInterface.c) (revision d0f8958c30ff294da7e5088b89226f0ac30f3a36) @@ -17,6 +17,7 @@ #include // To check for NaN +#include "Battery.h" #include "DialInFlow.h" #include "Dialysis.h" #include "DGDefs.h" @@ -223,23 +224,26 @@ *************************************************************************/ void execDGInterfaceMonitor( void ) { - // Trigger alarm if not receiving new load cell data message in timely manner - checkDGDataFreshness( ALARM_ID_HD_NEW_LOAD_CELL_DATA_MESSAGE_NOT_RECEIVE, &dgLoadCellDataFreshFlag ); + if ( isACPowerLost() != TRUE ) + { + // Trigger alarm if not receiving new load cell data message in timely manner + checkDGDataFreshness( ALARM_ID_HD_NEW_LOAD_CELL_DATA_MESSAGE_NOT_RECEIVE, &dgLoadCellDataFreshFlag ); - // Trigger alarm if not receiving new dialysate temperature data message in timely manner - checkDGDataFreshness( ALARM_ID_HD_NEW_DIALYSATE_TEMPERATURE_DATA_MESSAGE_NOT_RECEIVE, &dgDialysateTemperatureDataFreshFlag ); + // Trigger alarm if not receiving new dialysate temperature data message in timely manner + checkDGDataFreshness( ALARM_ID_HD_NEW_DIALYSATE_TEMPERATURE_DATA_MESSAGE_NOT_RECEIVE, &dgDialysateTemperatureDataFreshFlag ); - // Trigger alarm if not receiving new reservoirs data message in timely manner - checkDGDataFreshness( ALARM_ID_HD_NEW_RESERVOIRS_DATA_MESSAGE_NOT_RECEIVE, &dgReservoirsDataFreshFlag ); + // Trigger alarm if not receiving new reservoirs data message in timely manner + checkDGDataFreshness( ALARM_ID_HD_NEW_RESERVOIRS_DATA_MESSAGE_NOT_RECEIVE, &dgReservoirsDataFreshFlag ); - // Trigger alarm if not receiving new DG op mode message in timely manner - checkDGDataFreshness( ALARM_ID_HD_NEW_DG_OPERATION_MODE_MESSAGE_NOT_RECEIVE, &dgOpModeDataFreshFlag ); + // Trigger alarm if not receiving new DG op mode message in timely manner + checkDGDataFreshness( ALARM_ID_HD_NEW_DG_OPERATION_MODE_MESSAGE_NOT_RECEIVE, &dgOpModeDataFreshFlag ); - // Check to see if DG has restarted - checkDGRestart(); + // Check to see if DG has restarted + checkDGRestart(); - // Check the status of the trimmer heater - checkDGTrimmerHeaterStatus(); + // Check the status of the trimmer heater + checkDGTrimmerHeaterStatus(); + } } /*********************************************************************//** @@ -1157,18 +1161,21 @@ U32 trimmerState = dgHeatersData.trimmerHeaterState; DG_OP_MODE_T dgOp = getDGOpMode(); - if ( ( DG_MODE_GENE == dgOp ) || ( DG_MODE_FILL == dgOp ) || ( DG_MODE_DRAI == dgOp ) ) + if ( isACPowerLost() != TRUE ) { - // In heat disinfect and chemical disinfect, the trimmer heater is controlled by the DG itself so no commands from HD should be sent - // regarding the trimmer heater. - if ( ( TRUE == dgTrimmerHeaterOn ) && ( HEATER_EXEC_STATE_OFF == trimmerState ) ) + if ( ( DG_MODE_GENE == dgOp ) || ( DG_MODE_FILL == dgOp ) || ( DG_MODE_DRAI == dgOp ) ) { - cmdStartDGTrimmerHeater(); + // In heat disinfect and chemical disinfect, the trimmer heater is controlled by the DG itself so no commands from HD should be sent + // regarding the trimmer heater. + if ( ( TRUE == dgTrimmerHeaterOn ) && ( HEATER_EXEC_STATE_OFF == trimmerState ) ) + { + cmdStartDGTrimmerHeater(); + } + else if ( ( FALSE == dgTrimmerHeaterOn ) && ( trimmerState != HEATER_EXEC_STATE_OFF ) ) + { + cmdStopDGTrimmerHeater(); + } } - else if ( ( FALSE == dgTrimmerHeaterOn ) && ( trimmerState != HEATER_EXEC_STATE_OFF ) ) - { - cmdStopDGTrimmerHeater(); - } } } Index: firmware/App/Controllers/DialInFlow.c =================================================================== diff -u -rf760ffc4b10556e5186e9ceb90294262063440ca -rd0f8958c30ff294da7e5088b89226f0ac30f3a36 --- firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision f760ffc4b10556e5186e9ceb90294262063440ca) +++ firmware/App/Controllers/DialInFlow.c (.../DialInFlow.c) (revision d0f8958c30ff294da7e5088b89226f0ac30f3a36) @@ -512,7 +512,7 @@ } else { // Alarm if not receiving new dialysate flow readings in timely manner - if ( TRUE == isDGCommunicating() ) + if ( ( TRUE == isDGCommunicating() ) && ( isACPowerLost() != TRUE ) ) { if ( ++dialysateFlowDataFreshStatusCounter > DIP_DIALYSATE_FLOW_DATA_ALARM_THRESHOLD ) { Index: firmware/App/Controllers/Fans.c =================================================================== diff -u -r4df8828df03ee996540084c57f9b46c0febc1e03 -rd0f8958c30ff294da7e5088b89226f0ac30f3a36 --- firmware/App/Controllers/Fans.c (.../Fans.c) (revision 4df8828df03ee996540084c57f9b46c0febc1e03) +++ firmware/App/Controllers/Fans.c (.../Fans.c) (revision d0f8958c30ff294da7e5088b89226f0ac30f3a36) @@ -18,6 +18,7 @@ #include // For fabs #include "etpwm.h" +#include "Battery.h" #include "Fans.h" #include "FPGA.h" #include "PersistentAlarm.h" @@ -412,11 +413,14 @@ F32 fansMinAllowedRPM = fansNominalRPM - ( fansNominalRPM * FANS_MIN_RPM_OUT_OF_RANGE_TOL ); F32 fansMaxAllowedRPM = fansNominalRPM + ( fansNominalRPM * FANS_MAX_RPM_OUT_OF_RANGE_TOL ); - // Loop through the fans and make sure the each of them have RPM in range - for ( fan = FAN_INLET_1; fan < NUM_OF_FANS_NAMES; fan++ ) + if ( isACPowerLost() != TRUE ) { - rpm = getMeasuredFanRPM( fan ); - isFanRPMOutOfRange |= ( ( rpm < fansMinAllowedRPM ) || ( rpm > fansMaxAllowedRPM ) ? TRUE : FALSE ); + // Loop through the fans and make sure the each of them have RPM in range + for ( fan = FAN_INLET_1; fan < NUM_OF_FANS_NAMES; fan++ ) + { + rpm = getMeasuredFanRPM( fan ); + isFanRPMOutOfRange |= ( ( rpm < fansMinAllowedRPM ) || ( rpm > fansMaxAllowedRPM ) ? TRUE : FALSE ); + } } // If the fans alarm has been raised already, do not raise again Index: firmware/App/Modes/SelfTests.c =================================================================== diff -u -re5d6674fbf4b6ddd8057385babac0a085ce18f42 -rd0f8958c30ff294da7e5088b89226f0ac30f3a36 --- firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision e5d6674fbf4b6ddd8057385babac0a085ce18f42) +++ firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision d0f8958c30ff294da7e5088b89226f0ac30f3a36) @@ -143,6 +143,7 @@ static DRY_SELF_TESTS_STATE_T handleDrySelfTestStartState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestWaitForDoorCloseState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestUsedCartridgeCheckState( void ); +static DRY_SELF_TESTS_STATE_T handleDrySelfTestCartridgeInstalledCheckState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsNormalSetupState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsVenousSetupState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsVenousState( void ); @@ -442,16 +443,7 @@ break; case DRY_SELF_TESTS_CARTRIDGE_LOADED_CHECK_STATE: - if ( SELF_TEST_STATUS_PASSED == execPresOcclDryTest() ) - { - setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); - setValvePosition( VDO, VALVE_POSITION_C_CLOSE ); - setValvePosition( VBA, VALVE_POSITION_C_CLOSE ); - setValvePosition( VBV, VALVE_POSITION_C_CLOSE ); - setValveAirTrap( STATE_OPEN ); - pressureSelfTestPreNormalStartTime = getMSTimerCount(); - currentDrySelfTestsState = DRY_SELF_TESTS_PRESSURE_SENSORS_NORMAL_SETUP_STATE; - } + currentDrySelfTestsState = handleDrySelfTestCartridgeInstalledCheckState(); break; case DRY_SELF_TESTS_PRESSURE_SENSORS_NORMAL_SETUP_STATE: @@ -1035,6 +1027,38 @@ /*********************************************************************//** * @brief + * The handleDrySelfTestCartridgeInstalledCheckState function verifies that + * a cartridge has been installed by looking at the OB reading. + * @details Inputs: none + * @details Outputs: none + * @return the next state of dry self-tests state machine + *************************************************************************/ +static DRY_SELF_TESTS_STATE_T handleDrySelfTestCartridgeInstalledCheckState( void ) +{ + DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_USED_CARTRIDGE_CHECK_STATE; + + if ( SELF_TEST_STATUS_PASSED == execPresOcclDryTest() ) + { + setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); + setValvePosition( VDO, VALVE_POSITION_C_CLOSE ); + setValvePosition( VBA, VALVE_POSITION_C_CLOSE ); + setValvePosition( VBV, VALVE_POSITION_C_CLOSE ); + setValveAirTrap( STATE_OPEN ); + pressureSelfTestPreNormalStartTime = getMSTimerCount(); + state = DRY_SELF_TESTS_PRESSURE_SENSORS_NORMAL_SETUP_STATE; + } + + if ( TRUE == doesAlarmStatusIndicateStop() ) + { + state = DRY_SELF_TESTS_STOPPED_STATE; + setupForSelfTestsStop(); + } + + return state; +} + +/*********************************************************************//** + * @brief * The handleDrySelfTestPressureSensorsSetupState function handles the setup * for pressure sensors dry self-test. * @details Inputs: pressureSelfTestPreNormalStartTime