Index: firmware/App/Controllers/PresOccl.c =================================================================== diff -u -rd830f37cf6a42a16399c87985bd51dfd9312ced3 -r55a6adaf81175d25c1d9cc4c96d7dfda84eede16 --- firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision d830f37cf6a42a16399c87985bd51dfd9312ced3) +++ firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision 55a6adaf81175d25c1d9cc4c96d7dfda84eede16) @@ -1,4 +1,4 @@ -/************************************************************************** +/**********************************************************************//** * * Copyright (c) 2020 Diality Inc. - All Rights Reserved. * @@ -22,47 +22,56 @@ #include "TaskGeneral.h" #include "Timers.h" +/** + * @addtogroup PressureOcclusion + * @{ + */ + // ********** private definitions ********** +/// Default publication interval for pressure and occlusion data #define PRES_OCCL_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) // interval (ms/task time) at which the pressure/occlusion data is published on the CAN bus +/// Defined states for the pressure and occlusion monitor state machine typedef enum PresOccl_States { - PRESSURE_INIT_STATE = 0, - PRESSURE_CONTINUOUS_READ_STATE, + PRESSURE_INIT_STATE = 0, /// Initialization state + PRESSURE_CONTINUOUS_READ_STATE, /// Continuous read sensors state NUM_OF_PRESSURE_STATES } PRESSURE_STATE_T; +/// Defined states for the pressure and occlusion self test state machine typedef enum PresOccl_Self_Test_States { - PRESSURE_SELF_TEST_STATE_START = 0, - PRESSURE_TEST_STATE_IN_PROGRESS, - PRESSURE_FLOW_TEST_STATE_COMPLETE, + PRESSURE_SELF_TEST_STATE_START = 0, /// Self test start state + PRESSURE_TEST_STATE_IN_PROGRESS, /// Self test in progress state + PRESSURE_TEST_STATE_COMPLETE, /// Self test completed state NUM_OF_PRESSURE_SELF_TEST_STATES } PRESSURE_SELF_TEST_STATE_T; // ********** private data ********** -static PRESSURE_STATE_T presOcclState = PRESSURE_INIT_STATE; // current state of blood flow controller state machine -static U32 presOcclDataPublicationTimerCounter = 0; // used to schedule blood flow data publication to CAN bus +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 -DATA_DECL( U32, PresOcclDataPub, presOcclDataPublishInterval, PRES_OCCL_DATA_PUB_INTERVAL, PRES_OCCL_DATA_PUB_INTERVAL ); // interval (in ms) at which to publish pressure/occlusion data to CAN bus -DATA_DECL( F32, ArterialPressure, arterialPressure, 0, 0 ); // requested blood flow rate -DATA_DECL( F32, VenousPressure, venousPressure, 0.0, 0.0 ); // measured blood flow rate -DATA_DECL( F32, BloodPumpOcclusion, bloodPumpOcclusion, 0.0, 0.0 ); // measured blood pump rotor speed -DATA_DECL( F32, DialInPumpOcclusion, dialInPumpOcclusion, 0.0, 0.0 ); // measured blood pump motor speed -DATA_DECL( F32, DialOutPumpOcclusion, dialOutPumpOcclusion, 0.0, 0.0 ); // measured blood pump motor controller speed +DATA_DECL( U32, PresOcclDataPub, presOcclDataPublishInterval, PRES_OCCL_DATA_PUB_INTERVAL, PRES_OCCL_DATA_PUB_INTERVAL ); /// interval (in ms) at which to publish pressure/occlusion data to CAN bus +DATA_DECL( F32, ArterialPressure, arterialPressure, 0, 0 ); /// measured arterial pressure +DATA_DECL( F32, VenousPressure, venousPressure, 0.0, 0.0 ); /// measured venous pressure +DATA_DECL( F32, BloodPumpOcclusion, bloodPumpOcclusion, 0.0, 0.0 ); /// measured blood pump occlusion pressure +DATA_DECL( F32, DialInPumpOcclusion, dialInPumpOcclusion, 0.0, 0.0 ); /// measured dialysate inlet pump occlusion pressure +DATA_DECL( F32, DialOutPumpOcclusion, dialOutPumpOcclusion, 0.0, 0.0 ); /// measured dialysate outlet pump occlusion pressure -static PRESSURE_SELF_TEST_STATE_T presOcclSelfTestState = PRESSURE_SELF_TEST_STATE_START; // current blood pump self test state -static U32 bloodPumpSelfTestTimerCount = 0; // timer counter for blood pump self test +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 F32 arterialPressureLowLimitmmHG = 0.0; // lower alarm limit for arterial pressure -static F32 arterialPressureHighLimitmmHG = 0.0; // upper alarm limit for arterial pressure -static F32 venousPressureLowLimitmmHG = 0.0; // lower alarm limit for venous pressure -static F32 venousPressureHighLimitmmHG = 0.0; // upper alarm limit for venous pressure -static F32 bloodPumpOcclusionPressureThresholdmmHG = 50.0; // pressure threshold for blood pump occlusion // TODO - set thresholds for occlusions -static F32 dialInPumpOcclusionPressureThresholdmmHG = 50.0; // pressure threshold for dialysate inlet pump occlusion -static F32 dialOutPumpOcclusionPressureThresholdmmHG = 50.0; // pressure threshold for dialysate outlet pump occlusion +static F32 arterialPressureLowLimitmmHG = 0.0; /// lower alarm limit for arterial pressure +static F32 arterialPressureHighLimitmmHG = 0.0; /// upper alarm limit for arterial pressure +static F32 venousPressureLowLimitmmHG = 0.0; /// lower alarm limit for venous pressure +static F32 venousPressureHighLimitmmHG = 0.0; /// upper alarm limit for venous pressure +// TODO - set thresholds for occlusions +static F32 bloodPumpOcclusionPressureThresholdmmHG = 50.0; /// pressure threshold for blood pump occlusion +static F32 dialInPumpOcclusionPressureThresholdmmHG = 50.0; /// pressure threshold for dialysate inlet pump occlusion +static F32 dialOutPumpOcclusionPressureThresholdmmHG = 50.0; /// pressure threshold for dialysate outlet pump occlusion // ********** private function prototypes ********** @@ -72,7 +81,9 @@ static void publishPresOcclData( void ); static DATA_GET_PROTOTYPE( U32, getPublishPresOcclDataInterval ); -/************************************************************************* +/**@}*/ + +/*********************************************************************//** * @brief initPresOccl * The initPresOccl function initializes the initPresOccl module. * @details @@ -86,7 +97,7 @@ // TODO - anything to initialize? } -/************************************************************************* +/*********************************************************************//** * @brief setPressureLimits * The setPressureLimits function sets the lower and upper alarm limits \n * for a given pressure sensor. @@ -118,7 +129,7 @@ } } -/************************************************************************* +/*********************************************************************//** * @brief setOcclusionThreshold * The setOcclusionThreshold function sets the occlusion pressure threshold \n * for a given occlusion sensor. @@ -151,7 +162,7 @@ } } -/************************************************************************* +/*********************************************************************//** * @brief execPresOccl * The execPresOccl function executes the pressure and occlusion monitor. * @details @@ -182,7 +193,7 @@ publishPresOcclData(); } -/************************************************************************* +/*********************************************************************//** * @brief handlePresOcclInitState * The handlePresOcclInitState function handles the pres/occl initialize state \n * of the pressure/occlusion monitor state machine. @@ -199,7 +210,7 @@ return result; } -/************************************************************************* +/*********************************************************************//** * @brief handlePresOcclContReadState * The handlePresOcclContReadState function handles the continuous read state \n * of the pressure/occlusion monitor state machine. @@ -236,7 +247,7 @@ return result; } -/************************************************************************* +/*********************************************************************//** * @brief checkPressureLimits * The checkPressureLimits function gets the pressure/occlusion data \n * publication interval. @@ -269,7 +280,7 @@ } } -/************************************************************************* +/*********************************************************************//** * @brief getPublishPresOcclDataInterval * The getPublishPresOcclDataInterval function gets the pressure/occlusion data \n * publication interval. @@ -281,7 +292,7 @@ *************************************************************************/ DATA_GET( U32, getPublishPresOcclDataInterval, presOcclDataPublishInterval ) -/************************************************************************* +/*********************************************************************//** * @brief getMeasuredArterialPressure * The getMeasuredArterialPressure function gets the current arterial pressure. * @details @@ -292,7 +303,7 @@ *************************************************************************/ DATA_GET( F32, getMeasuredArterialPressure, arterialPressure ) -/************************************************************************* +/*********************************************************************//** * @brief getMeasuredVenousPressure * The getMeasuredVenousPressure function gets the measured venous pressure. * @details @@ -303,7 +314,7 @@ *************************************************************************/ DATA_GET( F32, getMeasuredVenousPressure, venousPressure ) -/************************************************************************* +/*********************************************************************//** * @brief getMeasuredBloodPumpOcclusion * The getMeasuredBloodPumpOcclusion function gets the measured blood pump \n * occlusion pressure. @@ -315,7 +326,7 @@ *************************************************************************/ DATA_GET( F32, getMeasuredBloodPumpOcclusion, bloodPumpOcclusion ) -/************************************************************************* +/*********************************************************************//** * @brief getMeasuredDialInPumpOcclusion * The getMeasuredDialInPumpOcclusion function gets the measured dialysate \n * inlet pump occlusion pressure. @@ -327,7 +338,7 @@ *************************************************************************/ DATA_GET( F32, getMeasuredDialInPumpOcclusion, dialInPumpOcclusion ) -/************************************************************************* +/*********************************************************************//** * @brief getMeasuredDialOutPumpOcclusion * The getMeasuredDialOutPumpOcclusion function gets the measured dialysate \n * outlet pump occlusion pressure. @@ -339,7 +350,7 @@ *************************************************************************/ DATA_GET( F32, getMeasuredDialOutPumpOcclusion, dialOutPumpOcclusion ) -/************************************************************************* +/*********************************************************************//** * @brief publishPresOcclData * The publishPresOcclData function publishes pressure/occlusion data at the \n * set interval. @@ -365,7 +376,7 @@ } } -/************************************************************************* +/*********************************************************************//** * @brief execPresOcclTest * The execPresOcclTest function executes the state machine for the \n * PresOccl self test. @@ -390,7 +401,7 @@ *************************************************************************/ -/************************************************************************* +/*********************************************************************//** * @brief testSetPresOcclDataPublishIntervalOverride * The testSetPresOcclDataPublishIntervalOverride function overrides the \n * pressure and occlusion data publish interval. @@ -416,7 +427,7 @@ return result; } -/************************************************************************* +/*********************************************************************//** * @brief testResetPresOcclDataPublishIntervalOverride * The testResetPresOcclDataPublishIntervalOverride function resets the override \n * of the pressure and occlusion data publish interval. @@ -439,7 +450,7 @@ return result; } -/************************************************************************* +/*********************************************************************//** * @brief testSetArterialPressureOverride and testResetArterialPressureOverride * The testSetArterialPressureOverride function overrides the measured arterial \n * pressure. @@ -453,7 +464,7 @@ *************************************************************************/ DATA_OVERRIDE_FUNC( F32, testSetArterialPressureOverride, testResetArterialPressureOverride, arterialPressure ) -/************************************************************************* +/*********************************************************************//** * @brief testSetVenousPressureOverride and testResetVenousPressureOverride * The testSetVenousPressureOverride function overrides the measured venous \n * pressure. @@ -467,7 +478,7 @@ *************************************************************************/ DATA_OVERRIDE_FUNC( F32, testSetVenousPressureOverride, testResetVenousPressureOverride, venousPressure ) -/************************************************************************* +/*********************************************************************//** * @brief testSetBloodPumpOcclusionOverride and testResetBloodPumpOcclusionOverride * The testSetBloodPumpOcclusionOverride function overrides the measured \n * blood pump occlusion pressure. \n @@ -481,7 +492,7 @@ *************************************************************************/ DATA_OVERRIDE_FUNC( F32, testSetBloodPumpOcclusionOverride, testResetBloodPumpOcclusionOverride, bloodPumpOcclusion ) -/************************************************************************* +/*********************************************************************//** * @brief testSetDialInPumpOcclusionOverride and testResetDialInPumpOcclusionOverride * The testSetDialInPumpOcclusionOverride function overrides the measured \n * dialysate inlet pump occlusion pressure. \n @@ -495,7 +506,7 @@ *************************************************************************/ DATA_OVERRIDE_FUNC( F32, testSetDialInPumpOcclusionOverride, testResetDialInPumpOcclusionOverride, dialInPumpOcclusion ) -/************************************************************************* +/*********************************************************************//** * @brief testSetDialOutPumpOcclusionOverride and testResetDialOutPumpOcclusionOverride * The testSetDialOutPumpOcclusionOverride function overrides the measured \n * dialysate outlet pump occlusion pressure. \n Index: firmware/App/Controllers/PresOccl.h =================================================================== diff -u -r07a5add2dff254f7be3699e4efac2b99d3554847 -r55a6adaf81175d25c1d9cc4c96d7dfda84eede16 --- firmware/App/Controllers/PresOccl.h (.../PresOccl.h) (revision 07a5add2dff254f7be3699e4efac2b99d3554847) +++ firmware/App/Controllers/PresOccl.h (.../PresOccl.h) (revision 55a6adaf81175d25c1d9cc4c96d7dfda84eede16) @@ -1,4 +1,4 @@ -/************************************************************************** +/**********************************************************************//** * * Copyright (c) 2020 Diality Inc. - All Rights Reserved. * @@ -19,20 +19,31 @@ #include "Common.h" +/** + * @defgroup PressureOcclusion PressureOcclusion + * @brief Pressure & Occlusion controller/monitor module. Monitors the + * blood line pressure sensors and pump occlusion sensors. + * + * @addtogroup PressureOcclusion + * @{ + */ + // ********** public definitions ********** +// Pressure sensors monitored by this module typedef enum PressureSensors { - PRESSURE_SENSOR_ARTERIAL = 0, - PRESSURE_SENSOR_VENOUS, + PRESSURE_SENSOR_ARTERIAL = 0, /// arterial blood line pressure sensor + PRESSURE_SENSOR_VENOUS, /// vensous blood line pressure sensor NUM_OF_PRESSURE_SENSORS } PRESSURE_SENSORS_T; +// Occlusion sensors monitored by this module typedef enum OcclusionSensors { - OCCLUSION_SENSOR_BLOOD_PUMP = 0, - OCCLUSION_SENSOR_DIAL_IN_PUMP, - OCCLUSION_SENSOR_DIAL_OUT_PUMP, + 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 } OCCLUSION_SENSORS_T; @@ -65,4 +76,6 @@ BOOL testSetDialOutPumpOcclusionOverride( F32 value ); BOOL testResetDialOutPumpOcclusionOverride( void ); +/**@}*/ + #endif Index: firmware/App/Services/PIControllers.c =================================================================== diff -u -rd830f37cf6a42a16399c87985bd51dfd9312ced3 -r55a6adaf81175d25c1d9cc4c96d7dfda84eede16 --- firmware/App/Services/PIControllers.c (.../PIControllers.c) (revision d830f37cf6a42a16399c87985bd51dfd9312ced3) +++ firmware/App/Services/PIControllers.c (.../PIControllers.c) (revision 55a6adaf81175d25c1d9cc4c96d7dfda84eede16) @@ -1,12 +1,12 @@ /**********************************************************************//** * - * @file PIControllers.c - * * 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 PIControllers.c + * * @date 18-Dec-2019 * @author L. Baloa * @@ -21,10 +21,17 @@ #include "SystemCommMessages.h" #include "PIControllers.h" +/** + * @addtogroup PIControllers + * @{ + */ + // ********** private definitions ********** +/// minimum integral coefficient - cannot be zero #define MIN_KI NEARLY_ZERO +/// record for PI controller typedef struct { // -- PI's parameters -- F32 Kp; /// Proportional Value @@ -38,7 +45,7 @@ F32 errorSumBeforeWindUp; /// error signal before windup correction F32 errorSum; /// error integral after windup correction F32 controlSignal; /// actual control signal -} PI_CONTROLLER_T; /// record for PI controller +} PI_CONTROLLER_T; #define SET_CONTROLLER( c, id ) ((c) = &piControllers[id]) /// macro to set a local controller pointer to a given piController @@ -52,6 +59,8 @@ { 0.0, 0.0, 0.90, 0.10, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 } // PI_CONTROLLER_ID_DIALYSATE_FLOW }; +/**@}*/ + /*********************************************************************//** * @brief initializePIController * Initialize controller before operation. Make sure to call it before