Index: firmware/App/Controllers/DGInterface.c =================================================================== diff -u -raaee82db1f0d169e3a51ea8fdba7f57c16b0b986 -rba7a576375ad7bbfa0d5a879d82b8783e5182899 --- firmware/App/Controllers/DGInterface.c (.../DGInterface.c) (revision aaee82db1f0d169e3a51ea8fdba7f57c16b0b986) +++ firmware/App/Controllers/DGInterface.c (.../DGInterface.c) (revision ba7a576375ad7bbfa0d5a879d82b8783e5182899) @@ -384,6 +384,19 @@ return inactiveRes; } + +/*********************************************************************//** + * @brief + * The hasDGCompletedReservoirSwitch function checks if DG has completed a + * switch reservoir command. + * @details Inputs: dgActiveReservoir, dgActiveReservoirSet + * @details Outputs: none + * @return TRUE if reported active reservoir is the same as set id, otherwise FALSE + *************************************************************************/ +BOOL hasDGCompletedReservoirSwitch( void ) +{ + return ( dgActiveReservoir == dgActiveReservoirSet ); +} /*********************************************************************//** * @brief Index: firmware/App/Controllers/DGInterface.h =================================================================== diff -u -raaee82db1f0d169e3a51ea8fdba7f57c16b0b986 -rba7a576375ad7bbfa0d5a879d82b8783e5182899 --- firmware/App/Controllers/DGInterface.h (.../DGInterface.h) (revision aaee82db1f0d169e3a51ea8fdba7f57c16b0b986) +++ firmware/App/Controllers/DGInterface.h (.../DGInterface.h) (revision ba7a576375ad7bbfa0d5a879d82b8783e5182899) @@ -126,6 +126,7 @@ U32 getDGSubMode( void ); DG_RESERVOIR_ID_T getDGActiveReservoir( void ); DG_RESERVOIR_ID_T getDGInactiveReservoir( void ); +BOOL hasDGCompletedReservoirSwitch( void ); F32 getDGPressure( DG_PRESSURE_SENSORS_T sensorID ); U32 getDGROPumpPressureSetPt( void ); F32 getDGROPumpFlowRateMlMin( void ); Index: firmware/App/HDCommon.h =================================================================== diff -u -rac636de6bf42cc4145cbd14886b616da78b3aaf8 -rba7a576375ad7bbfa0d5a879d82b8783e5182899 --- firmware/App/HDCommon.h (.../HDCommon.h) (revision ac636de6bf42cc4145cbd14886b616da78b3aaf8) +++ firmware/App/HDCommon.h (.../HDCommon.h) (revision ba7a576375ad7bbfa0d5a879d82b8783e5182899) @@ -66,6 +66,7 @@ #define SKIP_DRY_SELF_TESTS 1 // Skip pre-treatment dry self-tests #define SKIP_UI_INTERACTION 1 // Skip UI interaction. // #define DISABLE_BATT_COMM 1 // Disable battery communication. + #define SKIP_AIR_BUBBLE_CHECK 1 // Skip air bubble detector self-test. #include #include Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -rb8d74fc5b07d0e62d841b4c5a786b2be4e593c63 -rba7a576375ad7bbfa0d5a879d82b8783e5182899 --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision b8d74fc5b07d0e62d841b4c5a786b2be4e593c63) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision ba7a576375ad7bbfa0d5a879d82b8783e5182899) @@ -52,15 +52,15 @@ /// States of the pre-treatment reservoir management state machine. typedef enum PreTreatmentReservoirMgmt_States { - PRE_TREATMENT_RESERVOIR_MGMT_START_STATE = 0, ///< Wait for signal to start drain and fill reservoirs. - PRE_TREATMENT_RESERVOIR_MGMT_SWITCH_RESERVOIR_CMD_STATE, ///< Command DG to switch active reservoir. - PRE_TREATMENT_RESERVOIR_MGMT_SWITCH_RESERVOIR_RESP_STATE, ///< Processing DG switch reservoir command response. - PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_STATE, ///< Command DG to start draining reservoir. - PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_RESP_STATE, ///< After sending drain command, process DG drain command response. - PRE_TREATMENT_RESERVOIR_MGMT_START_FILL_STATE, ///< Command DG to start filling reservoir. - PRE_TREATMENT_RESERVOIR_MGMT_FILL_CMD_RESP_STATE, ///< After sending fill command, process DG fill command response. - PRE_TREATMENT_RESERVOIR_MGMT_FILL_COMPLETE_STATE, ///< Reservoir fill has completed. - NUM_OF_PRE_TREATMENT_RESERVOIR_MGMT_STATES ///< Number of pre-treatments reservoir mgmt. states. + PRE_TREATMENT_RESERVOIR_MGMT_START_STATE = 0, ///< Wait for signal to start drain and fill reservoirs + PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_STATE, ///< Command DG to start draining reservoir + PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_RESP_STATE, ///< After sending drain command, process DG drain command response + PRE_TREATMENT_RESERVOIR_MGMT_START_FILL_STATE, ///< Command DG to start filling reservoir + PRE_TREATMENT_RESERVOIR_MGMT_FILL_CMD_RESP_STATE, ///< After sending fill command, process DG fill command response + PRE_TREATMENT_RESERVOIR_MGMT_FILL_COMPLETE_STATE, ///< Reservoir fill has completed + PRE_TREATMENT_RESERVOIR_MGMT_WAIT_FOR_RESERVOIR_SWITCH_STATE, ///< Wait for prime operation to switch reservoir + PRE_TREATMENT_RESERVOIR_MGMT_COMPLETE_STATE, ///< Pre-treatment reservoir management complete state + NUM_OF_PRE_TREATMENT_RESERVOIR_MGMT_STATES ///< Number of pre-treatments reservoir mgmt. states } PRE_TREATMENT_RESERVOIR_MGMT_STATE_T; // ********** private data ********** @@ -99,13 +99,12 @@ static void execPreTreatmentReservoirMgmt( void ); static PRE_TREATMENT_RESERVOIR_MGMT_STATE_T handlePreTreatmentReservoirMgmtStartState( void ); -static PRE_TREATMENT_RESERVOIR_MGMT_STATE_T handlePreTreatmentReservoirMgmtSwitchReservoirCmdState( void ); -static PRE_TREATMENT_RESERVOIR_MGMT_STATE_T handlePreTreatmentReservoirMgmtSwitchReservoirRespState( void ); static PRE_TREATMENT_RESERVOIR_MGMT_STATE_T handlePreTreatmentReservoirMgmtDrainCmdState( void ); static PRE_TREATMENT_RESERVOIR_MGMT_STATE_T handlePreTreatmentReservoirMgmtDrainCmdRespState( void ); static PRE_TREATMENT_RESERVOIR_MGMT_STATE_T handlePreTreatmentReservoirMgmtFillCmdState( void ); static PRE_TREATMENT_RESERVOIR_MGMT_STATE_T handlePreTreatmentReservoirMgmtFillCmdRespState( void ); static PRE_TREATMENT_RESERVOIR_MGMT_STATE_T handlePreTreatmentReservoirMgmtFillCompleteState( void ); +static PRE_TREATMENT_RESERVOIR_MGMT_STATE_T handlePreTreatmentReservoirMgmtWaitReservoirSwitchState( void ); /*********************************************************************//** * @brief @@ -762,14 +761,6 @@ currentReservoirMgmtState = handlePreTreatmentReservoirMgmtStartState(); break; - case PRE_TREATMENT_RESERVOIR_MGMT_SWITCH_RESERVOIR_CMD_STATE: - currentReservoirMgmtState = handlePreTreatmentReservoirMgmtSwitchReservoirCmdState(); - break; - - case PRE_TREATMENT_RESERVOIR_MGMT_SWITCH_RESERVOIR_RESP_STATE: - currentReservoirMgmtState = handlePreTreatmentReservoirMgmtSwitchReservoirRespState(); - break; - case PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_STATE: currentReservoirMgmtState = handlePreTreatmentReservoirMgmtDrainCmdState(); break; @@ -790,6 +781,13 @@ currentReservoirMgmtState = handlePreTreatmentReservoirMgmtFillCompleteState(); break; + case PRE_TREATMENT_RESERVOIR_MGMT_WAIT_FOR_RESERVOIR_SWITCH_STATE: + currentReservoirMgmtState = handlePreTreatmentReservoirMgmtWaitReservoirSwitchState(); + break; + + case PRE_TREATMENT_RESERVOIR_MGMT_COMPLETE_STATE: + break; + default: currentReservoirMgmtState = PRE_TREATMENT_RESERVOIR_MGMT_START_STATE; SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_PRIME_RESERVOIR_MGMT_INVALID_STATE, (U32)currentReservoirMgmtState ); @@ -812,59 +810,10 @@ if ( TRUE == fillReservoirOneStartRequested ) { fillReservoirOneStartRequested = FALSE; - state = PRE_TREATMENT_RESERVOIR_MGMT_SWITCH_RESERVOIR_CMD_STATE; - } - - return state; -} - -/*********************************************************************//** - * @brief - * The handlePreTreatmentReservoirMgmtSwitchReservoirRespState function sends - * switch reservoir command to DG. - * @details Inputs: reservoirFilledStatus[] - * @details Outputs: sent switch reservoir command to DG - * @return next state of pre-treatment reservoir management - *************************************************************************/ -static PRE_TREATMENT_RESERVOIR_MGMT_STATE_T handlePreTreatmentReservoirMgmtSwitchReservoirCmdState( void ) -{ - if ( FALSE == reservoirFilledStatus[ DG_RESERVOIR_1 ] ) - { + state = PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_STATE; cmdSetDGActiveReservoir( DG_RESERVOIR_2 ); } - else - { - cmdSetDGActiveReservoir( DG_RESERVOIR_1 ); - } - return PRE_TREATMENT_RESERVOIR_MGMT_SWITCH_RESERVOIR_RESP_STATE; -} - -/*********************************************************************//** - * @brief - * The handlePreTreatmentReservoirMgmtSwitchReservoirRespState function waits - * and processes DG switch reservoir command response. - * @details Inputs: DG switch reservoir command response - * @details Outputs: processed switch reservoir response - * @return next state of pre-treatment reservoir management - *************************************************************************/ -static PRE_TREATMENT_RESERVOIR_MGMT_STATE_T handlePreTreatmentReservoirMgmtSwitchReservoirRespState( void ) -{ - PRE_TREATMENT_RESERVOIR_MGMT_STATE_T state = PRE_TREATMENT_RESERVOIR_MGMT_SWITCH_RESERVOIR_RESP_STATE; - DG_CMD_RESPONSE_T dgCmdResp; - - if ( TRUE == getDGCommandResponse( DG_CMD_SWITCH_RESERVOIR, &dgCmdResp ) ) - { - if ( TRUE == dgCmdResp.rejected ) - { - state = PRE_TREATMENT_RESERVOIR_MGMT_SWITCH_RESERVOIR_CMD_STATE; - } - else - { - state = PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_STATE; - } - } - return state; } @@ -882,18 +831,20 @@ DG_OP_MODE_T dgOpMode = getDGOpMode(); U32 dgSubMode = getDGSubMode(); - if ( DG_MODE_CIRC == dgOpMode ) + // If DG has not started yet, start DG + if ( DG_MODE_STAN == dgOpMode ) { - if ( DG_RECIRCULATE_MODE_STATE_RECIRC_WATER == dgSubMode ) + cmdStartDG(); + } + + if ( TRUE == hasDGCompletedReservoirSwitch() ) + { + if ( ( DG_MODE_CIRC == dgOpMode ) && ( DG_RECIRCULATE_MODE_STATE_RECIRC_WATER == dgSubMode ) ) { state = PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_RESP_STATE; cmdStartDGDrain( DRAIN_RESERVOIR_TO_VOLUME_ML, TRUE ); } } - else if ( DG_MODE_STAN == dgOpMode ) - { - cmdStartDG(); - } return state; } @@ -998,21 +949,44 @@ { PRE_TREATMENT_RESERVOIR_MGMT_STATE_T state = PRE_TREATMENT_RESERVOIR_MGMT_FILL_COMPLETE_STATE; DG_OP_MODE_T dgOpMode = getDGOpMode(); + U32 dgSubMode = getDGSubMode(); - if ( DG_MODE_CIRC == dgOpMode ) + if ( ( DG_MODE_CIRC == dgOpMode ) && ( DG_RECIRCULATE_MODE_STATE_RECIRC_WATER == dgSubMode ) ) { if ( FALSE == reservoirFilledStatus[ DG_RESERVOIR_1 ] ) { - state = PRE_TREATMENT_RESERVOIR_MGMT_SWITCH_RESERVOIR_CMD_STATE; + state = PRE_TREATMENT_RESERVOIR_MGMT_WAIT_FOR_RESERVOIR_SWITCH_STATE; reservoirFilledStatus[ DG_RESERVOIR_1 ] = TRUE; } else if ( ( TRUE == reservoirFilledStatus[ DG_RESERVOIR_1 ] ) && ( FALSE == reservoirFilledStatus[ DG_RESERVOIR_2 ] ) ) { reservoirFilledStatus[ DG_RESERVOIR_2 ] = TRUE; + state = PRE_TREATMENT_RESERVOIR_MGMT_COMPLETE_STATE; } } return state; } + +/*********************************************************************//** + * @brief + * The handlePreTreatmentReservoirMgmtWaitReservoirSwitchState function waits + * until prime operation switches the active reservoir before filling up next reservoir. + * @details Inputs: DG intactive reservoir + * @details Outputs: start filling next reservoir + * @return current state of pre-treatment reservoir management + *************************************************************************/ +static PRE_TREATMENT_RESERVOIR_MGMT_STATE_T handlePreTreatmentReservoirMgmtWaitReservoirSwitchState( void ) +{ + PRE_TREATMENT_RESERVOIR_MGMT_STATE_T state = PRE_TREATMENT_RESERVOIR_MGMT_WAIT_FOR_RESERVOIR_SWITCH_STATE; + + if ( DG_RESERVOIR_2 == getDGInactiveReservoir() ) + { + state = PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_STATE; + } + + return state; +} + /**@}*/ Index: firmware/App/Modes/Prime.c =================================================================== diff -u -rb8d74fc5b07d0e62d841b4c5a786b2be4e593c63 -rba7a576375ad7bbfa0d5a879d82b8783e5182899 --- firmware/App/Modes/Prime.c (.../Prime.c) (revision b8d74fc5b07d0e62d841b4c5a786b2be4e593c63) +++ firmware/App/Modes/Prime.c (.../Prime.c) (revision ba7a576375ad7bbfa0d5a879d82b8783e5182899) @@ -479,24 +479,29 @@ if ( TRUE == getReservoirFillStatus( DG_RESERVOIR_1 ) ) { - setValvePosition( VDI, VALVE_POSITION_B_OPEN ); - setValvePosition( VDO, VALVE_POSITION_B_OPEN ); - setValvePosition( VBA, VALVE_POSITION_C_CLOSE ); - setValvePosition( VBV, VALVE_POSITION_C_CLOSE ); - setValveAirTrap( STATE_CLOSED ); + cmdSetDGActiveReservoir( DG_RESERVOIR_1 ); - setDialInPumpTargetFlowRate( DIALYSATE_PUMP_PRIME_FLOW_RATE, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); - setDialOutPumpTargetRate( DIALYSATE_PUMP_PRIME_FLOW_RATE, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + if ( TRUE == hasDGCompletedReservoirSwitch() ) + { + setValvePosition( VDI, VALVE_POSITION_B_OPEN ); + setValvePosition( VDO, VALVE_POSITION_B_OPEN ); + setValvePosition( VBA, VALVE_POSITION_C_CLOSE ); + setValvePosition( VBV, VALVE_POSITION_C_CLOSE ); + setValveAirTrap( STATE_CLOSED ); - previousLoadCellReading = 0; - loadcellSteadyVolumeStartTime = getMSTimerCount(); - primeDialysateDialyzerStartTime = getMSTimerCount(); + setDialInPumpTargetFlowRate( DIALYSATE_PUMP_PRIME_FLOW_RATE, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + setDialOutPumpTargetRate( DIALYSATE_PUMP_PRIME_FLOW_RATE, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); -#ifdef SKIP_PRIMING - state = HD_PRIME_WET_SELF_TESTS_STATE; -#else - state = HD_PRIME_DIALYSATE_DIALYZER_STATE; -#endif + previousLoadCellReading = 0; + loadcellSteadyVolumeStartTime = getMSTimerCount(); + primeDialysateDialyzerStartTime = getMSTimerCount(); + + #ifdef SKIP_PRIMING + state = HD_PRIME_WET_SELF_TESTS_STATE; + #else + state = HD_PRIME_DIALYSATE_DIALYZER_STATE; + #endif + } } if ( TRUE == doesAlarmStatusIndicateStop() ) @@ -564,19 +569,24 @@ if ( TRUE == getReservoirFillStatus( DG_RESERVOIR_2 ) ) { - signalDialOutPumpHardStop(); - setDialInPumpTargetFlowRate( DIALYSATE_PUMP_PRIME_FLOW_RATE, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); + cmdSetDGActiveReservoir( DG_RESERVOIR_2 ); - 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_CLOSED ); + if ( TRUE == hasDGCompletedReservoirSwitch() ) + { + signalDialOutPumpHardStop(); + setDialInPumpTargetFlowRate( DIALYSATE_PUMP_PRIME_FLOW_RATE, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); - previousLoadCellReading = 0; - primeDialysateBypassStartTime = getMSTimerCount(); - loadcellSteadyVolumeStartTime = getMSTimerCount(); - state = HD_PRIME_DIALYSATE_BYPASS_STATE; + 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_CLOSED ); + + previousLoadCellReading = 0; + primeDialysateBypassStartTime = getMSTimerCount(); + loadcellSteadyVolumeStartTime = getMSTimerCount(); + state = HD_PRIME_DIALYSATE_BYPASS_STATE; + } } if ( TRUE == doesAlarmStatusIndicateStop() ) Index: firmware/App/Modes/SelfTests.c =================================================================== diff -u -rb8d74fc5b07d0e62d841b4c5a786b2be4e593c63 -rba7a576375ad7bbfa0d5a879d82b8783e5182899 --- firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision b8d74fc5b07d0e62d841b4c5a786b2be4e593c63) +++ firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision ba7a576375ad7bbfa0d5a879d82b8783e5182899) @@ -51,7 +51,7 @@ #define NORMAL_PRESSURE_DIFF_TOLERANCE_MMHG 5.0 ///< Difference in pressure readings after return to normal state tolerance (in mmHg). -#define DIP_FLOW_RATE_SETUP_ML_MIN 100 ///< Dialysate inlet pump flow rate during the setup for wet self-test. +#define DIP_FLOW_RATE_SETUP_ML_MIN 150 ///< Dialysate inlet pump flow rate during the setup for wet self-test. #define DIP_FLOW_RATE_FIRST_DISPLACEMENT_ML_MIN 100 ///< Dialysate inlet pump flow rate during the first displacement in wet self-test. #define DIP_FLOW_RATE_SECOND_DISPLACEMENT_ML_MIN 600 ///< Dialysate inlet pump flow rate during the second displacement in wet self-test. @@ -61,9 +61,9 @@ #define WET_SELF_TEST_INTEGRATED_VOLUME_TOLERANCE 5.0 ///< Tolerance on integrated volume in percentage. #define WET_SELF_TEST_DISPLACEMENT_TOLERANCE_G 1.5 ///< Tolerance in the load cell readings of the displacement in grams. #define WET_SELF_TEST_DISPLACEMENT_TIME_MS ( SEC_PER_MIN * MS_PER_SECOND ) ///< Time to displace dialysate in wet self-test in ms. -#define RESERVOIR_SETTLE_TIME_MS ( 4 * SEC_PER_MIN * MS_PER_SECOND ) ///< Time allotted for reservoir to settle in ms. +#define RESERVOIR_SETTLE_TIME_MS ( 4 * MS_PER_SECOND ) ///< Time allotted for reservoir to settle in ms. -#define MAX_NO_CARTRIDGE_SELF_TEST_TIME SEC_PER_MIN ///< Maximum no cartridge self-test time (in seconds). +#define MAX_NO_CARTRIDGE_SELF_TEST_TIME 30 ///< Maximum no cartridge self-test time (in seconds). #define MAX_DRY_SELF_TEST_TIME ( 3 * SEC_PER_MIN ) ///< Maximum dry self-test time (in seconds). #define SELF_TEST_TIME_DATA_PUB_INTERVAL ( MS_PER_SECOND ) ///< Interval (ms/task time) at which self-test time data is published on the CAN bus. @@ -988,7 +988,11 @@ if ( TRUE == selfTestsResumeRequested ) { selfTestsResumeRequested = FALSE; +#ifndef SKIP_DRY_SELF_TESTS state = DRY_SELF_TESTS_WAIT_FOR_DOOR_CLOSE_STATE; +#else + state = DRY_SELF_TESTS_SYRINGE_PUMP_PRIME_STATE; +#endif } return state; @@ -1089,20 +1093,20 @@ static WET_SELF_TESTS_STATE_T handleWetSelfTestPrimeCheckState( SELF_TEST_STATUS_T *result ) { WET_SELF_TESTS_STATE_T state = WET_SELF_TESTS_PRIME_CHECK_STATE; + *result = SELF_TEST_STATUS_FAILED; // TODO: Use appropriate sensor driver BOOL const isADADetectedAir = getFPGAArterialAirBubbleStatus(); BOOL const isADVDetectedAir = getFPGAVenousAirBubbleStatus(); +#ifndef SKIP_AIR_BUBBLE_CHECK if ( ( FALSE == isADADetectedAir ) && ( FALSE == isADVDetectedAir ) ) +#endif { settleStartTime = getMSTimerCount(); - currentWetSelfTestsState = WET_SELF_TESTS_FIRST_DISPLACEMENT_SETUP_STATE; + state = WET_SELF_TESTS_FIRST_DISPLACEMENT_SETUP_STATE; + *result = SELF_TEST_STATUS_PASSED; } - else - { - *result = SELF_TEST_STATUS_FAILED; - } if ( TRUE == doesAlarmStatusIndicateStop() ) {