Index: firmware/App/Modes/Prime.c =================================================================== diff -u -r90d3a2eb18cc8282c0c68a23e39677327448781a -rb1f086e7cd292d5a97a7265075400274d60d4fbf --- firmware/App/Modes/Prime.c (.../Prime.c) (revision 90d3a2eb18cc8282c0c68a23e39677327448781a) +++ firmware/App/Modes/Prime.c (.../Prime.c) (revision b1f086e7cd292d5a97a7265075400274d60d4fbf) @@ -1,14 +1,14 @@ /************************************************************************** * -* Copyright (c) 2019-2022 Diality Inc. - All Rights Reserved. +* Copyright (c) 2020-2022 Diality Inc. - All Rights Reserved. * * 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 Prime.c * -* @author (last) Hung Nguyen -* @date (last) 04-Jan-2022 +* @author (last) Michael Garthwaite +* @date (last) 21-Apr-2022 * * @author (original) Quang Nguyen * @date (original) 08-Dec-2020 @@ -36,23 +36,23 @@ // ********** private definitions ********** -#define MAX_PRIME_TIME ( 10 * SEC_PER_MIN ) ///< Maximum prime time (in seconds). +#define MAX_PRIME_TIME ( 15 * 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. +#define BLOOD_PUMP_FAST_FLOW_RATE_PURGE_AIR_ML_MIN 150 ///< Blood pump fast flow rate to fill fluid. #define BLOOD_PUMP_SLOW_FLOW_RATE_PURGE_AIR_ML_MIN 150 ///< Blood pump slow flow rate after fluid reach lower level of air trap sensor. #define BLOOD_PUMP_SALINE_FLOW_RATE_PURGE_AIR_ML_MIN 200 ///< Blood pump very slow flow rate during prime saline dialyzer state -#define BLOOD_PUMP_FLOW_RATE_CIRC_BLOOD_CIRCUIT_ML_MIN 300 ///< Blood pump flow rate during prime recirculate blood circuit state. +#define BLOOD_PUMP_FLOW_RATE_CIRC_BLOOD_CIRCUIT_ML_MIN 150 ///< Blood pump flow rate during prime recirculate blood circuit state. #define BLOOD_PUMP_FLOW_RATE_SALINE_DIALYZER_ML_MIN 300 ///< Blood pump flow rate during prime the saline dialyzer dialysate state. #define DIALYSATE_PUMP_PRIME_FLOW_RATE_ML_MIN 300 ///< Dialysate pump flow rate during priming fluid path. #define DIALYSATE_DIALYZER_TUBE_VOLUME_ML 115 ///< This total tube volume is used to calculate the Dpi & Dpo time out in the dialysate dialyzer state. #define DIALYSATE_DIALYZER_BYPASS_TUBE_VOLUME_ML 75 ///< This volume is used to calculate the DPi pump time out in the dialyzer bypass state. #define DIALYZER_DVI_PATH_VOLUME_ML 17 ///< Path volume from the dialyzer to the VDI valve in mL. -#define DIALYZER_VOLUME_SCALE_FACTOR 0.5 ///< Half of the dialyzer total volume. +#define DIALYZER_VOLUME_SCALE_FACTOR 0.5F ///< Half of the dialyzer total volume. #define NO_AIR_DETECTED_COUNT ( 20 * MS_PER_SECOND ) ///< No air detected time period count. -#define PURGE_AIR_TIME_OUT_COUNT ( 60 * MS_PER_SECOND ) ///< Time period count for purge air time out. +#define PURGE_AIR_TIME_OUT_COUNT ( 120 * MS_PER_SECOND ) ///< Time period count for purge air time out. #define LOAD_CELL_STEADY_VOLUME_SAMPLING_TIME ( 1 * MS_PER_SECOND ) ///< Time load cell reading steady state detection sampling time in seconds. #define PRIME_DIALYSATE_BYPASS_TIME_LIMIT ( 15 * MS_PER_SECOND ) ///< Time limit for priming dialysate bypass circuit. #define STEADY_VOLUME_COUNT_SEC ( 10000 / LOAD_CELL_STEADY_VOLUME_SAMPLING_TIME ) ///< Counter must be greater than 10 seconds before steady volume is true. @@ -141,7 +141,13 @@ *************************************************************************/ void initPrime( void ) { - transitionToPrime(); + currentPrimeState = HD_PRIME_START_STATE; + currentReservoirMgmtState = PRIME_RESERVOIR_MGMT_START_STATE; + + primeStartTime = 0; + primePauseStartTime = 0; + primeStatusBroadcastTimerCounter = 0; + } /*********************************************************************//** @@ -154,17 +160,27 @@ *************************************************************************/ void transitionToPrime( void ) { - currentPrimeState = HD_PRIME_START_STATE; - currentReservoirMgmtState = PRIME_RESERVOIR_MGMT_START_STATE; - primeStartTime = getMSTimerCount(); - primePauseStartTime = 0; - primeStatusBroadcastTimerCounter = 0; setAlarmUserActionEnabled( ALARM_USER_ACTION_RESUME, TRUE ); setAlarmUserActionEnabled( ALARM_USER_ACTION_RINSEBACK, FALSE ); setAlarmUserActionEnabled( ALARM_USER_ACTION_END_TREATMENT, TRUE ); + doorClosedRequired( TRUE, TRUE ); + + // Pumps should be off + signalBloodPumpHardStop(); + signalDialInPumpHardStop(); + signalDialOutPumpHardStop(); + stopSyringePump(); + + // Set valves to default positions + setValveAirTrap( STATE_CLOSED ); + setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); + setValvePosition( VDO, VALVE_POSITION_C_CLOSE ); + setValvePosition( VBA, VALVE_POSITION_C_CLOSE ); + setValvePosition( VBV, VALVE_POSITION_C_CLOSE ); + resetPrimeFlags(); } @@ -181,11 +197,16 @@ 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; +#ifndef _RELEASE_ + if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_PRIMING ) ) + { + currentPrimeState = HD_PRIME_RESERVOIR_ONE_FILL_COMPLETE_STATE; + } + else #endif + { + currentPrimeState = HD_PRIME_WAIT_FOR_USER_START_STATE; + } break; case HD_PRIME_WAIT_FOR_USER_START_STATE: @@ -423,12 +444,13 @@ // Keep updating start time until the user requested priming primeStartTime = getMSTimerCount(); -#ifdef SKIP_UI_INTERACTION - //if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_UI_INTERACTION ) != SW_CONFIG_ENABLE_VALUE ) +#ifndef _RELEASE_ + if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_UI_INTERACTION ) ) { primeStartRequested = TRUE; } #endif + if ( TRUE == primeStartRequested ) { primeStartRequested = FALSE; @@ -574,16 +596,23 @@ // Calculate the time out value that must passed prior to checking for the steady state volume in the reservoir primeDialysateDialyzerTimeLimit = (U32)( ( ( DIALYSATE_DIALYZER_TUBE_VOLUME_ML + dialyzerDialysateVolume ) * SEC_PER_MIN * MS_PER_SECOND ) / DIALYSATE_PUMP_PRIME_FLOW_RATE_ML_MIN ); - minimumReservoirVolume = getLoadCellWeight( LOAD_CELL_RESERVOIR_2_PRIMARY ); + minimumReservoirVolume = getLoadCellWeight( LOAD_CELL_RESERVOIR_1_PRIMARY ); steadyVolumeCount = 0; steadyVolumeSamplingStartTime = getMSTimerCount(); primeDialysateDialyzerStartTime = getMSTimerCount(); - #ifdef SKIP_PRIMING - state = HD_PRIME_WET_SELF_TESTS_STATE; - #else - state = HD_PRIME_DIALYSATE_DIALYZER_STATE; - #endif +#ifndef _RELEASE_ + if ( SW_CONFIG_ENABLE_VALUE == getSoftwareConfigStatus( SW_CONFIG_DISABLE_PRIMING ) ) + { + signalDialOutPumpHardStop(); + signalDialInPumpHardStop(); + state = HD_PRIME_WET_SELF_TESTS_STATE; + } + else +#endif + { + state = HD_PRIME_DIALYSATE_DIALYZER_STATE; + } } } @@ -827,11 +856,9 @@ signalResumeSelfTests(); } -#ifndef SKIP_WET_SELF_TESTS execWetSelfTests(); if ( TRUE == isWetSelfTestsPassed() ) -#endif { state = HD_PRIME_COMPLETE; }