Index: firmware/App/Controllers/PresOccl.c =================================================================== diff -u -r6e3cc2783dd177a3e53589fcc73ff56f05da20d9 -r833dc8408890ca24e537ccfd7cbc7f47abe19aa4 --- firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision 6e3cc2783dd177a3e53589fcc73ff56f05da20d9) +++ firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision 833dc8408890ca24e537ccfd7cbc7f47abe19aa4) @@ -40,8 +40,11 @@ // ********** private definitions ********** /// Default publication interval for pressure and occlusion data. -#define PRES_OCCL_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the pressure/occlusion data is published on the CAN bus. +#define PRES_OCCL_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the pressure/occlusion data is published on the CAN bus. +#define PRES_LIMIT_STABILIZATION_TIME_MS ( SEC_PER_MIN * MS_PER_SECOND ) ///< Duration of pressure limit stabilization period (in ms). +#define PRES_LIMIT_RESTABILIZE_TIME_MS ( 30 * SEC_PER_MIN * MS_PER_SECOND ) ///< Duration of pressure limit re-stabilize period (in ms). + #define ARTERIAL_PRESSURE_CONVERSION_OFFSET 0x800000 ///< Arterial pressure conversion coefficient. #define ARTERIAL_PRESSURE_V_BIAS ( 3.0F ) ///< Bias voltage for arterial pressure sensor. #define ARTERIAL_PRESSURE_SENSITIVITY ( 0.000005F ) ///< Sensitivity for arterial pressure sensor is 5 uV / mmHg @@ -153,7 +156,9 @@ static S32 currentArterialMaxLimit; ///< Maximum arterial pressure limit (in mmHg). static S32 currentArterialMinLimit; ///< Minimum arterial pressure limit (in mmHg). static S32 currentVenousMaxLimit; ///< Maximum venous pressure limit (in mmHg). -static S32 currentVenousMinLimit; ///< Minimum venous pressure limit (in mmHg). +static S32 currentVenousMinLimit; ///< Minimum venous pressure limit (in mmHg). +static BOOL pressureLimitsActive; ///< Flag indicates whether arterial and venous pressure alarm limits are active. +static U32 stabilizationStartTimeMs; ///< Timestamp taken when pressure limit stabilization began (ms). static F32 longFilteredArterialPressure; ///< Measured arterial pressure after long (10 s) filter. static F32 shortFilteredArterialPressure; ///< Measured arterial pressure after short (1 s) filter. static F32 shortFilteredVenousPressure; ///< Measured venous pressure after short (1 s) filter. @@ -176,7 +181,6 @@ static U32 venPressureReadingsShortIdx = 0; ///< Index for next sample in rolling average array. static F32 venPressureReadingsShortTotal = 0.0; ///< Rolling total - used to calc average. static U32 venPressureReadingsShortCount = 0; ///< Number of samples in flow rolling average buffer. -static U32 venPressureLimitDelayStart; ///< Time stamp for last time dialysis started/resumed. static PRESSURE_SELF_TEST_STATE_T presOcclPostState; ///< Pressure self test post state. static HD_PRESSURE_SENSORS_CAL_RECORD_T pressureSensorsCalRecord; ///< Pressure sensors calibration record. static HD_OCCLUSION_SENSORS_CAL_RECORD_T occlusionSensorsCalRecord; ///< Occlusion sensors calibration record. @@ -185,6 +189,7 @@ static PRESSURE_STATE_T handlePresOcclWaitForPOSTState( void ); static PRESSURE_STATE_T handlePresOcclContReadState( void ); +static void execPressureLimits( void ); static void convertInlinePressures( void ); static void convertOcclusionPressures( void ); static void checkArterialPressureInRange( void ); @@ -223,7 +228,9 @@ setPressureLimitsToOuterBounds(); - currPresLimitsState = PRESSURE_LIMITS_STATE_STABILIZATION; + currPresLimitsState = PRESSURE_LIMITS_STATE_OFF; + pressureLimitsActive = FALSE; + stabilizationStartTimeMs = 0; stableArterialPressure = 0; stableVenousPressure = 0; longFilteredArterialPressure = 0.0F; @@ -233,7 +240,6 @@ presOcclState = PRESSURE_WAIT_FOR_POST_STATE; presOcclPostState = PRESSURE_SELF_TEST_STATE_START; bloodPumpOcclusionAfterCartridgeInstall = 0; - venPressureLimitDelayStart = 0; } /*********************************************************************//** @@ -323,20 +329,6 @@ /*********************************************************************//** * @brief - * The signalStartDialysisStartOrResume function signals that dialysis has - * just been started or resumed which begins a brief time window where - * venous pressure limits are relaxed while treatment reaches stability. - * @details Inputs: none - * @details Outputs: venPressureLimitDelayStart - * @return none - *************************************************************************/ -void signalStartDialysisStartOrResume( void ) -{ - venPressureLimitDelayStart = getMSTimerCount(); -} - -/*********************************************************************//** - * @brief * The setPressureLimitsToOuterBounds function sets the min/max pressure * limits for arterial and venous pressure to their outer boundaries. * @details Inputs: none @@ -361,8 +353,7 @@ * resume will start a new stabilization period ending in another set of * stable pressures before windowed limits recalculated. * @details Inputs: none - * @details Outputs: stableArterialPressure, stableVenousPressure, - * currPresLimitsState + * @details Outputs: stableArterialPressure, stableVenousPressure * @param artPresWin new arterial pressure limit window setting * @param venPresWin new venous pressure limit window setting * @param venPresAsym new venous pressure limit asymmetric setting @@ -377,12 +368,25 @@ stableArterialPressure = curArtPres; stableVenousPressure = curVenPres; - // User update of pressure window(s) initiates a stabilization period - currPresLimitsState = PRESSURE_LIMITS_STATE_STABILIZATION; } /*********************************************************************//** * @brief + * The signalBPRateChange function signals that user has changed the blood + * flow rate. If pressure limits state was stable, a blood flow rate change + * will kick us back to stabilization state. + * @details Inputs: none + * @details Outputs: currPresLimitsState + * @return none + *************************************************************************/ +void signalBPRateChange( void ) +{ + // User update of blood flow rate initiates a stabilization period if we were stable before + currPresLimitsState = ( PRESSURE_LIMITS_STATE_STABLE == currPresLimitsState ? PRESSURE_LIMITS_STATE_STABILIZATION : currPresLimitsState ); +} + +/*********************************************************************//** + * @brief * The determineArtVenPressureLimits function determines current pressure * limits based on whether we are in stabilization or stable situation. * @details Inputs: currPresLimitsState @@ -392,20 +396,23 @@ *************************************************************************/ static void determineArtVenPressureLimits( void ) { - S32 artOffset = getTreatmentParameterS32( TREATMENT_PARAM_ART_PRES_LIMIT_WINDOW ) / 2; // Arterial is symmetric - S32 venMinOffset = getTreatmentParameterS32( TREATMENT_PARAM_VEN_PRES_LIMIT_ASYMMETRIC ); // Venous is asymmetric - S32 venMaxOffset = getTreatmentParameterS32( TREATMENT_PARAM_VEN_PRES_LIMIT_WINDOW ) - venMinOffset; - if ( PRESSURE_LIMITS_STATE_STABLE == currPresLimitsState ) { // apply pressure windows when stable + S32 artOffset = getTreatmentParameterS32( TREATMENT_PARAM_ART_PRES_LIMIT_WINDOW ) / 2; // Arterial is symmetric + S32 venMinOffset = getTreatmentParameterS32( TREATMENT_PARAM_VEN_PRES_LIMIT_ASYMMETRIC ); // Venous is asymmetric + S32 venMaxOffset = getTreatmentParameterS32( TREATMENT_PARAM_VEN_PRES_LIMIT_WINDOW ) - venMinOffset; + currentArterialMaxLimit = stableArterialPressure + artOffset; currentArterialMinLimit = stableArterialPressure - artOffset; currentVenousMaxLimit = stableVenousPressure + venMaxOffset; currentVenousMinLimit = stableVenousPressure - venMinOffset; } else - { // apply outer limits when stabilizing + { // apply outer limits when not stable setPressureLimitsToOuterBounds(); + + // set flag indicating whether pressure limits are active based on current current limits state + pressureLimitsActive = ( currPresLimitsState > PRESSURE_LIMITS_STATE_IDLE ? TRUE : FALSE ); } } @@ -476,6 +483,9 @@ // Read latest occlusion pressures convertOcclusionPressures(); + // Handle pressure limits state machine + execPressureLimits(); + // Set arterial/venous pressure limits according to current pressure limits state determineArtVenPressureLimits(); @@ -487,6 +497,90 @@ checkOcclusions(); return result; +} + +/*********************************************************************//** + * @brief + * The execPressureLimits function executes the pressure limits state machine. + * @details Inputs: currPresLimitsState, stabilizationStartTimeMs + * @details Outputs: currPresLimitsState, stabilizationStartTimeMs + * @return next pressure limits state + *************************************************************************/ +static void execPressureLimits( void ) +{ + BOOL bpRunning = isBloodPumpRunning(); + HD_OP_MODE_T currMode = getCurrentOperationMode(); + TREATMENT_STATE_T currTxState = getTreatmentState(); + + if ( currMode != MODE_TREA ) + { + currPresLimitsState = PRESSURE_LIMITS_STATE_OFF; + } + + switch ( currPresLimitsState ) + { + case PRESSURE_LIMITS_STATE_OFF: + if ( MODE_TREA == currMode ) + { // Tx mode starts in blood prime - want wide limits in that state + currPresLimitsState = PRESSURE_LIMITS_STATE_WIDE; + } + break; + + case PRESSURE_LIMITS_STATE_IDLE: + if ( TRUE == bpRunning ) + { + currPresLimitsState = PRESSURE_LIMITS_STATE_WIDE; + } + break; + + case PRESSURE_LIMITS_STATE_WIDE: + if ( bpRunning != TRUE ) + { + currPresLimitsState = PRESSURE_LIMITS_STATE_IDLE; + } + else if ( ( TREATMENT_DIALYSIS_STATE == currTxState ) || ( TREATMENT_STOP_STATE == currTxState ) ) + { + stabilizationStartTimeMs = getMSTimerCount(); + currPresLimitsState = PRESSURE_LIMITS_STATE_STABILIZATION; + } + break; + + case PRESSURE_LIMITS_STATE_STABILIZATION: + if ( bpRunning != TRUE ) + { + currPresLimitsState = PRESSURE_LIMITS_STATE_IDLE; + } + else if ( ( currTxState != TREATMENT_DIALYSIS_STATE ) && ( currTxState != TREATMENT_STOP_STATE ) ) + { + currPresLimitsState = PRESSURE_LIMITS_STATE_WIDE; + } + else if ( TRUE == didTimeout( stabilizationStartTimeMs, PRES_LIMIT_STABILIZATION_TIME_MS ) ) + { + stabilizationStartTimeMs = getMSTimerCount(); + currPresLimitsState = PRESSURE_LIMITS_STATE_STABLE; + } + break; + + case PRESSURE_LIMITS_STATE_STABLE: + if ( bpRunning != TRUE ) + { + currPresLimitsState = PRESSURE_LIMITS_STATE_IDLE; + } + else if ( ( currTxState != TREATMENT_DIALYSIS_STATE ) && ( currTxState != TREATMENT_STOP_STATE ) ) + { + currPresLimitsState = PRESSURE_LIMITS_STATE_WIDE; + } + else if ( TRUE == didTimeout( stabilizationStartTimeMs, PRES_LIMIT_RESTABILIZE_TIME_MS ) ) + { + stabilizationStartTimeMs = getMSTimerCount(); + currPresLimitsState = PRESSURE_LIMITS_STATE_STABILIZATION; + } + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_PRES_LIMITS_INVALID_STATE, currPresLimitsState ) + break; + } } /*********************************************************************//** @@ -569,53 +663,33 @@ if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_ARTERIAL_PRESSURE_CHECK ) != SW_CONFIG_ENABLE_VALUE ) #endif { - TREATMENT_STATE_T txState = getTreatmentState(); - // Check arterial pressure is in absolute max range if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_ARTERIAL_PRESSURE_OUT_OF_RANGE, ( artPres > ARTERIAL_PRESSURE_MAX_MMHG || artPres < ARTERIAL_PRESSURE_MIN_MMHG ) ) ) { SET_ALARM_WITH_1_F32_DATA( ALARM_ID_HD_ARTERIAL_PRESSURE_OUT_OF_RANGE, artPres ); } - // Check arterial pressure during treatment mode against either user set limits or fixed max limits depending on treatment state - if ( ( MODE_TREA == getCurrentOperationMode() ) && - ( ( ( TREATMENT_DIALYSIS_STATE == txState ) && ( DIALYSIS_UF_STATE == getDialysisState() ) ) || - ( ( TREATMENT_STOP_STATE == txState ) && ( isBloodPumpRunning() != FALSE ) ) ) ) + // Check arterial pressure when limits active + if ( pressureLimitsActive != FALSE ) { BOOL artPresLow, artPresHigh; artPresLow = ( artPres < (F32)currentArterialMinLimit ? TRUE : FALSE ); artPresHigh = ( artPres > (F32)currentArterialMaxLimit ? TRUE : FALSE ); - // Check arterial pressure is within user set alarm limits + // Check arterial pressure is within alarm limits if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_ARTERIAL_PRESSURE_LOW, artPresLow ) ) { SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_ARTERIAL_PRESSURE_LOW, artPres, (F32)currentArterialMinLimit ); } - if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_ARTERIAL_PRESSURE_HIGH, artPresHigh ) ) { SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_ARTERIAL_PRESSURE_HIGH, artPres, (F32)currentArterialMaxLimit ); } } - else if ( ( MODE_TREA == getCurrentOperationMode() ) && ( isBloodPumpRunning() != FALSE ) ) // All treatment states not covered by the if above - { - BOOL artPresLow = ( artPres < ARTERIAL_PRESSURE_LIMIT_MIN_MMHG ? TRUE : FALSE ); - BOOL artPresHigh = ( artPres > ARTERIAL_PRESSURE_LIMIT_MAX_MMHG ? TRUE : FALSE ); - - // Check arterial pressure is within max selectable range - if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_ARTERIAL_PRESSURE_LOW, artPresLow ) ) - { - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_ARTERIAL_PRESSURE_LOW, artPres, ARTERIAL_PRESSURE_LIMIT_MIN_MMHG ); - } - if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_ARTERIAL_PRESSURE_HIGH, artPresHigh ) ) - { - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_ARTERIAL_PRESSURE_HIGH, artPres, ARTERIAL_PRESSURE_LIMIT_MAX_MMHG ); - } - } else - { // Reset persistence if alarm is out of scope + { // Reset persistence if limits inactive isPersistentAlarmTriggered( ALARM_ID_HD_ARTERIAL_PRESSURE_LOW, FALSE ); isPersistentAlarmTriggered( ALARM_ID_HD_ARTERIAL_PRESSURE_HIGH, FALSE ); } @@ -638,67 +712,39 @@ if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_VENOUS_PRESSURE_CHECK ) != SW_CONFIG_ENABLE_VALUE ) #endif { - TREATMENT_STATE_T txState = getTreatmentState(); - // Check venous pressure is in absolute max range if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_VENOUS_PRESSURE_OUT_OF_RANGE, ( venPres > VENOUS_PRESSURE_MAX_MMHG || venPres < VENOUS_PRESSURE_MIN_MMHG ) ) ) { SET_ALARM_WITH_1_F32_DATA( ALARM_ID_HD_VENOUS_PRESSURE_OUT_OF_RANGE, venPres ); } - // Check venous pressure during treatment mode against either user set limits or fixed max limits depending on treatment state - if ( ( MODE_TREA == getCurrentOperationMode() ) && - ( ( ( TREATMENT_DIALYSIS_STATE == txState ) && ( DIALYSIS_UF_STATE == getDialysisState() ) && ( TRUE == didTimeout( venPressureLimitDelayStart, VENOUS_PRESSURE_LIMIT_DELAY_MS ) ) ) || - ( ( TREATMENT_STOP_STATE == txState ) && ( isBloodPumpRunning() != FALSE ) ) ) ) + // Check venous pressure when limits active + if ( pressureLimitsActive != FALSE ) { BOOL venPresLow, venPresHigh; venPresLow = ( venPres < (F32)currentVenousMinLimit ? TRUE : FALSE ); venPresHigh = ( venPres > (F32)currentVenousMaxLimit ? TRUE : FALSE ); - // Cannot monitor for low venous pressure while venting air trap + // Check arterial pressure is within alarm limits if ( getValveAirTrapStatus() != STATE_OPEN ) { if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_VENOUS_PRESSURE_LOW, venPresLow ) ) { - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_VENOUS_PRESSURE_LOW, venPres, currentVenousMinLimit ); + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_VENOUS_PRESSURE_LOW, venPres, (F32)currentVenousMinLimit ); } } else { // clear persistence if air trap valve is open isPersistentAlarmTriggered( ALARM_ID_HD_VENOUS_PRESSURE_LOW, FALSE ); } - if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_VENOUS_PRESSURE_HIGH, venPresHigh ) ) { - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_VENOUS_PRESSURE_HIGH, venPres, currentVenousMaxLimit ); + SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_VENOUS_PRESSURE_HIGH, venPres, (F32)currentVenousMaxLimit ); } } - else if ( ( MODE_TREA == getCurrentOperationMode() ) && ( isBloodPumpRunning() != FALSE ) ) // All treatment states not covered by the if statement above - { - BOOL venPresLow = ( venPres < VENOUS_PRESSURE_LIMIT_MIN_MMHG ? TRUE : FALSE ); - BOOL venPresHigh = ( venPres > VENOUS_PRESSURE_LIMIT_MAX_MMHG ? TRUE : FALSE ); - - // Check venous pressure is below max limit - if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_VENOUS_PRESSURE_HIGH, venPresHigh ) ) - { - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_VENOUS_PRESSURE_HIGH, venPres, VENOUS_PRESSURE_LIMIT_MAX_MMHG ); - } - // Cannot monitor for low venous pressure while venting air trap - if ( getValveAirTrapStatus() != STATE_OPEN ) - { - if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_VENOUS_PRESSURE_LOW, venPresLow ) ) - { - SET_ALARM_WITH_2_F32_DATA( ALARM_ID_HD_VENOUS_PRESSURE_LOW, venPres, VENOUS_PRESSURE_LIMIT_MIN_MMHG ); - } - } - else - { // clear persistence if air trap valve is open - isPersistentAlarmTriggered( ALARM_ID_HD_VENOUS_PRESSURE_LOW, FALSE ); - } - } else - { // Reset persistence if alarm is out of scope + { // Reset persistence if limits inactive isPersistentAlarmTriggered( ALARM_ID_HD_VENOUS_PRESSURE_LOW, FALSE ); isPersistentAlarmTriggered( ALARM_ID_HD_VENOUS_PRESSURE_HIGH, FALSE ); } Index: firmware/App/Controllers/PresOccl.h =================================================================== diff -u -r6e3cc2783dd177a3e53589fcc73ff56f05da20d9 -r833dc8408890ca24e537ccfd7cbc7f47abe19aa4 --- firmware/App/Controllers/PresOccl.h (.../PresOccl.h) (revision 6e3cc2783dd177a3e53589fcc73ff56f05da20d9) +++ firmware/App/Controllers/PresOccl.h (.../PresOccl.h) (revision 833dc8408890ca24e537ccfd7cbc7f47abe19aa4) @@ -52,9 +52,12 @@ /// Enumeration of arterial/venous pressure limits states. typedef enum PressureLimitsStates { - PRESSURE_LIMITS_STATE_STABILIZATION = 0,///< Stabilization state - PRESSURE_LIMITS_STATE_STABLE, ///< Stable state - NUM_OF_PRESSURE_LIMITS_STATES + PRESSURE_LIMITS_STATE_OFF = 0, ///< Off - not pressure low/high alarms will be detected) + PRESSURE_LIMITS_STATE_IDLE, ///< Idle - in Treatment mode state where BP is stopped - no pressure low/high alarms + PRESSURE_LIMITS_STATE_WIDE, ///< Wide - in Treatment mode state where BP is running but wide limits apply + PRESSURE_LIMITS_STATE_STABILIZATION, ///< Stabilization - in Treatment mode state where BP is running (dialysis or stop), but need to stabilize first + PRESSURE_LIMITS_STATE_STABLE, ///< Stable - in Treatment mode state where BP is running (dialysis or stop) and limit windows apply + NUM_OF_PRESSURE_LIMITS_STATES ///< Number of pressure limits states } PRESSURE_LIMITS_STATES_T; /// Payload record structure for the pressure & occlusions data message. @@ -80,7 +83,8 @@ SELF_TEST_STATUS_T execPresOcclSelfTest( void ); void setPressureLimitsToOuterBounds( void ); -void updatePressureLimitWindows( S32 artPresWin, S32 venPresWin, S32 venPresAsym ); +void updatePressureLimitWindows( S32 artPresWin, S32 venPresWin, S32 venPresAsym ); +void signalBPRateChange( void ); F32 getMeasuredArterialPressure( void ); F32 getFilteredArterialPressure( void ); @@ -92,7 +96,6 @@ BOOL isCartridgeLoaded( void ); BOOL isCartridgeUnloaded( void ); BOOL isSalineBagEmpty( void ); -void signalStartDialysisStartOrResume( void ); void setOcclusionInstallLevel( void ); Index: firmware/App/Modes/Dialysis.c =================================================================== diff -u -r38355442b06187fe5d57deca647b3adf2fa26b89 -r833dc8408890ca24e537ccfd7cbc7f47abe19aa4 --- firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision 38355442b06187fe5d57deca647b3adf2fa26b89) +++ firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision 833dc8408890ca24e537ccfd7cbc7f47abe19aa4) @@ -261,8 +261,6 @@ resetReservoirsVariables(); - signalStartDialysisStartOrResume(); - // Set valves for dialysis setValvePosition( VDI, VALVE_POSITION_B_OPEN ); setValvePosition( VDO, VALVE_POSITION_B_OPEN ); Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -r6e3cc2783dd177a3e53589fcc73ff56f05da20d9 -r833dc8408890ca24e537ccfd7cbc7f47abe19aa4 --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 6e3cc2783dd177a3e53589fcc73ff56f05da20d9) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision 833dc8408890ca24e537ccfd7cbc7f47abe19aa4) @@ -1267,6 +1267,10 @@ result = TRUE; sendTreatmentLogEventData( BLOOD_FLOW_RATE_CHANGE_EVENT, getTreatmentParameterU32( TREATMENT_PARAM_BLOOD_FLOW ), bloodRate ); sendTreatmentLogEventData( DIALYSATE_FLOW_RATE_CHANGE_EVENT, getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ), dialRate ); + if ( bloodRate != getTreatmentParameterS32( TREATMENT_PARAM_BLOOD_FLOW ) ) + { + signalBPRateChange(); + } // Set to new rates setTreatmentParameterU32( TREATMENT_PARAM_BLOOD_FLOW, bloodRate ); setTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW, dialRate ); Index: firmware/App/Services/AlarmMgmtSWFaults.h =================================================================== diff -u -rf4f7e0ee3baef51d91de64d44a0a00ff967f56c0 -r833dc8408890ca24e537ccfd7cbc7f47abe19aa4 --- firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision f4f7e0ee3baef51d91de64d44a0a00ff967f56c0) +++ firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision 833dc8408890ca24e537ccfd7cbc7f47abe19aa4) @@ -184,6 +184,7 @@ SW_FAULT_ID_INVALID_ALARM_ID_REFERENCED, SW_FAULT_ID_DIALYSIS_INVALID_DIALYZER_REPRIME_STATE, SW_FAULT_ID_HD_INVALID_PRE_TREATMENT_PAT_CONN_STATE, // 155 + SW_FAULT_ID_PRES_LIMITS_INVALID_STATE, NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T;