Index: firmware/.settings/org.eclipse.core.resources.prefs =================================================================== diff -u -rdd3356035996866e5db7678d352f933fc22ad789 -r138efd92a8645e0d2fe422409ef5a33dd2929a25 --- firmware/.settings/org.eclipse.core.resources.prefs (.../org.eclipse.core.resources.prefs) (revision dd3356035996866e5db7678d352f933fc22ad789) +++ firmware/.settings/org.eclipse.core.resources.prefs (.../org.eclipse.core.resources.prefs) (revision 138efd92a8645e0d2fe422409ef5a33dd2929a25) @@ -32,6 +32,8 @@ encoding//Release/App/Tasks/subdir_vars.mk=UTF-8 encoding//Release/FWCommon/FlashDriver/subdir_rules.mk=UTF-8 encoding//Release/FWCommon/FlashDriver/subdir_vars.mk=UTF-8 +encoding//Release/FWCommon/FlashDrvr/subdir_rules.mk=UTF-8 +encoding//Release/FWCommon/FlashDrvr/subdir_vars.mk=UTF-8 encoding//Release/FWCommon/subdir_rules.mk=UTF-8 encoding//Release/FWCommon/subdir_vars.mk=UTF-8 encoding//Release/makefile=UTF-8 Index: firmware/App/Controllers/Pressures.c =================================================================== diff -u --- firmware/App/Controllers/Pressures.c (revision 0) +++ firmware/App/Controllers/Pressures.c (revision 138efd92a8645e0d2fe422409ef5a33dd2929a25) @@ -0,0 +1,512 @@ +/**********************************************************************//** + * + * 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 BloodFlow.c + * + * @date 15-Jan-2020 + * @author S. Nash + * + * @brief Monitor for pressure and occlusion sensors. + * + **************************************************************************/ + +#include "Pressures.h" +#include "AlarmMgmt.h" +#include "FPGA.h" +#include "OperationModes.h" +#include "SystemCommMessages.h" +#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, ///< Initialization state. + PRESSURE_CONTINUOUS_READ_STATE, ///< Continuous read sensors state. + NUM_OF_PRESSURE_STATES ///< Number of pressure/occlusion monitor 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, ///< 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 ///< Number of pressure/occlusion self test states. +} PRESSURE_SELF_TEST_STATE_T; + +// ********** private data ********** + +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 ); ///< 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 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. +// 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 ********** + +static PRESSURE_STATE_T handlePresOcclInitState( void ); +static PRESSURE_STATE_T handlePresOcclContReadState( void ); +static void checkOcclusions( void ); +static void publishPresOcclData( void ); +static DATA_GET_PROTOTYPE( U32, getPublishPresOcclDataInterval ); + +/**@}*/ + +/*********************************************************************//** + * @brief + * The initPresOccl function initializes the initPresOccl module. + * @details + * Inputs : none + * Outputs : initPresOccl module initialized. + * @return none + *************************************************************************/ +void initPresOccl( void ) +{ + // TODO - anything to initialize? +} + +/*********************************************************************//** + * @brief + * The setPressureLimits function sets the lower and upper alarm limits \n + * for a given pressure sensor. + * @details + * Inputs : none + * Outputs : pressure limits + * @param sensor : pressure sensor we are setting limits for + * @param low : lower alarm limit (mmHg) + * @param high : upper alarm limit (mmHg) + * @return none + *************************************************************************/ +void setPressureLimits( PRESSURE_SENSORS_T sensor, F32 low, F32 high ) +{ + switch ( sensor ) // TODO - will low/high limits be range checked by caller or should we do it here? what are valid ranges? + { + case PRESSURE_SENSOR_ARTERIAL: + arterialPressureLowLimitmmHG = low; + arterialPressureHighLimitmmHG = high; + break; + + case PRESSURE_SENSOR_VENOUS: + venousPressureLowLimitmmHG = low; + venousPressureHighLimitmmHG = high; + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, 0, sensor ) // TODO - replace 1st param with s/w fault enum + break; + } +} + +/*********************************************************************//** + * @brief + * The setOcclusionThreshold function sets the occlusion pressure threshold \n + * for a given occlusion sensor. + * @details + * Inputs : none + * Outputs : pressure threshold + * @param sensor : occlusion sensor we are setting threshold for + * @param threshold : pressure threshold above which indicates an occlusion (mmHg) + * @return none + *************************************************************************/ +void setOcclusionThreshold( OCCLUSION_SENSORS_T sensor, F32 threshold ) +{ + switch ( sensor ) // TODO - will threshold be range checked by caller or should we do it here? what is valid range? + { + case OCCLUSION_SENSOR_BLOOD_PUMP: + bloodPumpOcclusionPressureThresholdmmHG = threshold; + break; + + case OCCLUSION_SENSOR_DIAL_IN_PUMP: + dialInPumpOcclusionPressureThresholdmmHG = threshold; + break; + + case OCCLUSION_SENSOR_DIAL_OUT_PUMP: + dialOutPumpOcclusionPressureThresholdmmHG = threshold; + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, 0, sensor ) // TODO - replace 1st param with s/w fault enum + break; + } +} + +/*********************************************************************//** + * @brief + * The execPresOccl function executes the pressure and occlusion monitor. + * @details + * Inputs : presOcclState + * Outputs : presOcclState + * @return none + *************************************************************************/ +void execPresOccl( void ) +{ + // state machine + switch ( presOcclState ) + { + case PRESSURE_INIT_STATE: + presOcclState = handlePresOcclInitState(); + break; + + case PRESSURE_CONTINUOUS_READ_STATE: + presOcclState = handlePresOcclContReadState(); + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, 0, presOcclState ) // TODO - replace 1st param with s/w fault enum + break; + } + + // publish pressure/occlusion data on interval + publishPresOcclData(); +} + +/*********************************************************************//** + * @brief + * The handlePresOcclInitState function handles the pres/occl initialize state \n + * of the pressure/occlusion monitor state machine. + * @details + * Inputs : TBD + * Outputs : TBD + * @return next state + *************************************************************************/ +static PRESSURE_STATE_T handlePresOcclInitState( void ) +{ + PRESSURE_STATE_T result = PRESSURE_CONTINUOUS_READ_STATE; + + return result; +} + +/*********************************************************************//** + * @brief + * The handlePresOcclContReadState function handles the continuous read state \n + * of the pressure/occlusion monitor state machine. + * @details + * Inputs : TBD + * Outputs : pressure sensor values updated + * @return next state + *************************************************************************/ +static PRESSURE_STATE_T handlePresOcclContReadState( void ) +{ + PRESSURE_STATE_T result = PRESSURE_CONTINUOUS_READ_STATE; + + U16 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 = (F32)artPres; + venousPressure.data = (F32)venPres; + 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 checkPressureLimits function gets the pressure/occlusion data \n + * publication interval. + * @details + * Inputs : occlusion pressures for the pumps + * Outputs : + * @return none + *************************************************************************/ +static void checkOcclusions( void ) +{ + F32 bpOccl = getMeasuredBloodPumpOcclusion(); + F32 diOccl = getMeasuredDialInPumpOcclusion(); + F32 doOccl = getMeasuredDialOutPumpOcclusion(); + + if ( bpOccl > bloodPumpOcclusionPressureThresholdmmHG ) + { + SET_ALARM_WITH_1_F32_DATA( ALARM_ID_OCCLUSION_BLOOD_PUMP, bpOccl ) + // TODO - stop blood pump immediately, ... + } + if ( diOccl > dialInPumpOcclusionPressureThresholdmmHG ) + { + SET_ALARM_WITH_1_F32_DATA( ALARM_ID_OCCLUSION_DIAL_IN_PUMP, diOccl ) + // TODO - stop dialysate inlet pump immediately, ... + } + if ( doOccl > dialOutPumpOcclusionPressureThresholdmmHG ) + { + SET_ALARM_WITH_1_F32_DATA( ALARM_ID_OCCLUSION_DIAL_OUT_PUMP, doOccl ) + // TODO - stop dialysate outlet pump immediately, ... + } +} + +/*********************************************************************//** + * @brief + * The getPublishPresOcclDataInterval function gets the pressure/occlusion data \n + * publication interval. + * @details + * Inputs : presOcclDataPublishInterval + * Outputs : none + * @return the current pressure/occlusion data publication interval (in ms). + *************************************************************************/ +DATA_GET( U32, getPublishPresOcclDataInterval, presOcclDataPublishInterval ) + +/*********************************************************************//** + * @brief + * The getMeasuredArterialPressure function gets the current arterial pressure. + * @details + * Inputs : arterialPressure + * Outputs : none + * @return the current arterial pressure (in mmHg). + *************************************************************************/ +DATA_GET( F32, getMeasuredArterialPressure, arterialPressure ) + +/*********************************************************************//** + * @brief + * The getMeasuredVenousPressure function gets the measured venous pressure. + * @details + * Inputs : venousPressure + * Outputs : none + * @return the current venous pressure (in mmHg). + *************************************************************************/ +DATA_GET( F32, getMeasuredVenousPressure, venousPressure ) + +/*********************************************************************//** + * @brief + * The getMeasuredBloodPumpOcclusion function gets the measured blood pump \n + * occlusion pressure. + * @details + * Inputs : bloodPumpOcclusion + * Outputs : none + * @return the current blood pump occlusion pressure (in mmHg). + *************************************************************************/ +DATA_GET( F32, getMeasuredBloodPumpOcclusion, bloodPumpOcclusion ) + +/*********************************************************************//** + * @brief + * The getMeasuredDialInPumpOcclusion function gets the measured dialysate \n + * inlet pump occlusion pressure. + * @details + * Inputs : dialInPumpOcclusion + * Outputs : none + * @return the current dialysis inlet pump occlusion pressure (in mmHg). + *************************************************************************/ +DATA_GET( F32, getMeasuredDialInPumpOcclusion, dialInPumpOcclusion ) + +/*********************************************************************//** + * @brief + * The getMeasuredDialOutPumpOcclusion function gets the measured dialysate \n + * outlet pump occlusion pressure. + * @details + * Inputs : dialOutPumpOcclusion + * Outputs : none + * @return the current dialysis outlet pump occlusion pressure (in mmHg). + *************************************************************************/ +DATA_GET( F32, getMeasuredDialOutPumpOcclusion, dialOutPumpOcclusion ) + +/*********************************************************************//** + * @brief + * The publishPresOcclData function publishes pressure/occlusion data at the \n + * set interval. + * @details + * Inputs : TBD + * Outputs : Pressure/occlusion data are published to CAN bus. + * @return none + *************************************************************************/ +static void publishPresOcclData( void ) +{ + // publish pressure/occlusion data on interval + if ( ++presOcclDataPublicationTimerCounter >= getPublishPresOcclDataInterval() ) + { + 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 \n + * PresOccl self test. + * @details + * Inputs : none + * Outputs : none + * @return the current state of the PresOccl self test. + *************************************************************************/ +SELF_TEST_STATUS_T execPresOcclTest( void ) +{ + SELF_TEST_STATUS_T result = SELF_TEST_STATUS_FAILED; + + // TODO - implement self test(s) + + return result; +} + +/**@}*/ + + +/************************************************************************* + * TEST SUPPORT FUNCTIONS + *************************************************************************/ + + +/*********************************************************************//** + * @brief + * The testSetPresOcclDataPublishIntervalOverride function overrides the \n + * 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 testSetPresOcclDataPublishIntervalOverride( U32 value ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + U32 intvl = value / TASK_GENERAL_INTERVAL; + + result = TRUE; + presOcclDataPublishInterval.ovData = intvl; + presOcclDataPublishInterval.override = OVERRIDE_KEY; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetPresOcclDataPublishIntervalOverride function resets the override \n + * of the pressure and occlusion data publish interval. + * @details + * Inputs : none + * Outputs : presOcclDataPublishInterval + * @return TRUE if override reset successful, FALSE if not + *************************************************************************/ +BOOL testResetPresOcclDataPublishIntervalOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + presOcclDataPublishInterval.override = OVERRIDE_RESET; + presOcclDataPublishInterval.ovData = presOcclDataPublishInterval.ovInitData; + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testSetArterialPressureOverride function overrides the measured arterial \n + * pressure. + * The testResetArterialPressureOverride function resets the override of the \n + * arterial pressure. + * @details + * Inputs : none + * Outputs : arterialPressure + * @param value : override arterial pressure (in mmHg) + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +DATA_OVERRIDE_FUNC( F32, testSetArterialPressureOverride, testResetArterialPressureOverride, arterialPressure ) + +/*********************************************************************//** + * @brief + * The testSetVenousPressureOverride function overrides the measured venous \n + * pressure. + * The testResetVenousPressureOverride function resets the override of the \n + * venous pressure. + * @details + * Inputs : none + * Outputs : venousPressure + * @param value : override measured vensous pressure with (in mmHg) + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +DATA_OVERRIDE_FUNC( F32, testSetVenousPressureOverride, testResetVenousPressureOverride, venousPressure ) + +/*********************************************************************//** + * @brief + * The testSetBloodPumpOcclusionOverride function overrides the measured \n + * blood pump occlusion pressure. \n + * The testResetBloodPumpOcclusionOverride function resets the override of the \n + * measured blood pump occlusion pressure. + * @details + * Inputs : none + * Outputs : bloodPumpOcclusion + * @param value : override measured blood pump occlusion pressure with (in mmHg) + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +DATA_OVERRIDE_FUNC( F32, testSetBloodPumpOcclusionOverride, testResetBloodPumpOcclusionOverride, bloodPumpOcclusion ) + +/*********************************************************************//** + * @brief + * The testSetDialInPumpOcclusionOverride function overrides the measured \n + * dialysate inlet pump occlusion pressure. \n + * The testResetDialInPumpOcclusionOverride function resets the override of the \n + * measured dialysate inlet pump occlusion pressure. + * @details + * Inputs : none + * Outputs : dialInPumpOcclusion + * @param value : override measured dialysate inlet pump occlusion pressure (in mmHg) + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +DATA_OVERRIDE_FUNC( F32, testSetDialInPumpOcclusionOverride, testResetDialInPumpOcclusionOverride, dialInPumpOcclusion ) + +/*********************************************************************//** + * @brief + * The testSetDialOutPumpOcclusionOverride function overrides the measured \n + * dialysate outlet pump occlusion pressure. \n + * The testResetDialOutPumpOcclusionOverride function resets the override of the \n + * measured dialysate outlet pump occlusion pressure. + * @details + * Inputs : none + * Outputs : dialOutPumpOcclusion + * @param value : override measured dialysate outlet pump occlusion pressure (in mmHg) + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +DATA_OVERRIDE_FUNC( F32, testSetDialOutPumpOcclusionOverride, testResetDialOutPumpOcclusionOverride, dialOutPumpOcclusion ) + + Index: firmware/App/Controllers/Pressures.h =================================================================== diff -u --- firmware/App/Controllers/Pressures.h (revision 0) +++ firmware/App/Controllers/Pressures.h (revision 138efd92a8645e0d2fe422409ef5a33dd2929a25) @@ -0,0 +1,81 @@ +/**********************************************************************//** + * + * 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 PresOccl.h + * + * @date 15-Jan-2020 + * @author S. Nash + * + * @brief PresOccl header file. + * + **************************************************************************/ + +#ifndef __PRESSURE_OCCLUSION_H__ +#define __PRESSURE_OCCLUSION_H__ + +#include "DGCommon.h" + +/** + * @defgroup PressureOcclusion PressureOcclusion + * @brief Pressure & Occlusion controller/monitor module. Monitors the + * blood line pressure sensors and pump occlusion sensors. + * + * @addtogroup PressureOcclusion + * @{ + */ + +// ********** public definitions ********** + +/// 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_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_SENSORS_T; + +// ********** public function prototypes ********** + +void initPresOccl( void ); +void execPresOccl( void ); + +void setPressureLimits( PRESSURE_SENSORS_T sensor, F32 low, F32 high ); +void setOcclusionThreshold( OCCLUSION_SENSORS_T sensor, F32 threshold ); + +SELF_TEST_STATUS_T execPresOcclTest( void ); + +DATA_GET_PROTOTYPE( F32, getMeasuredArterialPressure ); +DATA_GET_PROTOTYPE( F32, getMeasuredVenousPressure); +DATA_GET_PROTOTYPE( F32, getMeasuredBloodPumpOcclusion ); +DATA_GET_PROTOTYPE( F32, getMeasuredDialInPumpOcclusion ); +DATA_GET_PROTOTYPE( F32, getMeasuredDialOutPumpOcclusion ); + +BOOL testSetPresOcclDataPublishIntervalOverride( U32 value ); +BOOL testResetPresOcclDataPublishIntervalOverride( void ); +BOOL testSetArterialPressureOverride( F32 value ); +BOOL testResetArterialPressureOverride( void ); +BOOL testSetVenousPressureOverride( F32 value ); +BOOL testResetVenousPressureOverride( void ); +BOOL testSetBloodPumpOcclusionOverride( F32 value ); +BOOL testResetBloodPumpOcclusionOverride( void ); +BOOL testSetDialInPumpOcclusionOverride( F32 value ); +BOOL testResetDialInPumpOcclusionOverride( void ); +BOOL testSetDialOutPumpOcclusionOverride( F32 value ); +BOOL testResetDialOutPumpOcclusionOverride( void ); + +/**@}*/ + +#endif Index: firmware/App/Controllers/ROPump.c =================================================================== diff -u --- firmware/App/Controllers/ROPump.c (revision 0) +++ firmware/App/Controllers/ROPump.c (revision 138efd92a8645e0d2fe422409ef5a33dd2929a25) @@ -0,0 +1,598 @@ +/************************************************************************** + * + * 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 ROPump.c + * + * @date 03-Apr-2020 + * @author S. Nash + * + * @brief Monitor/Controller for RO pump. + * + **************************************************************************/ + +#ifndef _VECTORCAST_ + #include +#endif + +#include "etpwm.h" + +#include "FPGA.h" +#include "InternalADC.h" +#include "OperationModes.h" +#include "PIControllers.h" +#include "SystemCommMessages.h" +#include "TaskGeneral.h" +#include "TaskPriority.h" +#include "Timers.h" +#include "ROPump.h" + +// ********** private definitions ********** + +#define RO_PUMP_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< interval (ms/task time) at which the RO Pump data is published on the CAN bus + +#define MAX_RO_PUMP_PWM_STEP_CHANGE 0.01 ///< max duty cycle change for controller +#define MAX_RO_PUMP_PWM_DUTY_CYCLE 0.99 ///< max duty cycle +#define MIN_RO_PUMP_PWM_DUTY_CYCLE 0.00 ///< min duty cycle + +#define ROP_CONTROL_INTERVAL ( 1000 / TASK_GENERAL_INTERVAL ) ///< interval (ms/task time) at which the RO pump is controlled +#define ROP_P_COEFFICIENT 0.00005 ///< P term for RO pump control +#define ROP_I_COEFFICIENT 0.00015 ///< I term for RO pump control + +#define ROP_SPEED_ADC_TO_RPM_FACTOR 1.0 ///< conversion factor from ADC counts to RPM for RO pump + +#define RO_PUMP_ADC_FULL_SCALE_V 3.0 ///< RO pump analog signals are 0-3V (while int. ADC ref may be different) +#define RO_PUMP_ADC_ZERO ( (F32)( INT_ADC_ZERO ) * ( RO_PUMP_ADC_FULL_SCALE_V / INT_ADC_REF_V ) ) +#define SIGN_FROM_12_BIT_VALUE(v) ( (S16)(v) - (S16)RO_PUMP_ADC_ZERO ) + +typedef enum ROPump_States +{ + RO_PUMP_OFF_STATE = 0, + RO_PUMP_CONTROL_TO_TARGET_STATE, + NUM_OF_RO_PUMP_STATES +} RO_PUMP_STATE_T; + +typedef enum ROPump_Self_Test_States +{ + RO_PUMP_SELF_TEST_STATE_START = 0, + RO_PUMP_TEST_STATE_IN_PROGRESS, + RO_PUMP_TEST_STATE_COMPLETE, + NUM_OF_RO_PUMP_SELF_TEST_STATES +} RO_PUMP_SELF_TEST_STATE_T; + +// ********** private data ********** + +static RO_PUMP_STATE_T roPumpState = RO_PUMP_OFF_STATE; ///< current state of RO flow controller state machine +static U32 roPumpDataPublicationTimerCounter = 0; ///< used to schedule RO flow data publication to CAN bus +static BOOL isROPumpOn = FALSE; ///< RO pump is currently running +static F32 roPumpPWMDutyCyclePct = 0.0; ///< initial RO pump PWM duty cycle +static F32 roPumpPWMDutyCyclePctSet = 0.0; ///< currently set RO pump PWM duty cycle +static PUMP_CONTROL_MODE_T roPumpControlMode = PUMP_CONTROL_MODE_CLOSED_LOOP; ///< requested RO pump control mode. +static PUMP_CONTROL_MODE_T roPumpControlModeSet = PUMP_CONTROL_MODE_CLOSED_LOOP; ///< currently set RO pump control mode. + +static OVERRIDE_U32_T roPumpDataPublishInterval = { 0, 0, 0, 0 }; ///< interval (in ms) at which to publish RO flow data to CAN bus. +static OVERRIDE_U32_T targetROPumpPressure = { 0, 0, 0, 0 }; ///< Target RO pressure (in PSI). +static OVERRIDE_F32_T measuredROPumpPressure = { 0.0, 0.0, 0.0, 0 }; ///< Tmeasured RO pressure (in PSI). +static OVERRIDE_F32_T roPumpSpeedRPM = { 0.0, 0.0, 0.0, 0 }; ///< measured RO pump motor speed (in RPM). + +static U32 roControlTimerCounter = 0; ///< determines when to perform control on ro flow + +static RO_PUMP_SELF_TEST_STATE_T roPumpSelfTestState = RO_PUMP_SELF_TEST_STATE_START; ///< current ro pump self test state +static U32 roPumpSelfTestTimerCount = 0; ///< timer counter for ro pump self test + +// ********** private function prototypes ********** + +static RO_PUMP_STATE_T handleROPumpOffState( void ); +static RO_PUMP_STATE_T handleROPumpControlToTargetState( void ); +static void setROPumpControlSignalPWM( F32 newPWM ); +static void stopROPump( void ); +static void publishROPumpData( void ); +static DATA_GET_PROTOTYPE( U32, getPublishROPumpDataInterval ); + +/************************************************************************* + * @brief initROPump + * The initROPump function initializes the ROPump module. + * @details + * Inputs : none + * Outputs : ROPump module initialized. + * @param none + * @return none + *************************************************************************/ +void initROPump( void ) +{ + stopROPump(); + + // initialize RO pump PI controller + initializePIController( PI_CONTROLLER_ID_RO_PUMP, MIN_RO_PUMP_PWM_DUTY_CYCLE, + ROP_P_COEFFICIENT, ROP_I_COEFFICIENT, + MIN_RO_PUMP_PWM_DUTY_CYCLE, MAX_RO_PUMP_PWM_DUTY_CYCLE ); +} + +/************************************************************************* + * @brief + * The setROPumpTargetPressure function sets a new target pressure and + * pump direction. + * @details + * Inputs : none + * Outputs : targetROPumpPressure, roPumpPWMDutyCyclePct + * @param roPressure : new target ro pressure + * @param mode : new control mode + * @return TRUE if new pressure & dir are set, FALSE if not + *************************************************************************/ +BOOL setROPumpTargetPressure( U32 roPressure, PUMP_CONTROL_MODE_T mode ) +{ + BOOL result = FALSE; + + // verify pressure + if ( roPressure >= MIN_RO_PRESSURE && roPressure <= MAX_RO_PRESSURE ) + { + targetROPumpPressure.data = roPressure; + roPumpControlMode = mode; + // set PWM duty cycle target to an estimated initial target based on target pressure - then we'll control to pressure going forward + roPumpPWMDutyCyclePct = 0; // TODO - determine formula for estimating target PWM + + result = TRUE; + } + else // requested pressure out of range + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, 0, roPressure ) // TODO - replace 1st param with s/w fault enum + } + + return result; +} + +/************************************************************************* + * @brief + * The signalROPumpHardStop function stops the RO pump immediately. + * @details + * Inputs : none + * Outputs : RO pump stopped, set point reset, state changed to off + * @param none + * @return none + *************************************************************************/ +void signalROPumpHardStop( void ) +{ + targetROPumpPressure.data = 0; + stopROPump(); + roPumpState = RO_PUMP_OFF_STATE; + roPumpPWMDutyCyclePct = 0.0; + roControlTimerCounter = 0; + resetPIController( PI_CONTROLLER_ID_RO_PUMP, MIN_RO_PUMP_PWM_DUTY_CYCLE ); +} + +/************************************************************************* + * @brief + * The execROPumpMonitor function executes the RO Pump monitor. + * @details + * Inputs : none + * Outputs : measuredROPumpPressure + * @param none + * @return none + *************************************************************************/ +void execROPumpMonitor( void ) +{ + U16 roRPM = getFPGAROPumpSpeed(); + F32 roPressure = getFPGAROOutPressure(); + + roPumpSpeedRPM.data = (F32)((S16)roRPM); + measuredROPumpPressure.data = (F32)((S16)roPressure); + + // TODO - check pressure + + // publish RO flow data on interval + publishROPumpData(); +} + +/************************************************************************* + * @brief + * The execROPumpController function executes the RO Pump controller. + * @details + * Inputs : roPumpState + * Outputs : roPumpState + * @param none + * @return none + *************************************************************************/ +void execROPumpController( void ) +{ + switch ( roPumpState ) + { + case RO_PUMP_OFF_STATE: + roPumpState = handleROPumpOffState(); + break; + + case RO_PUMP_CONTROL_TO_TARGET_STATE: + roPumpState = handleROPumpControlToTargetState(); + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, 0, roPumpState ) // TODO - replace 1st param with s/w fault enum + break; + } +} + +/************************************************************************* + * @brief + * The handleROPumpOffState function handles the ro pump off state \n + * of the ro pump controller state machine. + * @details + * Inputs : targetROPumpPressure, roPumpDirection + * Outputs : roPumpPWMDutyCyclePctSet, roPumpDirectionSet, isROPumpOn + * @param none + * @return next state + *************************************************************************/ +static RO_PUMP_STATE_T handleROPumpOffState( void ) +{ + RO_PUMP_STATE_T result = RO_PUMP_OFF_STATE; + + // if we've been given a pressure, transition to control to target state + if ( getTargetROPressure() > 0 ) + { + // set initial PWM duty cycle + roPumpPWMDutyCyclePctSet = roPumpPWMDutyCyclePct; + setROPumpControlSignalPWM( roPumpPWMDutyCyclePctSet ); + // reset controller + resetPIController( PI_CONTROLLER_ID_RO_PUMP, MIN_RO_PUMP_PWM_DUTY_CYCLE ); + // set pump to on + isROPumpOn = TRUE; + result = RO_PUMP_CONTROL_TO_TARGET_STATE; + } + + return result; +} + +/************************************************************************* + * @brief + * The handleROPumpControlToTargetState function handles the "control to \n + * target" state of the ro pump controller state machine. + * @details + * Inputs : none + * Outputs : roPumpState + * @param none + * @return next state + *************************************************************************/ +static RO_PUMP_STATE_T handleROPumpControlToTargetState( void ) +{ + RO_PUMP_STATE_T result = RO_PUMP_CONTROL_TO_TARGET_STATE; + + // control at set interval + if ( ++roControlTimerCounter >= ROP_CONTROL_INTERVAL ) + { + if ( roPumpControlModeSet == PUMP_CONTROL_MODE_CLOSED_LOOP ) + { + F32 tgtFlow = (F32)getTargetROPressure(); + F32 actFlow = getMeasuredROPressure(); + F32 newPWM; + + newPWM = runPIController( PI_CONTROLLER_ID_RO_PUMP, tgtFlow, actFlow ); + roPumpPWMDutyCyclePctSet = newPWM; + setROPumpControlSignalPWM( newPWM ); + } + roControlTimerCounter = 0; + } + + return result; +} + +/************************************************************************* + * @brief + * The setROPumpControlSignalPWM function sets the PWM duty cycle for \n + * the RO pump to a given %. + * @details + * Inputs : none + * Outputs : PWM duty cycle zeroed + * @param newPWM : new duty cycle % to apply to PWM + * @return none + *************************************************************************/ +static void setROPumpControlSignalPWM( F32 newPWM ) +{ + etpwmSetCmpB( etpwmREG2, (U32)( (S32)( ( newPWM * (F32)(etpwmREG2->TBPRD) ) + FLOAT_TO_INT_ROUNDUP_OFFSET ) ) ); +} + +/************************************************************************* + * @brief + * The stopROPump function sets the RO pump PWM to zero. + * @details + * Inputs : none + * Outputs : PWM duty cycle zeroed + * @param none + * @return none + *************************************************************************/ +static void stopROPump( void ) +{ + isROPumpOn = FALSE; + roPumpPWMDutyCyclePctSet = 0.0; + etpwmSetCmpB( etpwmREG2, 0 ); +} + +/************************************************************************* + * @brief + * The getPublishROPumpDataInterval function gets the RO pump data \n + * publication interval. + * @details + * Inputs : roPumpDataPublishInterval + * Outputs : none + * @param none + * @return the current RO pump data publication interval (in ms). + *************************************************************************/ +DATA_GET( U32, getPublishROPumpDataInterval, roPumpDataPublishInterval ) + +/************************************************************************* + * @brief + * The getTargetROPumpPressure function gets the current target RO pump \n + * pressure. + * @details + * Inputs : targetROPumpPressure + * Outputs : none + * @param none + * @return the current target RO pressure (in PSI). + *************************************************************************/ +DATA_GET( S32, getTargetROPumpPressure, targetROPumpPressure ) + +/************************************************************************* + * @brief + * The getMeasuredROPumpPressure function gets the measured RO pump \n + * pressure. + * @details + * Inputs : measuredROPumpPressure + * Outputs : none + * @param none + * @return the current RO pressure (in PSI). + *************************************************************************/ +DATA_GET( F32, getMeasuredROPumpPressure, measuredROPumpPressure ) + +/************************************************************************* + * @brief + * The getMeasuredROPumpSpeed function gets the measured RO pump \n + * speed. + * @details + * Inputs : roPumpSpeedRPM + * Outputs : none + * @param none + * @return the current RO pump speed (in RPM). + *************************************************************************/ +DATA_GET( F32, getMeasuredROPumpSpeed, roPumpSpeedRPM ) + +/************************************************************************* + * @brief + * The publishROPumpData function publishes RO pump data at the set \n + * interval. + * @details + * Inputs : target pressure, measured pressure, measured RO pump speed. + * Outputs : RO pump data is published to CAN bus. + * @return none + *************************************************************************/ +static void publishROPumpData( void ) +{ + // publish RO pump data on interval + if ( ++roPumpDataPublicationTimerCounter >= getPublishROPumpDataInterval() ) + { + S32 presStPt = (S32)getTargetROPumpPressure(); + F32 measPres = getMeasuredROPumpPressure(); + F32 measSpd = getMeasuredROPumpSpeed(); + F32 pumpPWMPctDutyCycle = roPumpPWMDutyCyclePctSet * FRACTION_TO_PERCENT_FACTOR; + broadcastROPumpData( presStPt, measPres, measSpd, pumpPWMPctDutyCycle ); + roPumpDataPublicationTimerCounter = 0; + } +} + +/************************************************************************* + * @brief + * The execROPumpTest function executes the state machine for the ROPump self test. + * @details + * Inputs : none + * Outputs : none + * @return the current state of the ROPump self test. + *************************************************************************/ +SELF_TEST_STATUS_T execROPumpTest( void ) +{ + SELF_TEST_STATUS_T result = SELF_TEST_STATUS_FAILED; + + // TODO - implement self test(s) + + return result; +} + + +/************************************************************************* + * TEST SUPPORT FUNCTIONS + *************************************************************************/ + + +/************************************************************************* + * @brief + * The testSetROPumpDataPublishIntervalOverride function overrides the \n + * RO pump data publish interval. + * @details + * Inputs : none + * Outputs : roPumpDataPublishInterval + * @param value : override RO pump data publish interval with (in ms) + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetROPumpDataPublishIntervalOverride( U32 value ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + U32 intvl = value / TASK_PRIORITY_INTERVAL; + + result = TRUE; + roPumpDataPublishInterval.ovData = intvl; + roPumpDataPublishInterval.override = OVERRIDE_KEY; + } + + return result; +} + +/************************************************************************* + * @brief + * The testResetROPumpDataPublishIntervalOverride function resets the override \n + * of the RO pump data publish interval. + * @details + * Inputs : none + * Outputs : roPumpDataPublishInterval + * @return TRUE if override reset successful, FALSE if not + *************************************************************************/ +BOOL testResetROPumpDataPublishIntervalOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + roPumpDataPublishInterval.override = OVERRIDE_RESET; + roPumpDataPublishInterval.ovData = roPumpDataPublishInterval.ovInitData; + } + + return result; +} + +/************************************************************************* + * @brief + * The testSetTargetROPumpPressureOverride function overrides the target \n + * RO pressure. \n + * @details + * Inputs : none + * Outputs : targetROPumpPressure + * @param value : override target RO pressure (in PSI) + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetTargetROPumpPressureOverride( S32 value ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + targetROPumpPressure.ovInitData = targetROPumpPressure.data; // backup current target pressure + targetROPumpPressure.ovData = value; + targetROPumpPressure.override = OVERRIDE_KEY; + result = setROPumpTargetPressure( value, roPumpControlMode ); + } + + return result; +} + +/************************************************************************* + * @brief + * The testResetTargetROPumpPressureOverride function resets the override of the \n + * target RO pressure. + * @details + * Inputs : none + * Outputs : targetROPumpPressure + * @param none + * @return TRUE if override reset successful, FALSE if not + *************************************************************************/ +BOOL testResetTargetROPumpPressureOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + targetROPumpPressure.data = targetROPumpPressure.ovInitData; // restore pre-override target pressure + targetROPumpPressure.override = OVERRIDE_RESET; + targetROPumpPressure.ovInitData = 0; + targetROPumpPressure.ovData = 0; + result = setROPumpTargetPressure( targetROPumpPressure.data, roPumpControlMode ); + } + + return result; +} + +/************************************************************************* + * @brief + * The testResetMeasuredROPumpPressureOverride function overrides the measured \n + * ro pressure. + * @details + * Inputs : none + * Outputs : measuredROPumpPressure + * @param value : override measured RO pressure (in PSI) + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetMeasuredROPumpPressureOverride( F32 value ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + measuredROPumpPressure.ovData = value; + measuredROPumpPressure.override = OVERRIDE_KEY; + } + + return result; +} + +/************************************************************************* + * @brief + * The testResetOffButtonStateOverride function resets the override of the \n + * measured RO pressure. + * @details + * Inputs : none + * Outputs : measuredROPumpPressure + * @param none + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testResetMeasuredROPumpPressureOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + measuredROPumpPressure.override = OVERRIDE_RESET; + measuredROPumpPressure.ovData = measuredROPumpPressure.ovInitData; + } + + return result; +} + +/************************************************************************* + * @brief + * The testSetMeasuredROPumpSpeedOverride function overrides the measured \n + * RO pump motor speed. + * @details + * Inputs : none + * Outputs : roPumpSpeedRPM + * @param value : override measured RO pump motor speed (in RPM) + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetMeasuredROPumpSpeedOverride( F32 value ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + roPumpSpeedRPM.ovData = value; + roPumpSpeedRPM.override = OVERRIDE_KEY; + } + + return result; +} + +/************************************************************************* + * @brief + * The testResetMeasuredROPumpSpeedOverride function resets the override of the \n + * measured RO pump motor speed. + * @details + * Inputs : none + * Outputs : roPumpSpeedRPM + * @param none + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testResetMeasuredROPumpSpeedOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + result = TRUE; + roPumpSpeedRPM.override = OVERRIDE_RESET; + roPumpSpeedRPM.ovData = roPumpSpeedRPM.ovInitData; + } + + return result; +} Index: firmware/App/Controllers/ROPump.h =================================================================== diff -u --- firmware/App/Controllers/ROPump.h (revision 0) +++ firmware/App/Controllers/ROPump.h (revision 138efd92a8645e0d2fe422409ef5a33dd2929a25) @@ -0,0 +1,51 @@ +/************************************************************************** + * + * 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 ROPump.h + * + * @date 03-Apr-2020 + * @author S. Nash + * + * @brief ROPump header file. + * + **************************************************************************/ + +#ifndef __RO_PUMP_H__ +#define __RO_PUMP_H__ + +#include "DGCommon.h" + +// ********** public definitions ********** + +#define MAX_RO_PRESSURE 140 // PSI +#define MIN_RO_PRESSURE 100 // PSI + +// ********** public function prototypes ********** + +void initROPump( void ); +void execROPumpMonitor( void ); +void execROPumpController( void ); + +BOOL setROPumpTargetPressure( U32 flowRate, PUMP_CONTROL_MODE_T mode ); +void signalROPumpHardStop( void ); + +SELF_TEST_STATUS_T execROPumpTest( void ); + +DATA_GET_PROTOTYPE( S32, getTargetROPressure ); +DATA_GET_PROTOTYPE( F32, getMeasuredROPressure); +DATA_GET_PROTOTYPE( F32, getMeasuredROPumpSpeed ); + +BOOL testSetROPumpDataPublishIntervalOverride( U32 value ); +BOOL testResetROPumpDataPublishIntervalOverride( void ); +BOOL testSetTargetROPressureOverride( S32 value ); +BOOL testResetTargetROPressureOverride( void ); +BOOL testSetMeasuredROPressureOverride( F32 value ); +BOOL testResetMeasuredROPressureOverride( void ); +BOOL testSetMeasuredROPumpSpeedOverride( F32 value ); +BOOL testResetMeasuredROPumpSpeedOverride( void ); + +#endif Index: firmware/App/Modes/ModeChemicalDisinfect.c =================================================================== diff -u --- firmware/App/Modes/ModeChemicalDisinfect.c (revision 0) +++ firmware/App/Modes/ModeChemicalDisinfect.c (revision 138efd92a8645e0d2fe422409ef5a33dd2929a25) @@ -0,0 +1,64 @@ +/************************************************************************** + * + * 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 ModeChemicalDisinfect.c + * + * @date 03-Apr-2020 + * @author S. Nash + * + * @brief Top-level state machine for the chemical disinfect mode. + * + **************************************************************************/ + +#include "ModeChemicalDisinfect.h" +#include "OperationModes.h" + +// ********** private data ********** + +// ********** private function prototypes ********** + +/************************************************************************* + * @brief + * The initChemicalDisinfectMode function initializes the chemical disinfect Mode module. + * @details + * Inputs : none + * Outputs : Module initialized. + * @param none + * @return none + *************************************************************************/ +void initChemicalDisinfectMode( void ) +{ +} + +/************************************************************************* + * @brief + * The transitionToChemicalDisinfectMode function prepares for transition to \n + * chemical disinfect mode. + * @details + * Inputs : none + * Outputs : none + * @param none + * @return none + *************************************************************************/ +void transitionToChemicalDisinfectMode( void ) +{ +} + +/************************************************************************* + * @brief + * The execChemicalDisinfectMode function executes the chemical disinfect Mode state machine. + * @details + * Inputs : none + * Outputs : none + * @param none + * @return none + *************************************************************************/ +void execChemicalDisinfectMode( void ) +{ + +} + Index: firmware/App/Modes/ModeChemicalDisinfect.h =================================================================== diff -u --- firmware/App/Modes/ModeChemicalDisinfect.h (revision 0) +++ firmware/App/Modes/ModeChemicalDisinfect.h (revision 138efd92a8645e0d2fe422409ef5a33dd2929a25) @@ -0,0 +1,28 @@ +/************************************************************************** + * + * 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 ModeChemicalDisinfect.h + * + * @date 03-Apr-2020 + * @author S. Nash + * + * @brief Header file for Chemical Disinfect Mode. + * + **************************************************************************/ + +#ifndef __MODE_CHEMICAL_DISINFECT_H__ +#define __MODE_CHEMICAL_DISINFECT_H__ + +#include "DGCommon.h" + +// ********** private function prototypes ********** + +void initChemicalDisinfectMode( void ); // initialize this module +void transitionToChemicalDisinfectMode( void ); // prepares for transition to chemical disinfection mode +void execChemicalDisinfectMode( void ); // execute the chemical disinfection mode state machine (call from OperationModes) + +#endif Index: firmware/App/Modes/ModeDisinfect.h =================================================================== diff -u -rb64c49fdcf2b6d95e61e63f8e258c4e600935bbd -r138efd92a8645e0d2fe422409ef5a33dd2929a25 --- firmware/App/Modes/ModeDisinfect.h (.../ModeDisinfect.h) (revision b64c49fdcf2b6d95e61e63f8e258c4e600935bbd) +++ firmware/App/Modes/ModeDisinfect.h (.../ModeDisinfect.h) (revision 138efd92a8645e0d2fe422409ef5a33dd2929a25) @@ -5,7 +5,7 @@ * 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 ModeDisinfectt.h + * @file ModeDisinfect.h * * @date 20-Dec-2019 * @author L. Baloa @@ -22,7 +22,7 @@ // ********** private function prototypes ********** void initDisinfectMode( void ); // initialize this module -void transitionToDisinfectMode( void ); // prepares for transition to treatment mode -void execDisinfectMode( void ); // execute the treatment mode state machine (call from OperationModes) +void transitionToDisinfectMode( void ); // prepares for transition to disinfect mode +void execDisinfectMode( void ); // execute the disinfect mode state machine (call from OperationModes) #endif Index: firmware/App/Modes/ModeFill.h =================================================================== diff -u -rf43eb1e9e0803776ec7420b16e1db8760b020bd9 -r138efd92a8645e0d2fe422409ef5a33dd2929a25 --- firmware/App/Modes/ModeFill.h (.../ModeFill.h) (revision f43eb1e9e0803776ec7420b16e1db8760b020bd9) +++ firmware/App/Modes/ModeFill.h (.../ModeFill.h) (revision 138efd92a8645e0d2fe422409ef5a33dd2929a25) @@ -5,7 +5,7 @@ * 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 FillMode.h + * @file ModeFill.h * * @date 19-Nov-2019 * @author L. Baloa Fisheye: Tag 138efd92a8645e0d2fe422409ef5a33dd2929a25 refers to a dead (removed) revision in file `firmware/App/Modes/ModePostTreat.c'. Fisheye: No comparison available. Pass `N' to diff? Fisheye: Tag 138efd92a8645e0d2fe422409ef5a33dd2929a25 refers to a dead (removed) revision in file `firmware/App/Modes/ModePostTreat.h'. Fisheye: No comparison available. Pass `N' to diff? Index: firmware/App/Modes/ModeRecirculate.c =================================================================== diff -u --- firmware/App/Modes/ModeRecirculate.c (revision 0) +++ firmware/App/Modes/ModeRecirculate.c (revision 138efd92a8645e0d2fe422409ef5a33dd2929a25) @@ -0,0 +1,143 @@ +/**********************************************************************//** + * + * 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 ModeRecirculate.c + * + * @date 03-Apr-2020 + * @author S. Nash + * + * @brief Top-level state machine for the re-circulate mode. + * + **************************************************************************/ + +#include "OperationModes.h" +#include "Timers.h" +#include "ModeRecirculate.h" + +#ifdef RM46_EVAL_BOARD_TARGET + #include "CPLD.h" +#endif + +/** + * @addtogroup RecirculateMode + * @{ + */ + +// ********** private definitions ********** + +/// Enumberation of re-circulation mode states. +typedef enum Recirculate_Mode_States +{ + RECIRCULATE_MODE_STATE_START = 0, ///< Start re-circulation mode state. + RECIRCULATE_MODE_STATE_CHECK_INLET_WATER, ///< Check inlet water state. + RECIRCULATE_MODE_STATE_RECIRC_PRODUCT_WATER, ///< Re-circulate product water state. + NUM_OF_RECIRCULATE_MODE_STATES ///< Number of fill mode states. +} RECIRCULATE_MODE_STATE_T; + +// ********** private data ********** + +static RECIRCULATE_MODE_STATE_T recircState; ///< Currently active re-circulation state. + +// ********** private function prototypes ********** + +static RECIRCULATE_MODE_STATE_T handleCheckInletWaterState( void ); +static RECIRCULATE_MODE_STATE_T handleRecircProductWaterState( void ); + +/*********************************************************************//** + * @brief initFillMode + * The initFillMode function initializes the Fill Mode module. + * @details + * Inputs : none + * Outputs : Fill Mode module initialized. + * @return none + *************************************************************************/ +void initRecirculateMode( void ) +{ + recircState = RECIRCULATE_MODE_STATE_START; +} + +/*********************************************************************//** + * @brief transitionToFillMode + * The transitionToFillMode function prepares for transition to \n + * fill mode. + * @details + * Inputs : none + * Outputs : fillState + * @return none + *************************************************************************/ +void transitionToRecirculateMode( void ) +{ + recircState = RECIRCULATE_MODE_STATE_START; +} + +/*********************************************************************//** + * @brief execFillMode + * The execFillMode function executes the Fill Mode state machine. + * @details + * Inputs : fillState + * Outputs : fillState + * @return none + *************************************************************************/ +void execRecirculateMode( void ) +{ + // execute current Fill state + switch ( recircState ) + { + case RECIRCULATE_MODE_STATE_START: + recircState = RECIRCULATE_MODE_STATE_CHECK_INLET_WATER; + break; + + case RECIRCULATE_MODE_STATE_CHECK_INLET_WATER: + recircState = handleCheckInletWaterState(); + break; + + case RECIRCULATE_MODE_STATE_RECIRC_PRODUCT_WATER: + recircState = handleRecircProductWaterState(); + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, 0, recircState ) // TODO - add s/w fault enum to 1st data param + recircState = RECIRCULATE_MODE_STATE_START; + break; + } +} + +/*********************************************************************//** + * @brief + * The handleCheckInletWaterState function executes the Check Inlet Water \n + * state of the Fill Mode state machine. + * @details + * Inputs : none + * Outputs : + * @param none + * @return the next state + *************************************************************************/ +static RECIRCULATE_MODE_STATE_T handleCheckInletWaterState( void ) +{ + RECIRCULATE_MODE_STATE_T result = RECIRCULATE_MODE_STATE_CHECK_INLET_WATER; + + return result; +} + +/*********************************************************************//** + * @brief + * The handleRecircProductWaterState function executes the Create Product \n + * Water state of the Fill Mode state machine. + * @details + * Inputs : none + * Outputs : + * @param none + * @return the next state + *************************************************************************/ +static RECIRCULATE_MODE_STATE_T handleRecircProductWaterState( void ) +{ + RECIRCULATE_MODE_STATE_T result = RECIRCULATE_MODE_STATE_RECIRC_PRODUCT_WATER; + + return result; +} + +/**@}*/ Index: firmware/App/Modes/ModeRecirculate.h =================================================================== diff -u --- firmware/App/Modes/ModeRecirculate.h (revision 0) +++ firmware/App/Modes/ModeRecirculate.h (revision 138efd92a8645e0d2fe422409ef5a33dd2929a25) @@ -0,0 +1,41 @@ +/**********************************************************************//** + * + * 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 ModeRecirculate.h + * + * @date 03-Apr-2020 + * @author S. Nash + * + * @brief Header file for Recirculate Mode. + * + **************************************************************************/ + +#ifndef __MODE_RECIRCULATION_H__ +#define __MODE_RECIRCULATION_H__ + +#include "DGCommon.h" + +/** + * @defgroup RecirculateMode RecirculateMode + * @brief Re-circulate mode module. + * Manages re-circulate mode functions via a state machine. + * + * @addtogroup RecirculateMode + * @{ + */ + +// ********** public definitions ********** + +// ********** private function prototypes ********** + +void initRecirculateMode( void ); // initialize this module +void transitionToRecirculateMode( void ); // prepares for transition to Recirculate mode +void execRecirculateMode( void ); // execute the Recirculate mode state machine (call from OperationModes) + +/**@}*/ + +#endif Index: firmware/App/Modes/OperationModes.c =================================================================== diff -u -rf43eb1e9e0803776ec7420b16e1db8760b020bd9 -r138efd92a8645e0d2fe422409ef5a33dd2929a25 --- firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision f43eb1e9e0803776ec7420b16e1db8760b020bd9) +++ firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision 138efd92a8645e0d2fe422409ef5a33dd2929a25) @@ -17,14 +17,14 @@ #include "gio.h" #include "OperationModes.h" +#include "ModeChemicalDisinfect.h" #include "ModeDisinfect.h" #include "ModeDrain.h" -#include "ModeFill.h" -#include "ModeFlush.h" #include "ModeFault.h" #include "ModeFill.h" +#include "ModeFlush.h" #include "ModeInitPOST.h" -#include "ModePostTreat.h" +#include "ModeRecirculate.h" #include "ModeService.h" #include "ModeSolo.h" #include "ModeStandby.h" @@ -42,16 +42,18 @@ /// This matrix determines legal transitions from one mode to another. static const OP_MODE MODE_TRANSITION_TABLE[NUM_OF_MODES - 1][NUM_OF_MODES - 1] = { -// from to-> FAULT SERVICE INIT STANBY STBY-SOLO FILL DRAIN FLUSH DISINFECT - /* FAUL */{ MODE_FAUL, MODE_SERV, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG }, - /* SERV */{ MODE_FAUL, MODE_SERV, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG }, - /* INIT */{ MODE_FAUL, MODE_NLEG, MODE_INIT, MODE_STAN, MODE_SOLO, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG }, - /* STAN */{ MODE_FAUL, MODE_SERV, MODE_NLEG, MODE_STAN, MODE_SOLO, MODE_FILL, MODE_DRAI, MODE_NLEG, MODE_NLEG }, - /* SOLO */{ MODE_FAUL, MODE_NLEG, MODE_NLEG, MODE_STAN, MODE_SOLO, MODE_NLEG, MODE_NLEG, MODE_FLUS, MODE_DISI }, - /* FILL */{ MODE_FAUL, MODE_NLEG, MODE_NLEG, MODE_STAN, MODE_NLEG, MODE_FILL, MODE_NLEG, MODE_NLEG, MODE_NLEG }, - /* DRAI */{ MODE_FAUL, MODE_NLEG, MODE_NLEG, MODE_STAN, MODE_NLEG, MODE_NLEG, MODE_DRAI, MODE_NLEG, MODE_NLEG }, - /* FLUS */{ MODE_FAUL, MODE_NLEG, MODE_NLEG, MODE_STAN, MODE_SOLO, MODE_NLEG, MODE_NLEG, MODE_FLUS, MODE_NLEG }, - /* DISI */{ MODE_FAUL, MODE_NLEG, MODE_NLEG, MODE_STAN, MODE_SOLO, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_DISI } +// from to-> FAULT SERVICE INIT STANBY STBY-SOLO RE-CIRC FILL DRAIN FLUSH DISINFECT CHEM DIS + /* FAUL */{ MODE_FAUL, MODE_SERV, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG }, + /* SERV */{ MODE_FAUL, MODE_SERV, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG }, + /* INIT */{ MODE_FAUL, MODE_NLEG, MODE_INIT, MODE_STAN, MODE_SOLO, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG }, + /* STAN */{ MODE_FAUL, MODE_SERV, MODE_NLEG, MODE_STAN, MODE_SOLO, MODE_CIRC, MODE_NLEG, MODE_NLEG, MODE_FLUS, MODE_NLEG, MODE_CHEM }, + /* SOLO */{ MODE_FAUL, MODE_NLEG, MODE_NLEG, MODE_STAN, MODE_SOLO, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_FLUS, MODE_DISI, MODE_NLEG }, + /* CIRC */{ MODE_FAUL, MODE_NLEG, MODE_NLEG, MODE_STAN, MODE_NLEG, MODE_CIRC, MODE_FILL, MODE_DRAI, MODE_NLEG, MODE_NLEG, MODE_NLEG }, + /* FILL */{ MODE_FAUL, MODE_NLEG, MODE_NLEG, MODE_STAN, MODE_NLEG, MODE_CIRC, MODE_FILL, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG }, + /* DRAI */{ MODE_FAUL, MODE_NLEG, MODE_NLEG, MODE_STAN, MODE_NLEG, MODE_CIRC, MODE_NLEG, MODE_DRAI, MODE_NLEG, MODE_NLEG, MODE_NLEG }, + /* FLUS */{ MODE_FAUL, MODE_NLEG, MODE_NLEG, MODE_STAN, MODE_SOLO, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_FLUS, MODE_NLEG, MODE_NLEG }, + /* DISI */{ MODE_FAUL, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_SOLO, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_DISI, MODE_NLEG }, + /* CHEM */{ MODE_FAUL, MODE_NLEG, MODE_NLEG, MODE_STAN, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_CHEM } }; // ********** private function prototypes ********** @@ -88,10 +90,12 @@ initInitAndPOSTMode(); initStandbyMode(); initSoloMode(); + initRecirculateMode(); initFillMode(); initDrainMode(); initFlushMode(); initDisinfectMode(); + initChemicalDisinfectMode(); } /*********************************************************************//** @@ -149,6 +153,10 @@ execSoloMode(); break; + case MODE_CIRC: + execRecirculateMode(); + break; + case MODE_FILL: execFillMode(); break; @@ -165,6 +173,10 @@ execDisinfectMode(); break; + case MODE_CHEM: + execChemicalDisinfectMode(); + break; + default: currentMode = MODE_FAUL; // TODO - trigger s/w fault @@ -277,6 +289,9 @@ case MODE_SOLO: transitionToSoloMode(); break; + case MODE_CIRC: + transitionToRecirculateMode(); + break; case MODE_FILL: transitionToFillMode(); break; @@ -289,6 +304,9 @@ case MODE_DISI: transitionToDisinfectMode(); break; + case MODE_CHEM: + transitionToChemicalDisinfectMode(); + break; default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_SOFTWARE_FAULT, 0, (U32)newMode ) // TODO - add s/w fault enum to 1st data param break; Index: firmware/App/Modes/OperationModes.h =================================================================== diff -u -rf43eb1e9e0803776ec7420b16e1db8760b020bd9 -r138efd92a8645e0d2fe422409ef5a33dd2929a25 --- firmware/App/Modes/OperationModes.h (.../OperationModes.h) (revision f43eb1e9e0803776ec7420b16e1db8760b020bd9) +++ firmware/App/Modes/OperationModes.h (.../OperationModes.h) (revision 138efd92a8645e0d2fe422409ef5a33dd2929a25) @@ -38,10 +38,12 @@ MODE_INIT, ///< Initialization & POST mode. MODE_STAN, ///< Standby mode - connected to HD. MODE_SOLO, ///< Standby Solo mode - no HD connected. + MODE_CIRC, ///< Re-circulate mode. MODE_FILL, ///< Fill mode. MODE_DRAI, ///< Drain mode. MODE_FLUS, ///< Flush mode. MODE_DISI, ///< Disinfect mode. + MODE_CHEM, ///< Chemical Disinfect mode. MODE_NLEG, ///< Not legal - an illegal mode transition occurred. NUM_OF_MODES } OP_MODE; Index: firmware/App/Services/PIControllers.c =================================================================== diff -u -rf068446fdb7889d320ddb6ffbd58f347ce0501e7 -r138efd92a8645e0d2fe422409ef5a33dd2929a25 --- firmware/App/Services/PIControllers.c (.../PIControllers.c) (revision f068446fdb7889d320ddb6ffbd58f347ce0501e7) +++ firmware/App/Services/PIControllers.c (.../PIControllers.c) (revision 138efd92a8645e0d2fe422409ef5a33dd2929a25) @@ -54,13 +54,12 @@ /// 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_ULTRAFILTRATION - { 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 + { 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, // PI_CONTROLLER_ID_RO_PUMP + { 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, // PI_CONTROLLER_ID_DRAIN_PUMP + { 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, // PI_CONTROLLER_ID_PRIMARY_HEATER + { 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 } // PI_CONTROLLER_ID_TRIMMER_HEATER }; -/**@}*/ - /*********************************************************************//** * @brief * Initialize controller before operation. Make sure to call it before @@ -172,23 +171,6 @@ controller->errorSum -= ( windupError / controller->Ki ); } result = controller->controlSignal; -//#ifdef DEBUG_ENABLED -// { -// // TODO - temporary debug code - remove later -// char debugFlowStr[ 100 ]; -// S32 nums = (S32)(measuredSignal); -// S32 decs = (S32)(fabs(measuredSignal-(S32)(measuredSignal))*100.0); -// S32 nume = (S32)controller->errorSignal; -// S32 dece = (S32)(fabs(controller->errorSignal-(S32)controller->errorSignal)*100.0); -// S32 numes = (S32)controller->errorSum; -// S32 deces = (S32)((controller->errorSum-(S32)(controller->errorSum))*100.0); -// S32 nump = (S32)controller->controlSignal; -// S32 decp = (S32)((controller->controlSignal-(S32)controller->controlSignal)*10000.0); -// -// sprintf( debugFlowStr, "%6d.%02d %6d.%02d %10d.%02d %3d.%04d\n", nums, decs, nume, dece, numes, deces, nump, decp ); -// sendDebugData( (U08*)debugFlowStr, strlen(debugFlowStr) ); -// } -//#endif } else { Index: firmware/App/Services/PIControllers.h =================================================================== diff -u -rb64c49fdcf2b6d95e61e63f8e258c4e600935bbd -r138efd92a8645e0d2fe422409ef5a33dd2929a25 --- firmware/App/Services/PIControllers.h (.../PIControllers.h) (revision b64c49fdcf2b6d95e61e63f8e258c4e600935bbd) +++ firmware/App/Services/PIControllers.h (.../PIControllers.h) (revision 138efd92a8645e0d2fe422409ef5a33dd2929a25) @@ -32,9 +32,10 @@ /// Enumeration of PI controllers typedef enum ControllerList { - PI_CONTROLLER_ID_ULTRAFILTRATION = 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. + PI_CONTROLLER_ID_RO_PUMP = 0, ///< RO Pump controller. + PI_CONTROLLER_ID_DRAIN_PUMP, ///< Drain Pump controller. + PI_CONTROLLER_ID_PRIMARY_HEATER, ///< Primary Heater controller. + PI_CONTROLLER_ID_TRIMMER_HEATER, ///< Trimmer Heater controller. NUM_OF_PI_CONTROLLERS_IDS ///< Number of PI controllers. } PI_CONTROLLER_ID_T; Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -rdd3356035996866e5db7678d352f933fc22ad789 -r138efd92a8645e0d2fe422409ef5a33dd2929a25 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision dd3356035996866e5db7678d352f933fc22ad789) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 138efd92a8645e0d2fe422409ef5a33dd2929a25) @@ -57,6 +57,22 @@ F32 loadCellB2inGram; } LOAD_CELL_DATA_T; +typedef struct +{ + U32 setROPumpPressure; + F32 measROPumpPressure; + F32 measROPumpSpeed; + F32 roPumpPWM; +} RO_PUMP_DATA_T; + +typedef struct +{ + F32 roPumpInletPressure; + F32 roPumpOutletPressure; + F32 drainPumpInletPressure; + F32 drainPumpOutletPressure; +} PRESSURES_DATA_T; + #pragma pack(pop) // ********** private data ********** @@ -281,33 +297,34 @@ /************************************************************************* * @brief - * The broadcastTreatmentTime function constructs a treatment time msg to \n - * be broadcast and queues the msg for transmit on the appropriate CAN channel. + * The broadcastLoadCellData function sends out load cell data. * @details * Inputs : none - * Outputs : treatment time data msg constructed and queued - * @param secsTotTreatment : Total treatment time prescribed (in seconds). - * @param secsElapsed : Treatment time elapsed (in seconds). - * @param secsRemaining : Treatment time remaining (in seconds). + * Outputs : load cell data msg constructed and queued + * @param loadCellA1 : load cell A 1 data in grams. + * @param loadCellA2 : load cell A 2 data in grams. + * @param loadCellB1 : load cell B 1 data in grams. + * @param loadCellB2 : load cell B 2 data in grams. * @return TRUE if msg successfully queued for transmit, FALSE if not *************************************************************************/ -BOOL broadcastTreatmentTime( U32 secsTotTreatment, U32 secsElapsed, U32 secsRemaining ) +BOOL broadcastLoadCellData( F32 loadCellA1, F32 loadCellA2, F32 loadCellB1, F32 loadCellB2 ) { BOOL result; MESSAGE_T msg; U08 *payloadPtr = msg.payload; - TREATMENT_TIME_DATA_T payload; + LOAD_CELL_DATA_T payload; // create a message record blankMessage( &msg ); - msg.hdr.msgID = MSG_ID_TREATMENT_TIME; - msg.hdr.payloadLen = sizeof( TREATMENT_TIME_DATA_T ); + msg.hdr.msgID = MSG_ID_LOAD_CELL_READINGS; + msg.hdr.payloadLen = sizeof( LOAD_CELL_DATA_T ); - payload.treatmentTimePrescribedinSec = secsTotTreatment; - payload.treatmentTimeElapsedinSec = secsElapsed; - payload.treatmentTimeRemaininginSec = secsRemaining; + payload.loadCellA1inGram = loadCellA1; + payload.loadCellA2inGram = loadCellA2; + payload.loadCellB1inGram = loadCellB1; + payload.loadCellB2inGram = loadCellB2; - memcpy( payloadPtr, &payload, sizeof( TREATMENT_TIME_DATA_T ) ); + memcpy( payloadPtr, &payload, sizeof( LOAD_CELL_DATA_T ) ); // serialize the message (w/ sync, CRC, and appropriate CAN padding) and add serialized message data to appropriate comm buffer result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_DG_BROADCAST, ACK_NOT_REQUIRED ); @@ -317,42 +334,78 @@ /************************************************************************* * @brief - * The broadcastLoadCellData function sends out load cell data. + * The broadcastROPumpData function sends out RO pump data. * @details - * Inputs : load cell data - * Outputs : load cell data msg constructed and queued - * @param loadCellA1 : load cell A 1 data in grams. - * @param loadCellA2 : load cell A 2 data in grams. - * @param loadCellB1 : load cell B 1 data in grams. - * @param loadCellB2 : load cell B 2 data in grams. + * Inputs : none + * Outputs : RO pump data msg constructed and queued + * @param tgtPressure : target pressure for RO pump in PSI. + * @param measPressure : measured pressure for RO pump in PSI. + * @param measSpeed : measure RO pump speed in RPM. + * @param setPWM : set PWM duty cycle in %. * @return TRUE if msg successfully queued for transmit, FALSE if not *************************************************************************/ -BOOL broadcastLoadCellData( F32 loadCellA1, F32 loadCellA2, F32 loadCellB1, F32 loadCellB2 ) +BOOL broadcastROPumpData( U32 tgtPressure, F32 measPressure, F32 measSpeed, F32 setPWM ) { BOOL result; MESSAGE_T msg; U08 *payloadPtr = msg.payload; - LOAD_CELL_DATA_T payload; + RO_PUMP_DATA_T payload; // create a message record blankMessage( &msg ); - msg.hdr.msgID = MSG_ID_LOAD_CELL_READINGS; - msg.hdr.payloadLen = sizeof( LOAD_CELL_DATA_T ); + msg.hdr.msgID = MSG_ID_RO_PUMP_DATA; + msg.hdr.payloadLen = sizeof( RO_PUMP_DATA_T ); - payload.loadCellA1inGram = loadCellA1; - payload.loadCellA2inGram = loadCellA2; - payload.loadCellB1inGram = loadCellB1; - payload.loadCellB2inGram = loadCellB2; + payload.setROPumpPressure = tgtPressure; + payload.measROPumpPressure = measPressure; + payload.measROPumpSpeed = measSpeed; + payload.roPumpPWM = setPWM; - memcpy( payloadPtr, &payload, sizeof( LOAD_CELL_DATA_T ) ); + memcpy( payloadPtr, &payload, sizeof( RO_PUMP_DATA_T ) ); // serialize the message (w/ sync, CRC, and appropriate CAN padding) and add serialized message data to appropriate comm buffer result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_DG_BROADCAST, ACK_NOT_REQUIRED ); return result; } +/************************************************************************* + * @brief + * The broadcastPressureSensorsData function sends out DG pressure data. + * @details + * Inputs : none + * Outputs : Pressure data msg constructed and queued + * @param measROIn : measured RO pump inlet pressure in PSI. + * @param measROOut : measured RO pump outlet pressure in PSI. + * @param measDrainIn : measured Drain pump inlet pressure in PSI. + * @param measDrainOut : measured Drain pump outlet pressure in PSI. + * @return TRUE if msg successfully queued for transmit, FALSE if not + *************************************************************************/ +BOOL broadcastPressureSensorsData( F32 measROIn, F32 measROOut, F32 measDrainIn, F32 measDrainOut ) +{ + BOOL result; + MESSAGE_T msg; + U08 *payloadPtr = msg.payload; + PRESSURES_DATA_T payload; + // create a message record + blankMessage( &msg ); + msg.hdr.msgID = MSG_ID_DG_PRESSURES_DATA; + msg.hdr.payloadLen = sizeof( PRESSURES_DATA_T ); + + payload.roPumpInletPressure = measROIn; + payload.roPumpOutletPressure = measROOut; + payload.drainPumpInletPressure = measDrainIn; + payload.drainPumpOutletPressure = measDrainOut; + + memcpy( payloadPtr, &payload, sizeof( PRESSURES_DATA_T ) ); + + // serialize the message (w/ sync, CRC, and appropriate CAN padding) and add serialized message data to appropriate comm buffer + result = serializeMessage( msg, COMM_BUFFER_OUT_CAN_DG_BROADCAST, ACK_NOT_REQUIRED ); + + return result; +} + /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r8b56b0c617ac49536b8d53852b9621be873bade6 -r138efd92a8645e0d2fe422409ef5a33dd2929a25 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 8b56b0c617ac49536b8d53852b9621be873bade6) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 138efd92a8645e0d2fe422409ef5a33dd2929a25) @@ -38,6 +38,12 @@ // MSG_ID_LOAD_CELL_READINGS BOOL broadcastLoadCellData( F32 loadCellA1, F32 loadCellA2, F32 loadCellB1, F32 loadCellB2 ); +// MSG_ID_RO_PUMP_DATA +BOOL broadcastROPumpData( U32 tgtPressure, F32 measPressure, F32 measSpeed, F32 setPWM ); + +// MSG_ID_DG_PRESSURES_DATA +BOOL broadcastPressureSensorsData( F32 measROIn, F32 measROOut, F32 measDrainIn, F32 measDrainOut ); + // *********** public test support message functions ********** #ifdef DEBUG_ENABLED