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