Index: firmware/App/Controllers/AirTrap.c =================================================================== diff -u --- firmware/App/Controllers/AirTrap.c (revision 0) +++ firmware/App/Controllers/AirTrap.c (revision 6d044be7a5c4ef961c2d2569d88be95c9bd86be6) @@ -0,0 +1,356 @@ +/************************************************************************** +* +* 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; +} + +/**@}*/ Index: firmware/App/Controllers/AirTrap.h =================================================================== diff -u --- firmware/App/Controllers/AirTrap.h (revision 0) +++ firmware/App/Controllers/AirTrap.h (revision 6d044be7a5c4ef961c2d2569d88be95c9bd86be6) @@ -0,0 +1,70 @@ +/************************************************************************** +* +* 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.h +* +* @author (last) Sean +* @date (last) 16-Sep-2020 +* +* @author (original) Sean +* @date (original) 16-Sep-2020 +* +***************************************************************************/ + +#ifndef __AIR_TRAP_H__ +#define __AIR_TRAP_H__ + +#include "HDCommon.h" + +/** + * @defgroup AirTrap AirTrap + * @brief Pressure & Occlusion controller/monitor module. Monitors the + * blood line pressure sensors and pump occlusion sensors. + * + * @addtogroup AirTrap + * @{ + */ + +// ********** public definitions ********** + +/// Enumeration of air trap level sensors monitored by this module. +typedef enum AirTrapLevelSensors +{ + AIR_TRAP_LEVEL_SENSOR_LOWER = 0, ///< lower air trap sensor + AIR_TRAP_LEVEL_SENSOR_UPPER, ///< upper air trap sensor + NUM_OF_AIR_TRAP_LEVEL_SENSORS ///< Number of pressure sensors +} AIR_TRAP_LEVEL_SENSORS_T; + +/// Enumeration of air trap level sensor levels. +typedef enum AirTrapLevelSensorLevels +{ + AIR_TRAP_LEVEL_AIR = 0, ///< air trap level sensor detects air + AIR_TRAP_LEVEL_FLUID, ///< air trap level sensor detects fluid + NUM_OF_AIR_TRAP_LEVELS ///< Number of air trap level sensor levels +} AIR_TRAP_LEVELS_T; + +// ********** public function prototypes ********** + +void initAirTrap( void ); +void execAirTrapController( void ); +void execAirTrapMonitor( void ); + +void startAirTrapControl( void ); +void endAirTrapControl( void ); + +SELF_TEST_STATUS_T execAirTrapTest( void ); + +AIR_TRAP_LEVELS_T getAirTrapLevel( AIR_TRAP_LEVEL_SENSORS_T sensor ); + +BOOL testSetAirTrapDataPublishIntervalOverride( U32 value ); +BOOL testResetAirTrapDataPublishIntervalOverride( void ); +BOOL testSetAirTrapLevelOverride( AIR_TRAP_LEVEL_SENSORS_T sensor, AIR_TRAP_LEVELS_T level ); +BOOL testResetAirTrapLevelOverride( AIR_TRAP_LEVEL_SENSORS_T sensor ); + +/**@}*/ + +#endif Index: firmware/App/Controllers/PresOccl.c =================================================================== diff -u -rd91a24c730aeb5cd7e3eba9ef4eca78e442911f8 -r6d044be7a5c4ef961c2d2569d88be95c9bd86be6 --- firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision d91a24c730aeb5cd7e3eba9ef4eca78e442911f8) +++ firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision 6d044be7a5c4ef961c2d2569d88be95c9bd86be6) @@ -64,8 +64,6 @@ static PRESSURE_STATE_T presOcclState = PRESSURE_INIT_STATE; ///< current state of pressure monitor state machine. static U32 presOcclDataPublicationTimerCounter = 0; ///< used to schedule pressure data publication to CAN bus. -static OVERRIDE_F32_T measuredBloodFlowRate = { 0.0, 0.0, 0.0, 0 }; ///< measured blood flow rate - static OVERRIDE_U32_T presOcclDataPublishInterval = { PRES_OCCL_DATA_PUB_INTERVAL, PRES_OCCL_DATA_PUB_INTERVAL, 0, 0 }; ///< interval (in ms) at which to publish pressure/occlusion data to CAN bus. static OVERRIDE_F32_T arterialPressure = {0.0, 0.0, 0.0, 0 }; ///< measured arterial pressure. static OVERRIDE_F32_T venousPressure = {0.0, 0.0, 0.0, 0 }; ///< measured venous pressure. @@ -74,7 +72,7 @@ static OVERRIDE_F32_T dialOutPumpOcclusion = {0.0, 0.0, 0.0, 0 }; ///< measured dialysate outlet pump occlusion pressure. static PRESSURE_SELF_TEST_STATE_T presOcclSelfTestState = PRESSURE_SELF_TEST_STATE_START; ///< current pressure self-test state. -static U32 bloodPumpSelfTestTimerCount = 0; ///< timer counter for pressure self-test. +static U32 presOcclSelfTestTimerCount = 0; ///< timer counter for pressure self-test. static F32 arterialPressureLowLimitmmHG = 0.0; ///< lower alarm limit for arterial pressure. static F32 arterialPressureHighLimitmmHG = 0.0; ///< upper alarm limit for arterial pressure. Index: firmware/App/Controllers/PresOccl.h =================================================================== diff -u -rde5a0d43bdef611d963d11855bc958a8d8899a09 -r6d044be7a5c4ef961c2d2569d88be95c9bd86be6 --- firmware/App/Controllers/PresOccl.h (.../PresOccl.h) (revision de5a0d43bdef611d963d11855bc958a8d8899a09) +++ firmware/App/Controllers/PresOccl.h (.../PresOccl.h) (revision 6d044be7a5c4ef961c2d2569d88be95c9bd86be6) @@ -34,18 +34,18 @@ /// Enumeration of pressure sensors monitored by this module. typedef enum PressureSensors { - PRESSURE_SENSOR_ARTERIAL = 0, ///< arterial blood line pressure sensor. - PRESSURE_SENSOR_VENOUS, ///< vensous blood line pressure sensor. - NUM_OF_PRESSURE_SENSORS ///< Number of pressure sensors. + PRESSURE_SENSOR_ARTERIAL = 0, ///< arterial blood line pressure sensor + PRESSURE_SENSOR_VENOUS, ///< vensous blood line pressure sensor + NUM_OF_PRESSURE_SENSORS ///< Number of pressure sensors } PRESSURE_SENSORS_T; /// Enumeration of occlusion sensors monitored by this module. typedef enum OcclusionSensors { - OCCLUSION_SENSOR_BLOOD_PUMP = 0, ///< blood pump occlusion sensor. - OCCLUSION_SENSOR_DIAL_IN_PUMP, ///< dialysate inlet pump occlusion sensor. - OCCLUSION_SENSOR_DIAL_OUT_PUMP, ///< dialysate outlet pump occlusion sensor. - NUM_OF_OCCLUSION_SENSORS ///< Number of occlusion sensors. + OCCLUSION_SENSOR_BLOOD_PUMP = 0, ///< blood pump occlusion sensor + OCCLUSION_SENSOR_DIAL_IN_PUMP, ///< dialysate inlet pump occlusion sensor + OCCLUSION_SENSOR_DIAL_OUT_PUMP, ///< dialysate outlet pump occlusion sensor + NUM_OF_OCCLUSION_SENSORS ///< Number of occlusion sensors } OCCLUSION_SENSORS_T; // ********** public function prototypes ********** Index: firmware/source/sys_main.c =================================================================== diff -u -rb0b3522f2bd0b5b20ecbfd53c8f55b0e646ffa11 -r6d044be7a5c4ef961c2d2569d88be95c9bd86be6 --- firmware/source/sys_main.c (.../sys_main.c) (revision b0b3522f2bd0b5b20ecbfd53c8f55b0e646ffa11) +++ firmware/source/sys_main.c (.../sys_main.c) (revision 6d044be7a5c4ef961c2d2569d88be95c9bd86be6) @@ -63,6 +63,7 @@ #include "HDCommon.h" #include "Accel.h" +#include "AirTrap.h" #include "AlarmLamp.h" #include "BloodFlow.h" #include "Buttons.h" @@ -183,6 +184,7 @@ initButtons(); initPresOccl(); // initialize controllers + initAirTrap(); initAlarmLamp(); initBloodFlow(); initDialInFlow();