Index: firmware/App/Controllers/AirTrap.c =================================================================== diff -u -r736cc5b56cc9c784ab1d8fc8687a73d190c35759 -r2a7723dc3639de1f44b5e34be9adcad38582d07c --- firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision 736cc5b56cc9c784ab1d8fc8687a73d190c35759) +++ firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision 2a7723dc3639de1f44b5e34be9adcad38582d07c) @@ -38,9 +38,11 @@ #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_ON_DELAY_TIME_MS ( 10 * MS_PER_SECOND ) ///< Delay between air pump On (in ms). #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. +#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) @@ -66,11 +68,13 @@ /// Interval (in ms) at which to publish air trap data to CAN bus. static OVERRIDE_U32_T airTrapDataPublishInterval = { AIR_TRAP_DATA_PUB_INTERVAL, AIR_TRAP_DATA_PUB_INTERVAL, AIR_TRAP_DATA_PUB_INTERVAL, 0 }; static OVERRIDE_U32_T airTrapLevels[ NUM_OF_AIR_TRAP_LEVEL_SENSORS ]; ///< Detected air trap level for each level sensor. +static U32 airTrapLevelsDebounceStartTime[ NUM_OF_AIR_TRAP_LEVEL_SENSORS ]; ///< Debounce start time for airtrap level sensor. static BOOL pendingStartAirTrapController = FALSE; ///< Flag indicates an air trap controller start request is pending. static BOOL pendingStopAirTrapController = FALSE; ///< Flag indicates an air trap controller stop request is pending. static U32 fillStartTime = 0; ///< Time stamp for start of air trap fill. +static U32 airPumpOnDelayStartTime = 0; ///< Air pump On start time. static U32 airPumpUpperLevelCtr = 0; ///< Timer count for air pump persistence. @@ -95,13 +99,15 @@ resetAirTrap(); airTrapDataPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; airPumpUpperLevelCtr = 0; + airPumpOnDelayStartTime = getMSTimerCount(); for ( i = 0; i < NUM_OF_AIR_TRAP_LEVEL_SENSORS; i++ ) { airTrapLevels[i].data = 0; airTrapLevels[i].ovData = 0; airTrapLevels[i].ovInitData = 0; airTrapLevels[i].override = OVERRIDE_RESET; + airTrapLevelsDebounceStartTime[i] = 0; } initPersistentAlarm( ALARM_ID_HD_AIR_TRAP_ILLEGAL_LEVELS, AIR_TRAP_ILLEGAL_LEVELS_TIMEOUT_MS, AIR_TRAP_ILLEGAL_LEVELS_TIMEOUT_MS ); @@ -186,12 +192,55 @@ BOOL lower, upper; BOOL isAirTrapLevelsValid = FALSE; AIR_TRAP_LEVELS_T lowerAirTrap, upperAirTrap; + AIR_TRAP_LEVEL_SENSORS_T airTrapLevelSensor; + AIR_TRAP_LEVELS_T currentLevelStatus; // Get latest level readings getFPGAAirTrapLevels( &lower, &upper ); - airTrapLevels[ AIR_TRAP_LEVEL_SENSOR_LOWER ].data = (U32)( TRUE == lower ? AIR_TRAP_LEVEL_AIR : AIR_TRAP_LEVEL_FLUID ); - airTrapLevels[ AIR_TRAP_LEVEL_SENSOR_UPPER ].data = (U32)( TRUE == upper ? AIR_TRAP_LEVEL_AIR : AIR_TRAP_LEVEL_FLUID ); + for( airTrapLevelSensor = AIR_TRAP_LEVEL_SENSOR_LOWER; airTrapLevelSensor < NUM_OF_AIR_TRAP_LEVEL_SENSORS; airTrapLevelSensor++ ) + { + // Get the current level sensor status + switch ( airTrapLevelSensor ) + { + case AIR_TRAP_LEVEL_SENSOR_LOWER: + currentLevelStatus = ( TRUE == lower ? AIR_TRAP_LEVEL_AIR : AIR_TRAP_LEVEL_FLUID ); + break; + case AIR_TRAP_LEVEL_SENSOR_UPPER: + currentLevelStatus = ( TRUE == upper ? AIR_TRAP_LEVEL_AIR : AIR_TRAP_LEVEL_FLUID ); + break; + +#ifndef _VECTORCAST_ + // Since this is a for loop the default cannot be reached in VectorCAST for 100% coverage + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_HD_INVALID_LEVEL_SENSOR_ID, airTrapLevelSensor ) + break; +#endif + } + + // Check if the current level sensor status is not the same as the recorded data + if ( currentLevelStatus != (AIR_TRAP_LEVELS_T) airTrapLevels[ airTrapLevelSensor ].data ) + { + // If the debounce time is 0, start the timer + if ( 0 == airTrapLevelsDebounceStartTime[ airTrapLevelSensor ] ) + { + airTrapLevelsDebounceStartTime[ airTrapLevelSensor ] = getMSTimerCount(); + } + // If the debounce time has been elapsed, update the level sensor status to the new status + else if ( TRUE == didTimeout( airTrapLevelsDebounceStartTime[ airTrapLevelSensor ], AIR_TRAP_LEVEL_DEBOUNCE_TIME_MS ) ) + { + // reset the debounce time + airTrapLevelsDebounceStartTime[ airTrapLevelSensor ] = 0; + airTrapLevels[ airTrapLevelSensor ].data = (U32) currentLevelStatus; + } + } + else + { + airTrapLevelsDebounceStartTime[ airTrapLevelSensor ] = 0; + } + } + if ( STATE_OPEN == getSwitchStatus( PUMP_TRACK_SWITCH ) ) { // If the pump track on open, zero the persistent counter to not check the air trap illegal level alarm @@ -334,9 +383,11 @@ //Turn on air pump if fluid reaches upper level. else if ( AIR_TRAP_LEVEL_FLUID == getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_UPPER ) ) { - if ( AIR_PUMP_STATE_OFF == getAirPumpState() ) + if ( ( AIR_PUMP_STATE_OFF == getAirPumpState() ) || + ( TRUE == didTimeout( airPumpOnDelayStartTime, AIR_PUMP_ON_DELAY_TIME_MS ) ) ) { setAirPumpState( AIR_PUMP_STATE_ON ); + airPumpOnDelayStartTime = getMSTimerCount(); airPumpUpperLevelCtr = 0; signalInitiatePressureStabilization( USE_SHORT_STABILIZATION_PERIOD ); } Index: firmware/App/Controllers/PresOccl.c =================================================================== diff -u -r736cc5b56cc9c784ab1d8fc8687a73d190c35759 -r2a7723dc3639de1f44b5e34be9adcad38582d07c --- firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision 736cc5b56cc9c784ab1d8fc8687a73d190c35759) +++ firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision 2a7723dc3639de1f44b5e34be9adcad38582d07c) @@ -108,6 +108,7 @@ static const U32 EMPTY_SALINE_BAG_PERSISTENCE = ( 250 / TASK_GENERAL_INTERVAL ); ///< Time that saline bag looks empty before saying it is empty. #define PRES_ALARM_PERSISTENCE ( 1 * MS_PER_SECOND ) ///< Alarm persistence period for pressure alarms. +#define VEN_PRES_ALARM_PERSISTENCE 500 ///< Alarm persistence period for venous pressure alarms. #define PRES_OCCL_ALARM_PERSISTENCE ( 3 * MS_PER_SECOND ) ///< Alarm persistence period for occlusion alarms #define VEN_OCCL_ALARM_PERSISTENCE 100 ///< Alarm persistence period for venous occlusion alarm. #define AIR_PUMP_TOLERANCE_TIMEOUT_MS (1 * MS_PER_SECOND ) ///< Time to allow increased maximum venous high limit @@ -228,8 +229,8 @@ // Initialize persistent pressure alarms initPersistentAlarm( ALARM_ID_HD_ARTERIAL_PRESSURE_LOW, 0, PRES_ALARM_PERSISTENCE ); initPersistentAlarm( ALARM_ID_HD_ARTERIAL_PRESSURE_HIGH, 0, PRES_ALARM_PERSISTENCE ); - initPersistentAlarm( ALARM_ID_HD_VENOUS_PRESSURE_LOW, 0, PRES_ALARM_PERSISTENCE ); - initPersistentAlarm( ALARM_ID_HD_VENOUS_PRESSURE_HIGH, 0, PRES_ALARM_PERSISTENCE ); + initPersistentAlarm( ALARM_ID_HD_VENOUS_PRESSURE_LOW, 0, VEN_PRES_ALARM_PERSISTENCE ); + initPersistentAlarm( ALARM_ID_HD_VENOUS_PRESSURE_HIGH, 0, VEN_PRES_ALARM_PERSISTENCE ); initPersistentAlarm( ALARM_ID_HD_ARTERIAL_PRESSURE_OUT_OF_RANGE, 0, PRES_ALARM_PERSISTENCE ); initPersistentAlarm( ALARM_ID_HD_VENOUS_PRESSURE_OUT_OF_RANGE, 0, PRES_ALARM_PERSISTENCE ); initPersistentAlarm( ALARM_ID_HD_BP_OCCLUSION_OUT_OF_RANGE, 0, PRES_OCCL_ALARM_PERSISTENCE ); Index: firmware/App/Services/AlarmMgmtSWFaults.h =================================================================== diff -u -r736cc5b56cc9c784ab1d8fc8687a73d190c35759 -r2a7723dc3639de1f44b5e34be9adcad38582d07c --- firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision 736cc5b56cc9c784ab1d8fc8687a73d190c35759) +++ firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision 2a7723dc3639de1f44b5e34be9adcad38582d07c) @@ -93,7 +93,7 @@ SW_FAULT_ID_CAN_PARITY_ERROR, SW_FAULT_ID_CAN_PASSIVE_WARNING, SW_FAULT_ID_CAN_OFF_ERROR, - SW_FAULT_ID_____AVAILABLE_2, // 65 + SW_FAULT_ID_HD_INVALID_LEVEL_SENSOR_ID, // 65 SW_FAULT_ID_____AVAILABLE_3, SW_FAULT_ID_UTIL_TIME_WINDOWED_COUNT_ERROR, SW_FAULT_ID_ACCEL_INVALID_STATE,