Index: firmware/App/Controllers/PresOccl.c =================================================================== diff -u -r5dc15621f83c8fe19da6b82b4492102d699a8a14 -rf07f57ef0b78a5391f8809acee22c421ea0ac1f3 --- firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision 5dc15621f83c8fe19da6b82b4492102d699a8a14) +++ firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision f07f57ef0b78a5391f8809acee22c421ea0ac1f3) @@ -40,13 +40,14 @@ // ********** 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_LIMIT_STABILIZATION_TIME_MS ( 60 * MS_PER_SECOND ) ///< Duration of pressure limit stabilization period (in ms). -#define PRES_LIMIT_SHORT_STABILIZE_TIME_MS ( 10 * MS_PER_SECOND ) ///< Duration of pressure limit short 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 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_OFF ( 0 ) ///< pressure limit stabilization period off +#define PRES_LIMIT_STABILIZATION_2_TIME_MS ( 60 * MS_PER_SECOND ) ///< Duration of pressure limit second stage stabilization period (in ms) +#define PRES_LIMIT_STABILIZATION_TIME_MS ( 60 * MS_PER_SECOND ) ///< Duration of pressure limit stabilization period (in ms). +#define PRES_LIMIT_SHORT_STABILIZE_TIME_MS ( 10 * MS_PER_SECOND ) ///< Duration of pressure limit short stabilization period (in ms). +#define PRES_LIMIT_RESTABILIZE_TIME_MS ( 15 * SEC_PER_MIN * MS_PER_SECOND ) ///< Duration of pressure limit re-stabilize period (in ms). // Pressure Limit minimum stabilization time before short stabilization time activation -static const U32 PRES_LIMIT_MIN_STABILIZATION_TIME_IN_MS = ( PRES_LIMIT_STABILIZATION_TIME_MS - PRES_LIMIT_SHORT_STABILIZE_TIME_MS ) ; +static const U32 PRES_LIMIT_MIN_STABILIZATION_TIME_IN_MS = ( PRES_LIMIT_STABILIZATION_TIME_MS - PRES_LIMIT_SHORT_STABILIZE_TIME_MS ); #define ARTERIAL_PRESSURE_CONVERSION_OFFSET 0x800000 ///< Arterial pressure conversion coefficient. #define ARTERIAL_PRESSURE_V_BIAS ( 3.0F ) ///< Bias voltage for arterial pressure sensor. @@ -174,7 +175,7 @@ static OVERRIDE_F32_T shortFilteredArterialPressure = { 0.0, 0.0, 0.0, 0 }; ///< Measured arterial pressure after short (1 s) filter. static F32 longFilteredVenousPressure; ///< Measured venous pressure after long (10 s) filter. static OVERRIDE_F32_T shortFilteredVenousPressure = { 0.0, 0.0, 0.0, 0 }; ///< Measured venous pressure after short (1 s) filter. -static BOOL useShortStabilizeTime; ///< Flag to use short stabilize time. +static STABILIZATION_PERIODS_T pressureStabilizeTime; ///< Pressure stabilization time based on system events such as airpump, treatment param changes etc., static U32 bloodPumpOcclusionAfterCartridgeInstall; ///< Measured blood pump occlusion reading taken after cartridge install. @@ -262,7 +263,7 @@ presOcclState = PRESSURE_WAIT_FOR_POST_STATE; presOcclPostState = PRESSURE_SELF_TEST_STATE_START; bloodPumpOcclusionAfterCartridgeInstall = 0; - useShortStabilizeTime = USE_NORMAL_STABILIZATION_PERIOD; + pressureStabilizeTime = USE_NORMAL_STABILIZATION_PERIOD; } /*********************************************************************//** @@ -407,7 +408,7 @@ * will be in effect immediately (next monitor pass). If treatment paused, * resume will start a new stabilization period ending in another set of * stable pressures before windowed limits recalculated. - * @details Inputs: useShortStabilizeTime + * @details Inputs: pressureStabilizeTime * @details Outputs: stableArterialPressure, stableVenousPressure * @return none *************************************************************************/ @@ -418,7 +419,7 @@ S32 curArtPres; S32 curVenPres; - if ( USE_SHORT_STABILIZATION_PERIOD == useShortStabilizeTime ) + if ( USE_SHORT_STABILIZATION_PERIOD == pressureStabilizeTime ) { filtArt = getFilteredArterialPressure(); filtVen = getFilteredVenousPressure(); @@ -445,31 +446,33 @@ * was stable, a rate change will kick us back to stabilization state. * Else reset stabilize counter. * @details Inputs: currPresLimitsState - * @details Outputs: currPresLimitsState, stabilizationStartTimeMs, useShortStabilizeTime - * @param useShort Flag to use short stabilization period. Use defines: - * USE_NORMAL_STABILIZATION_PERIOD, USE_SHORT_STABILIZATION_PERIOD + * @details Outputs: currPresLimitsState, stabilizationStartTimeMs, pressureStabilizeTime + * @param stabilizationPeriod stabilization periods. Use defines: + * STABILIZATION_PERIOD_OFF, USE_NORMAL_STABILIZATION_PERIOD, USE_SHORT_STABILIZATION_PERIOD * @return none *************************************************************************/ -void signalInitiatePressureStabilization( BOOL useShort ) +void signalInitiatePressureStabilization( STABILIZATION_PERIODS_T stabilizationPeriod ) { // User update of blood/dialysate flow rate or UF rate or initiates/resets a stabilization period (if we were in stabilization or stable state) if ( PRESSURE_LIMITS_STATE_STABILIZATION == currPresLimitsState ) { U32 currentTime = getMSTimerCount(); - U32 expiredTime = u32DiffWithWrap( stabilizationStartTimeMs , currentTime ); + U32 expiredTime = u32DiffWithWrap( stabilizationStartTimeMs, currentTime ); // if pressure is already stabilized enough, assign the short stabilize time for the recent event ( air pump on). - // else,leave the current/on going stabilization to expire due to long pending stable time to settle down the pressure. + // else,allow the ongoing stabilization to complete. // allow Normal stabilization on a case when user updates flow rate or UF rate etc., - if ( expiredTime > PRES_LIMIT_MIN_STABILIZATION_TIME_IN_MS || useShort == FALSE ) + if ( ( expiredTime > PRES_LIMIT_MIN_STABILIZATION_TIME_IN_MS ) || + ( stabilizationPeriod == USE_NORMAL_STABILIZATION_PERIOD ) ) { - useShortStabilizeTime = useShort; + pressureStabilizeTime = stabilizationPeriod; stabilizationStartTimeMs = getMSTimerCount(); } } - else if ( PRESSURE_LIMITS_STATE_STABLE == currPresLimitsState ) + else if ( ( PRESSURE_LIMITS_STATE_STABLE == currPresLimitsState ) || + ( PRESSURE_LIMITS_STATE_STABILIZATION_2 == currPresLimitsState ) ) { - useShortStabilizeTime = useShort; + pressureStabilizeTime = stabilizationPeriod; currPresLimitsState = PRESSURE_LIMITS_STATE_STABILIZATION; stabilizationStartTimeMs = getMSTimerCount(); } @@ -486,8 +489,10 @@ *************************************************************************/ static void determineArtVenPressureLimits( void ) { - if ( PRESSURE_LIMITS_STATE_STABLE == currPresLimitsState ) - { // apply pressure windows when stable + if ( ( PRESSURE_LIMITS_STATE_STABLE == currPresLimitsState ) || + ( PRESSURE_LIMITS_STATE_STABILIZATION_2 == 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; @@ -637,7 +642,7 @@ else if ( ( TREATMENT_DIALYSIS_STATE == currTxState ) || ( TREATMENT_STOP_STATE == currTxState ) ) { stabilizationStartTimeMs = getMSTimerCount(); - useShortStabilizeTime = USE_NORMAL_STABILIZATION_PERIOD; + pressureStabilizeTime = USE_NORMAL_STABILIZATION_PERIOD;; currPresLimitsState = PRESSURE_LIMITS_STATE_STABILIZATION; } else if ( currTxState == TREATMENT_RECIRC_STATE ) @@ -647,10 +652,16 @@ break; case PRESSURE_LIMITS_STATE_STABILIZATION: - if ( USE_SHORT_STABILIZATION_PERIOD == useShortStabilizeTime ) + // update stabilization time + if ( USE_SHORT_STABILIZATION_PERIOD == pressureStabilizeTime ) { stabilizeTime = PRES_LIMIT_SHORT_STABILIZE_TIME_MS; } + else if ( STABILIZATION_PERIOD_OFF == pressureStabilizeTime ) + { + stabilizeTime = PRES_LIMIT_STABILIZATION_OFF; + } + // Normal stabilization period else { stabilizeTime = PRES_LIMIT_STABILIZATION_TIME_MS; @@ -668,12 +679,39 @@ { updatePressureLimitWindows(); stabilizationStartTimeMs = getMSTimerCount(); - useShortStabilizeTime = USE_NORMAL_STABILIZATION_PERIOD; + // second stage stabilization is not required when returning from stable state on every 15 minutes once. + if ( pressureStabilizeTime == STABILIZATION_PERIOD_OFF ) + { + currPresLimitsState = PRESSURE_LIMITS_STATE_STABLE; + } + else + { + currPresLimitsState = PRESSURE_LIMITS_STATE_STABILIZATION_2; + } + pressureStabilizeTime = USE_NORMAL_STABILIZATION_PERIOD; + } + break; + + case PRESSURE_LIMITS_STATE_STABILIZATION_2: + // second stage stabilization helps to re determine the pressure due to UF control change etc., + 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_2_TIME_MS ) ) + { + updatePressureLimitWindows(); + stabilizationStartTimeMs = getMSTimerCount(); currPresLimitsState = PRESSURE_LIMITS_STATE_STABLE; } break; case PRESSURE_LIMITS_STATE_STABLE: + // Pressure is re determined after every 15 minutes once and be remain in limited pressure windows. if ( bpRunning != TRUE ) { currPresLimitsState = PRESSURE_LIMITS_STATE_IDLE; @@ -685,7 +723,7 @@ else if ( TRUE == didTimeout( stabilizationStartTimeMs, PRES_LIMIT_RESTABILIZE_TIME_MS ) ) { stabilizationStartTimeMs = getMSTimerCount(); - useShortStabilizeTime = USE_NORMAL_STABILIZATION_PERIOD; + pressureStabilizeTime = STABILIZATION_PERIOD_OFF; currPresLimitsState = PRESSURE_LIMITS_STATE_STABILIZATION; } break;