Index: firmware/App/Modes/ModeUpdate.c =================================================================== diff -u --- firmware/App/Modes/ModeUpdate.c (revision 0) +++ firmware/App/Modes/ModeUpdate.c (revision eb159befbbeae67205fb6b55d75743aa4d48c9b0) @@ -0,0 +1,128 @@ + + +#include "Messaging.h" +#include "ModeUpdate.h" +#include "OperationModes.h" +#include "Timers.h" + +/** + * @addtogroup DDStandbyMode + * @{ + */ + +// ********** private definitions ********** + +#define BEFORE_MCU_RESET_TIMEOUT_MS 100 ///< Before micro-controller unit reset timeout in milliseconds. + +// ********** private data ********** + +static U32 modeUpdateStartTimeMS; ///< Mode update start time in milliseconds. +static DD_UPDATE_STATE_T currentUpdateState; ///< Current state (sub-mode) of update mode. + +// ********** private function prototypes ********** + +static DD_UPDATE_STATE_T handleUpdateModeStartState( void ); +static DD_UPDATE_STATE_T handleUpdateModeResetMCUState( void ); + +/*********************************************************************//** + * @brief + * The initUpdateMode function initializes the Update Mode Unit. + * @details \b Inputs: none + * @details \b Outputs: currentUpdateState, modeUpdateStartTimeMS + * @return none + *************************************************************************/ +void initUpdateMode( void ) +{ + currentUpdateState = DD_UPDATE_INIT_STATE; + modeUpdateStartTimeMS = 0; +} + +/*********************************************************************//** + * @brief + * The transitionToUpdateMode function prepares for transition to update mode. + * @details \b Inputs: none + * @details \b Outputs: Update Mode unit re-initialized. + * @return initial state + *************************************************************************/ +U32 transitionToUpdateMode( void ) +{ + initUpdateMode(); + + // Set the timer when the transition to update mode has been called upon requesting to transition to mode update + modeUpdateStartTimeMS = getMSTimerCount(); + + return currentUpdateState; +} + +/*********************************************************************//** + * @brief + * The execUpdateMode function executes the update Mode state machine. + * @details \b Inputs: currentUpdateState + * @details \b Outputs: currentUpdateState + * @return current state (sub-mode) + *************************************************************************/ +U32 execUpdateMode( void ) +{ + switch ( currentUpdateState ) + { + case DD_UPDATE_INIT_STATE: + currentUpdateState = handleUpdateModeStartState(); + break; + + case DD_UPDATE_RESET_MCU_STATE: + currentUpdateState = handleUpdateModeResetMCUState(); + break; + + default: + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_TD_SOFTWARE_FAULT, SW_FAULT_ID_MODE_UPDATE_INVALID_STATE, currentUpdateState ); + currentUpdateState = DD_UPDATE_INIT_STATE; + break; + } + + return currentUpdateState; +} + +/*********************************************************************//** + * @brief + * The handleUpdateModeStartState function executes the update mode start + * state. The start state transitions to the next state after the specified + * timeout. + * @details \b Inputs: modeUpdateStartTimeMS + * @details \b Outputs: none + * @return next state of the update mode state machine + *************************************************************************/ +static DD_UPDATE_STATE_T handleUpdateModeStartState( void ) +{ + DD_UPDATE_STATE_T state = DD_UPDATE_INIT_STATE; + + if ( TRUE == didTimeout( modeUpdateStartTimeMS, BEFORE_MCU_RESET_TIMEOUT_MS ) ) + { + state = DD_UPDATE_RESET_MCU_STATE; + } + + return state; +} + +/*********************************************************************//** + * @brief + * The handleUpdateModeResetMCUState function executes the update mode reset + * micro-controller unit state. The state resets the MCU. + * @details \b Inputs: none + * @details \b Outputs: none + * @return next state of the update mode state machine + *************************************************************************/ +static DD_UPDATE_STATE_T handleUpdateModeResetMCUState( void ) +{ + DD_UPDATE_STATE_T state = DD_UPDATE_RESET_MCU_STATE; + + resetMicroControllerUnit(); + + return state; +} + +/************************************************************************* + * TEST SUPPORT FUNCTIONS + *************************************************************************/ + + +/**@}*/ Index: firmware/App/Modes/ModeUpdate.h =================================================================== diff -u --- firmware/App/Modes/ModeUpdate.h (revision 0) +++ firmware/App/Modes/ModeUpdate.h (revision eb159befbbeae67205fb6b55d75743aa4d48c9b0) @@ -0,0 +1,25 @@ +#ifndef __MODE_UPDATE_H__ +#define __MODE_UPDATE_H__ + +#include "DDCommon.h" +#include "DDDefs.h" + +/** + * @defgroup DDUpdateMode DDUpdateMode + * @brief Update mode unit. Manages the update mode functions via a state machine. + * + * @addtogroup DDUpdateMode + * @{ + */ + +// ********** public definitions ********** + +// ********** public function prototypes ********** + +void initUpdateMode ( void ); +U32 transitionToUpdateMode( void ); +U32 execUpdateMode( void ); + +/**@}*/ + +#endif Index: firmware/App/Modes/OperationModes.c =================================================================== diff -u -r6d4aa77e6b85aa7621a234660f631e725fb1d441 -reb159befbbeae67205fb6b55d75743aa4d48c9b0 --- firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision 6d4aa77e6b85aa7621a234660f631e725fb1d441) +++ firmware/App/Modes/OperationModes.c (.../OperationModes.c) (revision eb159befbbeae67205fb6b55d75743aa4d48c9b0) @@ -22,6 +22,7 @@ #include "ModePostGenDialysate.h" #include "ModeService.h" #include "ModeStandby.h" +#include "ModeUpdate.h" #include "MessageSupport.h" #include "Messaging.h" #include "OperationModes.h" @@ -56,17 +57,18 @@ /// This matrix determines legal transitions from one mode to another. static const DD_OP_MODE_T MODE_TRANSITION_TABLE[ NUM_OF_DD_MODES - 1 ][ NUM_OF_DD_MODES - 1 ] = { - // from to-> FAULT SERVICE INIT STANBY PREG GEND POSG HEAT HCOL ROPS - /* FAUL */{ DD_MODE_FAUL, DD_MODE_SERV, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG }, - /* SERV */{ DD_MODE_NLEG, DD_MODE_SERV, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG }, - /* INIT */{ DD_MODE_FAUL, DD_MODE_NLEG, DD_MODE_INIT, DD_MODE_STAN, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG }, - /* STAN */{ DD_MODE_FAUL, DD_MODE_SERV, DD_MODE_INIT, DD_MODE_STAN, DD_MODE_PREG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_HEAT, DD_MODE_HCOL, DD_MODE_ROPS }, - /* PREG */{ DD_MODE_FAUL, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_STAN, DD_MODE_PREG, DD_MODE_GEND, DD_MODE_POSG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG }, - /* GEND */{ DD_MODE_FAUL, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_GEND, DD_MODE_POSG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG }, - /* POSG */{ DD_MODE_FAUL, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_STAN, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_POSG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG }, - /* HEAT */{ DD_MODE_FAUL, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_STAN, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_HEAT, DD_MODE_HCOL, DD_MODE_NLEG }, - /* HCOL */{ DD_MODE_FAUL, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_STAN, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_HCOL, DD_MODE_NLEG }, - /* ROPS */{ DD_MODE_FAUL, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_STAN, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_ROPS }, + // from to-> FAULT SERVICE INIT STANBY PREG GEND POSG HEAT HCOL ROPS UPDATE + /* FAUL */{ DD_MODE_FAUL, DD_MODE_SERV, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_UPDT}, + /* SERV */{ DD_MODE_NLEG, DD_MODE_SERV, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_UPDT}, + /* INIT */{ DD_MODE_FAUL, DD_MODE_NLEG, DD_MODE_INIT, DD_MODE_STAN, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_UPDT}, + /* STAN */{ DD_MODE_FAUL, DD_MODE_SERV, DD_MODE_INIT, DD_MODE_STAN, DD_MODE_PREG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_HEAT, DD_MODE_HCOL, DD_MODE_ROPS, DD_MODE_UPDT}, + /* PREG */{ DD_MODE_FAUL, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_STAN, DD_MODE_PREG, DD_MODE_GEND, DD_MODE_POSG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG}, + /* GEND */{ DD_MODE_FAUL, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_GEND, DD_MODE_POSG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG}, + /* POSG */{ DD_MODE_FAUL, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_STAN, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_POSG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG}, + /* HEAT */{ DD_MODE_FAUL, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_STAN, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_HEAT, DD_MODE_HCOL, DD_MODE_NLEG, DD_MODE_NLEG}, + /* HCOL */{ DD_MODE_FAUL, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_STAN, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_HCOL, DD_MODE_NLEG, DD_MODE_NLEG}, + /* ROPS */{ DD_MODE_FAUL, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_STAN, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_ROPS, DD_MODE_NLEG}, + /* UPDT */{ DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_STAN, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_NLEG, DD_MODE_UPDT}, }; // ********** private function prototypes ********** @@ -112,6 +114,7 @@ initServiceMode(); initInitAndPOSTMode(); initStandbyMode(); + initUpdateMode(); initGenDialysateMode(); initPreGenDialysateMode(); initPostGenDialysateMode(); @@ -224,6 +227,10 @@ // currentSubMode = execROPermeateSampleMode(); // break; + case DD_MODE_UPDT: + currentSubMode = execUpdateMode(); + break; + default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_OP_MODES_INVALID_MODE_STATE, (U32)currentMode ) currentMode = DD_MODE_FAUL; @@ -406,6 +413,10 @@ // currentSubMode = transitionToROPermeateSampleMode(); // break; + case DD_MODE_UPDT: + currentSubMode = transitionToUpdateMode(); + break; + default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_OP_MODES_INVALID_MODE_TO_TRANSITION_TO, (U32)newMode ) break; Index: firmware/App/Services/AlarmMgmtSWFaults.h =================================================================== diff -u -rfd897db8177752330ad08d877e0a13620513dbdc -reb159befbbeae67205fb6b55d75743aa4d48c9b0 --- firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision fd897db8177752330ad08d877e0a13620513dbdc) +++ firmware/App/Services/AlarmMgmtSWFaults.h (.../AlarmMgmtSWFaults.h) (revision eb159befbbeae67205fb6b55d75743aa4d48c9b0) @@ -157,6 +157,7 @@ SW_FAULT_ID_PI_CTRL_INVALID_FEED_FORWARD_LIMIT = 126, SW_FAULT_ID_INVALID_TEMPERATURE_SENSOR_SELECTED3 = 127, SW_FAULT_ID_DIALYSATE_MIX_EXEC_INVALID_STATE = 128, + SW_FAULT_ID_MODE_UPDATE_INVALID_STATE = 129, NUM_OF_SW_FAULT_IDS } DD_SW_FAULT_ID_T; Index: firmware/App/Services/Messaging.c =================================================================== diff -u -r2d295ca85f19e95da42476a57ca6b4496baf980a -reb159befbbeae67205fb6b55d75743aa4d48c9b0 --- firmware/App/Services/Messaging.c (.../Messaging.c) (revision 2d295ca85f19e95da42476a57ca6b4496baf980a) +++ firmware/App/Services/Messaging.c (.../Messaging.c) (revision eb159befbbeae67205fb6b55d75743aa4d48c9b0) @@ -289,6 +289,7 @@ { MSG_ID_FP_CONDUCTIVITY_SENSOR_VERSION_REQUEST, &testHandleConductivitySensorVersionRequest }, { MSG_ID_DD_TEMPERATURE_SENSOR_FILTERED_TEMP_OVERRIDE_REQUEST, &testDDTemperatureSensorFilteredReadingsOverride }, { MSG_ID_FP_SET_RECOVERY_VALVES_REQUEST, &testIOFPSetValveRecoveryConfig }, + { MSG_ID_FFU_SIGNAL_DD_UPDATE_AVAILABLE, &handleUpdateAvailable }, }; /// Calculation for number of entries in the incoming message function handler look-up table. @@ -768,7 +769,45 @@ return result; } +/*********************************************************************//** + * @brief + * The resetMicroControllerUnit function resets the MCU. + * @details \b Inputs: none + * @details \b Outputs: none + * @return none + *************************************************************************/ +void resetMicroControllerUnit( void ) +{ + setSystemREG1_SYSECR( (0x2) << 14 ); // Reset processor +} +/*********************************************************************//** + * @brief + * The handleUpdateAvailable function handles a request from the + * Firmware FPGA Updater (FFU) to reset the TD firmware processor. + * @note If reset is successful, this function will not return. + * @details \b Inputs: none + * @details \b Outputs: TD processor soft reset if request is valid + * @param message Pointer to the reset request message + * @return FALSE if reset command rejected + *************************************************************************/ +BOOL handleUpdateAvailable( MESSAGE_T *message ) +{ + BOOL result = FALSE; + + // Verify payload length + if ( 0 == message->hdr.payloadLen ) + { // S/w reset of processor + result = TRUE; // Reset will prevent this from getting transmitted though + requestNewOperationMode( DD_MODE_UPDT ); + } + + sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_DD_2_UI, result ); + + return result; +} + + /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ @@ -904,7 +943,7 @@ if ( 0 == message->hdr.payloadLen ) { // S/w reset of processor result = TRUE; // Reset will prevent this from getting transmitted though - setSystemREG1_SYSECR( (0x2) << 14 ); // Reset processor + resetMicroControllerUnit(); } return result; Index: firmware/App/Services/Messaging.h =================================================================== diff -u -r830213bc6dcc1a684610caf78c79d55f2cb41e93 -reb159befbbeae67205fb6b55d75743aa4d48c9b0 --- firmware/App/Services/Messaging.h (.../Messaging.h) (revision 830213bc6dcc1a684610caf78c79d55f2cb41e93) +++ firmware/App/Services/Messaging.h (.../Messaging.h) (revision eb159befbbeae67205fb6b55d75743aa4d48c9b0) @@ -68,6 +68,8 @@ BOOL handleSetTDOperationMode( MESSAGE_T *message ); BOOL handleVersionRequestMessage( MESSAGE_T *message ); +void resetMicroControllerUnit( void ); +BOOL handleUpdateAvailable( MESSAGE_T *message ); // Test Support Messaging Functions **************************