Index: firmware/App/Controllers/PresOccl.c =================================================================== diff -u -r07a5add2dff254f7be3699e4efac2b99d3554847 -rd830f37cf6a42a16399c87985bd51dfd9312ced3 --- firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision 07a5add2dff254f7be3699e4efac2b99d3554847) +++ firmware/App/Controllers/PresOccl.c (.../PresOccl.c) (revision d830f37cf6a42a16399c87985bd51dfd9312ced3) @@ -352,7 +352,7 @@ static void publishPresOcclData( void ) { // publish pressure/occlusion data on interval - if ( ++presOcclDataPublicationTimerCounter > getPublishPresOcclDataInterval() ) + if ( ++presOcclDataPublicationTimerCounter >= getPublishPresOcclDataInterval() ) { F32 artPres = getMeasuredArterialPressure(); F32 venPres = getMeasuredVenousPressure(); Index: firmware/App/Services/AlarmMgmt.h =================================================================== diff -u -r3e525c0567dd0b7d2153b751169d0ae17648e117 -rd830f37cf6a42a16399c87985bd51dfd9312ced3 --- firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision 3e525c0567dd0b7d2153b751169d0ae17648e117) +++ firmware/App/Services/AlarmMgmt.h (.../AlarmMgmt.h) (revision d830f37cf6a42a16399c87985bd51dfd9312ced3) @@ -187,6 +187,8 @@ SW_FAULT_ID_PRES_OCCL_INVALID_PRES_SENSOR, SW_FAULT_ID_PRES_OCCL_INVALID_OCCL_SENSOR, SW_FAULT_ID_MSG_PENDING_ACK_LIST_FULL, // 50 + SW_FAULT_ID_PI_CTRL_INVALID_CONTROLLER, + SW_FAULT_ID_PI_CTRL_INVALID_SIGNAL, NUM_OF_SW_FAULT_IDS } SW_FAULT_ID_T; Index: firmware/App/Services/PIControllers.c =================================================================== diff -u -r9864b14f76782f1e68bf266dcd843451748715a0 -rd830f37cf6a42a16399c87985bd51dfd9312ced3 --- firmware/App/Services/PIControllers.c (.../PIControllers.c) (revision 9864b14f76782f1e68bf266dcd843451748715a0) +++ firmware/App/Services/PIControllers.c (.../PIControllers.c) (revision d830f37cf6a42a16399c87985bd51dfd9312ced3) @@ -1,17 +1,16 @@ -/************************************************************************** +/**********************************************************************//** * + * @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 * - * @brief PIControllers service module. Creates a digital PI to be used as - * control loops + * @brief PIControllers source file. * **************************************************************************/ @@ -28,35 +27,34 @@ typedef struct { // -- PI's parameters -- - F32 Kp; // Proportional Value - F32 Ki; // Integral Value - F32 uMax; // Maximum control signal - F32 uMin; // Minimum control signal + F32 Kp; /// Proportional Value + F32 Ki; /// Integral Value + F32 uMax; /// Maximum control signal + F32 uMin; /// Minimum control signal // -- PI's signals -- - F32 referenceSignal; // reference signal - F32 measuredSignal; // measured signal - F32 errorSignal; // reference - measured signal - F32 errorSumBeforeWindUp; // error signal before windup correction - F32 errorSum; // error integral after windup correction - F32 controlSignal; // actual control signal -} PI_CONTROLLER_T; + F32 referenceSignal; /// reference signal + F32 measuredSignal; /// measured signal + F32 errorSignal; /// reference - measured signal + 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 -#define SET_CONTROLLER( c, id ) ((c) = &piControllers[id]) +#define SET_CONTROLLER( c, id ) ((c) = &piControllers[id]) /// macro to set a local controller pointer to a given piController // ********** private data ********** -// PI Controllers -- definition - +/// PI Controllers -- initial configurations. static PI_CONTROLLER_T piControllers[ NUM_OF_PI_CONTROLLERS_IDS ] = { // Kp Ki uMax uMin ref meas err esw esum ctrl { 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, // PI_CONTROLLER_ID_LOAD_CELL { 0.0, 0.0, 0.90, 0.10, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, // PI_CONTROLLER_ID_BLOOD_FLOW { 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 \n + * Initialize controller before operation. Make sure to call it before * first call to runController function. * * @param controllerID - ID filter number @@ -86,11 +84,15 @@ controller->uMax = controlMax; resetPIController( controllerID, initialControlSignal ); } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_PI_CTRL_INVALID_CONTROLLER, (U32)controllerID ) + } } -/************************************************************************* +/*********************************************************************//** * @brief resetPIController - * Reset controller before new set point. Make sure to call it before first \n + * Reset controller before new set point. Make sure to call it before first * call to runController function. * * @param controllerID - ID filter number @@ -112,9 +114,13 @@ controller->errorSumBeforeWindUp = controller->errorSum; controller->measuredSignal = 0.0; } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_PI_CTRL_INVALID_CONTROLLER, (U32)controllerID ) + } } -/************************************************************************* +/*********************************************************************//** * @brief runPIController * Call this function whenever a new measured signal sampled is acquired. * @@ -171,11 +177,15 @@ // } //#endif } + else + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_PI_CTRL_INVALID_CONTROLLER, (U32)controllerID ) + } return result; } -/************************************************************************* +/*********************************************************************//** * @brief getPIControllerSignals * Returns the latest requested signal sample. * @@ -228,10 +238,14 @@ break; default: - output = 0; + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_PI_CTRL_INVALID_SIGNAL, (U32)signalID ) break; } // end of switch } + else + { // invalid controller given + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, SW_FAULT_ID_PI_CTRL_INVALID_CONTROLLER, (U32)controllerID ) + } return output; } Index: firmware/App/Services/PIControllers.h =================================================================== diff -u -r832ca83805dc132cb753e79bdca81197331e03e6 -rd830f37cf6a42a16399c87985bd51dfd9312ced3 --- firmware/App/Services/PIControllers.h (.../PIControllers.h) (revision 832ca83805dc132cb753e79bdca81197331e03e6) +++ firmware/App/Services/PIControllers.h (.../PIControllers.h) (revision d830f37cf6a42a16399c87985bd51dfd9312ced3) @@ -1,4 +1,4 @@ -/************************************************************************** +/**********************************************************************//** * * Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. * @@ -19,26 +19,36 @@ #include "Common.h" +/** + * @defgroup PIControllers PIControllers + * @brief PIControllers service module. Provides PI controllers for various actuators.. + * + * @addtogroup PIControllers + * @{ + */ + // ********** public definitions ********** +/// Enumeration of PI controllers typedef enum ControllerList { - PI_CONTROLLER_ID_LOAD_CELL = 0, - PI_CONTROLLER_ID_BLOOD_FLOW, - PI_CONTROLLER_ID_DIALYSATE_FLOW, + PI_CONTROLLER_ID_LOAD_CELL = 0, /// Load cell controller for dialysate outlet pump + PI_CONTROLLER_ID_BLOOD_FLOW, /// Flow controller for blood pump + PI_CONTROLLER_ID_DIALYSATE_FLOW, /// Flow controller for dialysate inlet pump NUM_OF_PI_CONTROLLERS_IDS } PI_CONTROLLER_ID_T; +/// Enumeration of PI controller signals typedef enum ControllerSignals { - CONTROLLER_SIGNAL_REFERENCE = 0, - CONTROLLER_SIGNAL_MEASURED, - CONTROLLER_SIGNAL_ERROR, - CONTROLLER_SIGNAL_ERROR_SUM, - CONTROLLER_SIGNAL_ERROR_SUM_AFTER_WINDUP, - CONTROLLER_SIGNAL_PROPORTIONAL_OUTPUT, - CONTROLLER_SIGNAL_INTEGRAL_OUTPUT, - CONTROLLER_SIGNAL_CONTROL, + CONTROLLER_SIGNAL_REFERENCE = 0, /// Reference value + CONTROLLER_SIGNAL_MEASURED, /// Measured value + CONTROLLER_SIGNAL_ERROR, /// Error value + CONTROLLER_SIGNAL_ERROR_SUM, /// Error sum before anti-windup + CONTROLLER_SIGNAL_ERROR_SUM_AFTER_WINDUP, /// Error sum after anti-windup + CONTROLLER_SIGNAL_PROPORTIONAL_OUTPUT, /// P portion of controller output signal + CONTROLLER_SIGNAL_INTEGRAL_OUTPUT, /// I portion of controller output signal + CONTROLLER_SIGNAL_CONTROL, /// Controller output signal NUM_OF_CONTROLLER_SIGNAL } PI_CONTROLLER_SIGNALS_ID; @@ -50,5 +60,7 @@ F32 runPIController( PI_CONTROLLER_ID_T controllerID, F32 referenceSignal, F32 measuredSignal ); F32 getPIControllerSignals( PI_CONTROLLER_ID_T controllerID, PI_CONTROLLER_SIGNALS_ID signalID ); +/**@}*/ + #endif Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r3e525c0567dd0b7d2153b751169d0ae17648e117 -rd830f37cf6a42a16399c87985bd51dfd9312ced3 --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 3e525c0567dd0b7d2153b751169d0ae17648e117) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision d830f37cf6a42a16399c87985bd51dfd9312ced3) @@ -815,8 +815,6 @@ } } } - - // TODO - process UART (script) messages too } /************************************************************************* Index: firmware/App/Tasks/TaskGeneral.c =================================================================== diff -u -r07a5add2dff254f7be3699e4efac2b99d3554847 -rd830f37cf6a42a16399c87985bd51dfd9312ced3 --- firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision 07a5add2dff254f7be3699e4efac2b99d3554847) +++ firmware/App/Tasks/TaskGeneral.c (.../TaskGeneral.c) (revision d830f37cf6a42a16399c87985bd51dfd9312ced3) @@ -68,7 +68,7 @@ execBloodFlowController(); // control dialysate inlet pump - //execDialInFlowController(); + execDialInFlowController(); // manage alarm state execAlarmMgmt(); Index: firmware/App/Tasks/TaskPriority.c =================================================================== diff -u -r9864b14f76782f1e68bf266dcd843451748715a0 -rd830f37cf6a42a16399c87985bd51dfd9312ced3 --- firmware/App/Tasks/TaskPriority.c (.../TaskPriority.c) (revision 9864b14f76782f1e68bf266dcd843451748715a0) +++ firmware/App/Tasks/TaskPriority.c (.../TaskPriority.c) (revision d830f37cf6a42a16399c87985bd51dfd9312ced3) @@ -53,7 +53,7 @@ execBloodFlowMonitor(); // monitor dialysate inlet pump and flow - //execDialInFlowMonitor(); + execDialInFlowMonitor(); // 2nd pass for FPGA execFPGAOut();