Index: firmware/App/Controllers/AirTrap.c =================================================================== diff -u -ra2bc96881a5fc3d8f779246b2abebf15a8de9384 -r24b2fe72608344e67ef37234085d15ad5e4fcc37 --- firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision a2bc96881a5fc3d8f779246b2abebf15a8de9384) +++ firmware/App/Controllers/AirTrap.c (.../AirTrap.c) (revision 24b2fe72608344e67ef37234085d15ad5e4fcc37) @@ -1,17 +1,17 @@ /************************************************************************** * -* Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. +* Copyright (c) 2019-2022 Diality Inc. - All Rights Reserved. * * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. * -* @file AirTrap.c +* @file AirTrap.c * -* @author (last) Sean Nash -* @date (last) 08-Oct-2020 +* @author (last) Sean Nash +* @date (last) 12-Nov-2021 * -* @author (original) Sean Nash -* @date (original) 16-Sep-2020 +* @author (original) Sean Nash +* @date (original) 16-Sep-2020 * ***************************************************************************/ @@ -31,11 +31,14 @@ */ // ********** private definitions ********** + +/// Interval (ms/task time) at which the air trap data is published on the CAN bus. +#define AIR_TRAP_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) +/// Persistence period for illegal level sensors fault. +static const U32 AIR_TRAP_ILLEGAL_LEVELS_PERSISTENCE = ( MS_PER_SECOND * 2 / TASK_PRIORITY_INTERVAL ); +/// Volume (in mL) of venous portion of blood circuit line. TODO - get actual volume from Systems. +#define VENOUS_LINE_VOLUME_ML ( 200.0 ) -#define AIR_TRAP_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< Interval (ms/task time) at which the air trap data is published on the CAN bus. -#define AIR_TRAP_ILLEGAL_LEVELS_PERSISTENCE ( MS_PER_SECOND * 2 / TASK_PRIORITY_INTERVAL ) ///< Persistence period for illegal level sensors fault. -#define VENOUS_LINE_VOLUME_ML ( 200.0 ) ///< TODO Volume (in mL) of venous portion of blood circuit line. - /// Defined states for the air trap controller state machine. typedef enum AirTrap_States { @@ -46,15 +49,6 @@ NUM_OF_AIR_TRAP_STATES ///< Number of air trap controller states } AIR_TRAP_STATE_T; -/// Defined states for the air trap self-test state machine. -typedef enum AirTrap_Self_Test_States -{ - AIR_TRAP_SELF_TEST_STATE_START = 0, ///< Self-test start state - AIR_TRAP_SELF_TEST_STATE_IN_PROGRESS, ///< Self-test in progress state - AIR_TRAP_SELF_TEST_STATE_COMPLETE, ///< Self-test completed state - NUM_OF_AIR_TRAP_SELF_TEST_STATES ///< Number of air trap self-test states -} AIR_TRAP_SELF_TEST_STATE_T; - // ********** private data ********** static AIR_TRAP_STATE_T airTrapControllerState; ///< Current state of air trap controller state machine. @@ -63,9 +57,6 @@ /// 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 airTrapLevels[ NUM_OF_AIR_TRAP_LEVEL_SENSORS ]; ///< Detected air trap level for each level sensor. - -static AIR_TRAP_SELF_TEST_STATE_T airTrapSelfTestState; ///< Current air trap self-test state. -static U32 airTrapSelfTestTimerCount = 0; ///< Timer counter for air trap self-test. 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. @@ -80,7 +71,6 @@ static AIR_TRAP_STATE_T handleAirTrapValveClosedState( void ); static AIR_TRAP_STATE_T handleAirTrapValveOpenState( void ); static void publishAirTrapData( void ); -static U32 getPublishAirTrapDataInterval( void ); /*********************************************************************//** * @brief @@ -91,9 +81,18 @@ *************************************************************************/ void initAirTrap( void ) { + U32 i; + resetAirTrap(); - airTrapSelfTestState = AIR_TRAP_SELF_TEST_STATE_START; airTrapIllegalLevelSensorsCtr = 0; + + 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; + } } /*********************************************************************//** @@ -198,20 +197,6 @@ /*********************************************************************//** * @brief - * The execAirTrapMonitorPriming function executes the air trap monitor - * for cartridge priming during pre-treatment mode. - * @details Inputs: airTrapLevels[], airTrapFillAlarmCtr - * @details Outputs: airTrapFillAlarmCtr - * @return none - *************************************************************************/ -void execAirTrapMonitorPriming( void ) -{ - // TODO - Implement when priming sub-mode of pre-treatment mode is implemented. - // ActivateAlarmNoData( ALARM_ID_AIR_TRAP_FILL_DURING_PRIME ); -} - -/*********************************************************************//** - * @brief * The execAirTrapMonitorTreatment function executes the air trap monitor * for treatment mode. * @details Inputs: airTrapLevels[], airTrapFillAlarmCtr @@ -228,7 +213,7 @@ if ( TRUE == didTimeout( fillStartTime, fillTimeoutMS ) ) { -#ifndef DISABLE_AIR_TRAP_LEVELING +#ifndef DISABLE_AIR_TRAP_LEVELING_ALARM activateAlarmNoData( ALARM_ID_AIR_TRAP_FILL_DURING_TREATMENT ); #endif } @@ -248,6 +233,7 @@ if ( MODE_FAUL == getCurrentOperationMode() ) { airTrapControllerState = AIR_TRAP_MANUAL_CONTROL_STATE; + setValveAirTrap( STATE_CLOSED ); pendingStartAirTrapController = FALSE; } @@ -375,11 +361,7 @@ if ( sensor < NUM_OF_AIR_TRAP_LEVEL_SENSORS ) { - result = (AIR_TRAP_LEVELS_T)airTrapLevels[ sensor ].data; - if ( OVERRIDE_KEY == airTrapLevels[ sensor ].override ) - { - result = (AIR_TRAP_LEVELS_T)airTrapLevels[ sensor ].ovData; - } + result = (AIR_TRAP_LEVELS_T)getU32OverrideValue( &airTrapLevels[ sensor ] ); } else { @@ -392,26 +374,6 @@ /*********************************************************************//** * @brief - * The getPublishAirTrapDataInterval function gets the air trap data - * publication interval. - * @details Inputs: airTrapDataPublishInterval - * @details Outputs: none - * @return the current air trap data publication interval (in task intervals). - *************************************************************************/ -static U32 getPublishAirTrapDataInterval( void ) -{ - U32 result = airTrapDataPublishInterval.data; - - if ( OVERRIDE_KEY == airTrapDataPublishInterval.override ) - { - result = airTrapDataPublishInterval.ovData; - } - - return result; -} - -/*********************************************************************//** - * @brief * The publishAirTrapData function publishes air trap data at the set interval. * @details Inputs: airTrapLevels[] * @details Outputs: if broadcast is due, send air trap data @@ -420,12 +382,14 @@ static void publishAirTrapData( void ) { // Publish air trap data on interval - if ( ++airTrapDataPublicationTimerCounter >= getPublishAirTrapDataInterval() ) + if ( ++airTrapDataPublicationTimerCounter >= getU32OverrideValue( &airTrapDataPublishInterval ) ) { - AIR_TRAP_LEVELS_T lowLevel = getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_LOWER ); - AIR_TRAP_LEVELS_T highLevel = getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_UPPER ); + AIR_TRAP_PAYLOAD_T data; - broadcastAirTrapData( lowLevel, highLevel ); + data.lowerLevel = getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_LOWER ); + data.upperLevel = getAirTrapLevel( AIR_TRAP_LEVEL_SENSOR_UPPER ); + + broadcastData( MSG_ID_HD_AIR_TRAP_DATA, COMM_BUFFER_OUT_CAN_HD_BROADCAST, (U08*)&data, sizeof( AIR_TRAP_PAYLOAD_T ) ); airTrapDataPublicationTimerCounter = 0; } }