Index: firmware/App/Controllers/AirTrap.c =================================================================== diff -u -r408247fba0f81c8ca77fb3144694ac8d7358d87b -re300530d917868cdf690421673e3efcd48fd3f67 --- firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision 408247fba0f81c8ca77fb3144694ac8d7358d87b) +++ firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision e300530d917868cdf690421673e3efcd48fd3f67) @@ -21,6 +21,7 @@ #include "FPGA.h" #include "ModeTreatmentParams.h" #include "OperationModes.h" +#include "PersistentAlarm.h" #include "Switches.h" #include "SystemCommMessages.h" #include "TaskGeneral.h" @@ -41,7 +42,7 @@ #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 ); +#define AIR_TRAP_ILLEGAL_LEVELS_TIMEOUT_MS ( 2 * MS_PER_SECOND ) ///< Air trap illegal values timeout (in ms) /// Volume (in mL) of venous portion of blood circuit line. TODO - get actual volume from Systems. #define VENOUS_LINE_VOLUME_ML ( 200.0F ) @@ -63,7 +64,7 @@ static U32 airTrapDataPublicationTimerCounter; ///< Used to schedule air trap data publication to CAN bus. /// 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, 0, 0 }; +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 BOOL pendingStartAirTrapController = FALSE; ///< Flag indicates an air trap controller start request is pending. @@ -72,7 +73,6 @@ static U32 fillStartTime = 0; ///< Time stamp for start of air trap fill. static U32 airPumpUpperLevelCtr = 0; ///< Timer count for air pump persistence. -static U32 airTrapIllegalLevelSensorsCtr = 0; ///< Timer counter for illegal level sensor fault. // ********** private function prototypes ********** @@ -93,8 +93,8 @@ U32 i; resetAirTrap(); - airTrapIllegalLevelSensorsCtr = DATA_PUBLISH_COUNTER_START_COUNT; - airPumpUpperLevelCtr = 0; + airTrapDataPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; + airPumpUpperLevelCtr = 0; for ( i = 0; i < NUM_OF_AIR_TRAP_LEVEL_SENSORS; i++ ) { @@ -103,6 +103,9 @@ airTrapLevels[i].ovInitData = 0; airTrapLevels[i].override = OVERRIDE_RESET; } + + initPersistentAlarm( ALARM_ID_HD_AIR_TRAP_ILLEGAL_LEVELS, AIR_TRAP_ILLEGAL_LEVELS_TIMEOUT_MS, AIR_TRAP_ILLEGAL_LEVELS_TIMEOUT_MS ); + } /*********************************************************************//** @@ -181,6 +184,8 @@ void execAirTrapMonitor( void ) { BOOL lower, upper; + bool isAirTrapLevelsValid = FALSE; + AIR_TRAP_LEVELS_T lowerAirTrap, upperAirTrap; // Get latest level readings getFPGAAirTrapLevels( &lower, &upper ); @@ -190,27 +195,21 @@ 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 - airTrapIllegalLevelSensorsCtr = 0; + checkPersistentAlarm( ALARM_ID_HD_AIR_TRAP_ILLEGAL_LEVELS, FALSE, 0.0, 0.0 ); } - - // Check level readings are valid - if ( ( AIR_TRAP_LEVEL_AIR == getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_LOWER ) ) && - ( AIR_TRAP_LEVEL_FLUID == getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_UPPER ) ) ) + else { - if ( ++airTrapIllegalLevelSensorsCtr >= AIR_TRAP_ILLEGAL_LEVELS_PERSISTENCE ) - { + lowerAirTrap = getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_LOWER ); + upperAirTrap = getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_UPPER ); + isAirTrapLevelsValid = ( ( AIR_TRAP_LEVEL_AIR == lowerAirTrap ) && ( AIR_TRAP_LEVEL_FLUID == upperAirTrap ) ) ? TRUE : FALSE; + #ifndef _RELEASE_ - if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_ILLEGAL_AIR_TRAP_ALARM ) != SW_CONFIG_ENABLE_VALUE ) + if ( getSoftwareConfigStatus( SW_CONFIG_DISABLE_ILLEGAL_AIR_TRAP_ALARM ) != SW_CONFIG_ENABLE_VALUE ) #endif - { - activateAlarmNoData( ALARM_ID_HD_AIR_TRAP_ILLEGAL_LEVELS ); - } + { + checkPersistentAlarm( ALARM_ID_HD_AIR_TRAP_ILLEGAL_LEVELS, isAirTrapLevelsValid, lowerAirTrap, upperAirTrap ); } } - else - { - airTrapIllegalLevelSensorsCtr = 0; - } } /*********************************************************************//**