Index: firmware/App/Modes/ModeGenPermeateDefeatured.c =================================================================== diff -u -r410afd26b3ae5e372310c696c82f58c59235e10d -r8d272582cbd2cb5fc0c6af0fead2867ce02658b0 --- firmware/App/Modes/ModeGenPermeateDefeatured.c (.../ModeGenPermeateDefeatured.c) (revision 410afd26b3ae5e372310c696c82f58c59235e10d) +++ firmware/App/Modes/ModeGenPermeateDefeatured.c (.../ModeGenPermeateDefeatured.c) (revision 8d272582cbd2cb5fc0c6af0fead2867ce02658b0) @@ -1,28 +1,322 @@ +/************************************************************************** +* +* 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 "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 FPGenPermeateDefeatured + * @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 ) { - return 0; + initGenPermeateDefeaturedMode(); + setCurrentSubState( 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 ) { - return 0; + 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, SW_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: Valve states, Pump speed + * @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( 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( 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 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 == doesAlarmStatusIndicateStop() ) + { + 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; + requestNewOperationMode( FP_MODE_DEGW ); + + 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; + requestNewOperationMode( 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; +} + +/**@}*/