Index: firmware/App/Modes/OperationModes.c =================================================================== diff -u -r383c4be0d9ad14570c87cf5b7330f5f83d92383e -reef41b7363d82763095a1317f1757f360f0d9ec1 --- firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision 383c4be0d9ad14570c87cf5b7330f5f83d92383e) +++ firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision eef41b7363d82763095a1317f1757f360f0d9ec1) @@ -1,17 +1,17 @@ /************************************************************************** * -* Copyright (c) 2024-2024 Diality Inc. - All Rights Reserved. +* Copyright (c) 2024-2026 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 OperationModes.c * -* @author (last) Sean -* @date (last) 30-Jul-2024 +* @author (last) Varshini Nagabooshanam +* @date (last) 29-Jan-2026 * -* @author (original) Sean -* @date (original) 30-Jul-2024 +* @author (original) Sean Nash +* @date (original) 01-Aug-2024 * ***************************************************************************/ @@ -22,9 +22,8 @@ #include "ModeService.h" #include "ModeFault.h" #include "ModeStandby.h" -//#include "ModeTreatmentParams.h" -//#include "ModePreTreat.h" -//#include "ModeTreatment.h" +#include "ModePreTreat.h" +#include "ModeTreatment.h" //#include "ModePostTreat.h" //#include "NVDataMgmt.h" #include "OperationModes.h" @@ -62,7 +61,7 @@ static U32 current4thLevelState; ///< current 4th level state. /// Interval (in task intervals) at which to publish operation mode data to CAN bus. -static OVERRIDE_U32_T opModePublishInterval = { BROADCAST_TD_OP_MODE_INTERVAL, BROADCAST_TD_OP_MODE_INTERVAL, BROADCAST_TD_OP_MODE_INTERVAL, 0 }; +static OVERRIDE_U32_T opModePublishInterval; /// Local structure init for saving confirmation requests static CONFIRMATION_REQUEST_T confirmRequests[ MAX_PENDING_CONFIRM_REQUESTS ] = { GENERIC_CONFIRM_ID_NONE, GENERIC_CONFIRM_CMD_REQUEST_OPEN, 0, CONFIRMATION_REQUEST_STATUS_UNUSED, @@ -72,15 +71,14 @@ /// This matrix determines legal transitions from one mode to another static const TD_OP_MODE_T MODE_TRANSITION_TABLE[ NUM_OF_MODES - 1 ][ NUM_OF_MODES - 1 ] = { -// From to-> FAULT SERVICE INIT STANBY TRT.PARAMS PRE-TREAT TREATMENT POST_TREA -/* FAUL */{ MODE_FAUL, MODE_SERV, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, }, -/* SERV */{ MODE_NLEG, MODE_SERV, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, }, -/* INIT */{ MODE_FAUL, MODE_NLEG, MODE_INIT, MODE_STAN, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, }, -/* STAN */{ MODE_FAUL, MODE_SERV, MODE_INIT, MODE_STAN, MODE_TPAR, MODE_NLEG, MODE_NLEG, MODE_NLEG, }, -/* TPAR */{ MODE_FAUL, MODE_NLEG, MODE_NLEG, MODE_STAN, MODE_TPAR, MODE_PRET, MODE_NLEG, MODE_NLEG, }, -/* PRET */{ MODE_FAUL, MODE_NLEG, MODE_NLEG, MODE_STAN, MODE_NLEG, MODE_PRET, MODE_TREA, MODE_POST, }, -/* TREA */{ MODE_FAUL, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_TREA, MODE_POST, }, -/* POST */{ MODE_FAUL, MODE_NLEG, MODE_NLEG, MODE_STAN, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_POST, }, }; +// From to-> FAULT SERVICE INIT STANBY PRE-TREAT TREATMENT POST_TREA +/* FAUL */{ MODE_FAUL, MODE_SERV, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, }, +/* SERV */{ MODE_NLEG, MODE_SERV, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, }, +/* INIT */{ MODE_FAUL, MODE_NLEG, MODE_INIT, MODE_STAN, MODE_NLEG, MODE_NLEG, MODE_NLEG, }, +/* STAN */{ MODE_FAUL, MODE_SERV, MODE_INIT, MODE_STAN, MODE_PRET, MODE_NLEG, MODE_NLEG, }, +/* PRET */{ MODE_FAUL, MODE_NLEG, MODE_NLEG, MODE_STAN, MODE_PRET, MODE_TREA, MODE_POST, }, // From Standby to next mode is pretreatment +/* TREA */{ MODE_FAUL, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_NLEG, MODE_TREA, MODE_POST, }, +/* POST */{ MODE_FAUL, MODE_NLEG, MODE_NLEG, MODE_STAN, MODE_NLEG, MODE_NLEG, MODE_POST, }, }; // ********** private function prototypes ********** @@ -106,12 +104,16 @@ } // Start in init mode - lastMode = MODE_INIT; - currentMode = MODE_INIT; - currentSubMode = 0; - currentSubState = NO_SUB_STATE; - current4thLevelState = NO_SUB_STATE; - broadcastModeIntervalCtr = DATA_PUBLISH_COUNTER_START_COUNT; + lastMode = MODE_INIT; + currentMode = MODE_INIT; + currentSubMode = 0; + currentSubState = NO_SUB_STATE; + current4thLevelState = NO_SUB_STATE; + broadcastModeIntervalCtr = DATA_PUBLISH_COUNTER_START_COUNT; + opModePublishInterval.data = BROADCAST_TD_OP_MODE_INTERVAL; + opModePublishInterval.ovData = BROADCAST_TD_OP_MODE_INTERVAL; + opModePublishInterval.ovInitData = BROADCAST_TD_OP_MODE_INTERVAL; + opModePublishInterval.override = OVERRIDE_RESET; transitionToNewOperationMode( MODE_INIT ); @@ -120,9 +122,8 @@ initServiceMode(); initInitAndPOSTMode(); initStandbyMode(); -// initTreatParamsMode(); -// initPreTreatmentMode(); -// initTreatmentMode(); + initPreTreatmentMode(); + initTreatmentMode(); // initPostTreatmentMode(); } @@ -144,10 +145,13 @@ // Any new mode requests? newMode = arbitrateModeRequest(); // Will return current mode if no pending requests - if ( getTestConfigStatus( TEST_CONFIG_RECOVER_TREATMENT ) != TRUE ) +#ifndef TEST_UI_ONLY + // Verify mode transition is legal unless tester working with system TODO - restore check when all modes are implemented +// if ( ( isTestingActivated() != TRUE ) && ( getTestConfigStatus( TEST_CONFIG_RECOVER_TREATMENT ) != TRUE ) ) { newMode = MODE_TRANSITION_TABLE[ currentMode ][ newMode ]; } +#endif // Is requested new mode valid and legal at this time? if ( newMode >= MODE_NLEG ) @@ -168,8 +172,9 @@ { // If the last mode is treatment but the new mode is not treatment // it means the treatment is done. Get the elapsed time since the beginning of the treatment and convert it to hours to be written -// U32 txElapsedTimeMS = calcTimeSince( getTreatmentStartTimeStamp() ); -// F32 txElapsedTimeHrs = (F32)txElapsedTimeMS / ( (F32)( MIN_PER_HOUR * SEC_PER_MIN * MS_PER_SECOND ) ); + U32 txElapsedTimeMS = calcTimeSince( getTreatmentStartTimeStamp() ); + F32 txElapsedTimeHrs = (F32)txElapsedTimeMS / ( (F32)( MIN_PER_HOUR * SEC_PER_MIN * MS_PER_SECOND ) ); + // Write the treatment hours and set the service to be false so the treatment hours is not reset // setTxTimeHours( txElapsedTimeHrs ); } @@ -195,18 +200,14 @@ currentSubMode = execStandbyMode(); break; -// case MODE_TPAR: -// currentSubMode = execTreatParamsMode(); -// break; -// -// case MODE_PRET: -// currentSubMode = execPreTreatmentMode(); -// break; -// -// case MODE_TREA: -// currentSubMode = execTreatmentMode(); -// break; -// + case MODE_PRET: + currentSubMode = execPreTreatmentMode(); + break; + + case MODE_TREA: + currentSubMode = execTreatmentMode(); + break; + // case MODE_POST: // currentSubMode = execPostTreatmentMode(); // break; @@ -318,15 +319,12 @@ case MODE_STAN: signalAlarmActionToStandbyMode( action ); break; -// case MODE_TPAR: -// signalAlarmActionToTreatParamsMode( action ); -// break; // case MODE_PRET: // signalAlarmActionToPreTreatmentMode( action ); // break; -// case MODE_TREA: -// signalAlarmActionToTreatmentMode( action ); -// break; + case MODE_TREA: + signalAlarmActionToTreatmentMode( action ); + break; // case MODE_POST: // signalAlarmActionToPostTreatmentMode( action ); // break; @@ -387,6 +385,8 @@ *************************************************************************/ static void transitionToNewOperationMode( TD_OP_MODE_T newMode ) { + SEND_EVENT_WITH_2_U32_DATA( TD_EVENT_OP_MODE_CHANGE, lastMode, newMode ) + // Setup for new operating mode switch ( newMode ) { @@ -402,15 +402,12 @@ case MODE_STAN: currentSubMode = transitionToStandbyMode(); break; -// case MODE_TPAR: -// currentSubMode = transitionToTreatParamsMode(); -// break; -// case MODE_PRET: -// currentSubMode = transitionToPreTreatmentMode(); -// break; -// case MODE_TREA: -// currentSubMode = transitionToTreatmentMode(); -// break; + case MODE_PRET: + currentSubMode = transitionToPreTreatmentMode(); + break; + case MODE_TREA: + currentSubMode = transitionToTreatmentMode(); + break; // case MODE_POST: // currentSubMode = transitionToPostTreatmentMode(); // break; @@ -607,7 +604,7 @@ /*********************************************************************//** * @brief - * The sendOperationStatusEvent function constructs and sends an HD operation + * The sendOperationStatusEvent function constructs and sends an TD operation * status event. * @details \b Message \b Sent: MSG_ID_TD_EVENT * @details \b Inputs: currentMode, currentSubMode, currentSubState, current4thLevelState @@ -644,51 +641,47 @@ * mode if the transition is legal. * @details \b Inputs: none * @details \b Outputs: modeRequest[] - * @param newMode ID of requested mode to transition to + * @param message message from Dialin which includes the op mode to + * transition to. * @return TRUE if request successful, FALSE if not *************************************************************************/ -//BOOL testSetOperationMode( TD_OP_MODE_T newMode ) -//{ -// BOOL result = FALSE; -// -// if ( TRUE == isTestingActivated() ) -// { -// TD_OP_MODE_T check = MODE_TRANSITION_TABLE[ currentMode ][ newMode ]; -// -// // Is mode transition legal? -// if ( check == newMode ) -// { -// requestNewOperationMode( newMode ); -// result = TRUE; -// } -// } -// -// return result; -//} +BOOL testSetOperationMode( MESSAGE_T *message ) +{ + BOOL result = FALSE; + // Verify message payload length is valid + if ( sizeof( U32 ) == message->hdr.payloadLen ) + { + U32 newMode; + + memcpy( &newMode, message->payload, sizeof( U32 ) ); + if ( (TD_OP_MODE_T)newMode < NUM_OF_MODES ) + { + TD_OP_MODE_T reqMode = (TD_OP_MODE_T)newMode; + + requestNewOperationMode( reqMode ); + result = TRUE; + } + } + + return result; +} + /*********************************************************************//** * @brief * The testSetOpModePublishIntervalOverride function sets the override of the * operation mode publication interval. * @details \b Inputs: none * @details \b Outputs: opModePublishInterval - * @param ms milliseconds between operation mode broadcasts + * @param message override message from Dialin which includes the interval + * (in ms) to set the op mode publish to. * @return TRUE if override set successful, FALSE if not *************************************************************************/ -//BOOL testSetOpModePublishIntervalOverride( U32 ms ) -//{ -// BOOL result = FALSE; -// -// if ( TRUE == isTestingActivated() ) -// { -// U32 intvl = ms / TASK_GENERAL_INTERVAL; -// -// result = TRUE; -// opModePublishInterval.ovData = intvl; -// opModePublishInterval.override = OVERRIDE_KEY; -// } -// -// return result; -//} +BOOL testSetOpModePublishIntervalOverride( MESSAGE_T *message ) +{ + BOOL result = u32BroadcastIntervalOverride( message, &opModePublishInterval, TASK_GENERAL_INTERVAL ); + return result; +} + /**@}*/