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 } }