Index: firmware/App/Modes/Prime.c =================================================================== diff -u -r173e5908bada098006b85c1267147a187d2eaef4 -r7de21ac8b699cafdfeaefbf2c062c3e21bcc956d --- firmware/App/Modes/Prime.c (.../Prime.c) (revision 173e5908bada098006b85c1267147a187d2eaef4) +++ firmware/App/Modes/Prime.c (.../Prime.c) (revision 7de21ac8b699cafdfeaefbf2c062c3e21bcc956d) @@ -7,8 +7,8 @@ * * @file Prime.c * -* @author (last) Dara Navaei -* @date (last) 17-Oct-2022 +* @author (last) Michael Garthwaite +* @date (last) 21-Oct-2022 * * @author (original) Quang Nguyen * @date (original) 08-Dec-2020 @@ -36,7 +36,7 @@ // ********** private definitions ********** -#define MAX_PRIME_TIME ( 15 * SEC_PER_MIN ) ///< Maximum prime time (in seconds). +#define MAX_PRIME_TIME ( 30 * SEC_PER_MIN ) ///< Maximum prime time (in seconds). #define PRIME_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the prime data is published on the CAN bus. #define BLOOD_PUMP_FAST_FLOW_RATE_PURGE_AIR_ML_MIN 300 ///< Blood pump fast flow rate to fill fluid. @@ -416,7 +416,7 @@ * @brief * The purgeAirValvesBloodPumpControl function controls valves and blood pump * to purge air. - * @details Inputs: none + * @details Inputs: primeFirstPurgePass * @details Outputs: run blood pump, close VDI, VDO, VBA and VBV valves, open VBT valve * @return current state (sub-mode) *************************************************************************/ @@ -500,8 +500,9 @@ * @brief * The handlePrimePurgeAirState function checks for air trap level and moves * to blood circuit circulation state if fluid is detected at upper sensor. - * @details Inputs: air trap levels - * @details Outputs: runs blood pump, control valves to trap air + * @details Inputs: air trap levels, primeFirstPurgePass, purgeAirTimeOutStartTime + * @details Outputs: runs blood pump, control valves to trap air, primeFirstPurgePass + * noAirDetectedStartTime * @return current state *************************************************************************/ static HD_PRE_TREATMENT_PRIME_STATE_T handlePrimePurgeAirState( void ) @@ -513,18 +514,6 @@ SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_PRIME_SALINE_PURGE_AIR_TIME_OUT, PURGE_AIR_TIME_OUT_COUNT ); } - if ( AIR_TRAP_LEVEL_FLUID == getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_LOWER ) ) - { - if ( FALSE == primeFirstPurgePass ) - { - setBloodPumpTargetFlowRate( BLOOD_PUMP_FAST_FLOW_RATE_PURGE_AIR_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); - } - else - { - setBloodPumpTargetFlowRate( BLOOD_PUMP_SLOW_FLOW_RATE_PURGE_AIR_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); - } - } - if ( AIR_TRAP_LEVEL_FLUID == getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_UPPER ) ) { setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); @@ -533,15 +522,11 @@ setValvePosition( VBV, VALVE_POSITION_B_OPEN ); setValveAirTrap( STATE_CLOSED ); + setBloodPumpTargetFlowRate( BLOOD_PUMP_FAST_FLOW_RATE_CIRC_BLOOD_CIRCUIT_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); - if ( FALSE == primeFirstPurgePass ) - { - setBloodPumpTargetFlowRate( BLOOD_PUMP_FAST_FLOW_RATE_CIRC_BLOOD_CIRCUIT_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); - } - else - { - setBloodPumpTargetFlowRate( BLOOD_PUMP_SLOW_FLOW_RATE_CIRC_BLOOD_CIRCUIT_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); - } + // Once the dialyzer is no longer dry from the first pass of purge air, we can set flow to the fast rate + // until we are in a new priming state. + primeFirstPurgePass = FALSE; noAirDetectedStartTime = getMSTimerCount(); state = HD_PRIME_SALINE_CIRC_BLOOD_CIRCUIT_STATE; } @@ -572,12 +557,7 @@ { purgeAirValvesBloodPumpControl(); purgeAirTimeOutStartTime = getMSTimerCount(); - if ( TRUE == primeFirstPurgePass ) - { - primeFirstPurgePass = FALSE; - } state = HD_PRIME_SALINE_PURGE_AIR_STATE; - } if ( TRUE == didTimeout( noAirDetectedStartTime, NO_AIR_DETECTED_COUNT ) ) @@ -609,8 +589,13 @@ if ( TRUE == getReservoirFillStatus( DG_RESERVOIR_1 ) ) { - cmdSetDGActiveReservoir( DG_RESERVOIR_1 ); + DG_SWITCH_RSRVRS_CMD_T rsrvrCmd; + rsrvrCmd.reservoirID = (U32)DG_RESERVOIR_1; + rsrvrCmd.useLastTrimmerHeaterDC = FALSE; + + cmdSetDGActiveReservoir( &rsrvrCmd ); + if ( TRUE == hasDGCompletedReservoirSwitch() ) { U32 dialyzerDialysateVolume = getDialyzerDialysateVolume(); @@ -761,7 +746,7 @@ { state = HD_PRIME_RESERVOIR_TWO_FILL_COMPLETE_STATE; } - + // TODO: Rework alarm and timeout logic here. PRIME_SALINE_DIALYZER_TIME_OUT_COUNT may not be reached. if ( TRUE == didTimeout( primeSalineDialyzerStartTime, PRIME_SALINE_DIALYZER_TIME_OUT_COUNT ) ) { SET_ALARM_WITH_1_U32_DATA( ALARM_ID_PRIME_SALINE_DIALYZER_TIME_OUT, PRIME_SALINE_DIALYZER_TIME_OUT_COUNT ); // Trigger HD prime saline dialyzer time out alarm. @@ -790,8 +775,13 @@ if ( TRUE == getReservoirFillStatus( DG_RESERVOIR_2 ) ) { - cmdSetDGActiveReservoir( DG_RESERVOIR_2 ); + DG_SWITCH_RSRVRS_CMD_T rsrvrCmd; + rsrvrCmd.reservoirID = (U32)DG_RESERVOIR_1; + rsrvrCmd.useLastTrimmerHeaterDC = FALSE; + + cmdSetDGActiveReservoir( &rsrvrCmd ); + if ( TRUE == hasDGCompletedReservoirSwitch() ) { signalBloodPumpHardStop();