/************************************************************************** * * Copyright (c) 2025-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 ModePreGenPermeateDefeatured.c * * @author (last) “rkallala” * @date (last) 09-Dec-2025 * * @author (original) Michael Garthwaite * @date (original) 08-Sep-2025 * ***************************************************************************/ #include "FPModeStandby.h" #include "FPOperationModes.h" #include "Messaging.h" #include "MessageSupport.h" #include "ModeGenPermeateDefeatured.h" #include "ModePreGenPermeateDefeatured.h" #include "TaskGeneral.h" #include "Timers.h" #include "Valves.h" /** * @addtogroup FPGenPermeateDefeaturedMode * @{ */ // ********** private definitions ********** #define PRE_GEN_DEF_PERMEATE_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the gen permeate mode data published. #define PRE_GEN_DEF_FLUSH_TIMEOUT_MS ( 30 * MS_PER_SECOND ) #define PRE_GEN_DEF_WATER_CHECK_TIMEOUT_MS ( 10 * MS_PER_SECOND ) // ********** private data ********** static FP_PRE_GENP_DEF_MODE_STATE_T preGenPermeateDefState; ///< Currently active generate Permeate Defeatured state. static U32 preGenPermeateDefDataPublicationTimerCounter; ///< Used to schedule generate Permeate data publication to CAN bus. static OVERRIDE_U32_T preGenPermeateDefDataPublishInterval; ///< Generate permeate mode data publish interval. static BOOL pendingStartPreGenDefRequest; ///< Flag indicating DD has requested FP start the generate permeate. static U32 preGenPermeateDefFlushTimer; static U32 preGenPermeateDefWaterCheckTimer; // ********** private function prototypes ********** static FP_PRE_GENP_DEF_MODE_STATE_T handlePreGenPDefFlushState( void ); static FP_PRE_GENP_DEF_MODE_STATE_T handlePreGenPDefInletWaterState( void ); static FP_PRE_GENP_DEF_MODE_STATE_T handlePreGenPDefPausedState( void ); static void setModePreGenPDefTransition( FP_PRE_GENP_DEF_MODE_STATE_T state ); static U32 getPreGenPermeateDefDataPublishInterval( void ); static void publishPreGenPDefModeData( void ); /*********************************************************************//** * @brief * The initPreGenPermeateDefeaturedMode function initializes the * defeatured permeate generation mode. * @details \b Inputs: none * @details \b Outputs: defeatured permeate mode unit initialized * @return none *************************************************************************/ void initPreGenPermeateDefeaturedMode( void ) { preGenPermeateDefState = FP_PRE_GENP_DEF_FLUSH; preGenPermeateDefDataPublishInterval.data = PRE_GEN_DEF_PERMEATE_DATA_PUBLISH_INTERVAL; preGenPermeateDefDataPublishInterval.ovData = PRE_GEN_DEF_PERMEATE_DATA_PUBLISH_INTERVAL; preGenPermeateDefDataPublishInterval.ovInitData = 0; preGenPermeateDefDataPublishInterval.override = OVERRIDE_RESET; preGenPermeateDefDataPublicationTimerCounter = 0; pendingStartPreGenDefRequest = FALSE; preGenPermeateDefFlushTimer = 0; preGenPermeateDefWaterCheckTimer = 0; } /*********************************************************************//** * @brief * The transitionToPreGenPermeateDefeaturedMode function prepares for transition * to defeatured gen permeate mode. * @details \b Inputs: none * @details \b Outputs: none * @return initial state *************************************************************************/ U32 transitionToPreGenPermeateDefeaturedMode( void ) { initGenPermeateDefeaturedMode(); setCurrentFPSubState( preGenPermeateDefState ); return preGenPermeateDefState; } /*********************************************************************//** * @brief * The execPreGenPermeateDefeaturedMode function executes the Gen * Permeate defeatured mode state machine. * @details \b Inputs: none * @details \b Outputs: Gen Permeate defeatured mode state machine executed * @details \b Alarm: ALARM_ID_FP_SOFTWARE_FAULT when wrong state invoked. * @return current state. *************************************************************************/ U32 execPreGenPermeateDefeaturedMode( void ) { FP_PRE_GENP_DEF_MODE_STATE_T prevState = preGenPermeateDefState; // execute current gen Permeate defeatured state switch ( preGenPermeateDefState ) { case FP_PRE_GENP_DEF_FLUSH: preGenPermeateDefState = handlePreGenPDefFlushState(); break; case FP_PRE_GENP_DEF_INLET_WATER_CHECK: preGenPermeateDefState = handlePreGenPDefInletWaterState(); break; case FP_PRE_GENP_DEF_PAUSED: preGenPermeateDefState = handlePreGenPDefPausedState(); break; default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_FP_SOFTWARE_FAULT, FP_FAULT_ID_FP_INVALD_GENP_DEF_STATE, preGenPermeateDefState ) break; } if ( prevState != preGenPermeateDefState ) { setModePreGenPDefTransition( preGenPermeateDefState ); SEND_EVENT_WITH_2_U32_DATA( FP_EVENT_GENP_DEF_CHANGE, preGenPermeateDefState, prevState ) } //Publish Gen Permeate mode data publishPreGenPDefModeData(); return preGenPermeateDefState; } /*********************************************************************//** * @brief * The setModePreGenPDefTransition function sets the actuators and variables * for the state transition in generate permeate mode. * @details Inputs: none * @details Outputs: Actuate valves, pumps as desired. * @param state gen permeate state enum * @return none *************************************************************************/ static void setModePreGenPDefTransition( FP_PRE_GENP_DEF_MODE_STATE_T state ) { // Execute on running state switch( state ) { case FP_PRE_GENP_DEF_FLUSH: setValveState( M4_VALV, VALVE_STATE_OPEN ); setValveState( M12_VALV, VALVE_STATE_OPEN ); setValveState( P6_VALV, VALVE_STATE_CLOSED ); setValveState( P11_VALV, VALVE_STATE_CLOSED ); setValveState( P33_VALV, VALVE_STATE_CLOSED ); setValveState( P34_VALV, VALVE_STATE_CLOSED ); setValveState( P37_VALV, VALVE_STATE_CLOSED ); setValveState( P39_VALV, VALVE_STATE_CLOSED ); preGenPermeateDefFlushTimer = getMSTimerCount(); break; case FP_PRE_GENP_DEF_INLET_WATER_CHECK: setValveState( M4_VALV, VALVE_STATE_OPEN ); setValveState( M12_VALV, VALVE_STATE_CLOSED ); setValveState( P6_VALV, VALVE_STATE_CLOSED ); setValveState( P11_VALV, VALVE_STATE_CLOSED ); setValveState( P33_VALV, VALVE_STATE_CLOSED ); setValveState( P34_VALV, VALVE_STATE_CLOSED ); setValveState( P37_VALV, VALVE_STATE_CLOSED ); setValveState( P39_VALV, VALVE_STATE_CLOSED ); preGenPermeateDefWaterCheckTimer = getMSTimerCount(); break; case FP_PRE_GENP_DEF_PAUSED: setValveState( M4_VALV, VALVE_STATE_CLOSED ); setValveState( M12_VALV, VALVE_STATE_CLOSED ); setValveState( P6_VALV, VALVE_STATE_CLOSED ); setValveState( P11_VALV, VALVE_STATE_CLOSED ); setValveState( P33_VALV, VALVE_STATE_CLOSED ); setValveState( P34_VALV, VALVE_STATE_CLOSED ); setValveState( P37_VALV, VALVE_STATE_CLOSED ); setValveState( P39_VALV, VALVE_STATE_CLOSED ); break; default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_FP_SOFTWARE_FAULT, FP_FAULT_ID_FP_INVALID_GENP_STATE, state ) break; } } /*********************************************************************//** * @brief * The handlePreGenPDefFlushState handles the supply water of gen permeate * defeatured mode. * @details \b Inputs: preGenPermeateDefFlushTimer * @details \b Outputs: none * @return the next state of gen water defeatured mode *************************************************************************/ static FP_PRE_GENP_DEF_MODE_STATE_T handlePreGenPDefFlushState( void ) { FP_PRE_GENP_DEF_MODE_STATE_T state = FP_PRE_GENP_DEF_FLUSH; // if ( TRUE == 1 )// TODO Alarm and Stop State Rework // { // state = FP_PRE_GENP_DEF_PAUSED; // } if( TRUE == didTimeout( preGenPermeateDefFlushTimer, PRE_GEN_DEF_FLUSH_TIMEOUT_MS ) ) { state = FP_PRE_GENP_DEF_INLET_WATER_CHECK; } return state; } /*********************************************************************//** * @brief * The handlePreGenPDefInletWaterState handles the pause state of gen permeate * defeatured mode. * @details \b Inputs: preGenPermeateDefWaterCheckTimer * @details \b Outputs: none * @return the next state of gen water defeatured mode *************************************************************************/ static FP_PRE_GENP_DEF_MODE_STATE_T handlePreGenPDefInletWaterState( void ) { FP_PRE_GENP_DEF_MODE_STATE_T state = FP_PRE_GENP_DEF_INLET_WATER_CHECK; // if ( TRUE == 1 ))// TODO Alarm and Stop State Rework // { // state = FP_PRE_GENP_DEF_PAUSED; // } if( TRUE == didTimeout( preGenPermeateDefWaterCheckTimer, PRE_GEN_DEF_WATER_CHECK_TIMEOUT_MS ) ) { transitionToGenPermeateDefeaturedMode(); requestGenWaterDefStart(); } return state; } /*********************************************************************//** * @brief * The handlePreGenPDefPausedState handles the pause state of gen permeate * defeatured mode. * @details \b Inputs: none * @details \b Outputs: none * @return the next state of gen water defeatured mode *************************************************************************/ static FP_PRE_GENP_DEF_MODE_STATE_T handlePreGenPDefPausedState( void ) { FP_PRE_GENP_DEF_MODE_STATE_T state = FP_PRE_GENP_DEF_PAUSED; // if ( TRUE == 1 ))// TODO Alarm and Stop State Rework // { // state = FP_PRE_GENP_DEF_PAUSED; // } return state; } /*********************************************************************//** * @brief * The getCurrentPreGenPermeateDefState function returns the current state of the * gen permeate defeatured mode. * @details \b Inputs: preGenPermeateDefState * @details \b Outputs: preGenPermeateDefState * @return the current state of gen permeate defeatured mode *************************************************************************/ FP_PRE_GENP_DEF_MODE_STATE_T getCurrentPreGenPermeateDefState( void ) { return preGenPermeateDefState; } /*********************************************************************//** * @brief * The requestPreGenDefStart function handles an DD request to start (go to gen permeate mode). * @details \b Inputs: none * @details \b Outputs: pendingStartPreGenDefRequest * @return TRUE if request accepted, FALSE if not. *************************************************************************/ BOOL requestPreGenDefStart( void ) { BOOL result = FALSE; if ( ( FP_MODE_STAN == getCurrentFPOperationMode() ) && ( FP_STANDBY_MODE_STATE_IDLE == getCurrentFPStandbyState() ) ) { result = TRUE; pendingStartPreGenDefRequest = TRUE; requestNewFPOperationMode( FP_MODE_DPGP ); } return result; } /*********************************************************************//** * @brief * The getPreGenPermeateRequest function returns the current state of the * gen permeate defeatured mode. * @details \b Inputs: pendingStartPreGenDefRequest * @details \b Outputs: none * @return the current state of gen permeate defeatured request *************************************************************************/ BOOL getPreGenPermeateRequest( void ) { return pendingStartPreGenDefRequest; } /*********************************************************************//** * @brief * The requestPreGenDefStop function handles an DD request to stop (go to standby mode). * @details \b Inputs: none * @details \b Outputs: pendingStartPreGenDefRequest * @return TRUE if request accepted, FALSE if not. *************************************************************************/ BOOL requestPreGenDefStop( void ) { BOOL result = TRUE; pendingStartPreGenDefRequest = FALSE; requestNewFPOperationMode( FP_MODE_STAN ); return result; } /*********************************************************************//** * @brief * The getGenPermeateDataPublishInterval function gets the generate permeate * defeatured mode data publish interval. * @details \b Inputs: preGenPermeateDefDataPublishInterval * @details \b Outputs: none * @return the interval at generate permeate defeatured mode data being published. *************************************************************************/ static U32 getPreGenPermeateDefDataPublishInterval( void ) { U32 result = getU32OverrideValue( &preGenPermeateDefDataPublishInterval ); return result; } /*********************************************************************//** * @brief * The publishGenPModeData function broadcasts the generate water * mode data at defined interval. * @details \b Inputs: preGenPermeateDefDataPublicationTimerCounter * @details \b Outputs: FP generate permeate data broadcast message sent * @details \b Message \Sent: MSG_ID_FP_GENP_DEF_DATA to publish the * generate water mode data. * @return none *************************************************************************/ static void publishPreGenPDefModeData( void ) { if ( ++preGenPermeateDefDataPublicationTimerCounter >= getPreGenPermeateDefDataPublishInterval() ) { PRE_GEN_PERMEATE_DEF_MODE_DATA_T data; data.preGenPermeateDefExecState = (U32)getCurrentGenPermeateDefState(); broadcastData( MSG_ID_FP_GENP_DEF_DATA, COMM_BUFFER_OUT_CAN_FP_BROADCAST, (U08*)&data, sizeof( PRE_GEN_PERMEATE_DEF_MODE_DATA_T ) ); preGenPermeateDefDataPublicationTimerCounter = 0; } } /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ /*********************************************************************//** * @brief * The testGenPermeateDefDataPublishIntervalOverride function overrides the * DD generate water mode data publish interval. * @details \b Inputs: preGenPermeateDefDataPublishInterval * @details \b Outputs: preGenPermeateDefDataPublishInterval * @param Override message from Dialin which includes the interval * (in ms) to override the FP generate permeate data publish interval to. * @return TRUE if override successful, FALSE if not *************************************************************************/ BOOL testPreGenPermeateDefDataPublishIntervalOverride( MESSAGE_T *message ) { BOOL result = u32BroadcastIntervalOverride( message, &preGenPermeateDefDataPublishInterval, TASK_GENERAL_INTERVAL ); return result; } /**@}*/