/************************************************************************** * * 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 ModeGenPermeateDefeatured.c * * @author (last) Michael Garthwaite * @date (last) 28-Feb-2025 * * @author (original) Michael Garthwaite * @date (original) 28-Feb-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. // ********** private data ********** static FP_GENP_DEF_MODE_STATE_T genPermeateDefState; ///< Currently active generate Permeate Defeatured state. static U32 genPermeateDefDataPublicationTimerCounter; ///< Used to schedule generate Permeate data publication to CAN bus. static OVERRIDE_U32_T genPermeateDefDataPublishInterval; ///< Generate permeate mode data publish interval. static BOOL pendingStartGenDefRequest; ///< Flag indicating DD has requested FP start the generate permeate. // ********** private function prototypes ********** static FP_GENP_DEF_MODE_STATE_T handleGenPDefSupplyWaterState( void ); static FP_GENP_DEF_MODE_STATE_T handleGenPDefPausedState( void ); static void setModeGenPDefTransition( FP_GENP_DEF_MODE_STATE_T state ); static U32 getGenPermeateDefDataPublishInterval( void ); static void publishGenPDefModeData( void ); /*********************************************************************//** * @brief * The initGenPermeateDefeaturedMode function initializes the * defeatured permeate generation mode. * @details \b Inputs: none * @details \b Outputs: defeatured permeate mode unit initialized * @return none *************************************************************************/ void initGenPermeateDefeaturedMode( void ) { genPermeateDefState = FP_GENP_DEF_PAUSED; genPermeateDefDataPublishInterval.data = PRE_GEN_DEF_PERMEATE_DATA_PUBLISH_INTERVAL; genPermeateDefDataPublishInterval.ovData = PRE_GEN_DEF_PERMEATE_DATA_PUBLISH_INTERVAL; genPermeateDefDataPublishInterval.ovInitData = 0; genPermeateDefDataPublishInterval.override = OVERRIDE_RESET; genPermeateDefDataPublicationTimerCounter = 0; pendingStartGenDefRequest = FALSE; } /*********************************************************************//** * @brief * The transitionToGenPermeateDefeaturedMode function prepares for transition * to defeatured gen permeate mode. * @details \b Inputs: none * @details \b Outputs: none * @return initial state *************************************************************************/ U32 transitionToGenPermeateDefeaturedMode( void ) { initGenPermeateDefeaturedMode(); setCurrentFPSubState( genPermeateDefState ); return genPermeateDefState; } /*********************************************************************//** * @brief * The execGenPermeateDefeaturedMode 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 execGenPermeateDefeaturedMode( void ) { FP_GENP_DEF_MODE_STATE_T prevState = genPermeateDefState; // execute current gen Permeate defeatured state switch ( genPermeateDefState ) { case FP_GENP_DEF_SUPPLY_WATER: genPermeateDefState = handleGenPDefSupplyWaterState(); break; case FP_GENP_DEF_PAUSED: genPermeateDefState = handleGenPDefPausedState(); break; default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_FP_SOFTWARE_FAULT, FP_FAULT_ID_FP_INVALD_GENP_DEF_STATE, genPermeateDefState ) break; } if ( prevState != genPermeateDefState ) { setModeGenPDefTransition( genPermeateDefState ); SEND_EVENT_WITH_2_U32_DATA( FP_EVENT_GENP_DEF_CHANGE, genPermeateDefState, prevState ) } //Publish Gen Permeate mode data publishGenPDefModeData(); return genPermeateDefState; } /*********************************************************************//** * @brief * The setModeGenPDefTransition 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 setModeGenPDefTransition( FP_GENP_DEF_MODE_STATE_T state ) { // Execute on running state switch( state ) { case FP_GENP_DEF_SUPPLY_WATER: 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 ); break; case FP_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 handleGenPDefSupplyWaterState handles the supply water of gen permeate * defeatured mode. * @details \b Inputs: none * @details \b Outputs: nones * @return the next state of gen water defeatured mode *************************************************************************/ static FP_GENP_DEF_MODE_STATE_T handleGenPDefSupplyWaterState( void ) { FP_GENP_DEF_MODE_STATE_T state = FP_GENP_DEF_SUPPLY_WATER; // if ( TRUE == 1 ))// TODO Alarm and Stop State Rework // { // state = FP_GENP_DEF_PAUSED; // } return state; } /*********************************************************************//** * @brief * The handleGenPDefPausedState 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_GENP_DEF_MODE_STATE_T handleGenPDefPausedState( void ) { FP_GENP_DEF_MODE_STATE_T state = FP_GENP_DEF_PAUSED; return state; } /*********************************************************************//** * @brief * The getCurrentGenPermeateDefState function returns the current state of the * gen permeate defeatured mode. * @details \b Inputs: genPermeateDefState * @details \b Outputs: genPermeateDefState * @return the current state of gen permeate defeatured mode *************************************************************************/ FP_GENP_DEF_MODE_STATE_T getCurrentGenPermeateDefState( void ) { return genPermeateDefState; } /*********************************************************************//** * @brief * The requestGenWaterDefStart function handles an DD request to start (go to gen permeate mode). * @details \b Inputs: none * @details \b Outputs: pendingStartGenDefRequest * @return TRUE if request accepted, FALSE if not. *************************************************************************/ BOOL requestGenWaterDefStart( void ) { BOOL result = FALSE; result = TRUE; pendingStartGenDefRequest = TRUE; requestNewFPOperationMode( FP_MODE_DEGP ); return result; } /*********************************************************************//** * @brief * The getGenPermeateDefRequest function returns the current state of the * gen permeate defeatured mode. * @details \b Inputs: pendingStartGenDefRequest * @details \b Outputs: none * @return the current state of gen permeate defeatured request *************************************************************************/ BOOL getGenPermeateDefRequest( void ) { return pendingStartGenDefRequest; } /*********************************************************************//** * @brief * The requestGenWaterDefStop function handles an DD request to stop (go to standby mode). * @details \b Inputs: none * @details \b Outputs: pendingStartGenDefRequest * @return TRUE if request accepted, FALSE if not. *************************************************************************/ BOOL requestGenWaterDefStop( void ) { BOOL result = TRUE; pendingStartGenDefRequest = FALSE; requestNewFPOperationMode( FP_MODE_STAN ); return result; } /*********************************************************************//** * @brief * The getGenPermeateDataPublishInterval function gets the generate permeate * defeatured mode data publish interval. * @details \b Inputs: genPermeateDefDataPublishInterval * @details \b Outputs: none * @return the interval at generate permeate defeatured mode data being published. *************************************************************************/ static U32 getGenPermeateDefDataPublishInterval( void ) { U32 result = getU32OverrideValue( &genPermeateDefDataPublishInterval ); return result; } /*********************************************************************//** * @brief * The publishGenPModeData function broadcasts the generate water * mode data at defined interval. * @details \b Inputs: genPermeateDataPublicationTimerCounter * @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 publishGenPDefModeData( void ) { if ( ++genPermeateDefDataPublicationTimerCounter >= getGenPermeateDefDataPublishInterval() ) { GEN_PERMEATE_DEF_MODE_DATA_T data; data.genPermeateDefExecState = (U32)getCurrentGenPermeateDefState(); broadcastData( MSG_ID_FP_GENP_DEF_DATA, COMM_BUFFER_OUT_CAN_FP_BROADCAST, (U08*)&data, sizeof( GEN_PERMEATE_DEF_MODE_DATA_T ) ); genPermeateDefDataPublicationTimerCounter = 0; } } /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ /*********************************************************************//** * @brief * The testGenPermeateDefDataPublishIntervalOverride function overrides the * DD generate water mode data publish interval. * @details \b Inputs: genPermeateDefDataPublishInterval * @details \b Outputs: genPermeateDefDataPublishInterval * @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 testGenPermeateDefDataPublishIntervalOverride( MESSAGE_T *message ) { BOOL result = u32BroadcastIntervalOverride( message, &genPermeateDefDataPublishInterval, TASK_GENERAL_INTERVAL ); return result; } /**@}*/