Index: firmware/App/Modes/ModePreGenPermeateDefeatured.c =================================================================== diff -u -r410afd26b3ae5e372310c696c82f58c59235e10d -r8d272582cbd2cb5fc0c6af0fead2867ce02658b0 --- firmware/App/Modes/ModePreGenPermeateDefeatured.c (.../ModePreGenPermeateDefeatured.c) (revision 410afd26b3ae5e372310c696c82f58c59235e10d) +++ firmware/App/Modes/ModePreGenPermeateDefeatured.c (.../ModePreGenPermeateDefeatured.c) (revision 8d272582cbd2cb5fc0c6af0fead2867ce02658b0) @@ -1,28 +1,380 @@ +/************************************************************************** +* +* 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 ModePreGenPermeateDefeatured.c +* +* @author (last) Michael Garthwaite +* @date (last) 28-Feb-2025 +* +* @author (original) Michael Garthwaite +* @date (original) 28-Feb-2025 +* +***************************************************************************/ +#include "Messaging.h" +#include "MessageSupport.h" +#include "ModeGenPermeateDefeatured.h" #include "ModePreGenPermeateDefeatured.h" +#include "ModeStandby.h" +#include "OperationModes.h" +#include "TaskGeneral.h" +#include "Timers.h" +#include "Valves.h" /** - * @addtogroup FPreGenPermeateDefeatured + * @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; -void initPreGenPDefMode( void ) +// ********** 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_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(); + setCurrentSubState( preGenPermeateDefState ); + return preGenPermeateDefState; } -U32 transitionToPreGenPDefMode( void ) +/*********************************************************************//** + * @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 ) { - return 0; + 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, SW_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; } -U32 execPreGenPDefMode( void ) +/*********************************************************************//** + * @brief + * The setModePreGenPDefTransition 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 setModePreGenPDefTransition( FP_GENP_DEF_MODE_STATE_T state ) { - return 0; + // Execute on running state + switch( state ) + { + case FP_PRE_GENP_DEF_FLUSH: + setValveState( M4_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( 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( 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, SW_FAULT_ID_FP_INVALID_GENP_STATE, state ) + break; + } } -/**@}*/ +/*********************************************************************//** + * @brief + * The handlePreGenPDefFlushState 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_PRE_GENP_DEF_MODE_STATE_T handlePreGenPDefFlushState( void ) +{ + FP_PRE_GENP_DEF_MODE_STATE_T state = FP_PRE_GENP_DEF_FLUSH; + if ( TRUE == doesAlarmStatusIndicateStop() ) + { + 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: none + * @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 == doesAlarmStatusIndicateStop() ) + { + 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 == doesAlarmStatusIndicateStop() ) + { + 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; + + result = TRUE; + pendingStartPreGenDefRequest = TRUE; + requestNewOperationMode( FP_MODE_DPGW ); + + 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; + requestNewOperationMode( 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; +} + +/**@}*/