Index: firmware/App/Modes/ModePreTreat.c =================================================================== diff -u -r8466e63f95f65a3ffb18c3af85ac99328e41167b -rc137d3c7cb17b0364d745e10ff6dbd1901eb1baa --- firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision 8466e63f95f65a3ffb18c3af85ac99328e41167b) +++ firmware/App/Modes/ModePreTreat.c (.../ModePreTreat.c) (revision c137d3c7cb17b0364d745e10ff6dbd1901eb1baa) @@ -5,13 +5,13 @@ * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. * -* @file ModePreTreat.c +* @file ModePreTreat.c * -* @author (last) Sean Nash -* @date (last) 06-Oct-2020 +* @author (last) Quang Nguyen +* @date (last) 24-Aug-2021 * -* @author (original) Dara Navaei -* @date (original) 05-Nov-2019 +* @author (original) Dara Navaei +* @date (original) 05-Nov-2019 * ***************************************************************************/ @@ -45,9 +45,15 @@ #define DIP_PATIENT_CONNECTION_FLOW_RATE_ML_MIN 100 ///< Patient connection sub-mode dialysate inlet pump flow rate in mL/min. +#ifndef SKIP_PRIMING #define PRE_TREATMENT_FLUSH_RESERVOIR_VOLUME_ML 500 ///< Fill reservoir to this volume (in mL) to flush filter and lines. #define PRE_TREATMENT_FILL_RESERVOIR_ONE_VOLUME_ML 1300 ///< Fill reservoir one to this volume (in mL) during pre-treatment mode. #define PRE_TREATMENT_FILL_RESERVOIR_TWO_VOLUME_ML 700 ///< Fill reservoir two to this volume (in mL) during pre-treatment mode. +#else +#define PRE_TREATMENT_FLUSH_RESERVOIR_VOLUME_ML FILL_RESERVOIR_TO_VOLUME_ML +#define PRE_TREATMENT_FILL_RESERVOIR_ONE_VOLUME_ML FILL_RESERVOIR_TO_VOLUME_ML +#define PRE_TREATMENT_FILL_RESERVOIR_TWO_VOLUME_ML FILL_RESERVOIR_TO_VOLUME_ML +#endif #define PRIMARY_HEATER_TARGET_TEMP_OFFSET 2.0 ///< Primary heater target temperature offset from trimmer heater temperature. @@ -145,9 +151,9 @@ * pre-treatment mode. * @details Inputs: none * @details Outputs: none - * @return none + * @return initial state *************************************************************************/ -void transitionToPreTreatmentMode( void ) +U32 transitionToPreTreatmentMode( void ) { F32 const trimmerHeaterTemp = getTreatmentParameterF32( TREATMENT_PARAM_DIALYSATE_TEMPERATURE ); F32 const primaryHeaterTemp = trimmerHeaterTemp + PRIMARY_HEATER_TARGET_TEMP_OFFSET; @@ -160,6 +166,8 @@ setAlarmUserActionEnabled( ALARM_USER_ACTION_RESUME, TRUE ); setAlarmUserActionEnabled( ALARM_USER_ACTION_RINSEBACK, FALSE ); setAlarmUserActionEnabled( ALARM_USER_ACTION_END_TREATMENT, TRUE ); + + return currentPreTreatmentState; } /*********************************************************************//** @@ -247,7 +255,13 @@ *************************************************************************/ void signalUserConfirmInstallation( void ) { - if ( ( MODE_PRET == getCurrentOperationMode() ) && ( HD_PRE_TREATMENT_CART_INSTALL_STATE == currentPreTreatmentState ) ) + F32 bolusVol = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_BOLUS_VOLUME ); + F32 hepRate = getTreatmentParameterF32( TREATMENT_PARAM_HEPARIN_DISPENSE_RATE ); + + // Accept installation confirmation if we are in install state of pre-treatment mode and syringe is detected or Heparin not being used in this treatment. + if ( ( MODE_PRET == getCurrentOperationMode() ) && + ( HD_PRE_TREATMENT_CART_INSTALL_STATE == currentPreTreatmentState ) && + ( ( TRUE == isSyringeDetected() ) || ( ( bolusVol < NEARLY_ZERO ) && ( hepRate < NEARLY_ZERO ) ) ) ) { confirmInstallRequested = TRUE; } @@ -376,6 +390,10 @@ case ALARM_ACTION_END_TREATMENT: if ( HD_PRE_TREATMENT_PRIME_STATE > currentPreTreatmentState ) { + if ( HD_PRE_TREATMENT_WATER_SAMPLE_STATE == currentPreTreatmentState ) + { + cmdDGSampleWater( SAMPLE_WATER_CMD_END ); + } requestNewOperationMode( MODE_STAN ); } else @@ -432,7 +450,7 @@ preTreatmentData.recircState = getPreTreatmentRecircState(); preTreatmentData.patientConnectionState = 0; - broadcastPreTreatmentState( &preTreatmentData ); + broadcastData( MSG_ID_PRE_TREATMENT_STATE, COMM_BUFFER_OUT_CAN_HD_BROADCAST, (U08*)&preTreatmentData, sizeof( PRE_TREATMENT_STATE_DATA_T ) ); preTreatmentPublishTimerCounter = 0; } } @@ -662,7 +680,7 @@ { if ( submodeCompleteTransitionTimeCounter++ >= SUBMODE_COMPLETE_UI_TRANSITION_TIME_COUNT ) { - setOcclusionInstallLevels(); // Record occlusion pressure levels after a new cartridge is installed. + setOcclusionInstallLevel(); // Record occlusion pressure level after a new cartridge is installed. submodeCompleteTransitionTimeCounter = 0; state = HD_PRE_TREATMENT_PRIME_STATE; transitionToPrime(); @@ -763,7 +781,9 @@ if ( TRUE == treatmentStartRequested ) { DG_RESERVOIR_ID_T const activeRes = getDGActiveReservoir(); + setStartReservoirVolume( activeRes ); + resetHeparinVolumeDelivered(); // get clean starting volume/position before we start treatment requestNewOperationMode( MODE_TREA ); } @@ -865,10 +885,10 @@ if ( TRUE == hasDGCompletedReservoirSwitch() ) { - if ( ( DG_MODE_CIRC == dgOpMode ) && ( DG_RECIRCULATE_MODE_STATE_RECIRC_WATER == dgSubMode ) ) + if ( ( DG_MODE_GENE == dgOpMode ) && ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == dgSubMode ) ) { state = PRE_TREATMENT_RESERVOIR_MGMT_DRAIN_CMD_RESP_STATE; - cmdStartDGDrain( DRAIN_RESERVOIR_TO_VOLUME_ML, TRUE ); + cmdStartDGDrain( DRAIN_RESERVOIR_TO_VOLUME_ML, TRUE, FALSE, TRUE ); } } @@ -918,7 +938,7 @@ DG_OP_MODE_T dgOpMode = getDGOpMode(); U32 dgSubMode = getDGSubMode(); - if ( ( DG_MODE_CIRC == dgOpMode ) && ( DG_RECIRCULATE_MODE_STATE_RECIRC_WATER == dgSubMode ) ) + if ( ( DG_MODE_GENE == dgOpMode ) && ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == dgSubMode ) ) { state = PRE_TREATMENT_RESERVOIR_MGMT_FILL_CMD_RESP_STATE; @@ -985,7 +1005,7 @@ DG_OP_MODE_T dgOpMode = getDGOpMode(); U32 dgSubMode = getDGSubMode(); - if ( ( DG_MODE_CIRC == dgOpMode ) && ( DG_RECIRCULATE_MODE_STATE_RECIRC_WATER == dgSubMode ) ) + if ( ( DG_MODE_GENE == dgOpMode ) && ( DG_GEN_IDLE_MODE_STATE_FLUSH_WATER == dgSubMode ) ) { if ( ( TRUE == reservoirFlushedStatus[ DG_RESERVOIR_1 ] ) && ( TRUE == reservoirFlushedStatus[ DG_RESERVOIR_2 ] ) ) {