Index: firmware/App/Modes/Prime.c =================================================================== diff -u -r3d72b777cf1ceb673d118341c46e2d6d5b7b75f5 -r6c1d6a3eaf065c2b2d537d9fef793d73ea328359 --- firmware/App/Modes/Prime.c (.../Prime.c) (revision 3d72b777cf1ceb673d118341c46e2d6d5b7b75f5) +++ firmware/App/Modes/Prime.c (.../Prime.c) (revision 6c1d6a3eaf065c2b2d537d9fef793d73ea328359) @@ -7,8 +7,8 @@ * * @file Prime.c * -* @author (last) Hung Nguyen -* @date (last) 04-Jan-2022 +* @author (last) Dara Navaei +* @date (last) 22-Feb-2022 * * @author (original) Quang Nguyen * @date (original) 08-Dec-2020 @@ -61,62 +61,62 @@ /// States of the treatment reservoir management state machine. typedef enum PrimeReservoirMgmt_States { - PRIME_RESERVOIR_MGMT_START_STATE = 0, ///< If DG not already in re-circ mode, try to get it there. - PRIME_RESERVOIR_MGMT_FLUSH_DG_LINES_STATE, ///< In DG re-circ, wait for lines to flush - then start draining inactive reservoir. - PRIME_RESERVOIR_MGMT_WAIT_FOR_DRAIN_CMD_RESP, ///< After sending drain command, wait for DG to response back. - PRIME_RESERVOIR_MGMT_DRAIN_STATE, ///< Wait for drain to complete. - PRIME_RESERVOIR_MGMT_START_FILL_STATE, ///< Command DG to start filling reservoir. - PRIME_RESERVOIR_MGMT_WAIT_FOR_FILL_CMD_RESP, ///< After sending fill command, wait for DG to response back. - PRIME_RESERVOIR_MGMT_FILL_STATE, ///< Wait for fill to complete. - PRIME_RESERVOIR_MGMT_FILL_COMPLETE_STATE, ///< Reservoir fill has completed. - PRIME_RESERVOIR_MGMT_WAIT_RESERVOIR_TWO_INACTIVE, ///< Wait for reservoir 2 become inactive. - NUM_OF_PRIME_RESERVOIR_MGMT_STATES ///< Number of prime reservoir mgmt. states. + PRIME_RESERVOIR_MGMT_START_STATE = 0, ///< If DG not already in re-circ mode, try to get it there. + PRIME_RESERVOIR_MGMT_FLUSH_DG_LINES_STATE, ///< In DG re-circ, wait for lines to flush - then start draining inactive reservoir. + PRIME_RESERVOIR_MGMT_WAIT_FOR_DRAIN_CMD_RESP, ///< After sending drain command, wait for DG to response back. + PRIME_RESERVOIR_MGMT_DRAIN_STATE, ///< Wait for drain to complete. + PRIME_RESERVOIR_MGMT_START_FILL_STATE, ///< Command DG to start filling reservoir. + PRIME_RESERVOIR_MGMT_WAIT_FOR_FILL_CMD_RESP, ///< After sending fill command, wait for DG to response back. + PRIME_RESERVOIR_MGMT_FILL_STATE, ///< Wait for fill to complete. + PRIME_RESERVOIR_MGMT_FILL_COMPLETE_STATE, ///< Reservoir fill has completed. + PRIME_RESERVOIR_MGMT_WAIT_RESERVOIR_TWO_INACTIVE, ///< Wait for reservoir 2 become inactive. + NUM_OF_PRIME_RESERVOIR_MGMT_STATES ///< Number of prime reservoir mgmt. states. } PRIME_RESERVOIR_MGMT_STATE_T; typedef struct { - U32 bloodVolume; ///< Blood volume of the dialyzer in mL. - U32 dialysateVolume; ///< Dialysate volume of the dialyzer in mL. + U32 bloodVolume; ///< Blood volume of the dialyzer in mL. + U32 dialysateVolume; ///< Dialysate volume of the dialyzer in mL. } DIALYZER_VOLUME_DATA_T; // ********** private data ********** -static DIALYZER_VOLUME_DATA_T dialyzerVolumeTable[ ] = { { 82, 170 }, ///< Dialyzer volume table in mL of five types of dialyzer - { 100, 200 }, - { 120, 257 }, - { 87, 233 }, - { 102, 280 } }; +/// Dialyzer volumes (blood and dialysate) table in mL for each type of dialyzer. +static DIALYZER_VOLUME_DATA_T dialyzerVolumeTable[ ] = + { { 82, 170 }, // DIALYZER_TYPE_BBRAUN_PRO_13H + { 100, 200 }, // DIALYZER_TYPE_BBRAUN_PRO_16H + { 120, 257 }, // DIALYZER_TYPE_BBRAUN_PRO_19H + { 87, 233 }, // DIALYZER_TYPE_FRESENIUS_OPTIFLUX_F160NRE + { 102, 280 } }; // DIALYZER_TYPE_FRESENIUS_OPTIFLUX_F180NRE -static U32 primeDialysateDialyzerTimeLimit; ///< Time limit in msec for priming dialysate dialyzer path. -static U32 primeSalineDialyzerTimeLimit; ///< Time limit in msec for priming saline dialyzer path. +static U32 primeDialysateDialyzerTimeLimit; ///< Time limit in msec for priming dialysate dialyzer path. +static U32 primeSalineDialyzerTimeLimit; ///< Time limit in msec for priming saline dialyzer path. -static HD_PRE_TREATMENT_PRIME_STATE_T currentPrimeState; ///< Current state of the prime sub-mode state machine. -static HD_PRE_TREATMENT_PRIME_STATE_T previousPrimeState; ///< Previous state of the prime sub-mode, to use when resuming from pause. -static PRIME_RESERVOIR_MGMT_STATE_T currentReservoirMgmtState; ///< Current reservoir management state. +static HD_PRE_TREATMENT_PRIME_STATE_T currentPrimeState; ///< Current state of the prime sub-mode state machine. +static HD_PRE_TREATMENT_PRIME_STATE_T previousPrimeState; ///< Previous state of the prime sub-mode, to use when resuming from pause. +static PRIME_RESERVOIR_MGMT_STATE_T currentReservoirMgmtState; ///< Current reservoir management state. -static U32 primeStartTime; ///< Starting time of priming (in ms). -static U32 primePauseStartTime; ///< Priming pause start time (in ms). -static U32 primeStatusBroadcastTimerCounter; ///< Prime status data broadcast timer counter used to schedule when to transmit data. +static U32 primeStartTime; ///< Starting time of priming (in ms). +static U32 primePauseStartTime; ///< Priming pause start time (in ms). +static U32 primeStatusBroadcastTimerCounter; ///< Prime status data broadcast timer counter used to schedule when to transmit data. -static BOOL primeStartRequested; ///< Flag indicates user requesting to start prime. -static BOOL primeResumeRequested; ///< Flag indicates user requesting prime resume. +static BOOL primeStartRequested; ///< Flag indicates user requesting to start prime. +static BOOL primeResumeRequested; ///< Flag indicates user requesting prime resume. -static U32 noAirDetectedStartTime; ///< starting time when detecting no air. -static U32 purgeAirTimeOutStartTime; ///< Starting time for purge air state time out. -static U32 primeSalineDialyzerStartTime; ///< Starting time of priming saline dialyzer circuit. -static U32 primeDialysateDialyzerStartTime; ///< Starting time of priming dialysate dialyzer circuit. -static U32 primeDialysateBypassStartTime; ///< Starting time of priming dialysate bypass circuit. -static U32 steadyVolumeSamplingStartTime; ///< Load cell steady volume sampling interval starting time. -static F32 minimumReservoirVolume; ///< Minimum reservoir volume in mL. -static U32 steadyVolumeCount; ///< Use to keep track the number of dVolume/dt < Threshold +static U32 noAirDetectedStartTime; ///< starting time when detecting no air. +static U32 purgeAirTimeOutStartTime; ///< Starting time for purge air state time out. +static U32 primeSalineDialyzerStartTime; ///< Starting time of priming saline dialyzer circuit. +static U32 primeDialysateDialyzerStartTime; ///< Starting time of priming dialysate dialyzer circuit. +static U32 primeDialysateBypassStartTime; ///< Starting time of priming dialysate bypass circuit. +static U32 steadyVolumeSamplingStartTime; ///< Load cell steady volume sampling interval starting time. +static F32 minimumReservoirVolume; ///< Minimum reservoir volume in mL. +static U32 steadyVolumeCount; ///< Use to keep track the number of dVolume/dt < Threshold // ********** private function prototypes ********** static void resetPrimeFlags(); static void setupForPrimePause( void ); static void broadcastPrimingStatus( void ); static void purgeAirValvesBloodPumpControl( void ); -static F32 getDialyzerBloodVolume( void ); -static F32 getDialyzerDialysateVolume( void ); static HD_PRE_TREATMENT_PRIME_STATE_T handlePrimeWaitForUserStartState( void ); static HD_PRE_TREATMENT_PRIME_STATE_T handlePrimeSalineDialyzerSetupState( void ); @@ -181,11 +181,14 @@ switch ( currentPrimeState ) { case HD_PRIME_START_STATE: -#ifdef SKIP_PRIMING - currentPrimeState = HD_PRIME_RESERVOIR_ONE_FILL_COMPLETE_STATE; -#else - currentPrimeState = HD_PRIME_WAIT_FOR_USER_START_STATE; -#endif + if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_PRIMING ) ) + { + currentPrimeState = HD_PRIME_RESERVOIR_ONE_FILL_COMPLETE_STATE; + } + else + { + currentPrimeState = HD_PRIME_WAIT_FOR_USER_START_STATE; + } break; case HD_PRIME_WAIT_FOR_USER_START_STATE: @@ -269,9 +272,9 @@ * the selected dialyzer. * @details Inputs: dialyzer volume table * @details Outputs: none - * @return blood volume capacity of the dialyzer in mL + * @return blood volume capacity of the selected dialyzer type in mL *************************************************************************/ -F32 getDialyzerBloodVolume( void ) +U32 getDialyzerBloodVolume( void ) { U32 dialyzerType = getTreatmentParameterU32( TREATMENT_PARAM_DIALYZER_TYPE ); @@ -284,9 +287,9 @@ * of the selected dialyzer. * @details Inputs: dialyzer volume table * @details Outputs: none - * @return dialysate volume capacity of the dialyzer in mL + * @return dialysate volume capacity of the selected dialyzer type in mL *************************************************************************/ -F32 getDialyzerDialysateVolume( void ) +U32 getDialyzerDialysateVolume( void ) { U32 dialyzerType = getTreatmentParameterU32( TREATMENT_PARAM_DIALYZER_TYPE ); @@ -423,9 +426,11 @@ // Keep updating start time until the user requested priming primeStartTime = getMSTimerCount(); -#ifdef SKIP_UI_INTERACTION - primeStartRequested = TRUE; -#endif + if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_UI_INTERACTION ) ) + { + primeStartRequested = TRUE; + } + if ( TRUE == primeStartRequested ) { primeStartRequested = FALSE; @@ -576,11 +581,14 @@ steadyVolumeSamplingStartTime = getMSTimerCount(); primeDialysateDialyzerStartTime = getMSTimerCount(); - #ifdef SKIP_PRIMING - state = HD_PRIME_WET_SELF_TESTS_STATE; - #else - state = HD_PRIME_DIALYSATE_DIALYZER_STATE; - #endif + if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_PRIMING ) ) + { + state = HD_PRIME_WET_SELF_TESTS_STATE; + } + else + { + state = HD_PRIME_DIALYSATE_DIALYZER_STATE; + } } } @@ -824,11 +832,12 @@ signalResumeSelfTests(); } -#ifndef SKIP_WET_SELF_TESTS - execWetSelfTests(); + if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_WET_SELF_TEST ) != SW_CONFIG_ENABLE_VALUE ) + { + execWetSelfTests(); + } - if ( TRUE == isWetSelfTestsPassed() ) -#endif + if ( ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_WET_SELF_TEST ) ) || ( TRUE == isWetSelfTestsPassed() ) ) { state = HD_PRIME_COMPLETE; }