Index: firmware/App/Controllers/AirTrap.c =================================================================== diff -u -r13a064292b5a36a85593f53eabae268ae2bf4bc6 -racff6b01c7f6ed1c206953849214e0c31961d89e --- firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision 13a064292b5a36a85593f53eabae268ae2bf4bc6) +++ firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision acff6b01c7f6ed1c206953849214e0c31961d89e) @@ -45,6 +45,7 @@ #define AIR_TRAP_LEVEL_DEBOUNCE_TIME_MS ( 400 ) ///< Air trap level sensor debounce time /// Persistence period for illegal level sensors fault. #define AIR_TRAP_ILLEGAL_LEVELS_TIMEOUT_MS ( 2 * MS_PER_SECOND ) ///< Air trap illegal values timeout (in ms) +#define AIR_TRAP_UPPER_LEVEL_FLUID_TIMEOUT_MS ( 60 * MS_PER_SECOND ) ///< Air trap upper level fluid timeout in milliseconds. /// Volume (in mL) of venous portion of blood circuit line. TODO - get actual volume from Systems. #define VENOUS_LINE_VOLUME_ML ( 200.0F ) @@ -87,6 +88,7 @@ static AIR_TRAP_STATE_T handleAirTrapManualControlState( void ); static AIR_TRAP_STATE_T handleAirTrapValveClosedState( void ); static AIR_TRAP_STATE_T handleAirTrapValveOpenState( void ); +static void checkAirTrapUpperLevelFluidTimeout( void ); static void publishAirTrapData( void ); /*********************************************************************//** @@ -120,7 +122,7 @@ } initPersistentAlarm( ALARM_ID_HD_AIR_TRAP_ILLEGAL_LEVELS, AIR_TRAP_ILLEGAL_LEVELS_TIMEOUT_MS, AIR_TRAP_ILLEGAL_LEVELS_TIMEOUT_MS ); - + initPersistentAlarm( ALARM_ID_HD_AIR_TRAP_UPPER_LEVEL_FLUID_TIME_OUT, 0, AIR_TRAP_UPPER_LEVEL_FLUID_TIMEOUT_MS ); } /*********************************************************************//** @@ -347,8 +349,11 @@ setValveAirTrap( STATE_CLOSED ); SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_AIR_TRAP_FILL, STATE_CLOSED, 0 ); result = AIR_TRAP_VALVE_CLOSED_STATE; + SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_AIR_TRAP_STATE_CHANGE, (U32)AIR_TRAP_MANUAL_CONTROL_STATE, (U32)result ) } + checkPersistentAlarm( ALARM_ID_HD_AIR_TRAP_UPPER_LEVEL_FLUID_TIME_OUT, FALSE, (F32)AIR_TRAP_LEVEL_FLUID, (F32)AIR_TRAP_LEVEL_FLUID ); + return result; } @@ -364,6 +369,9 @@ { AIR_TRAP_STATE_T result = AIR_TRAP_VALVE_CLOSED_STATE; + // Check whether the air trap upper level is detecting fluid all the time and if it is, trigger an alarm + checkAirTrapUpperLevelFluidTimeout(); + // Air pump stop time based on the blood flow rate S32 qB = abs( getTargetBloodFlowRate() ); U32 qBx = ( 0 == qB ? MIN_SET_BLOOD_FLOW_RATE : (U32)qB ); @@ -374,6 +382,7 @@ { pendingStopAirTrapController = FALSE; result = AIR_TRAP_MANUAL_CONTROL_STATE; + SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_AIR_TRAP_STATE_CHANGE, (U32)AIR_TRAP_VALVE_CLOSED_STATE, (U32)result ) if ( AIR_PUMP_STATE_ON == getAirPumpState() ) { @@ -394,6 +403,7 @@ fillStartTime = getMSTimerCount(); SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_AIR_TRAP_FILL, STATE_OPEN, 0 ); result = AIR_TRAP_VALVE_OPEN_STATE; + SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_AIR_TRAP_STATE_CHANGE, (U32)AIR_TRAP_VALVE_CLOSED_STATE, (U32)result ) } // Turn air pump off after defined time or air detected at upper level @@ -432,6 +442,7 @@ fillStartTime = getMSTimerCount(); SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_AIR_TRAP_FILL, STATE_OPEN, 0 ); result = AIR_TRAP_VALVE_OPEN_STATE; + SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_AIR_TRAP_STATE_CHANGE, (U32)AIR_TRAP_VALVE_CLOSED_STATE, (U32)result ) } return result; @@ -449,11 +460,14 @@ { AIR_TRAP_STATE_T result = AIR_TRAP_VALVE_OPEN_STATE; + checkAirTrapUpperLevelFluidTimeout(); + // Transition to manual valve control state when requested if ( TRUE == pendingStopAirTrapController ) { pendingStopAirTrapController = FALSE; result = AIR_TRAP_MANUAL_CONTROL_STATE; + SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_AIR_TRAP_STATE_CHANGE, (U32)AIR_TRAP_VALVE_OPEN_STATE, (U32)result ) } // Transition to closed valve state when fluid detected at upper level else if ( AIR_TRAP_LEVEL_FLUID == getRawAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_UPPER ) ) @@ -463,6 +477,7 @@ signalLowVenousPressureCheck(); SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_AIR_TRAP_FILL, STATE_CLOSED, 0 ); result = AIR_TRAP_VALVE_CLOSED_STATE; + SEND_EVENT_WITH_2_U32_DATA( HD_EVENT_AIR_TRAP_STATE_CHANGE, (U32)AIR_TRAP_VALVE_OPEN_STATE, (U32)result ) } return result; } @@ -521,6 +536,22 @@ /*********************************************************************//** * @brief + * The checkAirTrapUpperLevelFluidTimeout function checks whether the air + * trap upper level is detecting fluid and then updates the persistent alarm. + * @details Inputs: none + * @details Outputs: none + * @return none + *************************************************************************/ +static void checkAirTrapUpperLevelFluidTimeout( void ) +{ + AIR_TRAP_LEVELS_T upperLevel = getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_UPPER ); + BOOL isUpperLevelFluid = ( AIR_TRAP_LEVEL_FLUID == upperLevel ? TRUE : FALSE ); + + checkPersistentAlarm( ALARM_ID_HD_AIR_TRAP_UPPER_LEVEL_FLUID_TIME_OUT, isUpperLevelFluid, (F32)AIR_TRAP_LEVEL_FLUID, (F32)AIR_TRAP_LEVEL_FLUID ); +} + +/*********************************************************************//** + * @brief * The publishAirTrapData function publishes air trap data at the set interval. * @details Inputs: airTrapLevels[], rawAirTrapLevels[] * @details Outputs: if broadcast is due, send air trap data Index: firmware/App/Controllers/PresOccl.c =================================================================== diff -u -r13a064292b5a36a85593f53eabae268ae2bf4bc6 -racff6b01c7f6ed1c206953849214e0c31961d89e --- firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision 13a064292b5a36a85593f53eabae268ae2bf4bc6) +++ firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision acff6b01c7f6ed1c206953849214e0c31961d89e) @@ -79,7 +79,6 @@ #define VENOUS_PRESSURE_MAX_MMHG ( 2000.0F ) ///< Maximum venous pressure reading (in mmHg) for range check. #define VENOUS_PRESSURE_MIN_MMHG ( -1500.0F ) ///< Minimum venous pressure reading (in mmHg) for range check. #define VENOUS_PRESSURE_LIMIT_MAX_MMHG ( 400.0F ) ///< Maximum venous pressure limit (in mmHg). -#define VENOUS_PRESSURE_LIMIT_MIN_MMHG ( 0.0F ) ///< Minimum venous pressure limit (in mmHg). #define VENOUS_PRESSURE_OCCL_OFFSET_MMHG ( 50.0F ) ///< Venous pressure occlusion threshold offset from max alarm limit (in mmHg). #define VENOUS_PRESSURE_EXEMPTION_PERIOD ( ( 2 * MS_PER_SECOND ) / \ TASK_GENERAL_INTERVAL ) ///< Venous pressure low exemption period (in task interval) after fill for all blood flow rate @@ -443,7 +442,7 @@ currentArterialMaxLimit = (S32)ARTERIAL_PRESSURE_LIMIT_MAX_MMHG; currentArterialMinLimit = (S32)ARTERIAL_PRESSURE_LIMIT_MIN_MMHG; currentVenousMaxLimit = (S32)VENOUS_PRESSURE_LIMIT_MAX_MMHG; - currentVenousMinLimit = (S32)VENOUS_PRESSURE_LIMIT_MIN_MMHG; + currentVenousMinLimit = getMinVenousPressureWideValueMMHG(); } /*********************************************************************//** @@ -539,16 +538,17 @@ ( 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; + 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; + S32 venMinWideLimitMMHG = getMinVenousPressureWideValueMMHG(); currentArterialMinLimit = stableArterialPressure - artOffset; currentArterialMinLimit = MAX( currentArterialMinLimit, ARTERIAL_PRESSURE_LIMIT_MIN_MMHG ); currentArterialMaxLimit = stableArterialPressure + artOffset; currentArterialMaxLimit = MIN( currentArterialMaxLimit, ARTERIAL_PRESSURE_LIMIT_MAX_MMHG ); currentVenousMinLimit = stableVenousPressure - venMinOffset; - currentVenousMinLimit = MAX( currentVenousMinLimit, VENOUS_PRESSURE_LIMIT_MIN_MMHG ); + currentVenousMinLimit = MAX( currentVenousMinLimit, venMinWideLimitMMHG ); currentVenousMaxLimit = stableVenousPressure + venMaxOffset; currentVenousMaxLimit = MIN( currentVenousMaxLimit, VENOUS_PRESSURE_LIMIT_MAX_MMHG ); } Index: firmware/App/Modes/ModeTreatmentParams.c =================================================================== diff -u -r3721992a3919c89841c7dc2bd847fd130ff629a3 -racff6b01c7f6ed1c206953849214e0c31961d89e --- firmware/App/Modes/ModeTreatmentParams.c (.../ModeTreatmentParams.c) (revision 3721992a3919c89841c7dc2bd847fd130ff629a3) +++ firmware/App/Modes/ModeTreatmentParams.c (.../ModeTreatmentParams.c) (revision acff6b01c7f6ed1c206953849214e0c31961d89e) @@ -45,6 +45,8 @@ #define INSTIT_CHEM_DISINFECT_ENABLE_RANGE 1 ///< Institutional record chemical disinfect enable/disable allowable range #define INSTIT_MIN_RO_REJECTION_RATIO_MAX_PCT 99 ///< Institutional record min RO rejection ratio maximum in percent. #define INSTIT_MAX_INLET_WATER_COND_ALARM_USPCM 300.0F ///< Institutional record max inlet water conductivity alarm in uS/cm. +#define INSTIT_MAX_MIN_VEN_PRES_WIDE_LIMIT_MMHG 400 ///< Institutional record max min venous pressure wide limit in mmHg. +#define INSTIT_MIN_MIN_VEN_PRES_WIDE_LIMIT_MMHG 0 ///< Institutional record min min venous pressure wide limit in mmHg. /// Record for range and default of treatment parameters. typedef struct @@ -951,6 +953,19 @@ /*********************************************************************//** * @brief + * The getMinVenousPressureWideValueMMHG function returns the min venous + * pressure wide limit window in mmHg. + * @details Inputs: hdInstitutionalRecord + * @details Outputs: none + * @return the min venous pressure wide limit window in mmHg. + *************************************************************************/ +S32 getMinVenousPressureWideValueMMHG( void ) +{ + return hdInstitutionalRecord.minVenPressWideLimitWindowMMHG; +} + +/*********************************************************************//** + * @brief * The isNVInstitutionalRecordInRange function checks whether all the * institutional NV records are valid and within range or not. * @details Inputs: none @@ -1032,6 +1047,8 @@ result &= ( ( nvInstRcrd->minRORejectionRatioPCT <= INSTIT_MIN_RO_REJECTION_RATIO_MAX_PCT ) ? TRUE : FALSE ); result &= ( ( nvInstRcrd->minInletWaterCondAlarmLimitUSPCM >= 0.0F ) && ( nvInstRcrd->minInletWaterCondAlarmLimitUSPCM <= INSTIT_MAX_INLET_WATER_COND_ALARM_USPCM ) ? TRUE : FALSE ); + result &= ( ( nvInstRcrd->minVenPressWideLimitWindowMMHG <= INSTIT_MAX_MIN_VEN_PRES_WIDE_LIMIT_MMHG ) && + ( nvInstRcrd->minVenPressWideLimitWindowMMHG >= INSTIT_MIN_MIN_VEN_PRES_WIDE_LIMIT_MMHG ) ? TRUE : FALSE ); return result; } Index: firmware/App/Modes/ModeTreatmentParams.h =================================================================== diff -u -r13a064292b5a36a85593f53eabae268ae2bf4bc6 -racff6b01c7f6ed1c206953849214e0c31961d89e --- firmware/App/Modes/ModeTreatmentParams.h (.../ModeTreatmentParams.h) (revision 13a064292b5a36a85593f53eabae268ae2bf4bc6) +++ firmware/App/Modes/ModeTreatmentParams.h (.../ModeTreatmentParams.h) (revision acff6b01c7f6ed1c206953849214e0c31961d89e) @@ -114,6 +114,7 @@ S32 getS32DefaultTreatmentParamEdge( TREATMENT_PARAM_T param, BOOL isMin ); U32 getU32DefaultTreatmentParamEdge( TREATMENT_PARAM_T param, BOOL isMin ); F32 getF32DefaultTreatmentParamEdge( TREATMENT_PARAM_T param, BOOL isMin ); +S32 getMinVenousPressureWideValueMMHG( void ); BOOL isNVInstitutionalRecordInRange( HD_INSTITUTIONAL_RECORD_T* nvInstRcrd ); // Is non-volatile memory institutional record in range void setNVInstitutionalRecordToTxParamsRecord( HD_INSTITUTIONAL_RECORD_T* nvInstitutionalRecord ); // Set the recently received institution record from NV to local tx parameters Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r3721992a3919c89841c7dc2bd847fd130ff629a3 -racff6b01c7f6ed1c206953849214e0c31961d89e --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 3721992a3919c89841c7dc2bd847fd130ff629a3) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision acff6b01c7f6ed1c206953849214e0c31961d89e) @@ -95,6 +95,7 @@ U32 enableChemicalDisinfect; ///< Enable/disable chemical disinfect. U32 minRORejectionRatioPCT; ///< Min RO rejection ratio in percent. F32 minInletWaterCondAlarmLimitUSPCM; ///< Min inlet water conductivity alarm limit in uS/cm. + S32 minVenPressWideLimitWindowMMHG; ///< Min venous pressure wide window limit in mmHg. } HD_INSTITUTIONAL_LOCAL_RECORD_T; typedef struct