Index: firmware/App/Modes/FPModes/FPOperationModes.c =================================================================== diff -u -r9d351536b78c540aec7c2a1cd5d23e88df856d6f -ra36dcbc3e2f94d418d8aa54588c836a3adf35e17 --- firmware/App/Modes/FPModes/FPOperationModes.c (.../FPOperationModes.c) (revision 9d351536b78c540aec7c2a1cd5d23e88df856d6f) +++ firmware/App/Modes/FPModes/FPOperationModes.c (.../FPOperationModes.c) (revision a36dcbc3e2f94d418d8aa54588c836a3adf35e17) @@ -47,8 +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 to determine change operation sub mode request status. +static U32 testRequestedSubMode; ///< Requested operation sub mode from dialin. +static BOOL testChangeSubMode; ///< Flag to determine change operation sub mode request status. static BOOL isDeviceDefeatured; ///< bool to determine defeatured status static BOOL isBoostInstalled; ///< bool to determine boost pump status @@ -72,6 +72,8 @@ static FP_OP_MODE_T arbitrateModeRequest( void ); static void transitionToNewOperationMode( FP_OP_MODE_T newMode ); static void broadcastOperationMode( void ); +static void requestNewFPOperationSubMode( void ); +static BOOL validateSubModeChangeRequest( U32 reqSubMode ); /*********************************************************************//** * @brief @@ -96,8 +98,8 @@ currentSubMode = 0; currentSubState = NO_FP_SUB_STATE; current4thLevelState = NO_FP_SUB_STATE; - requestedSubMode = 0; - changeSubMode = FALSE; + testRequestedSubMode = 0; + testChangeSubMode = FALSE; broadcastModeIntervalCtr = DATA_PUBLISH_COUNTER_START_COUNT; isDeviceDefeatured = FALSE; isBoostInstalled = FALSE; @@ -130,10 +132,15 @@ // Any new mode requests? newMode = arbitrateModeRequest(); // Will return current mode if no pending requests - newMode = MODE_TRANSITION_TABLE[ currentMode ][ newMode ]; + if ( isTestingActivated() != TRUE ) + { + // If the test configuration is not enabled check for the legality of the transition request + newMode = MODE_TRANSITION_TABLE[ currentMode ][ newMode ]; + } + // Is requested new mode valid and legal at this time? - if ( ( newMode >= FP_MODE_NLEG ) && ( isTestingActivated() != TRUE ) ) + if ( newMode >= FP_MODE_NLEG ) { SET_ALARM_WITH_2_U32_DATA( ALARM_ID_FP_SOFTWARE_FAULT, FP_FAULT_ID_OP_MODES_ILLEGAL_MODE_TRANSITION_REQUESTED, newMode ) newMode = currentMode; @@ -149,34 +156,10 @@ // sendOperationStatusEvent(); } // Is sub mode change request active? - if ( changeSubMode ) + if ( testChangeSubMode ) { - 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; + testChangeSubMode = FALSE; + requestNewFPOperationSubMode(); } // Mode specific processing to be done continuously @@ -260,21 +243,6 @@ /*********************************************************************//** * @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 @@ -424,6 +392,84 @@ /*********************************************************************//** * @brief + * The requestNewFPOperationSubMode function requests transition to a new + * operation sub mode. + * @details \b Inputs: none + * @details \b Outputs: none + * @return none + *************************************************************************/ +static void requestNewFPOperationSubMode( void ) +{ + switch ( currentMode ) + { + case FP_MODE_PGEN: + signalNewPreGenPSubMode( testRequestedSubMode ); + break; + + case FP_MODE_GENP: + signalNewGenPermeateSubMode( testRequestedSubMode ); + break; + + case FP_MODE_DPGP: + signalNewPreGenPDefeaturedSubMode( testRequestedSubMode ); + break; + + case FP_MODE_DEGP: + signalNewGenPDefeaturedSubMode( testRequestedSubMode ); + break; + + case FP_MODE_FAUL: + case FP_MODE_SERV: + case FP_MODE_INIT: + case FP_MODE_STAN: + default: + break; + } +} + +/*********************************************************************//** + * @brief + * The validateSubModeChangeRequest function requests transition to a new + * operation sub mode. + * @details \b Inputs: none + * @details \b Outputs: none + * @return TRUE if request is legal, FALSE if not. + *************************************************************************/ +static BOOL validateSubModeChangeRequest( U32 reqSubMode ) +{ + BOOL result = FALSE; + + switch ( currentMode ) + { + case FP_MODE_PGEN: + result = validatePreGenPChangeReq( reqSubMode ); + break; + + case FP_MODE_GENP: + result = validateGenPermeateChangeReq( reqSubMode ); + break; + + case FP_MODE_DPGP: + result = validatePreGenPDefeaturedChangeReq( reqSubMode ); + break; + + case FP_MODE_DEGP: + result = validateGenPDefeaturedChangeReq( reqSubMode ); + break; + + case FP_MODE_FAUL: + case FP_MODE_SERV: + case FP_MODE_INIT: + case FP_MODE_STAN: + default: + break; + } + + return result; +} + +/*********************************************************************//** + * @brief * The setCurrentFPSubState function sets the current subState. * @details \b Inputs: none * @details \b Outputs: currentSubState @@ -601,14 +647,26 @@ if ( reqMode < NUM_OF_FP_MODES ) { - requestNewFPOperationMode( reqMode ); + // verify if the requested submode transition is possible + result = validateSubModeChangeRequest( reqSubMode ); - // check to avoid repeated initialization if the requested sub mode matches with current sub mode - if ( requestedSubMode != currentSubMode ) + // send the sub mode change request only if the requested transition is valid + if ( result ) { - requestNewFPOperationSubMode(reqSubMode); + // request new operation mode and sub mode if the requested operation mode is not current mode + if ( currentMode != reqMode ) + { + requestNewFPOperationMode( reqMode ); + testRequestedSubMode = reqSubMode; + testChangeSubMode = TRUE; + } + // request submode change only as the requested operation mode is current mode and requested sub mode is not current sub mode + else if ( currentSubMode != testRequestedSubMode ) + { + testRequestedSubMode = reqSubMode; + testChangeSubMode = TRUE; + } } - result = TRUE; // TODO confirm if this is correct } } Index: firmware/App/Modes/FPModes/FPOperationModes.h =================================================================== diff -u -rcb8619fdf8690885708071d34b0e87e6657ecd62 -ra36dcbc3e2f94d418d8aa54588c836a3adf35e17 --- firmware/App/Modes/FPModes/FPOperationModes.h (.../FPOperationModes.h) (revision cb8619fdf8690885708071d34b0e87e6657ecd62) +++ firmware/App/Modes/FPModes/FPOperationModes.h (.../FPOperationModes.h) (revision a36dcbc3e2f94d418d8aa54588c836a3adf35e17) @@ -52,10 +52,8 @@ // ********** public function prototypes ********** void initFPOperationModes( void ); // Initialize this unit -void execFPOperationModes( void ); - +void execFPOperationModes( void ); // execute the FP operation modes state machine (scheduled periodic call) 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 Index: firmware/App/Modes/FPModes/ModeGenPermeate.c =================================================================== diff -u -r64acabc33ab795591768801f8b443f0da9ee2b98 -ra36dcbc3e2f94d418d8aa54588c836a3adf35e17 --- firmware/App/Modes/FPModes/ModeGenPermeate.c (.../ModeGenPermeate.c) (revision 64acabc33ab795591768801f8b443f0da9ee2b98) +++ firmware/App/Modes/FPModes/ModeGenPermeate.c (.../ModeGenPermeate.c) (revision a36dcbc3e2f94d418d8aa54588c836a3adf35e17) @@ -243,6 +243,24 @@ /*********************************************************************//** * @brief + * The validateGenPermeateChangeReq function validate whether requested + * sub mode change is legal or not. + * @details \b Inputs: none + * @details \b Outputs: none + * @return TRUE if request is legal, FALSE if not. + *************************************************************************/ +BOOL validateGenPermeateChangeReq( U32 newSubMode ) +{ + BOOL result = FALSE; + + // TODO add validation logic + result = TRUE; + + return result; +} + +/*********************************************************************//** + * @brief * The signalNewGenPermeateSubMode function requests transition to * a new Gen Permeate sub mode. * @details \b Inputs: none @@ -255,20 +273,19 @@ if ( reqSubMode < NUM_OF_FP_GENP_MODE_STATES ) { + genPermeateState = reqSubMode; + // handle the pre-requisite if any 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; } + setModeGenPTransition( reqSubMode ); } } Index: firmware/App/Modes/FPModes/ModeGenPermeate.h =================================================================== diff -u -r64acabc33ab795591768801f8b443f0da9ee2b98 -ra36dcbc3e2f94d418d8aa54588c836a3adf35e17 --- firmware/App/Modes/FPModes/ModeGenPermeate.h (.../ModeGenPermeate.h) (revision 64acabc33ab795591768801f8b443f0da9ee2b98) +++ firmware/App/Modes/FPModes/ModeGenPermeate.h (.../ModeGenPermeate.h) (revision a36dcbc3e2f94d418d8aa54588c836a3adf35e17) @@ -46,6 +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 validateGenPermeateChangeReq( U32 newSubMode ); // Validate the requested gen permeate sub mode transition is possible or not void 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 Index: firmware/App/Modes/FPModes/ModeGenPermeateDefeatured.c =================================================================== diff -u -r64acabc33ab795591768801f8b443f0da9ee2b98 -ra36dcbc3e2f94d418d8aa54588c836a3adf35e17 --- firmware/App/Modes/FPModes/ModeGenPermeateDefeatured.c (.../ModeGenPermeateDefeatured.c) (revision 64acabc33ab795591768801f8b443f0da9ee2b98) +++ firmware/App/Modes/FPModes/ModeGenPermeateDefeatured.c (.../ModeGenPermeateDefeatured.c) (revision a36dcbc3e2f94d418d8aa54588c836a3adf35e17) @@ -273,6 +273,24 @@ /*********************************************************************//** * @brief + * The validateGenPDefeaturedChangeReq function validate whether requested + * sub mode change is legal or not. + * @details \b Inputs: none + * @details \b Outputs: none + * @return TRUE if request is legal, FALSE if not. + *************************************************************************/ +BOOL validateGenPDefeaturedChangeReq( U32 newSubMode ) +{ + BOOL result = FALSE; + + // TODO add validation logic + result = TRUE; + + return result; +} + +/*********************************************************************//** + * @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. @@ -286,21 +304,20 @@ if ( reqSubMode < NUM_OF_FP_GENP_DEF_MODE_STATES ) { + genPermeateDefState = reqSubMode; + // handle the pre-requisite if any 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; } + setModeGenPDefTransition( reqSubMode ); } } Index: firmware/App/Modes/FPModes/ModeGenPermeateDefeatured.h =================================================================== diff -u -r64acabc33ab795591768801f8b443f0da9ee2b98 -ra36dcbc3e2f94d418d8aa54588c836a3adf35e17 --- firmware/App/Modes/FPModes/ModeGenPermeateDefeatured.h (.../ModeGenPermeateDefeatured.h) (revision 64acabc33ab795591768801f8b443f0da9ee2b98) +++ firmware/App/Modes/FPModes/ModeGenPermeateDefeatured.h (.../ModeGenPermeateDefeatured.h) (revision a36dcbc3e2f94d418d8aa54588c836a3adf35e17) @@ -46,6 +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 validateGenPDefeaturedChangeReq( U32 newSubMode ); // Validate the requested defeatured gen permeate sub mode transition is possible or not void 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 Index: firmware/App/Modes/FPModes/ModePreGenPermeate.c =================================================================== diff -u -r64acabc33ab795591768801f8b443f0da9ee2b98 -ra36dcbc3e2f94d418d8aa54588c836a3adf35e17 --- firmware/App/Modes/FPModes/ModePreGenPermeate.c (.../ModePreGenPermeate.c) (revision 64acabc33ab795591768801f8b443f0da9ee2b98) +++ firmware/App/Modes/FPModes/ModePreGenPermeate.c (.../ModePreGenPermeate.c) (revision a36dcbc3e2f94d418d8aa54588c836a3adf35e17) @@ -448,6 +448,25 @@ /*********************************************************************//** * @brief + * The validatePreGenPChangeReq function validate whether requested + * sub mode change is legal or not. + * @details \b Inputs: none + * @details \b Outputs: none + * @return TRUE if request is legal, FALSE if not. + *************************************************************************/ +BOOL validatePreGenPChangeReq( U32 newSubMode ) +{ + BOOL result = FALSE; + LEVEL_STATE_T level = getLevelStatus( P25_LEVL ); + + // TODO add validation logic + result = TRUE; + + return result; +} + +/*********************************************************************//** + * @brief * The signalNewPreGenPSubMode function requests transition to a new * PreGen Permeate sub mode. * @details \b Inputs: none @@ -457,45 +476,34 @@ void signalNewPreGenPSubMode( U32 newSubMode ) { 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 ) { + preGenPState = reqSubMode; + // handle the pre-requisite if any switch ( reqSubMode ) { case FP_PRE_GENP_INLET_PRESSURE_CHECK: - preGenPState = FP_PRE_GENP_INLET_PRESSURE_CHECK; - setModePreGenPTransition( reqSubMode ); break; case FP_PRE_GENP_FILTER_FLUSH: - preGenPState = FP_PRE_GENP_FILTER_FLUSH; - setModePreGenPTransition( reqSubMode ); break; case FP_PRE_GENP_PERMEATE_FLUSH: - preGenPState = FP_PRE_GENP_PERMEATE_FLUSH; - setModePreGenPTransition( reqSubMode ); 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 ); break; case FP_PRE_GENP_PAUSED: default: break; } + setModePreGenPTransition( reqSubMode ); } } Index: firmware/App/Modes/FPModes/ModePreGenPermeate.h =================================================================== diff -u -r64acabc33ab795591768801f8b443f0da9ee2b98 -ra36dcbc3e2f94d418d8aa54588c836a3adf35e17 --- firmware/App/Modes/FPModes/ModePreGenPermeate.h (.../ModePreGenPermeate.h) (revision 64acabc33ab795591768801f8b443f0da9ee2b98) +++ firmware/App/Modes/FPModes/ModePreGenPermeate.h (.../ModePreGenPermeate.h) (revision a36dcbc3e2f94d418d8aa54588c836a3adf35e17) @@ -47,6 +47,7 @@ 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 validatePreGenPChangeReq( U32 newSubMode ); // Validate the requested pre gen permeate sub mode transition is possible or not void 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 -r64acabc33ab795591768801f8b443f0da9ee2b98 -ra36dcbc3e2f94d418d8aa54588c836a3adf35e17 --- firmware/App/Modes/FPModes/ModePreGenPermeateDefeatured.c (.../ModePreGenPermeateDefeatured.c) (revision 64acabc33ab795591768801f8b443f0da9ee2b98) +++ firmware/App/Modes/FPModes/ModePreGenPermeateDefeatured.c (.../ModePreGenPermeateDefeatured.c) (revision a36dcbc3e2f94d418d8aa54588c836a3adf35e17) @@ -317,6 +317,24 @@ /*********************************************************************//** * @brief + * The validatePreGenPDefeaturedChangeReq function validate whether requested + * sub mode change is legal or not. + * @details \b Inputs: none + * @details \b Outputs: none + * @return TRUE if request is legal, FALSE if not. + *************************************************************************/ +BOOL validatePreGenPDefeaturedChangeReq( U32 newSubMode ) +{ + BOOL result = FALSE; + + // TODO add validation logic + result = TRUE; + + return result; +} + +/*********************************************************************//** + * @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. @@ -330,25 +348,21 @@ if ( reqSubMode < NUM_OF_FP_PRE_GENP_DEF_MODE_STATES ) { + preGenPermeateDefState = reqSubMode; + // handle the pre-requisite if any 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; } + setModePreGenPDefTransition( reqSubMode ); } } Index: firmware/App/Modes/FPModes/ModePreGenPermeateDefeatured.h =================================================================== diff -u -r64acabc33ab795591768801f8b443f0da9ee2b98 -ra36dcbc3e2f94d418d8aa54588c836a3adf35e17 --- firmware/App/Modes/FPModes/ModePreGenPermeateDefeatured.h (.../ModePreGenPermeateDefeatured.h) (revision 64acabc33ab795591768801f8b443f0da9ee2b98) +++ firmware/App/Modes/FPModes/ModePreGenPermeateDefeatured.h (.../ModePreGenPermeateDefeatured.h) (revision a36dcbc3e2f94d418d8aa54588c836a3adf35e17) @@ -46,6 +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 validatePreGenPDefeaturedChangeReq( U32 newSubMode ); // Validate the requested defeatured pre gen permeate sub mode transition is possible or not void 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 Index: firmware/App/Modes/OperationModes.h =================================================================== diff -u -r830213bc6dcc1a684610caf78c79d55f2cb41e93 -ra36dcbc3e2f94d418d8aa54588c836a3adf35e17 --- firmware/App/Modes/OperationModes.h (.../OperationModes.h) (revision 830213bc6dcc1a684610caf78c79d55f2cb41e93) +++ firmware/App/Modes/OperationModes.h (.../OperationModes.h) (revision a36dcbc3e2f94d418d8aa54588c836a3adf35e17) @@ -51,7 +51,7 @@ // ********** public function prototypes ********** void initOperationModes( void ); // initialize this unit -void execDDOperationModes( void ); // execute the operation modes state machine (scheduled periodic call) +void execDDOperationModes( void ); // execute the operation modes state machine (scheduled periodic call) void requestNewOperationMode( DD_OP_MODE_T newMode ); // request a transition to a new operation mode DD_OP_MODE_T getCurrentOperationMode( void ); // get the current operation mode DD_OP_MODE_T getPreviousOperationMode( void ); // get the previous operation mode