Index: firmware/App/Controllers/BloodLeak.c =================================================================== diff -u -r57f9f2d3b4c109c952034003c77a315bb3c41717 -r07a39ac5f935a84b2dbb93e3f3d3b3eaa8f37cc4 --- firmware/App/Controllers/BloodLeak.c (.../BloodLeak.c) (revision 57f9f2d3b4c109c952034003c77a315bb3c41717) +++ firmware/App/Controllers/BloodLeak.c (.../BloodLeak.c) (revision 07a39ac5f935a84b2dbb93e3f3d3b3eaa8f37cc4) @@ -103,6 +103,7 @@ BLOOD_LEAK_INIT_STATE, ///< Init state. BLOOD_LEAK_CHECK_ZERO_AND_SELF_TEST_STATE, ///< Blood leak check for zero and self test commands state. BLOOD_LEAK_NORMAL_STATE, ///< Normal state. + BLOOD_LEAK_RECOVER_BLOOD_DETECT_STATE, ///< Blood leak recover blood detect state. NUM_OF_BLOOD_LEAK_STATES ///< Number of blood leak detector states. } BLOOD_LEAK_STATE_T; @@ -188,6 +189,7 @@ static BLOOD_LEAK_STATE_T handleBloodLeakInitState( void ); static BLOOD_LEAK_STATE_T handleBloodLeakCheckZeroAndSelfTestState( void ); static BLOOD_LEAK_STATE_T handleBloodLeakNormalState( void ); +static BLOOD_LEAK_STATE_T handleBloodLeakRecoverBloodDetectState( void ); static BLOOD_LEAK_EMB_MODE_STATE_T handleBloodLeakEmbModeWaitForCommandState( void ); static BLOOD_LEAK_EMB_MODE_STATE_T handleBloodLeakEmbModeSendCommandState( void ); @@ -664,16 +666,6 @@ // If the blood leak status bit is low (0) it means blood has not been detected, otherwise, blood has been detected bloodLeakStatus.data = ( BLOOD_LEAK_STATUS_BIT_LOW == getFPGABloodLeakStatus() ? BLOOD_LEAK_NOT_DETECTED : BLOOD_LEAK_DETECTED ); -#ifdef DIALYZER_REPRIME_ENABLED -// exempt blood leak alarm while performing a dialyzer de-prime as air will be pushed past sensor and appear to be blood -if ( ( TREATMENT_DIALYSIS_STATE == getTreatmentState() ) && ( DIALYSIS_DIALYZER_REPRIME_STATE == getDialysisState() ) ) -{ - bloodLeakPersistenceCtr = 0; -} -else -{ -#endif - if ( STATE_OPEN == getSwitchStatus( PUMP_TRACK_SWITCH ) ) { // If the pump track on open, zero the persistent counter to not check the blood leak alarm @@ -713,10 +705,6 @@ } } -#ifdef DIALYZER_REPRIME_ENABLED -} -#endif - if ( TRUE == bloodLeakExitNormalRequested ) { bloodLeakExitNormalRequested = FALSE; @@ -732,6 +720,11 @@ return state; } +static BLOOD_LEAK_STATE_T handleBloodLeakRecoverBloodDetectState( void ) +{ + +} + /*********************************************************************//** * @brief * The getBloodLeakStatus function gets the current reading for the blood Index: firmware/App/HDCommon.h =================================================================== diff -u -r3aecacd0542d668592ff080e062afef39547380b -r07a39ac5f935a84b2dbb93e3f3d3b3eaa8f37cc4 --- firmware/App/HDCommon.h (.../HDCommon.h) (revision 3aecacd0542d668592ff080e062afef39547380b) +++ firmware/App/HDCommon.h (.../HDCommon.h) (revision 07a39ac5f935a84b2dbb93e3f3d3b3eaa8f37cc4) @@ -35,7 +35,6 @@ // #define BOARD_WITH_NO_HARDWARE 1 // Target is a PCB w/ no hardware // #define SIMULATE_UI 1 // Build w/o requirement that UI be there // #define TASK_TIMING_OUTPUT_ENABLED 1 // Re-purposes alarm lamp pins for task timing -// #define DIALYZER_REPRIME_ENABLED 1 // Build with dialyzer reprime code #include #include Index: firmware/App/Modes/Dialysis.c =================================================================== diff -u -rd608769332d4ffe19f39a18caca14d6155f13e0a -r07a39ac5f935a84b2dbb93e3f3d3b3eaa8f37cc4 --- firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision d608769332d4ffe19f39a18caca14d6155f13e0a) +++ firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision 07a39ac5f935a84b2dbb93e3f3d3b3eaa8f37cc4) @@ -51,20 +51,6 @@ #define MAX_ACTIVE_LOAD_CELL_CHANGE_G 50.0F ///< Maximum delta between new and previous measured UF volume. -#ifdef DIALYZER_REPRIME_ENABLED -// Dialyzer reprime constants -static const U32 DIALYZER_REPRIME_INTERVAL = ((30 * SEC_PER_MIN * MS_PER_SECOND) / TASK_GENERAL_INTERVAL); -/// Dialyzer reprime interval count. Time between reprime attempts. -#define DIALYZER_REPRIME_REPRIME_DURATION_MS ( 21 * MS_PER_SECOND ) ///< Duration of dialyzer reprime reprime state. -#define DIALYZER_REPRIME_PURGE_PRIOR_1_DURATION_MS ( 10 * MS_PER_SECOND ) ///< Duration of dialyzer reprime purge prior 1 state. -#define DIALYZER_REPRIME_PURGE_PRIOR_2_DURATION_MS ( 6 * MS_PER_SECOND ) ///< Duration of dialyzer reprime purge prior 2 state. -#define DIALYZER_REPRIME_PURGE_LINES_DURATION_MS ( 10 * MS_PER_SECOND ) ///< Duration of dialyzer reprime purge prior 2 state. -#define DIALYZER_REPRIME_BEFORE_TREATEMENT_END_INTERVAL_SEC 300 ///< Time before end of treatment to perform final dialyzer reprime, sec. -#define DP_FAST_PURGE_FLOW_RATE_ML_MIN 500.0F ///< Dialysate pump speed for purging air in dialyzer reprime states, ml/min. -#define DPI_REPRIME_PWM_DC -0.23F ///< Inlet dialysate pump PWM duty cycle (-520 RPM = appx -100 mL/min). -#define DPO_REPRIME_PWM_DC -0.225F ///< Outlet dialysate pump PWM duty cycle (-500 RPM = appx -104 mL/min). -#endif - /// Defined states for the Load Cell cycles. typedef enum Reservoir_Steady_Cycle { @@ -78,10 +64,6 @@ static DIALYSIS_STATE_T currentDialysisState; ///< Current state of the dialysis sub-mode state machine. static UF_STATE_T currentUFState; ///< Current state of the ultrafiltration state machine. static SALINE_BOLUS_STATE_T currentSalineBolusState; ///< Current state of the saline bolus state machine. -#ifdef DIALYZER_REPRIME_ENABLED -static DIALYZER_REPRIME_STATE_T currentDialyzerReprimeState; ///< Current state of the dialyzer reprime state machine. -#endif - static F32 refUFVolume; ///< Current reference volume for ultrafiltration (Where should we be w/r/t ultrafiltration). static F32 measUFVolume; ///< Current total measured volume for ultrafiltration (Where are we w/r/t ultrafiltration). static F32 resStartVolume[ NUM_OF_DG_RESERVOIRS ]; ///< Reservoir start volume for ultrafiltration (i.e. where did we start with each reservoir). @@ -109,20 +91,10 @@ static F32 bolusSalineVolumeDelivered_mL; ///< Volume (mL) of current bolus delivered so far (calculated from measured blood flow rate). static U32 bolusSalineLastVolumeTimeStamp; ///< Time stamp for last saline volume update. -#ifdef DIALYZER_REPRIME_ENABLED -static U32 dialyzerReprimeIntervalTimerCtr; ///< Timer counter to determine when the dialyzer reprime should be done. -static BOOL dialyzerReprimeInProgress; ///< Flag indicates whether the dialyzer reprime has been interrupted. -static BOOL dialyzerReprimeFinalReprimeFinished; ///< Flag indicates whether the final dialyzer reprime has completed. -static U32 dialyzerReprimeStateTimer; ///< General state timer for tracking duration of dialyzer reprime states. -#endif - // ********** private function prototypes ********** static DIALYSIS_STATE_T handleDialysisUltrafiltrationState( void ); static DIALYSIS_STATE_T handleDialysisSalineBolusState( void ); -#ifdef DIALYZER_REPRIME_ENABLED -static DIALYSIS_STATE_T handleDialysisDialyzerReprimeState( void ); -#endif static UF_STATE_T handleUFPausedState( DIALYSIS_STATE_T *dialysisState ); static UF_STATE_T handleUFRunningState( DIALYSIS_STATE_T *dialysisState ); @@ -132,15 +104,6 @@ static SALINE_BOLUS_STATE_T handleSalineBolusInProgressState( DIALYSIS_STATE_T *dialysisState ); static SALINE_BOLUS_STATE_T handleSalineBolusMaxDeliveredState( DIALYSIS_STATE_T *dialysisState ); -#ifdef DIALYZER_REPRIME_ENABLED -static DIALYZER_REPRIME_STATE_T handleDialyzerReprimeDialysatePumpsOffState( void ); -static DIALYZER_REPRIME_STATE_T handleDialyzerReprimePurgePrior1State( void ); -static DIALYZER_REPRIME_STATE_T handleDialyzerReprimePurgePrior2State( void ); -static DIALYZER_REPRIME_STATE_T handleDialyzerReprimeRePrimeState( void ); -static DIALYZER_REPRIME_STATE_T handleDialyzerReprimePurgeLinesState( DIALYSIS_STATE_T *dialysisState ); -static void initDialyzerReprime( void ); -#endif - static void checkUFControl( void ); static void updateUFVolumes( void ); @@ -185,12 +148,6 @@ totalSalineVolumeDelivered_mL = 0.0; autoResumeUF = FALSE; -#ifdef DIALYZER_REPRIME_ENABLED - dialyzerReprimeIntervalTimerCtr = 0; - dialyzerReprimeInProgress = FALSE; - dialyzerReprimeFinalReprimeFinished = FALSE; -#endif - for ( i = 0; i < NUM_OF_LOAD_CELLS; i++ ) { lcLastSteadyWeight[RESERVOIR_STEADY_CYCLE_START][i] = LOAD_CELL_ILLEGAL_WEIGHT_VALUE; @@ -435,12 +392,6 @@ { rejReason = REQUEST_REJECT_REASON_SALINE_BOLUS_IN_PROGRESS; } -#ifdef DIALYZER_REPRIME_ENABLED - else if ( DIALYSIS_DIALYZER_REPRIME_STATE == currentDialysisState ) - { - rejReason = REQUEST_REJECT_REASON_DIALYZER_REPRIME_IN_PROGRESS; - } -#endif else { accept = TRUE; @@ -529,22 +480,8 @@ return currentSalineBolusState; } -#ifdef DIALYZER_REPRIME_ENABLED /*********************************************************************//** * @brief - * The getDialyzerRePrimeState function gets the current dialyzer re-prime state. - * @details Inputs: currentDialyzerReprimeState - * @details Outputs: none - * @return currentDialyzerReprimeState - *************************************************************************/ -DIALYZER_REPRIME_STATE_T getDialyzerRePrimeState( void ) -{ - return currentDialyzerReprimeState; -} -#endif - -/*********************************************************************//** - * @brief * The getUltrafiltrationVolumeCollected function gets the current ultrafiltration * volume collected so far for current treatment. * @details Inputs: measUFVolume @@ -708,11 +645,7 @@ case DIALYSIS_SALINE_BOLUS_STATE: currentDialysisState = handleDialysisSalineBolusState(); break; -#ifdef DIALYZER_REPRIME_ENABLED - case DIALYSIS_DIALYZER_REPRIME_STATE: - currentDialysisState = handleDialysisDialyzerReprimeState(); - break; -#endif + default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_DIALYSIS_INVALID_STATE, currentDialysisState ) break; @@ -752,27 +685,6 @@ setHeparinCompleted(); } -#ifdef DIALYZER_REPRIME_ENABLED - // Check whether it is time for dialyzer reprime - // Either a fixed interval or some interval before treatment end. - if ( ( ++dialyzerReprimeIntervalTimerCtr >= DIALYZER_REPRIME_INTERVAL) || - ( ( FALSE == dialyzerReprimeFinalReprimeFinished ) && - ( getTreatmentTimeRemainingSecs() <= DIALYZER_REPRIME_BEFORE_TREATEMENT_END_INTERVAL_SEC ) - ) - ) - { - initDialyzerReprime(); - if ( UF_RUNNING_STATE == currentUFState ) - { - autoResumeUF = TRUE; - } - currentUFState = UF_PAUSED_STATE; - result = DIALYSIS_DIALYZER_REPRIME_STATE; - } - else - { -#endif - // Handle current ultrafiltration state switch ( currentUFState ) { @@ -790,10 +702,6 @@ break; } -#ifdef DIALYZER_REPRIME_ENABLED - } -#endif - if ( priorSubState != currentUFState ) { setCurrent4thLevelState( (U32)currentUFState ); @@ -851,59 +759,8 @@ return result; } -#ifdef DIALYZER_REPRIME_ENABLED /*********************************************************************//** * @brief - * The handleDialysisDialyzerReprimeState function handles the dialyzer reprime - * state of the Dialysis state machine. - * @details Inputs: prior currentDialyzerReprimeState - * @details Outputs: new currentDialyzerReprimeState - * @return next Dialysis state. - *************************************************************************/ -static DIALYSIS_STATE_T handleDialysisDialyzerReprimeState( void ) -{ - DIALYSIS_STATE_T result = DIALYSIS_DIALYZER_REPRIME_STATE; - DIALYZER_REPRIME_STATE_T priorSubState = currentDialyzerReprimeState; - - switch ( currentDialyzerReprimeState ) - { - case DIALYZER_REPRIME_STATE_DIALYSATE_PUMPS_OFF: - currentDialyzerReprimeState = handleDialyzerReprimeDialysatePumpsOffState(); - break; - - case DIALYZER_REPRIME_STATE_PURGE_PRIOR_1: - currentDialyzerReprimeState = handleDialyzerReprimePurgePrior1State(); - break; - - case DIALYZER_REPRIME_STATE_PURGE_PRIOR_2: - currentDialyzerReprimeState = handleDialyzerReprimePurgePrior2State(); - break; - - case DIALYZER_REPRIME_STATE_REPRIME: - currentDialyzerReprimeState = handleDialyzerReprimeRePrimeState(); - break; - - case DIALYZER_REPRIME_STATE_PURGE_LINES: - currentDialyzerReprimeState = handleDialyzerReprimePurgeLinesState( &result ); - break; - - default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_DIALYSIS_INVALID_DIALYZER_REPRIME_STATE, currentDialyzerReprimeState ) - currentDialyzerReprimeState = DIALYZER_REPRIME_STATE_DIALYSATE_PUMPS_OFF; - break; - } - - if ( priorSubState != currentDialyzerReprimeState ) - { - SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_SUB_STATE_CHANGE, priorSubState, currentDialyzerReprimeState ); - } - - return result; -} -#endif - -/*********************************************************************//** - * @brief * The handleUFPausedState function handles the Paused state of the * ultrafiltration state machine. * @details Inputs: salineBolusStartRequested @@ -1158,185 +1015,8 @@ return result; } -#ifdef DIALYZER_REPRIME_ENABLED /*********************************************************************//** * @brief - * The initDialyzerReprimeState function performs the steps to initiate - * the dialyzer reprime task. - * @details Inputs: - * @details Outputs: currentDialyzerReprimeState - * @return none. - *************************************************************************/ -static void initDialyzerReprime( void ) -{ - // Give commands to stop pumps - setDialInPumpTargetFlowRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); - setDialOutPumpTargetRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); - currentDialyzerReprimeState = DIALYZER_REPRIME_STATE_DIALYSATE_PUMPS_OFF; -} - -/*********************************************************************//** - * @brief - * The handleDialysatePumpsOffState function handles the dialysate pumps off state of the - * dialyzer reprime state machine. - * @details Inputs: isDialInPumpRunning(), isDialOutPumpRunning(), dialyzerReprimeInProgress flag - * @details Outputs: next dialyzer reprime state, dialyzerReprimeInProgress flag - * @return next dialyzer reprime state - *************************************************************************/ -static DIALYZER_REPRIME_STATE_T handleDialyzerReprimeDialysatePumpsOffState( void ) -{ - DIALYZER_REPRIME_STATE_T result = DIALYZER_REPRIME_STATE_DIALYSATE_PUMPS_OFF; - - if ( ( FALSE == isDialInPumpRunning() ) && ( FALSE == isDialOutPumpRunning() ) ) - { - // Decide which state to transition to - if ( TRUE == dialyzerReprimeInProgress ) - { // the reprime was interrupted, so it is necessary to purge any air that may have been left in the lines - setDialInPumpTargetFlowRate( DP_FAST_PURGE_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); - setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); - setValvePosition( VDO, VALVE_POSITION_C_CLOSE ); - result = DIALYZER_REPRIME_STATE_PURGE_PRIOR_1; - } - else - { - // Set valves to flow through dialyzer - setValvePosition( VDI, VALVE_POSITION_B_OPEN ); - setValvePosition( VDO, VALVE_POSITION_B_OPEN ); - testSetDialInPumpTargetDutyCycle( DPI_REPRIME_PWM_DC ); - testSetDialOutPumpTargetDutyCycle( DPO_REPRIME_PWM_DC ); - dialyzerReprimeInProgress = TRUE; - result = DIALYZER_REPRIME_STATE_REPRIME; - } - dialyzerReprimeStateTimer = getMSTimerCount(); - } - - return result; -} - -/*********************************************************************//** - * @brief - * The handleState function handles the purge prior 1 state of the dialyzer reprime - * state machine. - * @details Inputs: dialyzerReprimeStateTimer - * @details Outputs: dialyzerReprimeStateTimer, next dialyzer reprime state - * @return next dialyzer reprime state - *************************************************************************/ -static DIALYZER_REPRIME_STATE_T handleDialyzerReprimePurgePrior1State( void ) -{ - DIALYZER_REPRIME_STATE_T result = DIALYZER_REPRIME_STATE_PURGE_PRIOR_1; - - if ( ( TRUE == didTimeout( dialyzerReprimeStateTimer, DIALYZER_REPRIME_PURGE_PRIOR_1_DURATION_MS ) ) ) - { - // Stop the dialysate in pump before opening valves - signalDialInPumpHardStop(); - setValvePosition( VDI, VALVE_POSITION_B_OPEN ); - setValvePosition( VDO, VALVE_POSITION_B_OPEN ); - // Start the two dialysate pumps together. - setDialInPumpTargetFlowRate( DP_FAST_PURGE_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); - setDialOutPumpTargetRate( DP_FAST_PURGE_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); - dialyzerReprimeStateTimer = getMSTimerCount(); - result = DIALYZER_REPRIME_STATE_PURGE_PRIOR_2; - } - - return result; -} - -/*********************************************************************//** - * @brief - * The handlePurgePrior2State function handles the purge prior 2 state of the dialyzer reprime - * state machine. - * @details Inputs: dialyzerReprimeStateTimer - * @details Outputs: next dialyzer reprime state - * @return next dialyzer reprime state - *************************************************************************/ -static DIALYZER_REPRIME_STATE_T handleDialyzerReprimePurgePrior2State( void ) -{ - DIALYZER_REPRIME_STATE_T result = DIALYZER_REPRIME_STATE_PURGE_PRIOR_2; - - if ( ( TRUE == didTimeout( dialyzerReprimeStateTimer, DIALYZER_REPRIME_PURGE_PRIOR_2_DURATION_MS ) ) ) - { - // ramp down the pumps to zero before turning them on in reverse - setDialInPumpTargetFlowRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); - setDialOutPumpTargetRate( 0, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); - dialyzerReprimeInProgress = FALSE; // This will cause a transition to reprime state after pumps stop - result = DIALYZER_REPRIME_STATE_DIALYSATE_PUMPS_OFF; - } - - return result; -} - -/*********************************************************************//** - * @brief - * The handleState function handles the reprime state of the dialyzer reprime - * state machine. - * @details Inputs: dialyzerReprimeStateTimer - * @details Outputs: dialyzerReprimeStateTimer, next dialyzer reprime state - * @return next dialyzer reprime state - *************************************************************************/ -static DIALYZER_REPRIME_STATE_T handleDialyzerReprimeRePrimeState( void ) -{ - DIALYZER_REPRIME_STATE_T result = DIALYZER_REPRIME_STATE_REPRIME; - - if ( ( TRUE == didTimeout( dialyzerReprimeStateTimer, DIALYZER_REPRIME_REPRIME_DURATION_MS ) ) ) - { - signalDialInPumpHardStop(); - signalDialOutPumpHardStop(); - setDialInPumpTargetFlowRate( DP_FAST_PURGE_FLOW_RATE_ML_MIN, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_OPEN_LOOP ); - setValvePosition( VDI, VALVE_POSITION_C_CLOSE ); - setValvePosition( VDO, VALVE_POSITION_C_CLOSE ); - dialyzerReprimeStateTimer = getMSTimerCount(); - result = DIALYZER_REPRIME_STATE_PURGE_LINES; - } - - return result; -} - -/*********************************************************************//** - * @brief - * The handleState function handles the purge lines state of the dialyzer reprime - * state machine. - * @details Inputs: dialyzerReprimeStateTimer - * @details Outputs: dialyzerReprimeStateTimer, dialyzerReprimeInProgress, - * dialyzerReprimeIntervalTimerCtr, next dialyzer reprime state - * @param dialysis Dialysis state - * @return next dialyzer reprime state - *************************************************************************/ -static DIALYZER_REPRIME_STATE_T handleDialyzerReprimePurgeLinesState( DIALYSIS_STATE_T *dialysisState ) -{ - DIALYZER_REPRIME_STATE_T result = DIALYZER_REPRIME_STATE_PURGE_LINES; - - if ( ( TRUE == didTimeout( dialyzerReprimeStateTimer, DIALYZER_REPRIME_PURGE_LINES_DURATION_MS ) ) ) - { - signalDialInPumpHardStop(); - signalDialOutPumpHardStop(); - // Delay 1 more second before resuming treatment - if ( TRUE == didTimeout( dialyzerReprimeStateTimer, DIALYZER_REPRIME_PURGE_LINES_DURATION_MS + MS_PER_SECOND ) ) - { - setValvePosition( VDI, VALVE_POSITION_B_OPEN ); - setValvePosition( VDO, VALVE_POSITION_B_OPEN ); - // Reset the timer for reprime interval and the reprime in progress flag. - dialyzerReprimeIntervalTimerCtr = 0; - dialyzerReprimeInProgress = FALSE; - if ( getTreatmentTimeRemainingSecs() <= DIALYZER_REPRIME_BEFORE_TREATEMENT_END_INTERVAL_SEC) - { - dialyzerReprimeFinalReprimeFinished = TRUE; - } - // Dialysis back to UF state - *dialysisState = DIALYSIS_UF_STATE; - // This handles resuming UF if it was paused by re-prime - resetSalineBolus(); - // Resume dialysis - transitionToDialysis(); - result = DIALYZER_REPRIME_STATE_DIALYSATE_PUMPS_OFF; - } - } - - return result; -} -#endif - -/*********************************************************************//** - * @brief * The publishSalineBolusData function handles the max saline delivered * state of the saline bolus state machine. This is a terminal state. * @details Inputs: none Index: firmware/App/Modes/Dialysis.h =================================================================== diff -u -r14d740bbb065f043daaa348bcda5f447e1c16a32 -r07a39ac5f935a84b2dbb93e3f3d3b3eaa8f37cc4 --- firmware/App/Modes/Dialysis.h (.../Dialysis.h) (revision 14d740bbb065f043daaa348bcda5f447e1c16a32) +++ firmware/App/Modes/Dialysis.h (.../Dialysis.h) (revision 07a39ac5f935a84b2dbb93e3f3d3b3eaa8f37cc4) @@ -65,9 +65,6 @@ DIALYSIS_STATE_T getDialysisState( void ); UF_STATE_T getUltrafiltrationState( void ); SALINE_BOLUS_STATE_T getSalineBolusState( void ); -#ifdef DIALYZER_REPRIME_ENABLED -DIALYZER_REPRIME_STATE_T getDialyzerRePrimeState( void ); -#endif F32 getUltrafiltrationVolumeCollected( void ); F32 getUltrafiltrationReferenceVolume( void ); Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -rca238a4fc2400ffaf3c2a90c6e923a87b8dac4d2 -r07a39ac5f935a84b2dbb93e3f3d3b3eaa8f37cc4 --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision ca238a4fc2400ffaf3c2a90c6e923a87b8dac4d2) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 07a39ac5f935a84b2dbb93e3f3d3b3eaa8f37cc4) @@ -767,14 +767,7 @@ // Update treatment time (unless delivering a saline bolus) if ( dialysisState != DIALYSIS_SALINE_BOLUS_STATE ) { -#ifdef DIALYZER_REPRIME_ENABLED - if ( dialysisState != DIALYSIS_DIALYZER_REPRIME_STATE ) - { -#endif treatmentTimeMS += msSinceLast; -#ifdef DIALYZER_REPRIME_ENABLED - } -#endif } lastTreatmentTimeStamp = newTime; @@ -1460,11 +1453,6 @@ payload.txEndState = getCurrentTreatmentEndState(); payload.heparinState = getHeparinState(); payload.dialysisState = getDialysisState(); -#ifdef DIALYZER_REPRIME_ENABLED - payload.dlzReprimeState = getDialyzerRePrimeState(); -#else - payload.dlzReprimeState = 0; -#endif broadcastData( MSG_ID_TREATMENT_STATE_DATA, COMM_BUFFER_OUT_CAN_HD_BROADCAST, (U08*)&payload, sizeof( TREATMENT_STATE_DATA_T ) ); treatmentStateBroadcastTimerCtr = 0; Index: firmware/App/Modes/ModeTreatment.h =================================================================== diff -u -ra7821aff3dc204a060233b0753253ec04d020557 -r07a39ac5f935a84b2dbb93e3f3d3b3eaa8f37cc4 --- firmware/App/Modes/ModeTreatment.h (.../ModeTreatment.h) (revision a7821aff3dc204a060233b0753253ec04d020557) +++ firmware/App/Modes/ModeTreatment.h (.../ModeTreatment.h) (revision 07a39ac5f935a84b2dbb93e3f3d3b3eaa8f37cc4) @@ -54,7 +54,6 @@ U32 txEndState; U32 txStopState; U32 dialysisState; - U32 dlzReprimeState; } TREATMENT_STATE_DATA_T; /// Payload record structure for an ultrafiltration volume change confirmation message. Index: firmware/App/Modes/TreatmentStop.c =================================================================== diff -u -rd608769332d4ffe19f39a18caca14d6155f13e0a -r07a39ac5f935a84b2dbb93e3f3d3b3eaa8f37cc4 --- firmware/App/Modes/TreatmentStop.c (.../TreatmentStop.c) (revision d608769332d4ffe19f39a18caca14d6155f13e0a) +++ firmware/App/Modes/TreatmentStop.c (.../TreatmentStop.c) (revision 07a39ac5f935a84b2dbb93e3f3d3b3eaa8f37cc4) @@ -36,7 +36,8 @@ // ********** private definitions ********** /// Treatment stop status broadcast interval. -#define TREATMENT_STOP_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) +#define TREATMENT_STOP_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) +#define DIALYSATE_FLOW_RATE_FOR_BLOOD_DETECT_RECOVERY_MLPM 600 ///< Dialysate flow rate for blood detect recovery in mL/min. // ********** private data ********** @@ -55,6 +56,8 @@ static TREATMENT_STOP_STATE_T handleTreatmentStopAlarmsAndSignals( TREATMENT_STOP_STATE_T state ); static TREATMENT_STOP_STATE_T handleTreatmentStopDialysateRecircState( void ); static TREATMENT_STOP_STATE_T handleTreatmentStopBloodRecircState( void ); +static TREATMENT_STOP_STATE_T handleTreatmentRecoverBloodDetectState( void ); +static void setupForRecoverBloodDetectState( void ); static void handleTreatmentStopBloodSittingTimer( void ); static void publishTreatmentStopData( void ); @@ -252,6 +255,10 @@ currentTxStopState = handleTreatmentStopNoRecircState(); break; + case TREATMENT_STOP_RECOVER_BLOOD_DETECT_STATE: + currentTxStopState = handleTreatmentRecoverBloodDetectState(); + break; + default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_TREATMENT_STOP_INVALID_STATE, currentTxStopState ); break; @@ -276,9 +283,11 @@ *************************************************************************/ static TREATMENT_STOP_STATE_T handleTreatmentStopAlarmsAndSignals( TREATMENT_STOP_STATE_T state ) { + // TODO Sorry Sean, I had to! TREATMENT_STOP_STATE_T result = state; - BOOL bloodRecircBlocked = isBloodRecircBlocked(); - BOOL dialysateRecircBlocked = isDialysateRecircBlocked(); + BOOL bloodRecircBlocked = isBloodRecircBlocked(); + BOOL dialysateRecircBlocked = isDialysateRecircBlocked(); + BOOL isBloodDetectAlarmActive = FALSE; // Both unblocked and not in recirculate both state if ( ( TREATMENT_STOP_RECIRC_STATE != state ) && ( FALSE == dialysateRecircBlocked ) && ( FALSE == bloodRecircBlocked ) ) @@ -314,6 +323,13 @@ result = TREATMENT_STOP_RECIRC_DIALYSATE_ONLY_STATE; } + if ( ( TREATMENT_STOP_RECOVER_BLOOD_DETECT_STATE != state ) && ( dialysateRecircBlocked != TRUE ) && + ( TRUE == isAlarmActive( ALARM_ID_HD_BLOOD_LEAK_RECOVERING_PLEASE_WAIT ) ) ) + { + setupForRecoverBloodDetectState(); + result = TREATMENT_STOP_RECOVER_BLOOD_DETECT_STATE; + } + return result; } @@ -391,6 +407,23 @@ return result; } +static TREATMENT_STOP_STATE_T handleTreatmentRecoverBloodDetectState( void ) +{ + TREATMENT_STOP_STATE_T result = TREATMENT_STOP_RECOVER_BLOOD_DETECT_STATE; + + result = handleTreatmentStopAlarmsAndSignals( result ); + + return result; +} + +static void setupForRecoverBloodDetectState( void ) +{ + doorClosedRequired( TRUE, TRUE ); + // Close dialyzer inlet and go to bypass mode + setValvePosition( VDI, VALVE_POSITION_B_OPEN ); + setDialInPumpTargetFlowRate( DIALYSATE_FLOW_RATE_FOR_BLOOD_DETECT_RECOVERY_MLPM, MOTOR_DIR_FORWARD, PUMP_CONTROL_MODE_CLOSED_LOOP ); +} + /*********************************************************************//** * @brief * The handleTreatmentStopBloodSittingTimer function handles the no re-circ Index: firmware/App/Services/Reservoirs.c =================================================================== diff -u -rc68065fe2cfcfee46eae9d8a8af68b42b662661c -r07a39ac5f935a84b2dbb93e3f3d3b3eaa8f37cc4 --- firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision c68065fe2cfcfee46eae9d8a8af68b42b662661c) +++ firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision 07a39ac5f935a84b2dbb93e3f3d3b3eaa8f37cc4) @@ -192,17 +192,10 @@ // Calculate volume used from active reservoir - do not accumulate if not performing dialysis or saline bolus is in progress if ( ( TREATMENT_DIALYSIS_STATE == getTreatmentState() ) && ( getDialysisState() != DIALYSIS_SALINE_BOLUS_STATE ) ) { -#ifdef DIALYZER_REPRIME_ENABLED - if ( getDialysisState() != DIALYSIS_DIALYZER_REPRIME_STATE ) - { -#endif - volSpentML += ( flowRateMLPerMS * msSinceLastVolumeCalc ); - timeReservoirInUse++; - // Check the recirculation level - recirculationLevelPct = volSpentML / (F32)FILL_RESERVOIR_TO_VOLUME_ML; -#ifdef DIALYZER_REPRIME_ENABLED - } -#endif + volSpentML += ( flowRateMLPerMS * msSinceLastVolumeCalc ); + timeReservoirInUse++; + // Check the recirculation level + recirculationLevelPct = volSpentML / (F32)FILL_RESERVOIR_TO_VOLUME_ML; } // Update the reservoir start time