Index: firmware/App/Controllers/SyringePump.c =================================================================== diff -u -r4ddf1777acc4298a9ed034e56b66916256d22c18 -r1d4d52365189e2cc83b97d28761bc2d4f0128859 --- firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision 4ddf1777acc4298a9ed034e56b66916256d22c18) +++ firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision 1d4d52365189e2cc83b97d28761bc2d4f0128859) @@ -7,8 +7,8 @@ * * @file SyringePump.c * -* @author (last) Michael Garthwaite -* @date (last) 09-Feb-2023 +* @author (last) Sean Nash +* @date (last) 07-Mar-2023 * * @author (original) Sean Nash * @date (original) 04-Mar-2021 @@ -92,8 +92,8 @@ #define MIN_SYRINGE_PUMP_RATE_FOR_DIR_ALARM 0.5F ///< Minimum measured rate (in mL/hr) required before enforcing direction alarm. /// Expected position of empty in relation to home position. -#define SYRINGE_PUMP_EMPTY_POS ( SYRINGE_ENCODER_COUNTS_PER_ML * 10.84F ) -/// Margin of error for empty position determination. +#define SYRINGE_PUMP_EMPTY_POS ( SYRINGE_ENCODER_COUNTS_PER_ML * 11.0F ) +/// Over-travel (past empty) allowance for alarm. #define SYRINGE_PUMP_EMPTY_POS_MARGIN ( SYRINGE_ENCODER_COUNTS_PER_ML * 0.5F ) /// Minimum retract position. #define SYRINGE_PUMP_RETRACT_POS_MIN ( SYRINGE_ENCODER_COUNTS_PER_ML * -0.5F ) @@ -1410,6 +1410,7 @@ syringePumpPlungerFound = FALSE; syringeVolumeAdequate = FALSE; syringePumpPrimeCompleted = FALSE; + syringePumpPreLoadCompleted = FALSE; syringePumpVolumeRequired = 0.0F; // Clear insufficient volume alarm condition in case we're retracting to allow user to resolve alarm clearAlarmCondition( ALARM_ID_HD_SYRINGE_PUMP_NOT_ENOUGH_HEPARIN_ALARM ); @@ -1421,8 +1422,10 @@ SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SYRINGE_PUMP_OVER_TRAVEL_ERROR, (U32)getSyringePumpPosition(), (U32)SYRINGE_PUMP_RETRACT_STATE ); } + // Check for stall stopPump = checkForStall( stopPump ); + // Check direction stopPump = checkDirection( stopPump, MOTOR_DIR_REVERSE ); // If anything found that would require stopping the pump, stop pump and go to off state @@ -1460,17 +1463,8 @@ syringePumpVolumeRequired = txVolumeReq; txVolumeReq = txVolumeReq + SYRINGE_PUMP_PRELOAD_MARGIN_VOLUME_ML; - // Is syringe loaded? - if ( TRUE == isSyringeDetected() ) - { - activateAlarmNoData( ALARM_ID_HD_SYRINGE_DETECTED ); - stopPump = TRUE; - } - else - { - // Handle ramp up - rampSyringePump(); - } + // Handle ramp up + rampSyringePump(); // Is plunger Heparin volume position detected? or volume requiring full syringe. if ( ( syringeVol <= txVolumeReq ) || ( SYRINGE_PUMP_PRELOAD_MAX_VOLUME_ML < txVolumeReq ) ) @@ -1482,6 +1476,9 @@ syringePumpPreLoadCompleted = TRUE; } + // Check for stall + stopPump = checkForStall( stopPump ); + // Check max position > empty + 0.5 mL stopPump = checkMaxTravel( stopPump, SYRINGE_PUMP_EMPTY_POS + SYRINGE_PUMP_EMPTY_POS_MARGIN ); @@ -1547,6 +1544,9 @@ } } + // Check for stall + stopPump = checkForStall( stopPump ); + // Has syringe been removed? stopPump = checkSyringeRemoved( stopPump ); @@ -1815,7 +1815,7 @@ S32 pos = getSyringePumpPosition(); // If near empty position, assume syringe is empty - if ( fabs( pos - SYRINGE_PUMP_EMPTY_POS ) < SYRINGE_PUMP_EMPTY_POS_MARGIN ) + if ( pos >= SYRINGE_PUMP_EMPTY_POS ) { heparinDeliveryState = HEPARIN_STATE_EMPTY; SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_SYRINGE_PUMP_SYRINGE_EMPTY, (F32)pos, force ) @@ -1888,20 +1888,11 @@ BOOL result = stopPump; S32 pos = getSyringePumpPosition(); - if ( pos > ( SYRINGE_PUMP_EMPTY_POS - SYRINGE_PUMP_EMPTY_POS_MARGIN ) ) + if ( pos >= maxPos ) { result = TRUE; - heparinDeliveryState = HEPARIN_STATE_EMPTY; - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_SYRINGE_PUMP_SYRINGE_EMPTY, (F32)pos, getSyringePumpForceV() ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SYRINGE_PUMP_OVER_TRAVEL_ERROR, (U32)pos, (U32)syringePumpState ); } - else if ( pos > maxPos ) - { - result = TRUE; - if ( syringePumpState != SYRINGE_PUMP_PRIME_STATE ) - { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SYRINGE_PUMP_OVER_TRAVEL_ERROR, (U32)pos, (U32)syringePumpState ); - } - } return result; } Index: firmware/App/Modes/ModePostTreat.c =================================================================== diff -u -r4ddf1777acc4298a9ed034e56b66916256d22c18 -r1d4d52365189e2cc83b97d28761bc2d4f0128859 --- firmware/App/Modes/ModePostTreat.c (.../ModePostTreat.c) (revision 4ddf1777acc4298a9ed034e56b66916256d22c18) +++ firmware/App/Modes/ModePostTreat.c (.../ModePostTreat.c) (revision 1d4d52365189e2cc83b97d28761bc2d4f0128859) @@ -8,7 +8,7 @@ * @file ModePostTreat.c * * @author (last) Sean Nash -* @date (last) 02-Feb-2023 +* @date (last) 23-Feb-2023 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019 @@ -537,6 +537,7 @@ break; case DRAIN_RESERVOIR_COMPLETE_STATE: + // Nothing to be done in this state (terminal state). break; default: Index: firmware/App/Modes/SelfTests.c =================================================================== diff -u -rdf63092fbdea0bd7c06a5ff18cc12c4eb72e4cbb -r1d4d52365189e2cc83b97d28761bc2d4f0128859 --- firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision df63092fbdea0bd7c06a5ff18cc12c4eb72e4cbb) +++ firmware/App/Modes/SelfTests.c (.../SelfTests.c) (revision 1d4d52365189e2cc83b97d28761bc2d4f0128859) @@ -8,7 +8,7 @@ * @file SelfTests.c * * @author (last) Sean Nash -* @date (last) 10-Feb-2023 +* @date (last) 08-Mar-2023 * * @author (original) Quang Nguyen * @date (original) 28-Jan-2021 @@ -110,6 +110,7 @@ static F32 peakVenousPressure; ///< Holds the peak normal venous pressure reading. static F32 decayedArterialPressure; ///< Holds the decayed arterial pressure reading after blood pump is stopped. static F32 decayedVenousPressure; ///< Holds the decayed venous pressure reading after blood pump is stopped. +static BOOL dryPressureTestsCompleted; ///< Flag indicates dry cartridge pressure leak testing has been completed. static BOOL wetSelfTestsResult; ///< Result of wet self-tests. static WET_SELF_TESTS_STATE_T currentWetSelfTestsState; ///< Current state of the wet self-tests state machine. @@ -143,7 +144,7 @@ static DRY_SELF_TESTS_STATE_T handleDrySelfTestStartState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestWaitForDoorCloseState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestUsedCartridgeCheckState( void ); -static DRY_SELF_TESTS_STATE_T handleDrySelfTestCartridgeInstalledCheckState( void ); +static DRY_SELF_TESTS_STATE_T handleDrySelfTestCartridgeLoadedCheckState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsNormalSetupState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsVenousSetupState( void ); static DRY_SELF_TESTS_STATE_T handleDrySelfTestPressureSensorsVenousState( void ); @@ -395,6 +396,7 @@ pressureSelfTestNormalizedStartTime = 0; previousNormalArterialPressure = 0.0; previousNormalVenousPressure = 0.0; + dryPressureTestsCompleted = FALSE; selfTestStartTime = getMSTimerCount(); selfTestPreviousPublishDataTime = getMSTimerCount(); selfTestCartridgeSettleTime = getMSTimerCount(); @@ -443,7 +445,7 @@ break; case DRY_SELF_TESTS_CARTRIDGE_LOADED_CHECK_STATE: - currentDrySelfTestsState = handleDrySelfTestCartridgeInstalledCheckState(); + currentDrySelfTestsState = handleDrySelfTestCartridgeLoadedCheckState(); break; case DRY_SELF_TESTS_PRESSURE_SENSORS_NORMAL_SETUP_STATE: @@ -509,21 +511,13 @@ if ( calcTimeSince( selfTestPreviousPublishDataTime ) >= SELF_TEST_TIME_DATA_PUB_INTERVAL ) { U32 const elapsedSelfTestTimeInSecs = calcTimeSince( selfTestStartTime ) / MS_PER_SECOND; + SELF_TEST_DRY_PAYLOAD_T data; selfTestPreviousPublishDataTime = getMSTimerCount(); - if ( elapsedSelfTestTimeInSecs <= MAX_DRY_SELF_TEST_TIME ) - { - SELF_TEST_DRY_PAYLOAD_T data; - - data.timeout = MAX_DRY_SELF_TEST_TIME; - data.countdown = ( MAX_DRY_SELF_TEST_TIME - elapsedSelfTestTimeInSecs ); - broadcastData( MSG_ID_HD_DRY_SELF_TEST_PROGRESS_DATA, COMM_BUFFER_OUT_CAN_HD_BROADCAST, (U08*)&data, sizeof( SELF_TEST_DRY_PAYLOAD_T ) ); - } - else - { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_DRY_SELF_TEST_TIMEOUT, currentDrySelfTestsState ); - } + data.timeout = MAX_DRY_SELF_TEST_TIME; + data.countdown = ( MAX_DRY_SELF_TEST_TIME - elapsedSelfTestTimeInSecs ); + broadcastData( MSG_ID_HD_DRY_SELF_TEST_PROGRESS, COMM_BUFFER_OUT_CAN_HD_BROADCAST, (U08*)&data, sizeof( SELF_TEST_DRY_PAYLOAD_T ) ); } } @@ -767,7 +761,15 @@ } else if ( ( TRUE == syringeHome ) && ( TRUE == syringeStopped ) && ( FALSE == syringePreloaded ) ) { - preloadSyringePlunger(); + // Is syringe loaded? + if ( TRUE == isSyringeDetected() ) + { + activateAlarmNoData( ALARM_ID_HD_SYRINGE_DETECTED ); + } + else + { + preloadSyringePlunger(); + } } else if ( TRUE == syringePreloaded ) { @@ -1027,13 +1029,13 @@ /*********************************************************************//** * @brief - * The handleDrySelfTestCartridgeInstalledCheckState function verifies that - * a cartridge has been installed by looking at the OB reading. + * The handleDrySelfTestCartridgeLoadedCheckState function verifies a cartridge + * is installed by checking sufficient pressure at OB sensor. * @details Inputs: none * @details Outputs: none * @return the next state of dry self-tests state machine *************************************************************************/ -static DRY_SELF_TESTS_STATE_T handleDrySelfTestCartridgeInstalledCheckState( void ) +static DRY_SELF_TESTS_STATE_T handleDrySelfTestCartridgeLoadedCheckState( void ) { DRY_SELF_TESTS_STATE_T state = DRY_SELF_TESTS_USED_CARTRIDGE_CHECK_STATE; @@ -1439,6 +1441,7 @@ if ( ( STATE_OPEN == getValveAirTrapStatus() ) && ( arterialPressureDiff <= NORMAL_PRESSURE_DIFF_TOLERANCE_MMHG ) && ( venousPressureDiff <= NORMAL_PRESSURE_DIFF_TOLERANCE_MMHG ) ) { + dryPressureTestsCompleted = TRUE; state = DRY_SELF_TESTS_SYRINGE_PUMP_PRIME_STATE; } @@ -1501,7 +1504,7 @@ } else { - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, (U32)SW_FAULT_ID_HD_SYRINGE_NOT_PRELOADED ) + preloadSyringePlunger(); } } } @@ -1573,6 +1576,24 @@ doorClosedRequired( FALSE, FALSE ); + // if not enough heparin alarm, pre-load pusher after retract completes + if ( TRUE == isAlarmActive( ALARM_ID_HD_SYRINGE_PUMP_NOT_ENOUGH_HEPARIN_ALARM ) ) + { // prevent resume until syringe is retracted and pre-loaded + setAlarmUserActionEnabled( ALARM_USER_ACTION_RESUME, FALSE ); + if ( isSyringePumpRunning() != TRUE ) + { + if ( TRUE == isSyringePumpHome() ) + { + preloadSyringePlunger(); + } + else if ( TRUE == isSyringePumpPreLoaded() ) + { + setAlarmUserActionEnabled( ALARM_USER_ACTION_RESUME, TRUE ); + } + } + } + + // if resume request, resume dry self-tests if ( TRUE == selfTestsResumeRequested ) { // Restart self-test start time @@ -1588,9 +1609,17 @@ } else #endif - { - doorClosedRequired( FALSE, TRUE ); - state = DRY_SELF_TESTS_START_STATE; + { // if we've completed pressure testing, resume to syringe pump prime state, otherwise go back to start of dry self-tests + if ( TRUE == dryPressureTestsCompleted ) + { + doorClosedRequired( TRUE, TRUE ); + state = DRY_SELF_TESTS_SYRINGE_PUMP_PRIME_STATE; + } + else + { + doorClosedRequired( FALSE, TRUE ); + state = DRY_SELF_TESTS_START_STATE; + } } } Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r336cb4935bf768db17bd6b7a02668510289b712e -r1d4d52365189e2cc83b97d28761bc2d4f0128859 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 336cb4935bf768db17bd6b7a02668510289b712e) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 1d4d52365189e2cc83b97d28761bc2d4f0128859) @@ -7,8 +7,8 @@ * * @file SystemCommMessages.c * -* @author (last) James Walter Taylor -* @date (last) 10-Feb-2023 +* @author (last) Sean Nash +* @date (last) 08-Mar-2023 * * @author (original) Dara Navaei * @date (original) 05-Nov-2019 @@ -2358,7 +2358,7 @@ FLOW_SENSORS_DATA_T payload; memcpy( &payload, message->payload, sizeof( FLOW_SENSORS_DATA_T ) ); - setDialysateFlowData( payload.dialysateFlowRateLPM ); + setDialysateFlowData( payload ); } }