/************************************************************************** * * Copyright (c) 2019-2020 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 * * @author (last) Sean Nash * @date (last) 16-Sep-2020 * * @author (original) Sean * @date (original) 16-Sep-2020 * ***************************************************************************/ #include "AirTrap.h" #include "AlarmMgmt.h" #include "FPGA.h" #include "OperationModes.h" #include "SystemCommMessages.h" #include "TaskGeneral.h" #include "TaskPriority.h" #include "Timers.h" /** * @addtogroup AirTrap * @{ */ // ********** private definitions ********** /// Default publication interval for pressure and occlusion data. #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. /// Defined states for the air trap controller state machine. typedef enum AirTrap_States { AIR_TRAP_INIT_STATE = 0, ///< Initialization state AIR_TRAP_MANUAL_CONTROL_STATE, ///< Manually control air trap valve state AIR_TRAP_VALVE_CLOSED_STATE, ///< Valve closed state - until air detected at lower level AIR_TRAP_VALVE_OPEN_STATE, ///< Valve open state - until fluid detected at upper level 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_TEST_STATE_IN_PROGRESS, ///< Self test in progress state AIR_TRAP_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 = AIR_TRAP_INIT_STATE; ///< current state of air trap controller state machine. static U32 airTrapDataPublicationTimerCounter = 0; ///< used to schedule air trap data publication to CAN bus. static OVERRIDE_U32_T airTrapDataPublishInterval = { AIR_TRAP_DATA_PUB_INTERVAL, AIR_TRAP_DATA_PUB_INTERVAL, 0, 0 }; ///< interval (in ms) at which to publish air trap data to CAN bus. static OVERRIDE_U32_T arterialPressure[ NUM_OF_AIR_TRAP_LEVEL_SENSORS ]; ///< detected air trap level for each level sensor. static AIR_TRAP_SELF_TEST_STATE_T airTrapSelfTestState = AIR_TRAP_SELF_TEST_STATE_START; ///< current air trap self-test state. static U32 airTrapSelfTestTimerCount = 0; ///< timer counter for air trap self-test. // ********** private function prototypes ********** static AIR_TRAP_STATE_T handleAirTrapManualControlState( void ); static AIR_TRAP_STATE_T handleAirTrapValveClosedState( void ); static AIR_TRAP_STATE_T handleAirTrapValveOpenState( void ); static void publishAirTrapData( void ); static U32 getPublishAirTrapDataInterval( void ); /*********************************************************************//** * @brief * The initPresOccl function initializes the initPresOccl module. * @details * Inputs : none * Outputs : initPresOccl module initialized. * @return none *************************************************************************/ void initAirTrap( void ) { } void startAirTrapControl( void ) { } void endAirTrapControl( void ) { } /*********************************************************************//** * @brief * The execPresOccl function executes the pressure and occlusion monitor. * @details * Inputs : presOcclState * Outputs : presOcclState * @return none *************************************************************************/ void execAirTrapMonitor( void ) { } /*********************************************************************//** * @brief * The execPresOccl function executes the pressure and occlusion monitor. * @details * Inputs : presOcclState * Outputs : presOcclState * @return none *************************************************************************/ void execAirTrapController( void ) { // execute state machine switch( airTrapControllerState ) { case AIR_TRAP_INIT_STATE: airTrapControllerState = AIR_TRAP_MANUAL_CONTROL_STATE; break; case AIR_TRAP_MANUAL_CONTROL_STATE: break; case AIR_TRAP_VALVE_CLOSED_STATE: break; case AIR_TRAP_VALVE_OPEN_STATE: break; default: // TODO - s/w fault break; } } /*********************************************************************//** * @brief * The handlePresOcclInitState function handles the pres/occl initialize state * of the pressure/occlusion monitor state machine. * @details * Inputs : TBD * Outputs : TBD * @return next state *************************************************************************/ static AIR_TRAP_STATE_T handleAirTrapManualControlState( void ) { AIR_TRAP_STATE_T result = AIR_TRAP_MANUAL_CONTROL_STATE; return result; } /*********************************************************************//** * @brief * The handlePresOcclContReadState function handles the continuous read state * of the pressure/occlusion monitor state machine. * @details * Inputs : TBD * Outputs : pressure sensor values updated * @return next state *************************************************************************/ static AIR_TRAP_STATE_T handleAirTrapValveClosedState( void ) { AIR_TRAP_STATE_T result = AIR_TRAP_VALVE_CLOSED_STATE; // S32 artPres = getFPGAArterialPressure(); // U16 venPres = getFPGAVenousPressure(); // U16 bldOccl = getFPGABloodPumpOcclusion(); // U16 dliOccl = getFPGADialInPumpOcclusion(); // U16 dloOccl = getFPGADialOutPumpOcclusion(); // // // TODO - convert ADC counts to mmHg for each sensor // arterialPressure.data = ARTERIAL_PRESSURE_V_PER_BIT * ( (F32)(artPres) / ( ARTERIAL_PRESSURE_SENSITIVITY / ARTERIAL_PRESSURE_V_BIAS ) ); // venousPressure.data = ( (F32)(venPres - VENOUS_PRESSURE_OFFSET) * (VENOUS_PRESSURE_MAX - VENOUS_PRESSURE_MIN) / (F32)VENOUS_PRESSURE_SCALE ) - VENOUS_PRESSURE_MIN; // bloodPumpOcclusion.data = (F32)bldOccl; // dialInPumpOcclusion.data = (F32)dliOccl; // dialOutPumpOcclusion.data = (F32)dloOccl; // // // TODO - any filtering required??? // // // check for occlusions // checkOcclusions(); // // // TODO - any other checks return result; } /*********************************************************************//** * @brief * The handlePresOcclContReadState function handles the continuous read state * of the pressure/occlusion monitor state machine. * @details * Inputs : TBD * Outputs : pressure sensor values updated * @return next state *************************************************************************/ static AIR_TRAP_STATE_T handleAirTrapValveOpenState( void ) { AIR_TRAP_STATE_T result = AIR_TRAP_VALVE_OPEN_STATE; return result; } /*********************************************************************//** * @brief * The publishPresOcclData function publishes pressure/occlusion data at the * set interval. * @details * Inputs : TBD * Outputs : Pressure/occlusion data are published to CAN bus. * @return none *************************************************************************/ static void publishAirTrapData( void ) { // publish pressure/occlusion data on interval if ( ++airTrapDataPublicationTimerCounter >= getPublishAirTrapDataInterval() ) { // F32 artPres = getMeasuredArterialPressure(); // F32 venPres = getMeasuredVenousPressure(); // F32 bpOccl = getMeasuredBloodPumpOcclusion(); // F32 diOccl = getMeasuredDialInPumpOcclusion(); // F32 doOccl = getMeasuredDialOutPumpOcclusion(); // // broadcastPresOcclData( artPres, venPres, bpOccl, diOccl, doOccl ); // presOcclDataPublicationTimerCounter = 0; } } /*********************************************************************//** * @brief * The execPresOcclTest function executes the state machine for the * PresOccl self-test. * @details * Inputs : none * Outputs : none * @return the current state of the PresOccl self-test. *************************************************************************/ SELF_TEST_STATUS_T execAirTrapTest( void ) { SELF_TEST_STATUS_T status; return status; } /*********************************************************************//** * @brief * The getPublishPresOcclDataInterval function gets the pressure/occlusion data * publication interval. * @details * Inputs : presOcclDataPublishInterval * Outputs : none * @return the current pressure/occlusion data publication interval (in task intervals). *************************************************************************/ AIR_TRAP_LEVELS_T getAirTrapLevel( AIR_TRAP_LEVEL_SENSORS_T sensor ) { AIR_TRAP_LEVELS_T result; return result; } /*********************************************************************//** * @brief * The getPublishPresOcclDataInterval function gets the pressure/occlusion data * publication interval. * @details * Inputs : presOcclDataPublishInterval * Outputs : none * @return the current pressure/occlusion data publication interval (in task intervals). *************************************************************************/ static U32 getPublishAirTrapDataInterval( void ) { U32 result; return result; } /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ /*********************************************************************//** * @brief * The testSetPresOcclDataPublishIntervalOverride function overrides the * pressure and occlusion data publish interval. * @details * Inputs : none * Outputs : presOcclDataPublishInterval * @param value override pressure and occlusion data publish interval with (in ms) * @return TRUE if override successful, FALSE if not *************************************************************************/ BOOL testSetAirTrapDataPublishIntervalOverride( U32 value ) { BOOL result = FALSE; return result; } /*********************************************************************//** * @brief * The testResetPresOcclDataPublishIntervalOverride function resets the override * of the pressure and occlusion data publish interval. * @details * Inputs : none * Outputs : presOcclDataPublishInterval * @return TRUE if override reset successful, FALSE if not *************************************************************************/ BOOL testResetAirTrapDataPublishIntervalOverride( void ) { BOOL result = FALSE; return result; } /*********************************************************************//** * @brief * The testSetArterialPressureOverride function overrides the measured arterial * pressure. * @details * Inputs : none * Outputs : arterialPressure * @param value override arterial pressure (in mmHg) * @return TRUE if override successful, FALSE if not *************************************************************************/ BOOL testSetAirTrapLevelOverride( AIR_TRAP_LEVEL_SENSORS_T sensor, AIR_TRAP_LEVELS_T level ) { BOOL result = FALSE; return result; } /*********************************************************************//** * @brief * The testResetArterialPressureOverride function resets the override of the * arterial pressure. * @details * Inputs : none * Outputs : arterialPressure * @return TRUE if reset successful, FALSE if not *************************************************************************/ BOOL testResetAirTrapLevelOverride( AIR_TRAP_LEVEL_SENSORS_T sensor ) { BOOL result = FALSE; return result; } /**@}*/