/************************************************************************** * * 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.c * * @author (last) Michael Garthwaite * @date (last) 28-Feb-2025 * * @author (original) Michael Garthwaite * @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 pendingStartPreGenRequest; ///< 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; pendingStartPreGenRequest = FALSE; } /*********************************************************************//** * @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: preGenWState * @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: none * @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: // TODO: handler function of state start break; case RO_PRE_GENW_STATE_COMPLETE: // TODO: handler function of state complete 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_PRE_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: pendingStartGenRequest * @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 == pendingStartPreGenRequest ) { 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: none * @return the current state of pre gen water mode *************************************************************************/ RO_PRE_GENW_MODE_STATE_T getCurrentPreGenWState( void ) { return preGenWState; } /** * *******************************************************************//** * @brief * The getPreGenRequest function returns the current state of the * pre gen water mode. * @details \b Inputs: pendingStartPreGenRequest * @details \b Outputs: none * @return the current state of pre gen request *************************************************************************/ BOOL getPreGenRequest( void ) { return pendingStartPreGenRequest; } /*********************************************************************//** * @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: preGenWState, preGenWDataPublicationTimerCounter * @details \b Message \b 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 pre gen permeate mode). * @details \b Inputs: standbyState * @details \b Outputs: pendingStartRORequest * @return TRUE if request accepted, FALSE if not. *************************************************************************/ BOOL requestPreGenStart( void ) { BOOL result = FALSE; if ( ( RO_MODE_STAN == getCurrentOperationMode() ) && ( RO_STANDBY_MODE_STATE_IDLE == getCurrentStandbyState() ) ) { result = TRUE; pendingStartPreGenRequest = TRUE; } return result; } /*********************************************************************//** * @brief * The requestPreGenStop function handles an DD request to stop (go to standby mode). * @details \b Inputs: none * @details \b Outputs: pendingStartPreGenRequest * @return TRUE if request accepted, FALSE if not. *************************************************************************/ BOOL requestPreGenStop( void ) { BOOL result = TRUE; pendingStartPreGenRequest = FALSE; requestNewOperationMode( RO_MODE_STAN ); 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; } /**@}*/