Index: firmware/App/Modes/FPModes/FPOperationModes.c =================================================================== diff -u -rd210786d6c7d75bb0b4d9e18efc40a01d85123fe -rcb8619fdf8690885708071d34b0e87e6657ecd62 --- firmware/App/Modes/FPModes/FPOperationModes.c (.../FPOperationModes.c) (revision d210786d6c7d75bb0b4d9e18efc40a01d85123fe) +++ firmware/App/Modes/FPModes/FPOperationModes.c (.../FPOperationModes.c) (revision cb8619fdf8690885708071d34b0e87e6657ecd62) @@ -47,6 +47,8 @@ static U32 broadcastModeIntervalCtr; ///< Interval counter used to determine when to broadcast operation mode. Initialize to 11 to stagger broadcast. static U32 currentSubState; ///< current sub state. static U32 current4thLevelState; ///< current 4th level state. +static U32 requestedSubMode; ///< Requested operation sub mode. +static BOOL changeSubMode; ///< Flag that change operation sub mode request status. static BOOL isDeviceDefeatured; ///< bool to determine defeatured status static BOOL isBoostInstalled; ///< bool to determine boost pump status @@ -94,6 +96,8 @@ currentSubMode = 0; currentSubState = NO_FP_SUB_STATE; current4thLevelState = NO_FP_SUB_STATE; + requestedSubMode = 0; + changeSubMode = FALSE; broadcastModeIntervalCtr = DATA_PUBLISH_COUNTER_START_COUNT; isDeviceDefeatured = FALSE; isBoostInstalled = FALSE; @@ -144,7 +148,37 @@ currentMode = newMode; // sendOperationStatusEvent(); } + // Is sub mode change request active? + if ( changeSubMode ) + { + switch ( currentMode ) + { + case FP_MODE_PGEN: + signalNewPreGenPSubMode( requestedSubMode ); + break; + case FP_MODE_GENP: + signalNewGenPermeateSubMode( requestedSubMode ); + break; + + case FP_MODE_DPGP: + signalNewPreGenPDefeaturedSubMode( requestedSubMode ); + break; + + case FP_MODE_DEGP: + signalNewGenPDefeaturedSubMode( requestedSubMode ); + break; + + case FP_MODE_FAUL: + case FP_MODE_SERV: + case FP_MODE_INIT: + case FP_MODE_STAN: + default: + break; + } + changeSubMode = FALSE; + } + // Mode specific processing to be done continuously switch ( currentMode ) { @@ -226,6 +260,21 @@ /*********************************************************************//** * @brief + * The requestNewFPOperationSubMode function requests transition to a new + * operation sub mode. The request will be arbitrated when the state machine + * is next executed. + * @details \b Inputs: none + * @details \b Outputs: requestedSubMode, changeSubMode + * @return none + *************************************************************************/ +void requestNewFPOperationSubMode( U32 reqSubMode ) +{ + requestedSubMode = reqSubMode; + changeSubMode = TRUE; +} + +/*********************************************************************//** + * @brief * The getCurrentFPOperationMode function gets the current operation mode. * @details \b Inputs: currentMode * @details \b Outputs: none @@ -529,6 +578,45 @@ /*********************************************************************//** * @brief + * The testSetFPOperationSubMode function will transition to a given + * sub mode if the transition is legal. + * @details \b Inputs: none + * @details \b Outputs: request new sub mode function called for current Op mode + * @param message message from Dialin which includes the sub mode to + * transition to. + * @return TRUE if request successful, FALSE if not + *************************************************************************/ +BOOL testSetFPOperationSubMode( MESSAGE_T *message ) +{ + OP_MODE_PAYLOAD_T payload; + BOOL result = FALSE; + + // Verify message payload length is valid + if ( sizeof( OP_MODE_PAYLOAD_T ) == message->hdr.payloadLen ) + { + memcpy( (U08*)(&payload), message->payload, sizeof( OP_MODE_PAYLOAD_T ) ); + + FP_OP_MODE_T reqMode = (FP_OP_MODE_T)payload.opMode; + U32 reqSubMode = payload.subMode; + + if ( reqMode < NUM_OF_FP_MODES ) + { + requestNewFPOperationMode( reqMode ); + + // check to avoid repeated initialization if the requested sub mode matches with current sub mode + if ( requestedSubMode != currentSubMode ) + { + requestNewFPOperationSubMode(reqSubMode); + } + result = TRUE; // TODO confirm if this is correct + } + } + + return result; +} + +/*********************************************************************//** + * @brief * The testSetFPOpModePublishIntervalOverride function sets the override of the * operation mode publication interval. * @details \b Inputs: none Index: firmware/App/Modes/FPModes/FPOperationModes.h =================================================================== diff -u -rd18ed8a1064006f220e75096c723077dda62b500 -rcb8619fdf8690885708071d34b0e87e6657ecd62 --- firmware/App/Modes/FPModes/FPOperationModes.h (.../FPOperationModes.h) (revision d18ed8a1064006f220e75096c723077dda62b500) +++ firmware/App/Modes/FPModes/FPOperationModes.h (.../FPOperationModes.h) (revision cb8619fdf8690885708071d34b0e87e6657ecd62) @@ -55,6 +55,7 @@ void execFPOperationModes( void ); void requestNewFPOperationMode( FP_OP_MODE_T newMode ); // Request a transition to a new operation mode +void requestNewFPOperationSubMode( U32 reqSubMode ); // Request a transition to a new operation sub mode FP_OP_MODE_T getCurrentFPOperationMode( void ); // Get the current operation mode FP_OP_MODE_T getPreviousFPOperationMode( void ); // Get the previous operation mode U32 getCurrentFPSubMode( void ); // Get the current sub-mode @@ -66,6 +67,7 @@ void setCurrentFPSubState( U32 subState ); // Set the current substate. void setCurrentFP4thLevelState( U32 state ); // Set the current 4th level state. BOOL testSetFPOperationMode( MESSAGE_T *message ); // Set operation mode override +BOOL testSetFPOperationSubMode( MESSAGE_T *message ); // Set operation sub mode override BOOL testSetFPOpModePublishIntervalOverride( MESSAGE_T *message ); // Set operation mode publish interval override BOOL testSetGeneratePermeateSignal( MESSAGE_T *message ); // Set start stop generate permeate. BOOL testGetFPDefeaturedStatus( MESSAGE_T *message ); // Send a response message with FP defeatured status payload Index: firmware/App/Modes/FPModes/ModeGenPermeate.c =================================================================== diff -u -r973f790125e70115662d979f5f5631bb9df081f0 -rcb8619fdf8690885708071d34b0e87e6657ecd62 --- firmware/App/Modes/FPModes/ModeGenPermeate.c (.../ModeGenPermeate.c) (revision 973f790125e70115662d979f5f5631bb9df081f0) +++ firmware/App/Modes/FPModes/ModeGenPermeate.c (.../ModeGenPermeate.c) (revision cb8619fdf8690885708071d34b0e87e6657ecd62) @@ -243,6 +243,41 @@ /*********************************************************************//** * @brief + * The signalNewGenPermeateSubMode function requests transition to + * a new Gen Permeate sub mode. + * @details \b Inputs: none + * @details \b Outputs: none + * @return TRUE if request successful, FALSE if not + *************************************************************************/ +BOOL signalNewGenPermeateSubMode( U32 newSubMode ) +{ + BOOL result = FALSE; + FP_GENP_MODE_STATE_T reqSubMode = (FP_GENP_MODE_STATE_T)newSubMode; + + if ( reqSubMode < NUM_OF_FP_GENP_MODE_STATES ) + { + switch ( reqSubMode ) + { + case FP_GENP_TANK_FILL_STATE: + genPermeateState = FP_GENP_TANK_FILL_STATE; + setModeGenPTransition( reqSubMode ); + break; + + case FP_GENP_TANK_FULL_STATE: + genPermeateState = FP_GENP_TANK_FULL_STATE; + setModeGenPTransition( reqSubMode ); + break; + default: + break; + } + result = TRUE; + } + + return result; // TODO can this be a void function +} + +/*********************************************************************//** + * @brief * The getTankFullAlarmTimeout function returns the tank full alarm timeout * @details \b Inputs: none * @details \b Outputs: tankFullAlarmTimeout Index: firmware/App/Modes/FPModes/ModeGenPermeate.h =================================================================== diff -u -r830213bc6dcc1a684610caf78c79d55f2cb41e93 -rcb8619fdf8690885708071d34b0e87e6657ecd62 --- firmware/App/Modes/FPModes/ModeGenPermeate.h (.../ModeGenPermeate.h) (revision 830213bc6dcc1a684610caf78c79d55f2cb41e93) +++ firmware/App/Modes/FPModes/ModeGenPermeate.h (.../ModeGenPermeate.h) (revision cb8619fdf8690885708071d34b0e87e6657ecd62) @@ -46,7 +46,7 @@ U32 execGenPermeateMode( void ); // Execute the gen permeate mode state machine (call from OperationModes) BOOL requestGenWaterStart( void ); // Request to start gen water and transition modes BOOL requestGenWaterStop( void ); // Request to stop gen water and transition. - +BOOL signalNewGenPermeateSubMode( U32 newSubMode ); // Signal transition to a new gen permeate sub mode FP_GENP_MODE_STATE_T getCurrentGenPermeateState( void ); // Get the current state of the gen water mode BOOL testGenPermeateDataPublishIntervalOverride( MESSAGE_T *message ); // override broadcast interval for gen permeate Index: firmware/App/Modes/FPModes/ModeGenPermeateDefeatured.c =================================================================== diff -u -r47a7b0fce13cf38919932a8662c378f4f6a8b9f3 -rcb8619fdf8690885708071d34b0e87e6657ecd62 --- firmware/App/Modes/FPModes/ModeGenPermeateDefeatured.c (.../ModeGenPermeateDefeatured.c) (revision 47a7b0fce13cf38919932a8662c378f4f6a8b9f3) +++ firmware/App/Modes/FPModes/ModeGenPermeateDefeatured.c (.../ModeGenPermeateDefeatured.c) (revision cb8619fdf8690885708071d34b0e87e6657ecd62) @@ -273,6 +273,43 @@ /*********************************************************************//** * @brief + * The signalNewGenPDefeaturedSubMode function requests transition to a new + * defeatured Gen Permeate sub mode. + * @details \b Alarm: ALARM_ID_FP_SOFTWARE_FAULT if given new sub mode is invalid. + * @details \b Inputs: none + * @details \b Outputs: none + * @return TRUE if request successful, FALSE if not + *************************************************************************/ +BOOL signalNewGenPDefeaturedSubMode( U32 newSubMode ) +{ + BOOL result = FALSE; + FP_GENP_DEF_MODE_STATE_T reqSubMode = (FP_GENP_DEF_MODE_STATE_T)newSubMode; + + if ( reqSubMode < NUM_OF_FP_GENP_DEF_MODE_STATES ) + { + switch ( reqSubMode ) + { + case FP_GENP_DEF_SUPPLY_WATER: + genPermeateDefState = FP_GENP_DEF_SUPPLY_WATER; + setModeGenPDefTransition( reqSubMode ); + break; + + case FP_GENP_DEF_PAUSED: + genPermeateDefState = FP_GENP_DEF_PAUSED; + setModeGenPDefTransition( reqSubMode ); + break; + + default: + break; + } + result = TRUE; // TODO can this be a void function + } + + return result; +} + +/*********************************************************************//** + * @brief * The getGenPermeateDataPublishInterval function gets the generate permeate * defeatured mode data publish interval. * @details \b Inputs: genPermeateDefDataPublishInterval Index: firmware/App/Modes/FPModes/ModeGenPermeateDefeatured.h =================================================================== diff -u -r830213bc6dcc1a684610caf78c79d55f2cb41e93 -rcb8619fdf8690885708071d34b0e87e6657ecd62 --- firmware/App/Modes/FPModes/ModeGenPermeateDefeatured.h (.../ModeGenPermeateDefeatured.h) (revision 830213bc6dcc1a684610caf78c79d55f2cb41e93) +++ firmware/App/Modes/FPModes/ModeGenPermeateDefeatured.h (.../ModeGenPermeateDefeatured.h) (revision cb8619fdf8690885708071d34b0e87e6657ecd62) @@ -46,7 +46,7 @@ BOOL requestGenWaterDefStart( void ); // request to start gen permeate in defeatured mode BOOL requestGenWaterDefStop( void ); // request to stop gen permeate in defeatured mode BOOL getGenPermeateRequest( void ); // get function to retrieve request status - +BOOL signalNewGenPDefeaturedSubMode( U32 newSubMode ); // Signal transition to a new defeatured gen permeate sub mode FP_GENP_DEF_MODE_STATE_T getCurrentGenPermeateDefState( void ); // Get the current state of the gen water mode BOOL testGenPermeateDefDataPublishIntervalOverride( MESSAGE_T *message ); // override broadcast interval for defeatued gen permeate Index: firmware/App/Modes/FPModes/ModePreGenPermeate.c =================================================================== diff -u -rb569bc796c56acd5d94d468386f5f42c350cad65 -rcb8619fdf8690885708071d34b0e87e6657ecd62 --- firmware/App/Modes/FPModes/ModePreGenPermeate.c (.../ModePreGenPermeate.c) (revision b569bc796c56acd5d94d468386f5f42c350cad65) +++ firmware/App/Modes/FPModes/ModePreGenPermeate.c (.../ModePreGenPermeate.c) (revision cb8619fdf8690885708071d34b0e87e6657ecd62) @@ -18,6 +18,7 @@ #include "BoostPump.h" #include "FPModeStandby.h" #include "FPOperationModes.h" +#include "Level.h" #include "MessageSupport.h" #include "Messaging.h" #include "ModeGenPermeate.h" @@ -447,6 +448,67 @@ /*********************************************************************//** * @brief + * The signalNewPreGenPSubMode function requests transition to a new + * PreGen Permeate sub mode. + * @details \b Inputs: none + * @details \b Outputs: none + * @return TRUE if request successful, FALSE if not + *************************************************************************/ +BOOL signalNewPreGenPSubMode( U32 newSubMode ) +{ + BOOL result = FALSE; + FP_PRE_GENP_MODE_STATE_T reqSubMode = (FP_PRE_GENP_MODE_STATE_T)newSubMode; + LEVEL_STATE_T level = getLevelStatus( P25_LEVL ); + + if ( reqSubMode < NUM_OF_FP_PRE_GENW_MODE_STATES ) + { + switch ( reqSubMode ) + { + case FP_PRE_GENP_INLET_PRESSURE_CHECK: + preGenPState = FP_PRE_GENP_INLET_PRESSURE_CHECK; + setModePreGenPTransition( reqSubMode ); + result = TRUE; + break; + + case FP_PRE_GENP_FILTER_FLUSH: + preGenPState = FP_PRE_GENP_FILTER_FLUSH; + setModePreGenPTransition( reqSubMode ); + result = TRUE; + break; + + case FP_PRE_GENP_PERMEATE_FLUSH: + preGenPState = FP_PRE_GENP_PERMEATE_FLUSH; + setModePreGenPTransition( reqSubMode ); + result = TRUE; + break; + + case FP_PRE_GENP_CONCENTRATE_FLUSH: + // jump to concentrate flush sub mode only if the permeate tank is full + if ( LEVEL_STATE_HIGH == level ) + { + preGenPState = FP_PRE_GENP_CONCENTRATE_FLUSH; + setModePreGenPTransition( reqSubMode ); + } + break; + + case FP_PRE_GENP_VERIFY_WATER: + preGenPState = FP_PRE_GENP_VERIFY_WATER; + setModePreGenPTransition( reqSubMode ); + result = TRUE; + break; + + case FP_PRE_GENP_PAUSED: + default: + result = FALSE; + break; + } + } + + return result; // TODO can this be a void function +} + +/*********************************************************************//** + * @brief * The getPreGenWDataPublishInterval function gets the pre generate water * mode data publish interval. * @details \b Inputs: genWaterDataPublishInterval Index: firmware/App/Modes/FPModes/ModePreGenPermeate.h =================================================================== diff -u -r830213bc6dcc1a684610caf78c79d55f2cb41e93 -rcb8619fdf8690885708071d34b0e87e6657ecd62 --- firmware/App/Modes/FPModes/ModePreGenPermeate.h (.../ModePreGenPermeate.h) (revision 830213bc6dcc1a684610caf78c79d55f2cb41e93) +++ firmware/App/Modes/FPModes/ModePreGenPermeate.h (.../ModePreGenPermeate.h) (revision cb8619fdf8690885708071d34b0e87e6657ecd62) @@ -40,13 +40,14 @@ // ********** public function prototypes ********** -void initPreGenPMode( void ); // Initialize this pre gen Permeate mode unit -U32 transitionToPreGenPMode( void ); // Transition to pre gen Permeate mode -U32 execPreGenPMode( void ); // Execute the pre gen Permeate mode state machine (call from OperationModes) -BOOL requestPreGenStart( void ); -BOOL requestPreGenStop( void ); -BOOL getPreGenRequest( void ); -FP_PRE_GENP_MODE_STATE_T getCurrentPreGenPState( void ); // Get the current state of the pre gen Permeate mode +void initPreGenPMode( void ); // Initialize this pre gen permeate mode unit +U32 transitionToPreGenPMode( void ); // Transition to pre gen permeate mode +U32 execPreGenPMode( void ); // Execute the pre gen permeate mode state machine (call from OperationModes) +BOOL requestPreGenStart( void ); // Start pre gen permeate request +BOOL requestPreGenStop( void ); // Stop pre gen permeate request +BOOL getPreGenRequest( void ); // Get the pre gen permeate request status +FP_PRE_GENP_MODE_STATE_T getCurrentPreGenPState( void ); // Get the current state of the pre gen permeate mode +BOOL signalNewPreGenPSubMode( U32 newSubMode ); // Signal transition to a new pre gen permeate sub mode BOOL testPreGenDataPublishIntervalOverride( MESSAGE_T *message ); Index: firmware/App/Modes/FPModes/ModePreGenPermeateDefeatured.c =================================================================== diff -u -r70a0840cbf7c2455cb6b814cba1241c253f0e9e3 -rcb8619fdf8690885708071d34b0e87e6657ecd62 --- firmware/App/Modes/FPModes/ModePreGenPermeateDefeatured.c (.../ModePreGenPermeateDefeatured.c) (revision 70a0840cbf7c2455cb6b814cba1241c253f0e9e3) +++ firmware/App/Modes/FPModes/ModePreGenPermeateDefeatured.c (.../ModePreGenPermeateDefeatured.c) (revision cb8619fdf8690885708071d34b0e87e6657ecd62) @@ -317,6 +317,47 @@ /*********************************************************************//** * @brief + * The signalNewPreGenPDefeaturedSubMode function requests transition to a new + * defeatured PreGen Permeate sub mode. + * @details \b Alarm: ALARM_ID_FP_SOFTWARE_FAULT if given new sub mode is invalid. + * @details \b Inputs: none + * @details \b Outputs: none + * @return TRUE if request successful, FALSE if not + *************************************************************************/ +BOOL signalNewPreGenPDefeaturedSubMode( U32 newSubMode ) +{ + BOOL result = FALSE; + FP_PRE_GENP_DEF_MODE_STATE_T reqSubMode = (FP_PRE_GENP_DEF_MODE_STATE_T)newSubMode; + + if ( reqSubMode < NUM_OF_FP_PRE_GENP_DEF_MODE_STATES ) + { + switch ( reqSubMode ) + { + case FP_PRE_GENP_DEF_INLET_PRESSURE_CHECK: + preGenPermeateDefState = FP_PRE_GENP_DEF_INLET_PRESSURE_CHECK; + setModePreGenPDefTransition( reqSubMode ); + break; + + case FP_PRE_GENP_DEF_FLUSH: + preGenPermeateDefState = FP_PRE_GENP_DEF_FLUSH; + setModePreGenPDefTransition( reqSubMode ); + break; + + case FP_PRE_GENP_DEF_PAUSED: + preGenPermeateDefState = FP_PRE_GENP_DEF_PAUSED; + setModePreGenPDefTransition( reqSubMode ); + + default: + break; + } + result = TRUE; + } + + return result; // TODO can this be a void function +} + +/*********************************************************************//** + * @brief * The getGenPermeateDataPublishInterval function gets the generate permeate * defeatured mode data publish interval. * @details \b Inputs: preGenPermeateDefDataPublishInterval Index: firmware/App/Modes/FPModes/ModePreGenPermeateDefeatured.h =================================================================== diff -u -r830213bc6dcc1a684610caf78c79d55f2cb41e93 -rcb8619fdf8690885708071d34b0e87e6657ecd62 --- firmware/App/Modes/FPModes/ModePreGenPermeateDefeatured.h (.../ModePreGenPermeateDefeatured.h) (revision 830213bc6dcc1a684610caf78c79d55f2cb41e93) +++ firmware/App/Modes/FPModes/ModePreGenPermeateDefeatured.h (.../ModePreGenPermeateDefeatured.h) (revision cb8619fdf8690885708071d34b0e87e6657ecd62) @@ -46,7 +46,7 @@ BOOL requestPreGenDefStart( void ); // Request to start pre generate BOOL requestPreGenDefStop( void ); // Request to stop pre generate BOOL getPreGenPermeateRequest( void ); // Retrieve pre gen request - +BOOL signalNewPreGenPDefeaturedSubMode( U32 newSubMode ); // Signal transition to a new defeatured pre gen permeate sub mode FP_PRE_GENP_DEF_MODE_STATE_T getCurrentPreGenPermeateDefState( void ); // Get the current state of the Pre gen water mode BOOL testPreGenPermeateDefDataPublishIntervalOverride( MESSAGE_T *message ); // override broadcast interval for Pre gen permeate Index: firmware/App/Services/Messaging.c =================================================================== diff -u -r290cac3c0557c978647cef2972800dfe137dd662 -rcb8619fdf8690885708071d34b0e87e6657ecd62 --- firmware/App/Services/Messaging.c (.../Messaging.c) (revision 290cac3c0557c978647cef2972800dfe137dd662) +++ firmware/App/Services/Messaging.c (.../Messaging.c) (revision cb8619fdf8690885708071d34b0e87e6657ecd62) @@ -284,6 +284,7 @@ { MSG_ID_FP_RO_FILTERED_REJECTION_RATIO_OVERRIDE_REQUEST, &testRORejectionRatioFilteredOverride }, { MSG_ID_DD_BICART_DRAIN_REQUEST_OVERRIDE_REQUEST, &testDryBiCartDrainRequestOverride }, { MSG_ID_DD_BICART_CARTRIDGE_SELECT_OVERRIDE_REQUEST, &testDryBiCartTypeOverride }, + { MSG_ID_FP_SET_OPERATION_SUB_MODE_REQUEST, &testSetFPOperationSubMode }, }; /// Calculation for number of entries in the incoming message function handler look-up table.