Index: firmware/App/Controllers/AirTrap.c =================================================================== diff -u -r20fe5dc6869557f96c86fbd9d7f2f634ce23696a -r8d3dbd25627fb7e993409eb47b2575e0430afddd --- firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision 20fe5dc6869557f96c86fbd9d7f2f634ce23696a) +++ firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision 8d3dbd25627fb7e993409eb47b2575e0430afddd) @@ -18,6 +18,7 @@ #include "AirPump.h" #include "AirTrap.h" #include "AlarmMgmt.h" +#include "BloodFlow.h" #include "FPGA.h" #include "ModeTreatmentParams.h" #include "OperationModes.h" @@ -27,6 +28,7 @@ #include "TaskGeneral.h" #include "TaskPriority.h" #include "Timers.h" +#include "Valves.h" /** * @addtogroup AirTrap @@ -35,17 +37,16 @@ // ********** private definitions ********** - #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 ( 10 * 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_ON_STOP_TIME_MIN_MS 200 ///< Stop air Pump time. -#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_ACTIVITY_MAX_COUNT 5 ///< Maximum number of air trap events (fills and air pump activations) within time window before alarm triggered. +#define AIR_TRAP_ACTIVITY_TIME_WIN_MS ( 5 * SEC_PER_MIN * MS_PER_SECOND ) ///< Time window to monitor for too many air trap events. #define AIR_TRAP_LEVEL_DEBOUNCE_TIME_MS ( 400 ) ///< Air trap level sensor debounce time -/// Persistence period for illegal level sensors fault. +// 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. +#define AIR_TRAP_UPPER_LEVEL_FLUID_TIMEOUT_MS ( 30 * 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 ) @@ -122,6 +123,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 ); + initTimeWindowedCount( TIME_WINDOWED_COUNT_AIRTRAP_TOO_FREQ_ALARM, AIR_TRAP_ACTIVITY_MAX_COUNT, AIR_TRAP_ACTIVITY_TIME_WIN_MS ); } /*********************************************************************//** @@ -195,6 +197,26 @@ /*********************************************************************//** * @brief + * The isAirTrapFillInProgress function determines whether the air trap is + * currently filling. + * @details Inputs: airTrapControllerState + * @details Outputs: none + * @return TRUE if air trap is currently filling, FALSE if not. + *************************************************************************/ +BOOL isAirTrapFillInProgress( void ) +{ + BOOL result = FALSE; + + if ( AIR_TRAP_VALVE_OPEN_STATE == airTrapControllerState ) + { + result = TRUE; + } + + return result; +} + +/*********************************************************************//** + * @brief * The execAirTrapMonitor function executes the air trap monitor. * @details Inputs: FPGA air trap levels GPIO pin levels, airTrapIllegalLevelSensorsCtr * @details Outputs: airTrapLevels[], airTrapIllegalLevelSensorsCtr @@ -390,7 +412,7 @@ } } - //Open valve once at start of treatment ( blood priming) + //Open valve once at start of treatment (blood priming) else if ( TRUE == airTrapValveOpenAtStartOfTreatement ) { airTrapValveOpenAtStartOfTreatement = FALSE; @@ -400,10 +422,12 @@ } setValveAirTrap( STATE_OPEN ); + signalBloodPumpHardStop(); + setValvePosition( VBV, VALVE_POSITION_C_CLOSE ); 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 ) + result = AIR_TRAP_VALVE_OPEN_STATE; } // Turn air pump off after defined time or air detected at upper level @@ -422,9 +446,19 @@ if ( ( AIR_PUMP_STATE_OFF == getAirPumpState() ) && ( TRUE == didTimeout( airPumpOnDelayStartTime, AIR_PUMP_ON_DELAY_TIME_MS ) ) ) { - setAirPumpState( AIR_PUMP_STATE_ON ); - stopAirPumpStartTime = getMSTimerCount(); - signalInitiatePressureStabilization( USE_SHORT_STABILIZATION_PERIOD ); + // Check air trap activity (fills/air pump activations) too frequent + if ( TRUE == incTimeWindowedCount( TIME_WINDOWED_COUNT_AIRTRAP_TOO_FREQ_ALARM ) ) + { + SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_AIR_TRAP_ACTIVITY_TOO_FREQUENT, TIME_WINDOWED_COUNT_AIRTRAP_TOO_FREQ_ALARM ); + // reset alarm count after alarm so that time window does not interfere with alarm recovery + initTimeWindowedCount( TIME_WINDOWED_COUNT_AIRTRAP_TOO_FREQ_ALARM, AIR_TRAP_ACTIVITY_MAX_COUNT, AIR_TRAP_ACTIVITY_TIME_WIN_MS ); + } + else + { + setAirPumpState( AIR_PUMP_STATE_ON ); + stopAirPumpStartTime = getMSTimerCount(); + signalInitiatePressureStabilization( USE_SHORT_STABILIZATION_PERIOD ); + } } } @@ -438,10 +472,12 @@ } setValveAirTrap( STATE_OPEN ); + signalBloodPumpHardStop(); + setValvePosition( VBV, VALVE_POSITION_C_CLOSE ); 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 ) + result = AIR_TRAP_VALVE_OPEN_STATE; } return result; @@ -478,6 +514,7 @@ 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; }