Index: firmware/App/Controllers/AirTrap.c =================================================================== diff -u -r4d509fa074423027c3106a209ead0beffd57cc3e -rda757a96fa3b5756a2cc6321cc851af9a2cfcf09 --- firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision 4d509fa074423027c3106a209ead0beffd57cc3e) +++ firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision da757a96fa3b5756a2cc6321cc851af9a2cfcf09) @@ -37,7 +37,9 @@ #define AIR_TRAP_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the air trap data is published on the CAN bus. #define AIR_TRAP_FILL_TIMEOUT_MS ( 6 * MS_PER_SECOND ) ///< Air trap fill timeout period (in ms). -#define AIR_PUMP_UPPER_LEVEL_PERSISTENCE ( 100 / TASK_GENERAL_INTERVAL ) ///< Persistence time for air pump operation after air trap upper level reads air. +#define AIR_PUMP_UPPER_LEVEL_PERSISTENCE ( 300 / TASK_GENERAL_INTERVAL ) ///< Persistence time for air pump operation after air trap upper level reads air. +#define AIR_PUMP_ON_ERROR_MAX_CNT 6 ///< Maximum number of air pump on events within time window before alarm triggered. Do not exceed MAX_TIME_WINDOWED_COUNT. +#define AIR_PUMP_ON_ERROR_TIME_WIN_MS ( 60 * MS_PER_SECOND ) ///< Time window for Air Pump on count error. /// Persistence period for illegal level sensors fault. static const U32 AIR_TRAP_ILLEGAL_LEVELS_PERSISTENCE = ( MS_PER_SECOND * 2 / TASK_GENERAL_INTERVAL ); @@ -101,6 +103,9 @@ airTrapLevels[i].ovInitData = 0; airTrapLevels[i].override = OVERRIDE_RESET; } + + // TODO DMC - enable windowed counter init when new alarm added + //initTimeWindowedCount( TIME_WINDOWED_COUNT_AIR_PUMP_ERROR, AIR_PUMP_ON_ERROR_MAX_CNT, AIR_PUMP_ON_ERROR_TIME_WIN_MS ); } /*********************************************************************//** @@ -335,9 +340,15 @@ { if ( AIR_PUMP_STATE_OFF == getAirPumpState() ) { + // TODO DMC - Check Air pump window counter here + //if ( TRUE == incTimeWindowedCount( TIME_WINDOWED_COUNT_AIR_PUMP_ERROR ) ) + //{ + // activateAlarmNoData( ALARM_ID_HD_AIR_PUMP_ON_ERROR ); + //} + setAirPumpState( AIR_PUMP_STATE_ON ); airPumpUpperLevelCtr = 0; - signalInitiatePressureStabilization(); + signalInitiatePressureStabilization( TRUE ); } } Index: firmware/App/Controllers/PresOccl.c =================================================================== diff -u -rf0c16ca7223ad48b7bdb86b8f010b74b550c0051 -rda757a96fa3b5756a2cc6321cc851af9a2cfcf09 --- firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision f0c16ca7223ad48b7bdb86b8f010b74b550c0051) +++ firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision da757a96fa3b5756a2cc6321cc851af9a2cfcf09) @@ -43,6 +43,7 @@ #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 ( 5 * 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 ARTERIAL_PRESSURE_CONVERSION_OFFSET 0x800000 ///< Arterial pressure conversion coefficient. @@ -171,6 +172,7 @@ static F32 shortFilteredArterialPressure; ///< Measured arterial pressure after short (1 s) filter. static F32 longFilteredVenousPressure; ///< Measured venous pressure after long (10 s) filter. static F32 shortFilteredVenousPressure; ///< Measured venous pressure after short (1 s) filter. +static BOOL useShortStablizeTime; ///< Flag to use short stabilize time. static U32 bloodPumpOcclusionAfterCartridgeInstall; ///< Measured blood pump occlusion reading taken after cartridge install. @@ -258,6 +260,7 @@ presOcclState = PRESSURE_WAIT_FOR_POST_STATE; presOcclPostState = PRESSURE_SELF_TEST_STATE_START; bloodPumpOcclusionAfterCartridgeInstall = 0; + useShortStablizeTime = FALSE; } /*********************************************************************//** @@ -402,17 +405,30 @@ * 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: none + * @details Inputs: useShort * @details Outputs: stableArterialPressure, stableVenousPressure * @return none *************************************************************************/ -void updatePressureLimitWindows( void ) +void updatePressureLimitWindows( BOOL useShort ) { - F32 filtArt = getLongFilteredArterialPressure(); - F32 filtVen = getLongFilteredVenousPressure(); - S32 curArtPres = FLOAT_TO_INT_WITH_ROUND( filtArt ); - S32 curVenPres = FLOAT_TO_INT_WITH_ROUND( filtVen ); + F32 filtArt; + F32 filtVen; + S32 curArtPres; + S32 curVenPres; + if ( useShort ) + { + filtArt = getFilteredArterialPressure(); + filtVen = getFilteredVenousPressure(); + } + else + { + F32 filtArt = getLongFilteredArterialPressure(); + F32 filtVen = getLongFilteredVenousPressure(); + } + + curArtPres = FLOAT_TO_INT_WITH_ROUND( filtArt ); + curVenPres = FLOAT_TO_INT_WITH_ROUND( filtVen ); stableArterialPressure = curArtPres; stableVenousPressure = curVenPres; @@ -425,12 +441,15 @@ * The signalInitiatePressureStabilization function signals that user has * changed the blood and/or dialysate flow rate. If pressure limits state * was stable, a rate change will kick us back to stabilization state. - * @details Inputs: none - * @details Outputs: currPresLimitsState, stabilizationStartTimeMs + * Else reset stabilize counter. + * @details Inputs: useShort + * @details Outputs: currPresLimitsState, stabilizationStartTimeMs, useShortStablizeTime * @return none *************************************************************************/ -void signalInitiatePressureStabilization( void ) +void signalInitiatePressureStabilization( BOOL useShort ) { + useShortStablizeTime = useShort; + // 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 ) { @@ -574,6 +593,7 @@ BOOL bpRampComplete = isBloodPumpRampComplete(); HD_OP_MODE_T currMode = getCurrentOperationMode(); TREATMENT_STATE_T currTxState = getTreatmentState(); + U32 stabilizeTime = PRES_LIMIT_STABILIZATION_TIME_MS; if ( currMode != MODE_TREA ) { @@ -604,11 +624,21 @@ else if ( ( TREATMENT_DIALYSIS_STATE == currTxState ) || ( TREATMENT_STOP_STATE == currTxState ) ) { stabilizationStartTimeMs = getMSTimerCount(); + useShortStablizeTime = FALSE; currPresLimitsState = PRESSURE_LIMITS_STATE_STABILIZATION; } break; case PRESSURE_LIMITS_STATE_STABILIZATION: + if ( useShortStablizeTime ) + { + stabilizeTime = PRES_LIMIT_SHORT_STABILIZE_TIME_MS; + } + else + { + stabilizeTime = PRES_LIMIT_STABILIZATION_TIME_MS; + } + if ( bpRunning != TRUE ) { currPresLimitsState = PRESSURE_LIMITS_STATE_IDLE; @@ -617,10 +647,11 @@ { currPresLimitsState = PRESSURE_LIMITS_STATE_WIDE; } - else if ( TRUE == didTimeout( stabilizationStartTimeMs, PRES_LIMIT_STABILIZATION_TIME_MS ) ) + else if ( TRUE == didTimeout( stabilizationStartTimeMs, stabilizeTime ) ) { - updatePressureLimitWindows(); + updatePressureLimitWindows( useShortStablizeTime ); stabilizationStartTimeMs = getMSTimerCount(); + useShortStablizeTime = FALSE; currPresLimitsState = PRESSURE_LIMITS_STATE_STABLE; } break; @@ -637,6 +668,7 @@ else if ( TRUE == didTimeout( stabilizationStartTimeMs, PRES_LIMIT_RESTABILIZE_TIME_MS ) ) { stabilizationStartTimeMs = getMSTimerCount(); + useShortStablizeTime = FALSE; currPresLimitsState = PRESSURE_LIMITS_STATE_STABILIZATION; } break; Index: firmware/App/Controllers/PresOccl.h =================================================================== diff -u -r9353792f6dbd624a1d55cf1e87fa848e8fbaea71 -rda757a96fa3b5756a2cc6321cc851af9a2cfcf09 --- firmware/App/Controllers/PresOccl.h (.../PresOccl.h) (revision 9353792f6dbd624a1d55cf1e87fa848e8fbaea71) +++ firmware/App/Controllers/PresOccl.h (.../PresOccl.h) (revision da757a96fa3b5756a2cc6321cc851af9a2cfcf09) @@ -85,8 +85,8 @@ SELF_TEST_STATUS_T execPresOcclSelfTest( void ); void setPressureLimitsToOuterBounds( void ); -void updatePressureLimitWindows( void ); -void signalInitiatePressureStabilization( void ); +void updatePressureLimitWindows( BOOL ); +void signalInitiatePressureStabilization( BOOL ); void resetArtVenPressureOffsets( void ); void setArtVenPressureOffsets( void ); Index: firmware/App/Modes/Dialysis.c =================================================================== diff -u -rf0c16ca7223ad48b7bdb86b8f010b74b550c0051 -rda757a96fa3b5756a2cc6321cc851af9a2cfcf09 --- firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision f0c16ca7223ad48b7bdb86b8f010b74b550c0051) +++ firmware/App/Modes/Dialysis.c (.../Dialysis.c) (revision da757a96fa3b5756a2cc6321cc851af9a2cfcf09) @@ -397,7 +397,7 @@ { accept = TRUE; salineBolusStartRequested = TRUE; - signalInitiatePressureStabilization(); + signalInitiatePressureStabilization( FALSE ); } // Send response @@ -438,7 +438,7 @@ { accept = TRUE; salineBolusAbortRequested = TRUE; - signalInitiatePressureStabilization(); + signalInitiatePressureStabilization( FALSE ); } // Send response @@ -987,7 +987,7 @@ sendOperationStatusEvent(); } - signalInitiatePressureStabilization(); + signalInitiatePressureStabilization( FALSE ); // Resume dialysis transitionToDialysis(); } Index: firmware/App/Modes/ModeTreatment.c =================================================================== diff -u -rf0c16ca7223ad48b7bdb86b8f010b74b550c0051 -rda757a96fa3b5756a2cc6321cc851af9a2cfcf09 --- firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision f0c16ca7223ad48b7bdb86b8f010b74b550c0051) +++ firmware/App/Modes/ModeTreatment.c (.../ModeTreatment.c) (revision da757a96fa3b5756a2cc6321cc851af9a2cfcf09) @@ -831,7 +831,7 @@ transitionToBloodPrime(); result = TREATMENT_BLOOD_PRIME_STATE; } - signalInitiatePressureStabilization(); + signalInitiatePressureStabilization( FALSE ); } // If user requests rinseback, go to rinseback else if ( TRUE == initiateRinsebackAlarmResponseRequest ) @@ -1214,7 +1214,7 @@ { sendTreatmentLogEventData( UF_RATE_CHANGE_EVENT, presUFRate, pendingUFRateChange ); presUFRate = pendingUFRateChange; - signalInitiatePressureStabilization(); + signalInitiatePressureStabilization( FALSE ); } setDialysisParams( getTreatmentParameterU32( TREATMENT_PARAM_BLOOD_FLOW ), getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ), presMaxUFVolumeML, presUFRate ); @@ -1281,7 +1281,7 @@ if ( ( bloodRate != (U32)getTreatmentParameterU32( TREATMENT_PARAM_BLOOD_FLOW ) ) || ( dialRate != (U32)getTreatmentParameterU32( TREATMENT_PARAM_DIALYSATE_FLOW ) ) ) { - signalInitiatePressureStabilization(); + signalInitiatePressureStabilization( FALSE ); } // Set to new rates setTreatmentParameterU32( TREATMENT_PARAM_BLOOD_FLOW, bloodRate ); Index: firmware/App/Modes/TreatmentStop.c =================================================================== diff -u -r89cc353281d4ea2fdcff196402069c3ee50d500d -rda757a96fa3b5756a2cc6321cc851af9a2cfcf09 --- firmware/App/Modes/TreatmentStop.c (.../TreatmentStop.c) (revision 89cc353281d4ea2fdcff196402069c3ee50d500d) +++ firmware/App/Modes/TreatmentStop.c (.../TreatmentStop.c) (revision da757a96fa3b5756a2cc6321cc851af9a2cfcf09) @@ -112,7 +112,7 @@ setupForDialysateRecirculationState(); - signalInitiatePressureStabilization(); + signalInitiatePressureStabilization( FALSE ); // Reset saline bolus state in case alarm interrupted one resetSalineBolus();