Index: firmware/App/Modes/ModeGenPermeate.c =================================================================== diff -u --- firmware/App/Modes/ModeGenPermeate.c (revision 0) +++ firmware/App/Modes/ModeGenPermeate.c (revision 9ad496e4c3a54e96402afd66955be575bdaa3f57) @@ -0,0 +1,265 @@ +/************************************************************************** +* +* Copyright (c) 2024-2024 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 ModeStandby.c +* +* @author (last) Michael Garthwaite +* @date (last) 28-Feb-2025 +* +* @author (original) Michael Garthwaite +* @date (original) 28-Feb-2025 +* +***************************************************************************/ + +#include "DDInterface.h" +#include "FlowSensor.h" +#include "FpgaRO.h" +#include "Level.h" +#include "ModeGenPermeate.h" +#include "ModeStandby.h" +#include "MessageSupport.h" +#include "Messaging.h" +#include "OperationModes.h" +#include "TaskGeneral.h" +#include "Timers.h" +#include "Valves.h" + +/** + * @addtogroup ROGenPermeateMode + * @{ + */ + +// ********** private definitions ********** +#define GEN_PERMEATE_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the gen permeate mode data published. + +// ********** private data ********** + +static RO_GENP_MODE_STATE_T genPermeateState; ///< Currently active generate permeate water state. +static U32 genPermeateDataPublicationTimerCounter; ///< Used to schedule generate permeate data publication to CAN bus. +static OVERRIDE_U32_T genPermeateDataPublishInterval; ///< Generate permeate mode data publish interval. + +// ********** private function prototypes ********** + +static void publishGenPermeateModeData( void ); +static RO_GENP_MODE_STATE_T handleGenPStartState( void ); +static RO_GENP_MODE_STATE_T handleGenPWaterFullState( void ); +static RO_GENP_MODE_STATE_T handleGenPWaterLowState( void ); +static void setModeGenPStateTransition( RO_GENP_MODE_STATE_T state ); + +/*********************************************************************//** + * @brief + * The initGenPermeateMode function initializes the dialysis permeate mode unit. + * @details \b Inputs: none + * @details \b Outputs: Gen permeate mode unit initialized + * @return none + *************************************************************************/ +void initGenPermeateMode( void ) +{ + RO_GENP_MODE_STATE_T genPermeateState = RO_GENP_STATE_START; + genPermeateDataPublishInterval.data = GEN_PERMEATE_DATA_PUBLISH_INTERVAL; + genPermeateDataPublishInterval.ovData = GEN_PERMEATE_DATA_PUBLISH_INTERVAL; + genPermeateDataPublishInterval.ovInitData = 0; + genPermeateDataPublishInterval.override = OVERRIDE_RESET; + genPermeateDataPublicationTimerCounter = 0; +} + +/*********************************************************************//** + * @brief + * The transitionToGenPermeateMode function prepares for transition to gen + * permeate mode. + * @details \b Inputs: none + * @details \b Outputs: none + * @return initial state + *************************************************************************/ +U32 transitionToGenPermeateMode( void ) +{ + initGenPermeateMode(); + setCurrentSubState( RO_GENP_STATE_START ); + + return genPermeateState; +} + +/*********************************************************************//** + * @brief + * The execGenPermeateMode function executes the Gen permeate mode state machine. + * @details \b Inputs: none + * @details \b Outputs: Gen permeate mode state machine executed + * @details \b Alarm: ALARM_ID_RO_SOFTWARE_FAULT when wrong gen permeate state invoked. + * @return current state. + *************************************************************************/ +U32 execGenPermeateMode( void ) +{ + // execute current gen permeate state + switch ( genPermeateState ) + { + case RO_GENP_STATE_START: + genPermeateState = handleGenPStartState(); + break; + + case RO_GENP_WATER_LOW_STATE: + genPermeateState = handleGenPWaterLowState(); + break; + + case RO_GENP_WATER_FULL_STATE: + genPermeateState = handleGenPWaterFullState(); + break; + + } + //Publish Gen permeate mode data + publishGenPermeateModeData(); + + return genPermeateState; + +} + +/*********************************************************************//** + * @brief + * The setModeGenPStateTransition function sets the actuators and variables + * for the state transition in generate permeate mode. + * @details Inputs: Valve states, Pump speed + * @details Outputs: Actuate valves, pumps as desired. + * @param state gen permeate state enum + * @return none + *************************************************************************/ +static void setModeGenPStateTransition( RO_GENP_MODE_STATE_T state ) +{ + // Execute on running state + switch( state ) + { + case DD_GEND_STATE_START: + // Do nothing + break; + case RO_GENP_WATER_LOW_STATE: + // set + break; + case RO_GENP_WATER_FULL_STATE: + //set + break; + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_RO_SOFTWARE_FAULT, SW_FAULT_ID_OP_MODES_INVALID_MODE_STATE, state ) + break; + } +} +/*********************************************************************//** + * @brief + * The handleGenPStartState handles the initial state of gen permeate. + * @details \b Inputs: none + * @details \b Outputs: none + * @return the current state of gen permeate mode + *************************************************************************/ +static RO_GENP_MODE_STATE_T handleGenPStartState( void ) +{ + RO_GENP_MODE_STATE_T state = RO_GENP_STATE_START; + return state; +} + +/*********************************************************************//** + * @brief + * The handleGenPStartState handles the initial state of gen permeate. + * @details \b Inputs: none + * @details \b Outputs: none + * @return the current state of gen permeate mode + *************************************************************************/ +static RO_GENP_MODE_STATE_T handleGenPWaterLowState( void ) +{ + RO_GENP_MODE_STATE_T state = RO_GENP_WATER_LOW_STATE; + return state; +} + +/*********************************************************************//** + * @brief + * The handleGenPStartState handles the initial state of gen permeate. + * @details \b Inputs: none + * @details \b Outputs: none + * @return the current state of gen permeate mode + *************************************************************************/ +static RO_GENP_MODE_STATE_T handleGenPWaterFullState( void ) +{ + RO_GENP_MODE_STATE_T state = RO_GENP_WATER_FULL_STATE; + return state; +} +/** + * *******************************************************************//** + * @brief + * The getCurrentGenPermeateState function returns the current state of the + * gen dialysate mode. + * @details \b Inputs: genDialysateState + * @details \b Outputs: none + * @return the current state of gen dialysate mode + *************************************************************************/ +RO_GENP_MODE_STATE_T getCurrentGenPermeateState( void ) +{ + return genPermeateState; +} + +/*********************************************************************//** + * @brief + * The getGenPermeateDataPublishInterval function gets the generate permeate + * mode data publish interval. + * @details \b Inputs: genPermeateDataPublishInterval + * @details \b Outputs: none + * @return the interval at generate permeate mode data being published. + *************************************************************************/ +static U32 getGenPermeateDataPublishInterval( void ) +{ + U32 result = getU32OverrideValue( &genPermeateDataPublishInterval ); + + return result; +} +/*********************************************************************//** + * @brief + * The publishGenDialysateModeData function broadcasts the generate dialysate + * mode data at defined interval. + * @details \b Inputs: genDialysateDataPublicationTimerCounter + * @details \b Outputs: DD generate dialysate data broadcast message sent + * @details \b Message \Sent: MSG_ID_DD_GEN_DIALYSATE_MODE_DATA to publish the + * generate dialysate mode data. + * @return none + *************************************************************************/ +static void publishGenPermeateModeData( void ) +{ + if ( ++genPermeateDataPublicationTimerCounter >= getGenPermeateDataPublishInterval() ) + { + GEN_PERMEATE_MODE_DATA_T data; + + data.genPermeateExecState = (U32)getCurrentGenPermeateState(); + data.isWaterDelInProgress = 0; + data.p25Level = (U32)getLevelStatus(); + data.setFlowRate = (U32)getDDPermeateFlowRate(); + data.p16FlowRate = (U32)getFilteredFlow( P16_FLOW ); + + + broadcastData( MSG_ID_DD_GEN_DIALYSATE_MODE_DATA, COMM_BUFFER_OUT_CAN_RO_BROADCAST, (U08*)&data, sizeof( GEN_PERMEATE_MODE_DATA_T ) ); + + genPermeateDataPublicationTimerCounter = 0; + } +} + + +/************************************************************************* + * TEST SUPPORT FUNCTIONS + *************************************************************************/ + + +/*********************************************************************//** + * @brief + * The testROGenPermeateDataPublishIntervalOverride function overrides the + * DD generate permeate mode data publish interval. + * @details \b Inputs: genDialysateDataPublishInterval + * @details \b Outputs: genDialysateDataPublishInterval + * @param Override message from Dialin which includes the interval + * (in ms) to override the RO generate permeate data publish interval to. + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testROGenPermeateDataPublishIntervalOverride( MESSAGE_T *message ) +{ + BOOL result = u32BroadcastIntervalOverride( message, &genPermeateDataPublishInterval, TASK_GENERAL_INTERVAL ); + + return result; +} + +/**@}*/ Index: firmware/App/Modes/ModeGenPermeate.h =================================================================== diff -u --- firmware/App/Modes/ModeGenPermeate.h (revision 0) +++ firmware/App/Modes/ModeGenPermeate.h (revision 9ad496e4c3a54e96402afd66955be575bdaa3f57) @@ -0,0 +1,56 @@ +/************************************************************************** +* +* Copyright (c) 2024-2025 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 ModeGenPeremate.h +* +* @author (last) Michael Garthwaite +* @date (last) 03-Mar-2025 +* +* @author (original) Michael Garthwaite +* @date (original) 03-Mar-2025 +* +***************************************************************************/ + +#ifndef __MODE_GEN_PERMEATE_H__ +#define __MODE_GEN_PERMEATE_H__ + +#include "ROCommon.h" +#include "RODefs.h" + +/** + * @defgroup ROGenPermeateMode ROGenPermeateMode + * @brief Generate Permeate unit. Manages permeate generation functions via a state machine. + * + * @addtogroup ROGenPermeateMode + * @{ + */ + +// ********** public definitions ********** + +/// Generate permeate mode data structure +typedef struct +{ + U32 genPermeateExecState; ///< Generate Permeate execution state + BOOL isWaterDelInProgress; ///< Whether Water delivery is in progress or not + U32 p25Level; ///< Floater level (low, medium and high) + F32 setFlowRate; ///< Permeate flow rate requested by the DD. + F32 p16FlowRate; ///< measured RO flow rate +} GEN_PERMEATE_MODE_DATA_T; + +// ********** public function prototypes ********** + +void initGenPermeateMode( void ); // Initialize this gen permeate mode unit +U32 transitionToGenPermeateMode( void ); // Prepares for transition to gen permeate mode +U32 execGenPermeateMode( void ); // Execute the gen permeate mode state machine (call from OperationModes) +void execGenPermeateMonitor( void ); // Permeate generation monitor + +RO_GENP_MODE_STATE_T getCurrentGenPermeateState( void ); // Get the current state of the gen permeate mode + +/**@}*/ + + +#endif Index: firmware/App/Modes/ModeStandby.c =================================================================== diff -u -r533272e6ef2873fcfe7a41338a6c88c7a601605d -r9ad496e4c3a54e96402afd66955be575bdaa3f57 --- firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 533272e6ef2873fcfe7a41338a6c88c7a601605d) +++ firmware/App/Modes/ModeStandby.c (.../ModeStandby.c) (revision 9ad496e4c3a54e96402afd66955be575bdaa3f57) @@ -1,25 +1,173 @@ +/************************************************************************** +* +* Copyright (c) 2024-2024 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 ModeStandby.c +* +* @author (last) Michael Garthwaite +* @date (last) 28-Feb-2025 +* +* @author (original) Michael Garthwaite +* @date (original) 28-Feb-2025 +* +***************************************************************************/ - #include "ModeStandby.h" - +#include "OperationModes.h" +#include "PersistentAlarm.h" +#include "SystemCommRO.h" +#include "TaskGeneral.h" /** * @addtogroup ROStandbyMode * @{ */ +// ********** private definitions ********** + +// ********** private data ********** + +static RO_STANDBY_MODE_STATE_T standbyState; ///< Currently active standby state. +static OVERRIDE_U32_T pendingStartRORequest; ///< Flag indicating DD has requested RO start the generate permeate (Overridable). + +// ********** private function prototypes ********** + +static RO_STANDBY_MODE_STATE_T handleStandbyIdleState( void ); + +/*********************************************************************//** + * @brief + * The initStandbyMode function initializes the standby mode unit. + * @details \b Inputs: none + * @details \b Outputs:unit variables initialized. + * @return none + *************************************************************************/ void initStandbyMode( void ) { - + standbyState = RO_STANDBY_MODE_STATE_IDLE; + pendingStartRORequest.data = FALSE; + pendingStartRORequest.ovData = FALSE; + pendingStartRORequest.ovInitData = FALSE; + pendingStartRORequest.override = OVERRIDE_RESET; } +/*********************************************************************//** + * @brief + * The transitionToStandbyMode function prepares for transition to standby mode. + * while transition, deenergize all actuators. + * @details \b Inputs: none + * @details \b Outputs: Re-initialized standby mode + * @return initial state + *************************************************************************/ U32 transitionToStandbyMode( void ) { - return 0; + initStandbyMode(); + + return standbyState; } +/*********************************************************************//** + * @brief + * The execStandbyMode function executes the standby mode state machine. + * @details \b Inputs: none + * @details \b Outputs: Standby mode state machine executed + * @details \b Alarm: ALARM_ID_RO_SOFTWARE_FAULT if standbyState is invalid. + * @return current state + *************************************************************************/ U32 execStandbyMode( void ) { - return 0; + + // execute current Standby state + switch ( standbyState ) + { + case RO_STANDBY_MODE_STATE_IDLE: + standbyState = handleStandbyIdleState(); + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_RO_SOFTWARE_FAULT, SW_FAULT_ID_MODE_STANDBY_INVALID_STATE, standbyState ) + standbyState = RO_STANDBY_MODE_STATE_IDLE; + break; + } + + return standbyState; } +/*********************************************************************//** + * @brief + * The handleStandbyIdleState function executes the idle state of the + * standby mode state machine. + * @details \b Inputs: + * @details \b Outputs: + * @details \b Message \Sent: + * @return the next state + *************************************************************************/ +static RO_STANDBY_MODE_STATE_T handleStandbyIdleState( void ) +{ + RO_STANDBY_MODE_STATE_T state = RO_STANDBY_MODE_STATE_IDLE; + + if ( TRUE == getU32OverrideValue( &pendingStartRORequest ) ) + { + pendingStartRORequest.data = FALSE; + requestNewOperationMode( RO_MODE_GEN_PERM ); + } + + return state; +} + +/*********************************************************************//** + * @brief + * The getCurrentStandbyState function returns the current state of standby mode. + * @details \b Inputs: standbyState + * @details \b Outputs: none + * @return the current state of standby mode. + *************************************************************************/ +RO_STANDBY_MODE_STATE_T getCurrentStandbyState( void ) +{ + return standbyState; +} + +/*********************************************************************//** + * @brief + * The requestROStart function handles an DD request to start (go to gen permeate mode). + * @details \b Inputs: standbyState + * @details \b Outputs: pendingStartRORequest + * @return TRUE if request accepted, FALSE if not. + *************************************************************************/ +BOOL requestROStart( void ) +{ + BOOL result = FALSE; + + if ( RO_STANDBY_MODE_STATE_IDLE == standbyState ) + { + result = TRUE; + pendingStartRORequest.data = TRUE; + } + + return result; +} + +/************************************************************************* + * TEST SUPPORT FUNCTIONS + *************************************************************************/ + + +/*********************************************************************//** + * @brief + * The testROstartGenPermeateOverride function sets the override value + * to start the generate permeate operation mode. + * @details Inputs: pendingStartRORequest + * @details Outputs: pendingStartRORequest + * @param message Override message from Dialin which includes the flag + * to override the operation mode. + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testROstartGenPermeateOverride( MESSAGE_T *message ) +{ + BOOL result = u32Override( message, &pendingStartRORequest, FALSE, TRUE ); + + return result; +} + /**@}*/ Index: firmware/App/Modes/ModeStandby.h =================================================================== diff -u -r129a1c2f4343bc85efdb4767c2dec35e4ba8ce98 -r9ad496e4c3a54e96402afd66955be575bdaa3f57 --- firmware/App/Modes/ModeStandby.h (.../ModeStandby.h) (revision 129a1c2f4343bc85efdb4767c2dec35e4ba8ce98) +++ firmware/App/Modes/ModeStandby.h (.../ModeStandby.h) (revision 9ad496e4c3a54e96402afd66955be575bdaa3f57) @@ -1,4 +1,19 @@ - +/************************************************************************** +* +* Copyright (c) 2024-2024 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 ModeStandby.h +* +* @author (last) Michael Garthwaite +* @date (last) 28-Feb-2025 +* +* @author (original) Michael Garthwaite +* @date (original) 28-Feb-2025 +* +***************************************************************************/ #ifndef __MODE_STANDBY_H__ #define __MODE_STANDBY_H__ @@ -21,7 +36,12 @@ void initStandbyMode( void ); // Initialize this unit U32 transitionToStandbyMode( void ); // Prepares for transition to standby mode U32 execStandbyMode( void ); // Execute the standby mode state machine (call from OperationModes) +BOOL requestROStart( void ); +RO_STANDBY_MODE_STATE_T getCurrentStandbyState( void ); // get the current state of the standby mode. + +BOOL testROstartGenPermeateOverride( MESSAGE_T *message ); // Overide start gen permeate mode + /**@}*/ #endif Index: firmware/App/Modes/OperationModes.c =================================================================== diff -u -rbf3ba65cafc8cbfb34e03d9fb2fc248069a8addb -r9ad496e4c3a54e96402afd66955be575bdaa3f57 --- firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision bf3ba65cafc8cbfb34e03d9fb2fc248069a8addb) +++ firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision 9ad496e4c3a54e96402afd66955be575bdaa3f57) @@ -18,6 +18,7 @@ #include "Messaging.h" #include "ModeInitPOST.h" #include "ModeFault.h" +#include "ModeGenPermeate.h" #include "ModeStandby.h" #include "OperationModes.h" #include "TaskGeneral.h" @@ -51,7 +52,8 @@ /* FAUL */{ RO_MODE_FAUL, RO_MODE_SERV, RO_MODE_NLEG, RO_MODE_NLEG }, /* SERV */{ RO_MODE_FAUL, RO_MODE_SERV, RO_MODE_NLEG, RO_MODE_NLEG }, /* INIT */{ RO_MODE_FAUL, RO_MODE_NLEG, RO_MODE_INIT, RO_MODE_STAN }, -/* STAN */{ RO_MODE_FAUL, RO_MODE_SERV, RO_MODE_NLEG, RO_MODE_STAN } }; +/* STAN */{ RO_MODE_FAUL, RO_MODE_SERV, RO_MODE_NLEG, RO_MODE_STAN }, +/* GEN_PERM */{ RO_MODE_FAUL, RO_MODE_SERV, RO_MODE_NLEG, RO_MODE_STAN } }; // ********** private function prototypes ********** @@ -91,6 +93,7 @@ // initServiceMode(); initInitAndPOSTMode(); initStandbyMode(); + initGenPermeateMode(); } /*********************************************************************//** @@ -148,6 +151,9 @@ currentSubMode = execStandbyMode(); break; + case RO_MODE_GEN_PERM: + currentSubMode = execGenPermeateMode(); + default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_RO_SOFTWARE_FAULT, SW_FAULT_ID_OP_MODES_INVALID_MODE_STATE, currentMode ) currentMode = RO_MODE_FAUL; @@ -285,15 +291,23 @@ case RO_MODE_FAUL: currentSubMode = transitionToFaultMode(); break; + case RO_MODE_SERV: // currentSubMode = transitionToServiceMode(); break; + case RO_MODE_INIT: currentSubMode = transitionToInitAndPOSTMode(); break; + case RO_MODE_STAN: currentSubMode = transitionToStandbyMode(); break; + + case RO_MODE_GEN_PERM: + currentSubMode = transitionToGenPermeateMode(); + break; + default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_RO_SOFTWARE_FAULT, SW_FAULT_ID_OP_MODES_INVALID_MODE_TO_TRANSITION_TO, newMode ) break; Index: firmware/App/Services/DDInterface.c =================================================================== diff -u --- firmware/App/Services/DDInterface.c (revision 0) +++ firmware/App/Services/DDInterface.c (revision 9ad496e4c3a54e96402afd66955be575bdaa3f57) @@ -0,0 +1,177 @@ +/************************************************************************** +* +* Copyright (c) 2024-2025 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 DDInterface.c +* +* @author (last) Michael Garthwaite +* @date (last) 03-Mar-2025 +* +* @author (original) Michael Garthwaite +* @date (original) 03-Mar-2025 +* +***************************************************************************/ + +#include "DDInterface.h" +#include "Messaging.h" +#include "MessagePayloads.h" +#include "ModeGenPermeate.h" +#include "ModeStandby.h" +#include "OperationModes.h" +#include "PersistentAlarm.h" +#include "SystemCommRO.h" +#include "TaskGeneral.h" +#include "Timers.h" + +/** + * @addtogroup TDInterface + * @{ + */ + +// ********** private definitions ********** + +// ********** private data ********** +static DD_OP_MODE_T ddCurrentOpMode; ///< Current DD operation mode. +static U32 ddSubMode; ///< Current state (sub-mode) of current DD operation mode. +static F32 ddPermeateFlowRate; ///< DD RO Permeate flow rate. + +// ********** private function prototypes ********** + +/*********************************************************************//** + * @brief + * The initDDInterface function initializes the DD Interface unit. + * @details \b Inputs: none + * @details \b Outputs: DD Interface unit initialized. + * @return none + *************************************************************************/ +void initDDInterface( void ) +{ + // Initialize unit variables + ddCurrentOpMode = DD_MODE_INIT; + ddSubMode = 0; + ddPermeateFlowRate = 0.0; + +} + +/*********************************************************************//** + * @brief + * The execDDInterfaceMonitor function executes the DD Interface monitoring + * function. Ensures DD is sending fresh data in a timely manner. + * @details \b Inputs: none + * @details \b Outputs: none + * @return none + *************************************************************************/ +void execDDInterfaceMonitor( void ) +{ + return; +} + +/*********************************************************************//** + * @brief + * The getDDOpMode function gets the current latest reported DD operating mode. + * @details \b Inputs: ddCurrentOpMode + * @details \b Outputs: none + * @return Latest reported DD operating mode. + *************************************************************************/ +DD_OP_MODE_T getDDOpMode( void ) +{ + return ddCurrentOpMode; +} + +/*********************************************************************//** + * @brief + * The getDDSubMode function gets the latest reported DD operating sub-mode. + * @details \b Inputs: tdSubMode + * @details \b Outputs: none + * @return Latest reported DD operating sub-mode. + *************************************************************************/ +U32 getDDSubMode( void ) +{ + return ddSubMode; +} + +/*********************************************************************//** + * @brief + * The setDDPermeateFlowRate function sets the latest DD Permeate flow + * rate. + * @details \b Inputs: none + * @details \b Outputs: ddPermeateFlowRate + * @param flowRate. + * @return none. + *************************************************************************/ +void setDDPermeateFlowRate( F32 flowRate ) +{ + ddPermeateFlowRate = flowRate; +} + +/*********************************************************************//** + * @brief + * The getDDPermeateFlowRate function sets the latest DD Permeate flow + * rate. + * @details \b Inputs: none + * @details \b Outputs: ddPermeateFlowRate + * @param Dialyzer Bypass enable. + * @return latest DD Permeate Flow Rate. + *************************************************************************/ +F32 getDDPermeateFlowRate( void ) +{ + return ddPermeateFlowRate; +} + +/*********************************************************************//** + * @brief + * The handleGeneratePermeateRequestMsg function handles a RO permeate + * request from DD and updates permeate flow rate. + * @details Inputs: none + * @details Outputs: message handled + * @param message a pointer to the message to handle + * @return TRUE if message is sucessfully parsed, FALSE if not. + *************************************************************************/ +BOOL handleGeneratePermeateRequestMsg( MESSAGE_T *message ) +{ + BOOL result = FALSE; + + if ( message->hdr.payloadLen == sizeof( RO_WATER_REQ_PAYLOAD_T ) ) + { + RO_WATER_REQ_PAYLOAD_T startRORequest; + RO_OP_MODE_T roMode = getCurrentOperationMode(); + + memcpy( &startRORequest, message->payload, sizeof( RO_WATER_REQ_PAYLOAD_T ) ); + + if ( ( RO_MODE_STAN == roMode ) && ( TRUE == startRORequest.start ) ) + { + setDDPermeateFlowRate(startRORequest.roRate); + + result = requestROStart(); + } + else if ( RO_MODE_GEN_PERM == roMode ) + { + if ( FALSE == startRORequest.start ) + { + // stop Permeate Generation by transitioning to standby mode + requestNewOperationMode( RO_MODE_STAN ); + } + else + { + // Set flow rate and delivery. + setDDPermeateFlowRate(startRORequest.roRate); + } + result = TRUE; + } + } + + sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_RO_2_DD, result ); + + return result; +} + + +/************************************************************************* + * TEST SUPPORT FUNCTIONS + *************************************************************************/ + + +/**@}*/ Index: firmware/App/Services/DDInterface.h =================================================================== diff -u --- firmware/App/Services/DDInterface.h (revision 0) +++ firmware/App/Services/DDInterface.h (revision 9ad496e4c3a54e96402afd66955be575bdaa3f57) @@ -0,0 +1,52 @@ +/************************************************************************** +* +* Copyright (c) 2024-2025 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 ROInterface.h +* +* @author (last) Michael Garthwaite +* @date (last) 03-Mar-2025 +* +* @author (original) Michael Garthwaite +* @date (original) 03-Mar-2025 +* +***************************************************************************/ + +#ifndef __DD_INTERFACE_H__ +#define __DD_INTERFACE_H__ + +#include "ROCommon.h" +#include "RODefs.h" +#include "DDDefs.h" + +/** + * @defgroup DDInterface DDInterface + * @brief DD interface & monitor unit. Interfaces with and monitors the + * DD (Dialysate Delivery) sub-system. + * + * @addtogroup DDInterface + * @{ + */ + +// ********** public definitions ********** + +// ********** public function prototypes ********** + +void initTDInterface( void ); +void execTDInterfaceMonitor( void ); + +void setDDOpMode( U32 opMode, U32 subMode ); +void setDDPermeateFlowRate( F32 flowRate ); + +F32 getDDPermeateFlowRate( void ); +DD_OP_MODE_T getDDOpMode( void ); + +BOOL handleGeneratePermeateRequestMsg( MESSAGE_T *message ); + + +/**@}*/ + +#endif Index: firmware/App/Services/Messaging.c =================================================================== diff -u -r340b6bedc5aac2ad47364ade48a842f00b12b8fe -r9ad496e4c3a54e96402afd66955be575bdaa3f57 --- firmware/App/Services/Messaging.c (.../Messaging.c) (revision 340b6bedc5aac2ad47364ade48a842f00b12b8fe) +++ firmware/App/Services/Messaging.c (.../Messaging.c) (revision 9ad496e4c3a54e96402afd66955be575bdaa3f57) @@ -4,9 +4,11 @@ #include "BoostPump.h" #include "Compatible.h" #include "Conductivity.h" +#include "DDInterface.h" #include "Flow.h" #include "Level.h" #include "Messaging.h" +#include "ModeGenPermeate.h" #include "OperationModes.h" #include "PAL.h" #include "Pressure.h" @@ -60,31 +62,32 @@ MSG_ID_RO_SOFTWARE_RESET_REQUEST, MSG_ID_RO_SEND_TEST_CONFIGURATION, MSG_ID_RO_VALVE_PUBLISH_INTERVAL_OVERRIDE_REQUEST, - MSG_ID_RO_VALVE_CMD_STATE_OVERRIDE_REQUEST, + MSG_ID_RO_VALVE_CMD_STATE_OVERRIDE_REQUEST, //5 MSG_ID_RO_VALVE_SENSED_STATE_OVERRIDE_REQUEST, MSG_ID_RO_BOOST_PUMP_SET_PWM_REQUEST, MSG_ID_RO_BOOST_PUMP_READ_PWM_OVERRIDE_REQUEST, MSG_ID_RO_BOOST_PUMP_SPEED_OVERRIDE_REQUEST, - MSG_ID_RO_BOOST_PUMPS_PUBLISH_INTERVAL_OVERRIDE_REQUEST, + MSG_ID_RO_BOOST_PUMPS_PUBLISH_INTERVAL_OVERRIDE_REQUEST, //10 MSG_ID_RO_PRESSURE_OVERRIDE_REQUEST, MSG_ID_RO_PRESSURE_TEMP_OVERRIDE_REQUEST, MSG_ID_RO_PRESSURE_READ_COUNT_OVERRIDE_REQUEST, MSG_ID_RO_PRESSURE_ERROR_COUNT_OVERRIDE_REQUEST, - MSG_ID_RO_PRESSURE_PUBLISH_INTERVAL_OVERRIDE_REQUEST, + MSG_ID_RO_PRESSURE_PUBLISH_INTERVAL_OVERRIDE_REQUEST, //15 MSG_ID_RO_DEBUG_EVENT, MSG_ID_RO_LEVEL_PUBLISH_INTERVAL_OVERRIDE_REQUEST, MSG_ID_RO_LEVEL_OVERRIDE_REQUEST, MSG_ID_RO_FLOWS_PUBLISH_INTERVAL_OVERRIDE_REQUEST, - MSG_ID_RO_FLOW_RATE_OVERRIDE_REQUEST, + MSG_ID_RO_FLOW_RATE_OVERRIDE_REQUEST, //20 MSG_ID_RO_FLOW_TEMP_OVERRIDE_REQUEST, MSG_ID_RO_FILTERED_FLOW_RATE_OVERRIDE_REQUEST, MSG_ID_RO_FILTERED_FLOW_TEMP_OVERRIDE_REQUEST, MSG_ID_RO_CONDUCTIVITY_PUBLISH_INTERVAL_OVERRIDE_REQUEST, - MSG_ID_RO_CONDUCTIVITY_OVERRIDE_REQUEST, + MSG_ID_RO_CONDUCTIVITY_OVERRIDE_REQUEST, //25 MSG_ID_RO_CONDUCTIVITY_TEMP_OVERRIDE_REQUEST, MSG_ID_RO_CONDUCTIVITY_READ_COUNT_OVERRIDE_REQUEST, MSG_ID_RO_CONDUCTIVITY_ERROR_COUNT_OVERRIDE_REQUEST, - MSG_ID_RO_TEMPERATURE_OVERRIDE_REQUEST + MSG_ID_RO_TEMPERATURE_OVERRIDE_REQUEST, + MSG_ID_DD_RO_START_STOP_CMD_REQUEST //30 }; /// Message handling function table @@ -93,31 +96,32 @@ &handleROSoftwareResetRequest, &handleROTestConfiguration, &testValvesStatesPublishIntervalOverride, - &testValveStateOverride, + &testValveStateOverride, //5 &testValveSensedStateOverride, &testSetBoostPumpPWM, &testBoostPumpPWMOverride, &testBoostPumpRPMOverride, - &testROPumpDataPublishIntervalOverride, + &testROPumpDataPublishIntervalOverride, //10 &testPressureSensorReadingsOverride, &testPressureSensorTemperatureReadingsOverride, &testPressureSensorReadCounterOverride, &testPressureSensorErrorCounterOverride, - &testPressureSensorDataPublishIntervalOverride, + &testPressureSensorDataPublishIntervalOverride, //15 &handleUnhandledMsg, &testLevelsDataPublishIntervalOverride, &testLevelStateOverride, &testFlowSensorDataPublishIntervalOverride, - &testFlowSensorReadingsOverride, + &testFlowSensorReadingsOverride, //20 &testFlowSensorTemperatureReadingsOverride, &testFlowSensorFilteredReadingsOverride, &testFlowSensorFilteredTemperatureReadingsOverride, &testConductivitySensorDataPublishIntervalOverride, - &testConductivitySensorReadingsOverride, + &testConductivitySensorReadingsOverride, //25 &testConductivitySensorTemperatureReadingsOverride, &testConductivitySensorReadCounterOverride, &testConductivitySensorErrorCounterOverride, - &testMeasuredTemperatureOverride + &testMeasuredTemperatureOverride, + &handleGeneratePermeateRequestMsg //30 }; #define NUM_OF_FUNCTION_HANDLERS (sizeof(MSG_FUNCTION_HANDLERS) / sizeof(MsgFuncPtr)) @@ -131,7 +135,6 @@ // ********** private function prototypes ********** -static BOOL sendAckResponseMsg( MSG_ID_T msgID, COMM_BUFFER_T buffer, BOOL ack ); static MsgFuncPtr getMsgHandler( U16 msgID ); static BOOL sendTestAckResponseMsg( MSG_ID_T msgID, BOOL ack ); @@ -259,7 +262,7 @@ * @param ack TRUE if test message was handled successfully, FALSE if not * @return TRUE if response message successfully queued for transmit, FALSE if not *************************************************************************/ -static BOOL sendAckResponseMsg( MSG_ID_T msgID, COMM_BUFFER_T buffer, BOOL ack ) +BOOL sendAckResponseMsg( MSG_ID_T msgID, COMM_BUFFER_T buffer, BOOL ack ) { BOOL result; MESSAGE_T msg; Index: firmware/App/Services/Messaging.h =================================================================== diff -u -rd8cd7de2f84b26aafc153e2bb665a5058a040bf0 -r9ad496e4c3a54e96402afd66955be575bdaa3f57 --- firmware/App/Services/Messaging.h (.../Messaging.h) (revision d8cd7de2f84b26aafc153e2bb665a5058a040bf0) +++ firmware/App/Services/Messaging.h (.../Messaging.h) (revision 9ad496e4c3a54e96402afd66955be575bdaa3f57) @@ -36,10 +36,12 @@ BOOL sendACKMsg( MESSAGE_T *message ); void handleIncomingMessage( MESSAGE_T *message ); BOOL handleUnhandledMsg( MESSAGE_T *message ); +BOOL sendAckResponseMsg( MSG_ID_T msgID, COMM_BUFFER_T buffer, BOOL ack ); BOOL broadcastAlarmTriggered( U32 alarm, ALARM_DATA_T almData1, ALARM_DATA_T almData2 ); BOOL broadcastAlarmCleared( U32 alarm ); BOOL broadcastAlarmConditionCleared( U32 alarm ); + BOOL sendEvent( RO_EVENT_ID_T event, EVENT_DATA_T dat1, EVENT_DATA_T dat2 ); void handleUITDResetInServiceModeRequest( MESSAGE_T* message );