Index: firmware/App/Modes/ModeWaterPreGen.c =================================================================== diff -u -rd19f70066e9d3503c5d2d4fd26a43c7dfa00f873 -r28b6e281605c1a944c982d0ec7dcdb6f28aac82b --- firmware/App/Modes/ModeWaterPreGen.c (.../ModeWaterPreGen.c) (revision d19f70066e9d3503c5d2d4fd26a43c7dfa00f873) +++ firmware/App/Modes/ModeWaterPreGen.c (.../ModeWaterPreGen.c) (revision 28b6e281605c1a944c982d0ec7dcdb6f28aac82b) @@ -1,16 +1,272 @@ /************************************************************************** * -* Copyright (c) 2024-2025 Diality Inc. - All Rights Reserved. +* Copyright (c) 2020-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 ModeWaterPreGen.h +* @file ModeWaterPreGen.c * * @author (last) Michael Garthwaite -* @date (last) 03-Mar-2025 +* @date (last) 28-Feb-2025 * * @author (original) Michael Garthwaite -* @date (original) 03-Mar-2025 +* @date (original) 28-Feb-2025 * ***************************************************************************/ + +#include "ModeWaterPreGen.h" +#include "DDInterface.h" +#include "ModeStandby.h" +#include "MessageSupport.h" +#include "Messaging.h" +#include "OperationModes.h" +#include "TaskGeneral.h" +#include "Timers.h" + +/** + * @addtogroup FPPreGenWaterMode + * @{ + */ + +// ********** private definitions ********** + +#define PRE_GENW_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the pre gen water mode data published. + +// ********** private data ********** + +static RO_PRE_GENW_MODE_STATE_T preGenWState; ///< Currently active pre generate water state. +static U32 preGenWDataPublicationTimerCounter; ///< Used to schedule pre generate water data publication to CAN bus. +static OVERRIDE_U32_T preGenWDataPublishInterval; ///< Pre Generate water mode data publish interval. +static U32 pendingStartGenRequest; ///< Flag indicating DD has requested RO start the generate permeate. + +// ********** private function prototypes ********** + +static void publishPreGenWModeData( void ); +static RO_PRE_GENW_MODE_STATE_T handlePreGenWStartState( void ); +static RO_PRE_GENW_MODE_STATE_T handlePreGenWCompleteState( void ); +static void setModePreGenWTransition( RO_PRE_GENW_MODE_STATE_T state ); + +/*********************************************************************//** + * @brief + * The initPreGenWMode function initializes the pre generate water mode unit. + * @details \b Inputs: none + * @details \b Outputs: pre gen water mode unit initialized + * @return none + *************************************************************************/ +void initPreGenWMode( void ) +{ + preGenWState = RO_PRE_GENW_STATE_START; + preGenWDataPublishInterval.data = PRE_GENW_DATA_PUBLISH_INTERVAL; + preGenWDataPublishInterval.ovData = PRE_GENW_DATA_PUBLISH_INTERVAL; + preGenWDataPublishInterval.ovInitData = 0; + preGenWDataPublishInterval.override = OVERRIDE_RESET; + preGenWDataPublicationTimerCounter = 0; +} + +/*********************************************************************//** + * @brief + * The transitionToPreGenWMode function prepares for transition to pre gen + * water mode. + * @details \b Inputs: none + * @details \b Outputs: none + * @return initial state + *************************************************************************/ +U32 transitionToPreGenWMode( void ) +{ + initPreGenWMode(); + setCurrentSubState( preGenWState ); + + return preGenWState; +} + +/*********************************************************************//** + * @brief + * The execPreGenWMode function executes the pre gen water mode state machine. + * @details \b Inputs: none + * @details \b Outputs: Pre Gen water mode state machine executed + * @details \b Alarm: ALARM_ID_RO_SOFTWARE_FAULT when wrong pre gen water state invoked. + * @return current state. + *************************************************************************/ +U32 execPreGenWMode( void ) +{ + + // execute current gen water state + switch ( preGenWState ) + { + case RO_PRE_GENW_STATE_START: + preGenWState = handlePreGenWStartState(); + break; + + case RO_PRE_GENW_STATE_COMPLETE: + preGenWState = handlePreGenWCompleteState(); + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_RO_SOFTWARE_FAULT, SW_FAULT_ID_RO_INVALID_PGEN_STATE, preGenWState ) + break; + + } + //Publish pre Gen water mode data + publishPreGenWModeData(); + + return preGenWState; +} + +/*********************************************************************//** + * @brief + * The setModePreGenWTransition function sets the actuators and variables + * for the state transition in pre generate water mode. + * @details Inputs: Valve states, Pump speed + * @details Outputs: Actuate valves, pumps as desired. + * @param state pre gen water state enum + * @return none + *************************************************************************/ +static void setModePreGenWTransition( RO_PRE_GENW_MODE_STATE_T state ) +{ + // Execute on running state + switch( state ) + { + case RO_PRE_GENW_STATE_START: + // Do nothing + break; + + case RO_PRE_GENW_STATE_COMPLETE: + // Do nothing + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_RO_SOFTWARE_FAULT, SW_FAULT_ID_RO_INVALID_PGEN_STATE, state ) + break; + } +} +/*********************************************************************//** + * @brief + * The handlePreGenWStartState handles the initial state of pre gen water. + * @details \b Inputs: none + * @details \b Outputs: none + * @return the next state of pre gen water mode + *************************************************************************/ +static RO_PRE_GENW_MODE_STATE_T handlePreGenWStartState( void ) +{ + RO_GENW_MODE_STATE_T state = RO_PRE_GENW_STATE_COMPLETE; + setModePreGenWTransition( RO_PRE_GENW_STATE_COMPLETE ); + + return state; +} + +/*********************************************************************//** + * @brief + * The handlePreGenWCompleteState handles the complete state ofpre gen water. + * @details \b Inputs: none + * @details \b Outputs: none + * @return the next state of pre gen water mode + *************************************************************************/ +static RO_PRE_GENW_MODE_STATE_T handlePreGenWCompleteState( void ) +{ + RO_PRE_GENW_MODE_STATE_T state = RO_PRE_GENW_STATE_COMPLETE; + + if ( TRUE == pendingStartGenRequest ) + { + requestNewOperationMode( RO_MODE_GENW ); + } + + return state; +} + +/** + * *******************************************************************//** + * @brief + * The getCurrentPreGenWState function returns the current state of the + * pre gen water mode. + * @details \b Inputs: preGenWState + * @details \b Outputs: preGenWState + * @return the current state of gen water mode + *************************************************************************/ +RO_PRE_GENW_MODE_STATE_T getCurrentPreGenWState( void ) +{ + return preGenWState; +} + +/*********************************************************************//** + * @brief + * The getPreGenWDataPublishInterval function gets the pre generate water + * mode data publish interval. + * @details \b Inputs: genWaterDataPublishInterval + * @details \b Outputs: none + * @return the interval at generate water mode data being published. + *************************************************************************/ +static U32 getPreGenWDataPublishInterval( void ) +{ + U32 result = getU32OverrideValue( &preGenWDataPublishInterval ); + + return result; +} +/*********************************************************************//** + * @brief + * The publishPreGenWModeData function broadcasts the pre generate water + * mode data at defined interval. + * @details \b Inputs: genDialysateDataPublicationTimerCounter + * @details \b Outputs: DD generate water data broadcast message sent + * @details \b Message \Sent: MSG_ID_RO_GEN_WATER_MODE_DATA to publish the + * generate water mode data. + * @return none + *************************************************************************/ +static void publishPreGenWModeData( void ) +{ + if ( ++preGenWDataPublicationTimerCounter >= getPreGenWDataPublishInterval() ) + { + PRE_GENW_MODE_DATA_T data; + + data.preGenWExecState = (U32)getCurrentPreGenWState(); + + broadcastData( MSG_ID_RO_PRE_GEN_WATER_MODE_DATA, COMM_BUFFER_OUT_CAN_RO_BROADCAST, (U08*)&data, sizeof( PRE_GENW_MODE_DATA_T ) ); + + preGenWDataPublicationTimerCounter = 0; + } +} + +/*********************************************************************//** + * @brief + * The requestPreGenStart 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 requestGenWaterStart( void ) +{ + BOOL result = FALSE; + + if ( RO_PRE_GENW_STATE_COMPLETE == preGenWState ) + { + result = TRUE; + pendingStartGenRequest = TRUE; + } + + return result; +} + + +/************************************************************************* + * TEST SUPPORT FUNCTIONS + *************************************************************************/ + + +/*********************************************************************//** + * @brief + * The testPreGenWaterDataPublishIntervalOverride function overrides the + * DD generate water mode data publish interval. + * @details \b Inputs: preGenWDataPublishInterval + * @details \b Outputs: preGenWDataPublishInterval + * @param Override message from Dialin which includes the interval + * (in ms) to override the RO generate water data publish interval to. + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testPreGenWaterDataPublishIntervalOverride( MESSAGE_T *message ) +{ + BOOL result = u32BroadcastIntervalOverride( message, &preGenWDataPublishInterval, TASK_GENERAL_INTERVAL ); + + return result; +} + +/**@}*/