summaryrefslogtreecommitdiffstats
path: root/ucs2-lib/src/ucs_sys_diag.c
diff options
context:
space:
mode:
Diffstat (limited to 'ucs2-lib/src/ucs_sys_diag.c')
-rw-r--r--ucs2-lib/src/ucs_sys_diag.c1343
1 files changed, 0 insertions, 1343 deletions
diff --git a/ucs2-lib/src/ucs_sys_diag.c b/ucs2-lib/src/ucs_sys_diag.c
deleted file mode 100644
index 0c80eb6..0000000
--- a/ucs2-lib/src/ucs_sys_diag.c
+++ /dev/null
@@ -1,1343 +0,0 @@
-/*------------------------------------------------------------------------------------------------*/
-/* UNICENS V2.1.0-3491 */
-/* Copyright (c) 2017 Microchip Technology Germany II GmbH & Co. KG. */
-/* */
-/* This program is free software: you can redistribute it and/or modify */
-/* it under the terms of the GNU General Public License as published by */
-/* the Free Software Foundation, either version 2 of the License, or */
-/* (at your option) any later version. */
-/* */
-/* This program is distributed in the hope that it will be useful, */
-/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
-/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
-/* GNU General Public License for more details. */
-/* */
-/* You should have received a copy of the GNU General Public License */
-/* along with this program. If not, see <http://www.gnu.org/licenses/>. */
-/* */
-/* You may also obtain this software under a propriety license from Microchip. */
-/* Please contact Microchip for further information. */
-/*------------------------------------------------------------------------------------------------*/
-
-/*!
- * \file
- * \brief Implementation of the System Diagnosis class
- * \details Performs the System Diagnosis
- *
- * \cond UCS_INTERNAL_DOC
- * \addtogroup G_SYS_DIAG
- * @{
- */
-
-/*------------------------------------------------------------------------------------------------*/
-/* Includes */
-/*------------------------------------------------------------------------------------------------*/
-#include "ucs_misc.h"
-#include "ucs_ret_pb.h"
-#include "ucs_sys_diag.h"
-/*#include "ucs_mnsa.h"*/
-
-
-
-/*------------------------------------------------------------------------------------------------*/
-/* Internal constants */
-/*------------------------------------------------------------------------------------------------*/
-#define SYS_DIAG_NUM_STATES 10U /*!< \brief Number of state machine states */
-#define SYS_DIAG_NUM_EVENTS 17U /*!< \brief Number of state machine events */
-
-#define SD_NUM_HELLO 10U /*!< \brief Number of Hello.Get Retries */
-#define SD_TIMEOUT_HELLO 150U /*!< \brief timeout used for repeating Hello.Get messages */
-#define SD_TIMEOUT_COMMAND 100U /*!< \brief timeout used for supervising INIC commands */
-#define SD_TIMEOUT_CABLE_DIAGNOSIS 3000U /*!< \brief timeout used for supervising cable link diagnosis */
-#define SD_DIAG_ADDR_BASE 0x0500U /*!< \brief Diagnosis Node Address of own node */
-
-#define SD_WELCOME_SUCCESS 0U /*!< \brief Welcome.Result reports success */
-
-#define SD_SIGNATURE_VERSION 1U /*!< \brief signature version used for System Diagnosis */
-
-
-/*------------------------------------------------------------------------------------------------*/
-/* Service parameters */
-/*------------------------------------------------------------------------------------------------*/
-/*! Priority of the System Diagnosis service used by scheduler */
-static const uint8_t SD_SRV_PRIO = 248U; /* parasoft-suppress MISRA2004-8_7 "Value shall be part of the module, not part of a function." */
-/*! Main event for the System Diagnosis service */
-static const Srv_Event_t SD_EVENT_SERVICE = 1U;
-
-
-/*------------------------------------------------------------------------------------------------*/
-/* Internal enumerators */
-/*------------------------------------------------------------------------------------------------*/
-/*! \brief Possible events of the system diagnosis state machine */
-typedef enum SysDiag_Events_
-{
- SD_E_NIL = 0U, /*!< \brief NIL Event */
- SD_E_STARTDIAG = 1U, /*!< \brief StartDiag API function was called */
- SD_E_SD_RES_OK = 2U, /*!< \brief MOSTNetworkSystemDiagnosis.Result received */
- SD_E_ABORT = 3U, /*!< \brief Application requires stop of System Diagnosis */
- SD_E_HELLO_OK = 4U, /*!< \brief Hello.Status received */
- SD_E_HELLO_RETRY = 5U, /*!< \brief Retry the Hello.Get command */
- SD_E_HELLO_ALL_DONE = 6U, /*!< \brief All retries of the Hello.Get command are done */
- SD_E_WELCOME = 7U, /*!< \brief Welcome.Result, may be Ok or NotOk*/
- SD_E_ALL_DONE = 8U, /*!< \brief All branches and segments of the network were explored*/
- SD_E_PORT_FOUND = 9U, /*!< \brief An unexplored port was found */
- SD_E_PORT_ENABLED = 10U, /*!< \brief A port was succesful enabled */
- SD_E_PORT_DISABLED = 11U, /*!< \brief A port was succesful disabled */
- SD_E_BRANCH_FOUND = 12U, /*!< \brief Another branch was found */
- SD_E_CABLE_LINK_RES = 13U, /*!< \brief The CableLinkDiagnosis reported a result */
- SD_E_ERROR = 14U, /*!< \brief An error was detected */
- SD_E_TIMEOUT = 15U, /*!< \brief An timeout has been occurred */
- SD_E_NO_SUCCESS = 16U /*!< \brief Welcome result was NoSuccess */
-} SysDiag_Events_t;
-
-/*! \brief States of the system diagnosis state machine */
-typedef enum SysDiag_State_
-{
- SD_S_IDLE = 0U, /*!< \brief Idle state */
- SD_S_WAIT_DIAG = 1U, /*!< \brief System Diagnosis started */
- SD_S_WAIT_HELLO = 2U, /*!< \brief Hello command sent */
- SD_S_HELLO_TIMEOUT = 3U, /*!< \brief Hello command timed out */
- SD_S_WAIT_WELCOME = 4U, /*!< \brief Welcome sent */
- SD_S_NEXT_PORT = 5U, /*!< \brief Next port found to be tested */
- SD_S_WAIT_ENABLE = 6U, /*!< \brief Port Enable sent */
- SD_S_WAIT_DISABLE = 7U, /*!< \brief Port Disable sent */
- SD_S_CABLE_LINK_DIAG = 8U, /*!< \brief Wait for CableL Link Diagnosis Result */
- SD_S_END = 9U /*!< \brief Wait for System Diagnosis stop */
-} SysDiag_State_t;
-
-
-
-/*------------------------------------------------------------------------------------------------*/
-/* Internal prototypes */
-/*------------------------------------------------------------------------------------------------*/
-static void Sd_Service(void *self);
-
-static void Sd_SysDiagInit(void* self);
-static void Sd_SysDiagStart(void *self);
-static void Sd_SysDiagStop(void *self);
-static void Sd_SendHello(void *self);
-static void Sd_Error(void *self);
-static void Sd_ErrorWelcome(void *self);
-static void Sd_SendWelcome(void *self);
-static void Sd_CableLinkDiagnosis(void *self);
-static void Sd_CalcPort(void *self);
-static void Sd_AllDone(void *self);
-static void Sd_EnablePort(void *self);
-static void Sd_DisablePort(void *self);
-static void Sd_Finish(void *self);
-static void Sd_Abort(void *self);
-static void Sd_StopDiagFailed(void *self);
-
-static void Sd_HelloTimeout(void *self);
-static void Sd_SysDiagTimeout(void *self);
-static void Sd_WelcomeTimeout(void *self);
-static void Sd_EnablePortTimeout(void *self);
-static void Sd_DisablePortTimeout(void *self);
-static void Sd_CableLinkDiagnosisTimeout(void *self);
-
-static void Sd_SysDiagStartResultCb(void *self, void *result_ptr);
-static void Sd_SysDiagStopResultCb(void *self, void *result_ptr);
-static void Sd_HelloStatusCb(void *self, void *result_ptr);
-static void Sd_WelcomeResultCb(void *self, void *result_ptr);
-static void Sd_EnablePortResultCb(void *self, void *result_ptr);
-static void Sd_DisablePortResultCb(void *self, void *result_ptr);
-static void Sd_CableLinkDiagnosisResultCb(void *self, void *result_ptr);
-static void Sd_OnTerminateEventCb(void *self, void *result_ptr);
-static void Sd_TimerCb(void *self);
-
-
-
-
-/*------------------------------------------------------------------------------------------------*/
-/* State transition table (used by finite state machine) */
-/*------------------------------------------------------------------------------------------------*/
-/*! \brief State transition table */
-static const Fsm_StateElem_t sys_diag_trans_tab[SYS_DIAG_NUM_STATES][SYS_DIAG_NUM_EVENTS] = /* parasoft-suppress MISRA2004-8_7 "Value shall be part of the module, not part of a function." */
-{
-
- { /* State SD_S_IDLE */
- /* SD_E_NIL */ {NULL, SD_S_IDLE },
- /* SD_E_STARTDIAG */ {&Sd_SysDiagStart, SD_S_WAIT_DIAG },
- /* SD_E_SD_RES_OK */ {NULL, SD_S_IDLE },
- /* SD_E_ABORT */ {NULL, SD_S_IDLE },
- /* SD_E_HELLO_OK */ {NULL, SD_S_IDLE },
- /* SD_E_HELLO_RETRY */ {NULL, SD_S_IDLE },
- /* SD_E_HELLO_ALL_DONE */ {NULL, SD_S_IDLE },
- /* SD_E_WELCOME */ {NULL, SD_S_IDLE },
- /* SD_E_ALL_DONE */ {NULL, SD_S_IDLE },
- /* SD_E_PORT_FOUND */ {NULL, SD_S_IDLE },
- /* SD_E_PORT_ENABLED */ {NULL, SD_S_IDLE },
- /* SD_E_PORT_DISABLED */ {NULL, SD_S_IDLE },
- /* SD_E_BRANCH_FOUND */ {NULL, SD_S_IDLE },
- /* SD_E_CABLE_LINK_RES */ {NULL, SD_S_IDLE },
- /* SD_E_ERROR */ {NULL, SD_S_IDLE },
- /* SD_E_TIMEOUT */ {NULL, SD_S_IDLE },
- /* SD_E_NO_SUCCESS */ {NULL, SD_S_IDLE }
- },
-
- { /* State SD_S_WAIT_DIAG */
- /* SD_E_NIL */ {NULL, SD_S_WAIT_DIAG },
- /* SD_E_STARTDIAG */ {NULL, SD_S_WAIT_DIAG },
- /* SD_E_SD_RES_OK */ {&Sd_SendHello, SD_S_WAIT_HELLO },
- /* SD_E_ABORT */ {&Sd_Abort, SD_S_END },
- /* SD_E_HELLO_OK */ {NULL, SD_S_WAIT_DIAG },
- /* SD_E_HELLO_RETRY */ {NULL, SD_S_WAIT_DIAG },
- /* SD_E_HELLO_ALL_DONE */ {NULL, SD_S_WAIT_DIAG },
- /* SD_E_WELCOME */ {NULL, SD_S_WAIT_DIAG },
- /* SD_E_ALL_DONE */ {NULL, SD_S_WAIT_DIAG },
- /* SD_E_PORT_FOUND */ {NULL, SD_S_WAIT_DIAG },
- /* SD_E_PORT_ENABLED */ {NULL, SD_S_WAIT_DIAG },
- /* SD_E_PORT_DISABLED */ {NULL, SD_S_WAIT_DIAG },
- /* SD_E_BRANCH_FOUND */ {NULL, SD_S_WAIT_DIAG },
- /* SD_E_CABLE_LINK_RES */ {NULL, SD_S_WAIT_DIAG },
- /* SD_E_ERROR */ {&Sd_Error, SD_S_END },
- /* SD_E_TIMEOUT */ {&Sd_SysDiagTimeout, SD_S_END },
- /* SD_E_NO_SUCCESS */ {NULL, SD_S_WAIT_DIAG }
- },
-
- { /* State SD_S_WAIT_HELLO*/
- /* SD_E_NIL */ {NULL, SD_S_WAIT_HELLO },
- /* SD_E_STARTDIAG */ {NULL, SD_S_WAIT_HELLO },
- /* SD_E_SD_RES_OK */ {NULL, SD_S_WAIT_HELLO },
- /* SD_E_ABORT */ {&Sd_Abort, SD_S_END },
- /* SD_E_HELLO_OK */ {&Sd_SendWelcome, SD_S_WAIT_WELCOME },
- /* SD_E_HELLO_RETRY */ {NULL, SD_S_WAIT_HELLO },
- /* SD_E_HELLO_ALL_DONE */ {NULL, SD_S_WAIT_HELLO },
- /* SD_E_WELCOME */ {NULL, SD_S_WAIT_HELLO },
- /* SD_E_ALL_DONE */ {NULL, SD_S_WAIT_HELLO },
- /* SD_E_PORT_FOUND */ {NULL, SD_S_WAIT_HELLO },
- /* SD_E_PORT_ENABLED */ {NULL, SD_S_WAIT_HELLO },
- /* SD_E_PORT_DISABLED */ {NULL, SD_S_WAIT_HELLO },
- /* SD_E_BRANCH_FOUND */ {NULL, SD_S_WAIT_HELLO },
- /* SD_E_CABLE_LINK_RES */ {NULL, SD_S_WAIT_HELLO },
- /* SD_E_ERROR */ {&Sd_Error, SD_S_END },
- /* SD_E_TIMEOUT */ {&Sd_HelloTimeout, SD_S_HELLO_TIMEOUT },
- /* SD_E_NO_SUCCESS */ {NULL, SD_S_WAIT_HELLO }
- },
-
- { /* State SD_S_HELLO_TIMEOUT */
- /* SD_E_NIL */ {NULL, SD_S_HELLO_TIMEOUT },
- /* SD_E_STARTDIAG */ {NULL, SD_S_HELLO_TIMEOUT },
- /* SD_E_SD_RES_OK */ {NULL, SD_S_HELLO_TIMEOUT },
- /* SD_E_ABORT */ {&Sd_Abort, SD_S_END },
- /* SD_E_HELLO_OK */ {NULL, SD_S_HELLO_TIMEOUT },
- /* SD_E_HELLO_RETRY */ {&Sd_SendHello, SD_S_WAIT_HELLO },
- /* SD_E_HELLO_ALL_DONE */ {&Sd_CableLinkDiagnosis, SD_S_CABLE_LINK_DIAG },
- /* SD_E_WELCOME */ {NULL, SD_S_HELLO_TIMEOUT },
- /* SD_E_ALL_DONE */ {NULL, SD_S_HELLO_TIMEOUT },
- /* SD_E_PORT_FOUND */ {NULL, SD_S_HELLO_TIMEOUT },
- /* SD_E_PORT_ENABLED */ {NULL, SD_S_HELLO_TIMEOUT },
- /* SD_E_PORT_DISABLED */ {NULL, SD_S_HELLO_TIMEOUT },
- /* SD_E_BRANCH_FOUND */ {NULL, SD_S_HELLO_TIMEOUT },
- /* SD_E_CABLE_LINK_RES */ {NULL, SD_S_HELLO_TIMEOUT },
- /* SD_E_ERROR */ {&Sd_Error, SD_S_END },
- /* SD_E_TIMEOUT */ {NULL, SD_S_HELLO_TIMEOUT },
- /* SD_E_NO_SUCCESS */ {NULL, SD_S_HELLO_TIMEOUT }
- },
-
- { /* State SD_S_WAIT_WELCOME */
- /* SD_E_NIL */ {NULL, SD_S_WAIT_WELCOME },
- /* SD_E_STARTDIAG */ {NULL, SD_S_WAIT_WELCOME },
- /* SD_E_SD_RES_OK */ {NULL, SD_S_WAIT_WELCOME },
- /* SD_E_ABORT */ {&Sd_Abort, SD_S_END },
- /* SD_E_HELLO_OK */ {NULL, SD_S_WAIT_WELCOME },
- /* SD_E_HELLO_RETRY */ {NULL, SD_S_WAIT_WELCOME },
- /* SD_E_HELLO_ALL_DONE */ {NULL, SD_S_WAIT_WELCOME },
- /* SD_E_WELCOME */ {&Sd_CalcPort, SD_S_NEXT_PORT },
- /* SD_E_ALL_DONE */ {NULL, SD_S_WAIT_WELCOME },
- /* SD_E_PORT_FOUND */ {NULL, SD_S_WAIT_WELCOME },
- /* SD_E_PORT_ENABLED */ {NULL, SD_S_WAIT_WELCOME },
- /* SD_E_PORT_DISABLED */ {NULL, SD_S_WAIT_WELCOME },
- /* SD_E_BRANCH_FOUND */ {NULL, SD_S_WAIT_WELCOME },
- /* SD_E_CABLE_LINK_RES */ {NULL, SD_S_WAIT_WELCOME },
- /* SD_E_ERROR */ {&Sd_Error, SD_S_END },
- /* SD_E_TIMEOUT */ {&Sd_WelcomeTimeout, SD_S_END },
- /* SD_E_NO_SUCCESS */ {&Sd_ErrorWelcome, SD_S_END }
- },
-
- { /* State SD_S_NEXT_PORT */
- /* SD_E_NIL */ {NULL, SD_S_NEXT_PORT },
- /* SD_E_STARTDIAG */ {NULL, SD_S_NEXT_PORT },
- /* SD_E_SD_RES_OK */ {NULL, SD_S_NEXT_PORT },
- /* SD_E_ABORT */ {&Sd_Abort, SD_S_END },
- /* SD_E_HELLO_OK */ {NULL, SD_S_NEXT_PORT },
- /* SD_E_HELLO_RETRY */ {NULL, SD_S_NEXT_PORT },
- /* SD_E_HELLO_ALL_DONE */ {NULL, SD_S_NEXT_PORT },
- /* SD_E_WELCOME */ {NULL, SD_S_NEXT_PORT },
- /* SD_E_ALL_DONE */ {&Sd_AllDone, SD_S_END },
- /* SD_E_PORT_FOUND */ {&Sd_EnablePort, SD_S_WAIT_ENABLE },
- /* SD_E_PORT_ENABLED */ {NULL, SD_S_NEXT_PORT },
- /* SD_E_PORT_DISABLED */ {NULL, SD_S_NEXT_PORT },
- /* SD_E_BRANCH_FOUND */ {&Sd_DisablePort, SD_S_WAIT_DISABLE },
- /* SD_E_CABLE_LINK_RES */ {NULL, SD_S_NEXT_PORT },
- /* SD_E_ERROR */ {&Sd_Error, SD_S_END },
- /* SD_E_TIMEOUT */ {NULL, SD_S_NEXT_PORT },
- /* SD_E_NO_SUCCESS */ {NULL, SD_S_NEXT_PORT }
- },
-
- { /* State SD_S_WAIT_ENABLE */
- /* SD_E_NIL */ {NULL, SD_S_WAIT_ENABLE },
- /* SD_E_STARTDIAG */ {NULL, SD_S_WAIT_ENABLE },
- /* SD_E_SD_RES_OK */ {NULL, SD_S_WAIT_ENABLE },
- /* SD_E_ABORT */ {&Sd_Abort, SD_S_END },
- /* SD_E_HELLO_OK */ {NULL, SD_S_WAIT_ENABLE },
- /* SD_E_HELLO_RETRY */ {NULL, SD_S_WAIT_ENABLE },
- /* SD_E_HELLO_ALL_DONE */ {NULL, SD_S_WAIT_ENABLE },
- /* SD_E_WELCOME */ {NULL, SD_S_WAIT_ENABLE },
- /* SD_E_ALL_DONE */ {NULL, SD_S_WAIT_ENABLE },
- /* SD_E_PORT_FOUND */ {NULL, SD_S_WAIT_ENABLE },
- /* SD_E_PORT_ENABLED */ {&Sd_SendHello, SD_S_WAIT_HELLO },
- /* SD_E_PORT_DISABLED */ {NULL, SD_S_WAIT_ENABLE },
- /* SD_E_BRANCH_FOUND */ {NULL, SD_S_WAIT_ENABLE },
- /* SD_E_CABLE_LINK_RES */ {NULL, SD_S_WAIT_ENABLE },
- /* SD_E_ERROR */ {&Sd_Error, SD_S_END },
- /* SD_E_TIMEOUT */ {&Sd_EnablePortTimeout, SD_S_END },
- /* SD_E_NO_SUCCESS */ {NULL, SD_S_WAIT_ENABLE }
- },
-
- { /* State SD_S_WAIT_DISABLE */
- /* SD_E_NIL */ {NULL, SD_S_WAIT_DISABLE },
- /* SD_E_STARTDIAG */ {NULL, SD_S_WAIT_DISABLE },
- /* SD_E_SD_RES_OK */ {NULL, SD_S_WAIT_DISABLE },
- /* SD_E_ABORT */ {&Sd_Abort, SD_S_END },
- /* SD_E_HELLO_OK */ {NULL, SD_S_WAIT_DISABLE },
- /* SD_E_HELLO_RETRY */ {NULL, SD_S_WAIT_DISABLE },
- /* SD_E_HELLO_ALL_DONE */ {NULL, SD_S_WAIT_DISABLE },
- /* SD_E_WELCOME */ {NULL, SD_S_WAIT_DISABLE },
- /* SD_E_ALL_DONE */ {NULL, SD_S_WAIT_DISABLE },
- /* SD_E_PORT_FOUND */ {NULL, SD_S_WAIT_DISABLE },
- /* SD_E_PORT_ENABLED */ {NULL, SD_S_WAIT_DISABLE },
- /* SD_E_PORT_DISABLED */ {&Sd_EnablePort, SD_S_WAIT_ENABLE },
- /* SD_E_BRANCH_FOUND */ {NULL, SD_S_WAIT_DISABLE },
- /* SD_E_CABLE_LINK_RES */ {NULL, SD_S_WAIT_DISABLE },
- /* SD_E_ERROR */ {&Sd_Error, SD_S_END },
- /* SD_E_TIMEOUT */ {&Sd_DisablePortTimeout, SD_S_END },
- /* SD_E_NO_SUCCESS */ {NULL, SD_S_WAIT_DISABLE }
- },
-
- { /* State SD_S_CABLE_LINK_DIAG */
- /* SD_E_NIL */ {NULL, SD_S_CABLE_LINK_DIAG },
- /* SD_E_STARTDIAG */ {NULL, SD_S_CABLE_LINK_DIAG },
- /* SD_E_SD_RES_OK */ {NULL, SD_S_CABLE_LINK_DIAG },
- /* SD_E_ABORT */ {&Sd_Abort, SD_S_END },
- /* SD_E_HELLO_OK */ {NULL, SD_S_CABLE_LINK_DIAG },
- /* SD_E_HELLO_RETRY */ {NULL, SD_S_CABLE_LINK_DIAG },
- /* SD_E_HELLO_ALL_DONE */ {NULL, SD_S_CABLE_LINK_DIAG },
- /* SD_E_WELCOME */ {NULL, SD_S_CABLE_LINK_DIAG },
- /* SD_E_ALL_DONE */ {NULL, SD_S_CABLE_LINK_DIAG },
- /* SD_E_PORT_FOUND */ {NULL, SD_S_CABLE_LINK_DIAG },
- /* SD_E_PORT_ENABLED */ {NULL, SD_S_CABLE_LINK_DIAG },
- /* SD_E_PORT_DISABLED */ {NULL, SD_S_CABLE_LINK_DIAG },
- /* SD_E_BRANCH_FOUND */ {NULL, SD_S_CABLE_LINK_DIAG },
- /* SD_E_CABLE_LINK_RES */ {&Sd_CalcPort, SD_S_NEXT_PORT },
- /* SD_E_ERROR */ {&Sd_Error, SD_S_END },
- /* SD_E_TIMEOUT */ {&Sd_CableLinkDiagnosisTimeout, SD_S_END },
- /* SD_E_NO_SUCCESS */ {NULL, SD_S_CABLE_LINK_DIAG }
- },
-
- { /* State SD_S_END */
- /* SD_E_NIL */ {NULL, SD_S_END },
- /* SD_E_STARTDIAG */ {NULL, SD_S_END },
- /* SD_E_SD_RES_OK */ {Sd_Finish, SD_S_IDLE },
- /* SD_E_ABORT */ {NULL, SD_S_END },
- /* SD_E_HELLO_OK */ {NULL, SD_S_END },
- /* SD_E_HELLO_RETRY */ {NULL, SD_S_END },
- /* SD_E_HELLO_ALL_DONE */ {NULL, SD_S_END },
- /* SD_E_WELCOME */ {NULL, SD_S_END },
- /* SD_E_ALL_DONE */ {NULL, SD_S_END },
- /* SD_E_PORT_FOUND */ {NULL, SD_S_END },
- /* SD_E_PORT_ENABLED */ {NULL, SD_S_END },
- /* SD_E_PORT_DISABLED */ {NULL, SD_S_END },
- /* SD_E_BRANCH_FOUND */ {NULL, SD_S_END },
- /* SD_E_CABLE_LINK_RES */ {NULL, SD_S_END },
- /* SD_E_ERROR */ {Sd_StopDiagFailed, SD_S_IDLE },
- /* SD_E_TIMEOUT */ {Sd_StopDiagFailed, SD_S_IDLE },
- /* SD_E_NO_SUCCESS */ {NULL, SD_S_END }
- }
-
-};
-
-
-
-/*------------------------------------------------------------------------------------------------*/
-/* Implementation */
-/*------------------------------------------------------------------------------------------------*/
-
-/*! \brief Constructor of class CSysDiag.
- * \param self Reference to CSysDiag instance
- * \param inic Reference to CInic instance
- * \param base Reference to CBase instance
- * \param exc Reference to CExc instance
- */
- void SysDiag_Ctor(CSysDiag *self, CInic *inic, CBase *base, CExc *exc)
-{
- MISC_MEM_SET((void *)self, 0, sizeof(*self));
-
- self->inic = inic;
- self->exc = exc;
- self->base = base;
-
- Fsm_Ctor(&self->fsm, self, &(sys_diag_trans_tab[0][0]), SYS_DIAG_NUM_EVENTS, SD_E_NIL);
-
- Sobs_Ctor(&self->sys_diag_start, self, &Sd_SysDiagStartResultCb);
- Sobs_Ctor(&self->sys_diag_stop, self, &Sd_SysDiagStopResultCb);
- Sobs_Ctor(&self->sys_hello, self, &Sd_HelloStatusCb);
- Sobs_Ctor(&self->sys_welcome, self, &Sd_WelcomeResultCb);
- Sobs_Ctor(&self->sys_enable_port, self, &Sd_EnablePortResultCb);
- Sobs_Ctor(&self->sys_disable_port, self, &Sd_DisablePortResultCb);
- Sobs_Ctor(&self->sys_cable_link_diagnosis, self, &Sd_CableLinkDiagnosisResultCb);
-
- /* register termination events */
- Mobs_Ctor(&self->sys_terminate, self, EH_M_TERMINATION_EVENTS, &Sd_OnTerminateEventCb);
- Eh_AddObsrvInternalEvent(&self->base->eh, &self->sys_terminate);
-
- /* Initialize System Diagnosis service */
- Srv_Ctor(&self->sd_srv, SD_SRV_PRIO, self, &Sd_Service);
- /* Add System Diagnosis service to scheduler */
- (void)Scd_AddService(&self->base->scd, &self->sd_srv);
-
-}
-
-/*! \brief Service function of the System Diagnosis service.
- * \param self Reference to System Diagnosis object
- */
-static void Sd_Service(void *self)
-{
- CSysDiag *self_ = (CSysDiag *)self;
- Srv_Event_t event_mask;
- Srv_GetEvent(&self_->sd_srv, &event_mask);
- if(SD_EVENT_SERVICE == (event_mask & SD_EVENT_SERVICE)) /* Is event pending? */
- {
- Fsm_State_t result;
- Srv_ClearEvent(&self_->sd_srv, SD_EVENT_SERVICE);
- TR_INFO((self_->base->ucs_user_ptr, "[SD]", "FSM __ %d %d", 2U, self_->fsm.current_state, self_->fsm.event_occured));
- result = Fsm_Service(&self_->fsm);
- TR_ASSERT(self_->base->ucs_user_ptr, "[SD]", (result != FSM_STATE_ERROR));
- TR_INFO((self_->base->ucs_user_ptr, "[SD]", "FSM -> %d", 1U, self_->fsm.current_state));
- MISC_UNUSED(result);
- }
-}
-
-
-/*! \brief Starts the System Diagnosis State machine
- *
- * \param *self Reference to System Diagnosis object
- * \param *obs_ptr Observer pointer
- * \return UCS_RET_SUCCESS Operation successful
- * \return UCS_RET_ERR_API_LOCKED System Diagnosis was already started
- * \return UCS_RET_ERR_BUFFER_OVERFLOW Invalid observer
- */
-Ucs_Return_t SysDiag_Run(CSysDiag *self, CSingleObserver *obs_ptr)
-{
- Ucs_Return_t ret_val = UCS_RET_SUCCESS;
-
- if (self->startup_locked == false)
- {
- Ssub_Ret_t ret_ssub;
-
- ret_ssub = Ssub_AddObserver(&self->sysdiag, obs_ptr);
- if (ret_ssub != SSUB_UNKNOWN_OBSERVER) /* obs_ptr == NULL ? */
- {
- self->startup_locked = true;
-
- Sd_SysDiagInit(self);
-
- Fsm_SetEvent(&self->fsm, SD_E_STARTDIAG);
- Srv_SetEvent(&self->sd_srv, SD_EVENT_SERVICE);
-
- TR_INFO((self->base->ucs_user_ptr, "[SD]", "SysDiag_Run", 0U));
- }
- else
- {
- ret_val = UCS_RET_ERR_BUFFER_OVERFLOW; /* obs_ptr was invalid */
- }
- }
- else
- {
- ret_val = UCS_RET_ERR_API_LOCKED;
- }
-
- return ret_val;
-}
-
-
-/*! \brief Aborts the System Diagnosis State machine
- *
- * \param *self Reference to System Diagnosis object
- * \return UCS_RET_SUCCESS Operation successful
- * \return UCS_RET_ERR_NOT_AVAILABLE System Diagnosis not running
- */
-Ucs_Return_t SysDiag_Abort(CSysDiag *self)
-{
- Ucs_Return_t ret_val = UCS_RET_SUCCESS;
-
- if (self->startup_locked == true) /* check if System Diagnosis was started */
- {
- Tm_ClearTimer(&self->base->tm, &self->timer);
-
- Fsm_SetEvent(&self->fsm, SD_E_ABORT);
- Srv_SetEvent(&self->sd_srv, SD_EVENT_SERVICE);
- TR_INFO((self->base->ucs_user_ptr, "[SD]", "SysDiag_Abort", 0U));
- }
- else
- {
- ret_val = UCS_RET_ERR_NOT_AVAILABLE;
- }
-
- return ret_val;
-}
-
-/*! Initialize the System Diagnosis
- *
- * \param self Reference to System Diagnosis object
- */
-static void Sd_SysDiagInit(void* self)
-{
- CSysDiag *self_ = (CSysDiag *)self;
-
- self_->hello_retry = SD_NUM_HELLO;
- self_->segment_nr = 0U;
- self_->num_ports = 0U;
- self_->curr_branch = 0U;
- self_->source.node_address = 0xFFFFU;
- self_->source.available = false;
- self_->last_result = SD_INIT;
-
- self_->target.node_address = 0x0001U; /* address of own INIC */
- self_->target.available = false;
-
- self_->admin_node_address = SD_DIAG_ADDR_BASE;
-}
-
-
-/*! FSM action function: sets the INIC into System Diagnosis Mode
- *
- * \param *self Reference to System Diagnosis object
- */
-static void Sd_SysDiagStart(void *self)
-{
- Ucs_Return_t ret_val;
-
- CSysDiag *self_ = (CSysDiag *)self;
-
- ret_val = Inic_NwSysDiagnosis(self_->inic, &self_->sys_diag_start);
- TR_ASSERT(self_->base->ucs_user_ptr, "[SD]", ret_val == UCS_RET_SUCCESS);
- TR_INFO((self_->base->ucs_user_ptr, "[SD]", "Sd_SysDiagStart", 0U));
-
- Tm_SetTimer(&self_->base->tm,
- &self_->timer,
- &Sd_TimerCb,
- self_,
- SD_TIMEOUT_COMMAND,
- 0U);
-
- MISC_UNUSED(ret_val);
-}
-
-
-/*! Callback function for the Inic_NwSysDiagnosis() command
- *
- * \param *self Reference to System Diagnosis object
- * \param *result_ptr Result of the Inic_NwSysDiagnosis() command
- */
-static void Sd_SysDiagStartResultCb(void *self, void *result_ptr)
-{
- CSysDiag *self_ = (CSysDiag *)self;
- Inic_StdResult_t *result_ptr_ = (Inic_StdResult_t *)result_ptr;
-
- Tm_ClearTimer(&self_->base->tm, &self_->timer);
-
- if (result_ptr_->result.code == UCS_RES_SUCCESS)
- {
- Fsm_SetEvent(&self_->fsm, SD_E_SD_RES_OK);
- TR_INFO((self_->base->ucs_user_ptr, "[SD]", "Sd_SysDiagStartResultCb SD_E_SD_RES_OK", 0U));
- }
- else
- {
- Fsm_SetEvent(&self_->fsm, SD_E_ERROR);
- TR_INFO((self_->base->ucs_user_ptr, "[SD]", "Sd_SysDiagStartResultCb SD_E_ERROR", 0U));
- }
-
- Srv_SetEvent(&self_->sd_srv, SD_EVENT_SERVICE);
-}
-
-
-/*! FSM action function: Timeout occured
- *
- * \param *self Reference to System Diagnosis object
- */
-static void Sd_SysDiagTimeout(void *self)
-{
- CSysDiag *self_ = (CSysDiag *)self;
-
- TR_FAILED_ASSERT(self_->base->ucs_user_ptr, "[SD]");
-
- MISC_MEM_SET(&self_->report, 0, sizeof(self_->report));
- self_->report.code = UCS_SD_ERROR;
- self_->report.err_info = UCS_SD_ERR_UNSPECIFIED;
- Ssub_Notify(&self_->sysdiag, &self_->report, false);
-
- Sd_SysDiagStop(self_);
-}
-
-/*! FSM action function: Timeout occured
- *
- * \param *self Reference to System Diagnosis object
- */
-static void Sd_EnablePortTimeout(void *self)
-{
- CSysDiag *self_ = (CSysDiag *)self;
-
- TR_FAILED_ASSERT(self_->base->ucs_user_ptr, "[SD]");
-
- MISC_MEM_SET(&self_->report, 0, sizeof(self_->report));
- self_->report.code = UCS_SD_ERROR;
- self_->report.err_info = UCS_SD_ERR_UNSPECIFIED;
- Ssub_Notify(&self_->sysdiag, &self_->report, false);
-
- Sd_SysDiagStop(self_);
-}
-
-/*! FSM action function: Timeout occured
- *
- * \param *self Reference to System Diagnosis object
- */
-static void Sd_DisablePortTimeout(void *self)
-{
- CSysDiag *self_ = (CSysDiag *)self;
-
- TR_FAILED_ASSERT(self_->base->ucs_user_ptr, "[SD]");
-
- MISC_MEM_SET(&self_->report, 0, sizeof(self_->report));
- self_->report.code = UCS_SD_ERROR;
- self_->report.err_info = UCS_SD_ERR_UNSPECIFIED;
- Ssub_Notify(&self_->sysdiag, &self_->report, false);
-
- Sd_SysDiagStop(self_);
-}
-
-/*! Helper function. Stops the System Diagnosis
- *
- * \param *self Reference to System Diagnosis object
- */
-static void Sd_SysDiagStop(void *self)
-{
- Ucs_Return_t ret_val;
-
- CSysDiag *self_ = (CSysDiag *)self;
-
- ret_val = Inic_NwSysDiagEnd(self_->inic, &self_->sys_diag_stop);
- TR_ASSERT(self_->base->ucs_user_ptr, "[SD]", ret_val == UCS_RET_SUCCESS);
- TR_INFO((self_->base->ucs_user_ptr, "[SD]", "Sd_SysDiagStop", 0U));
- if (ret_val == UCS_RET_SUCCESS)
- {
- Tm_SetTimer(&self_->base->tm,
- &self_->timer,
- &Sd_TimerCb,
- self_,
- SD_TIMEOUT_COMMAND,
- 0U);
- }
- else
- {
- MISC_MEM_SET(&self_->report, 0, sizeof(self_->report));
- self_->report.code = UCS_SD_ERROR;
- self_->report.err_info = UCS_SD_ERR_STOP_SYSDIAG_FAILED;
-
- Ssub_Notify(&self_->sysdiag, &self_->report, false);
-
- Fsm_SetEvent(&self_->fsm, SD_E_ERROR);
- Srv_SetEvent(&self_->sd_srv, SD_EVENT_SERVICE);
- }
-}
-
-
-/*! \brief Callback function for the Inic_NwSysDiagEnd() command
- *
- * \param *self Reference to System Diagnosis object
- * \param *result_ptr Result of the Inic_NwSysDiagEnd() command
- */
-static void Sd_SysDiagStopResultCb(void *self, void *result_ptr)
-{
- CSysDiag *self_ = (CSysDiag *)self;
- Inic_StdResult_t *result_ptr_ = (Inic_StdResult_t *)result_ptr;
-
- Tm_ClearTimer(&self_->base->tm, &self_->timer);
-
- TR_ASSERT(self_->base->ucs_user_ptr, "[SD]", UCS_RES_SUCCESS == result_ptr_->result.code);
-
- if (result_ptr_->result.code == UCS_RES_SUCCESS)
- {
- Fsm_SetEvent(&self_->fsm, SD_E_SD_RES_OK);
- TR_INFO((self_->base->ucs_user_ptr, "[SD]", "Sd_SysDiagStopResultCb SD_E_SD_RES_OK", 0U));
- }
- else
- {
- Fsm_SetEvent(&self_->fsm, SD_E_ERROR);
- TR_INFO((self_->base->ucs_user_ptr, "[SD]", "Sd_SysDiagStopResultCb SD_E_ERROR", 0U));
- }
-
- Srv_SetEvent(&self_->sd_srv, SD_EVENT_SERVICE);
-}
-
-
-
-/*! FSM action function: Send Hello.Get command
- *
- * \param *self Reference to System Diagnosis object
- */
-static void Sd_SendHello(void *self)
-{
- Ucs_Return_t ret_val;
-
- CSysDiag *self_ = (CSysDiag *)self;
-
- ret_val = Exc_Hello_Get(self_->exc,
- UCS_ADDR_BROADCAST_BLOCKING,
- SD_SIGNATURE_VERSION,
- &self_->sys_hello);
- Tm_SetTimer(&self_->base->tm,
- &self_->timer,
- &Sd_TimerCb,
- self_,
- SD_TIMEOUT_HELLO,
- 0U);
-
- TR_ASSERT(self_->base->ucs_user_ptr, "[SD]", ret_val == UCS_RET_SUCCESS);
- MISC_UNUSED(ret_val);
-}
-
-/*! Callback function for the Enc.Hello.Status message
- *
- * \param *self Reference to System Diagnosis object
- * \param *result_ptr Result of the Exc_Hello_Get() command
- */
-static void Sd_HelloStatusCb(void *self, void *result_ptr)
-{
- CSysDiag *self_ = (CSysDiag *)self;
- Exc_StdResult_t *result_ptr_ = (Exc_StdResult_t *)result_ptr;
-
- Tm_ClearTimer(&self_->base->tm, &self_->timer);
-
- if (result_ptr_->result.code == UCS_RES_SUCCESS)
- {
- /* read signature and store it for the Welcome command */
- self_->target.signature = (*(Exc_HelloStatus_t *)(result_ptr_->data_info)).signature;
- self_->target.version = (*(Exc_HelloStatus_t *)(result_ptr_->data_info)).version;
-
- if (self_->segment_nr != 0U)
- {
- self_->target.node_address = self_->segment_nr + 0x0400U;
-
- }
-
- Fsm_SetEvent(&self_->fsm, SD_E_HELLO_OK);
- TR_INFO((self_->base->ucs_user_ptr, "[SD]", "Sd_HelloStatusCb SD_E_SD_RES_OK", 0U));
- }
- else
- {
- Fsm_SetEvent(&self_->fsm, SD_E_ERROR);
- TR_INFO((self_->base->ucs_user_ptr, "[SD]", "Sd_HelloStatusCb SD_E_ERROR", 0U));
- }
-
- Srv_SetEvent(&self_->sd_srv, SD_EVENT_SERVICE);
-}
-
-/*! \brief Timer callback used for supervising INIC command timeouts.
- * \param self Reference to System Diagnosis object
- */
-static void Sd_TimerCb(void *self)
-{
- CSysDiag *self_ = (CSysDiag *)self;
-
- Fsm_SetEvent(&self_->fsm, SD_E_TIMEOUT);
- TR_INFO((self_->base->ucs_user_ptr, "[SD]", "Sd_TimerCb SD_E_TIMEOUT", 0U));
-
- Srv_SetEvent(&self_->sd_srv, SD_EVENT_SERVICE);
-}
-
-
-/*! FSM action function: retry hello command or start CableLinkDiagnosis
- *
- * \param *self Reference to System Diagnosis object
- */
-static void Sd_HelloTimeout(void *self)
-{
- CSysDiag *self_ = (CSysDiag *)self;
-
- if (self_->hello_retry > 0U)
- {
- --self_->hello_retry;
- Fsm_SetEvent(&self_->fsm, SD_E_HELLO_RETRY);
- TR_INFO((self_->base->ucs_user_ptr, "[SD]", "Sd_HelloTimeout SD_E_HELLO_RETRY", 0U));
- }
- else
- {
- Fsm_SetEvent(&self_->fsm, SD_E_HELLO_ALL_DONE);
- TR_INFO((self_->base->ucs_user_ptr, "[SD]", "Sd_HelloTimeout SD_E_HELLO_ALL_DONE", 0U));
- }
-
- /*Srv_SetEvent(&self_->sd_srv, SD_EVENT_SERVICE);*/
-}
-
-
-/*! FSM action function: Send Welcome message
- *
- * \param *self Reference to System Diagnosis object
- */
-static void Sd_SendWelcome(void *self)
-{
- Ucs_Return_t ret_val;
- CSysDiag *self_ = (CSysDiag *)self;
-
- self_->admin_node_address = SD_DIAG_ADDR_BASE + self_->segment_nr;
-
- ret_val = Exc_Welcome_Sr(self_->exc,
- self_->target.node_address,
- self_->admin_node_address,
- SD_SIGNATURE_VERSION,
- self_->target.signature,
- &self_->sys_welcome);
- Tm_SetTimer(&self_->base->tm,
- &self_->timer,
- &Sd_TimerCb,
- self_,
- SD_TIMEOUT_COMMAND,
- 0U);
- TR_ASSERT(self_->base->ucs_user_ptr, "[SD]", ret_val == UCS_RET_SUCCESS);
- MISC_UNUSED(ret_val);
-}
-
-
-/*! \brief Function is called on reception of the Welcome.Result messsage
- * \param self Reference to System Diagnosis object
- * \param result_ptr Pointer to the result of the Welcome message
- */
-static void Sd_WelcomeResultCb(void *self, void *result_ptr)
-{
- CSysDiag *self_ = (CSysDiag *)self;
- Exc_StdResult_t *result_ptr_ = (Exc_StdResult_t *)result_ptr;
-
- Tm_ClearTimer(&self_->base->tm, &self_->timer);
-
- if (result_ptr_->result.code == UCS_RES_SUCCESS)
- {
- /* read signature and store it for the Welcome command */
- self_->target.result = (*(Exc_WelcomeResult_t *)(result_ptr_->data_info)).res;
-
- if (self_->target.result == SD_WELCOME_SUCCESS)
- {
- self_->target.available = true;
-
- if (self_->segment_nr == 0U)
- {
- self_->num_ports = self_->target.signature.num_ports;
- }
- else
- {
- self_->last_result = SD_SEGMENT;
- }
- /* do not report result for own node */
- if (self_->segment_nr != 0U)
- {
- MISC_MEM_SET(&self_->report, 0, sizeof(self_->report));
-
- self_->report.code = UCS_SD_TARGET_FOUND;
- self_->report.segment.branch = self_->curr_branch;
- self_->report.segment.num = self_->segment_nr;
- self_->report.segment.source = self_->source.signature;
- self_->report.segment.target = self_->target.signature;
- /*self_->report.cable_link_info = 0U;*/ /* element is not written deliberately */
- /*self_->report.err_info = 0U;*/ /* element is not written deliberately */
-
- Ssub_Notify(&self_->sysdiag, &self_->report, false);
- TR_INFO((self_->base->ucs_user_ptr, "[SD]", "Sd_WelcomeResultCb ReportSegment", 0U));
- }
-
- Fsm_SetEvent(&self_->fsm, SD_E_WELCOME);
- TR_INFO((self_->base->ucs_user_ptr, "[SD]", "Sd_WelcomeResultCb SD_E_WELCOME", 0U));
- }
- else
- {
- MISC_MEM_SET(&self_->report, 0, sizeof(self_->report));
-
- self_->report.code = UCS_SD_ERROR;
- self_->report.segment.branch = self_->curr_branch;
- self_->report.segment.num = self_->segment_nr;
- self_->report.segment.source = self_->source.signature;
- self_->report.segment.target = self_->target.signature;
- /*self_->report.cable_link_info = 0U;*/ /* element is not written deliberately */
- self_->report.err_info = UCS_SD_ERR_WELCOME_NO_SUCCESS;
-
- Ssub_Notify(&self_->sysdiag, &self_->report, false);
-
- Fsm_SetEvent(&self_->fsm, SD_E_NO_SUCCESS);
- TR_INFO((self_->base->ucs_user_ptr, "[SD]", "Sd_WelcomeResultCb reported NoSuccess", 0U));
- }
-
- }
- else
- {
- Fsm_SetEvent(&self_->fsm, SD_E_ERROR);
- TR_INFO((self_->base->ucs_user_ptr, "[SD]", "Sd_WelcomeResultCb Error SD_E_ERROR 0x%x", 1U, result_ptr_->result.code));
-
- }
-
- Srv_SetEvent(&self_->sd_srv, SD_EVENT_SERVICE);
-}
-
-
-/*! \brief FSM action function: Calculate the next port tobe examined
- * \param self Reference to System Diagnosis object
- */
-static void Sd_CalcPort(void *self)
-{
- CSysDiag *self_ = (CSysDiag *)self;
-
- switch (self_->last_result)
- {
- case SD_INIT:
- self_->curr_branch = 0U; /* Master device has at least one port */
- self_->source = self_->target;
- self_->master = self_->target;
-
- MISC_MEM_SET(&(self_->target), 0, sizeof(self_->target));
- self_->last_result = SD_SEGMENT;
- Fsm_SetEvent(&self_->fsm, SD_E_PORT_FOUND);
- TR_INFO((self_->base->ucs_user_ptr, "[SD]", "Sd_CalcPort SD_E_PORT_FOUND", 0U));
- break;
-
- case SD_SEGMENT:
- if (self_->target.signature.num_ports > 1U)
- {
- self_->source = self_->target;
- MISC_MEM_SET(&(self_->target), 0, sizeof(self_->target));
- Fsm_SetEvent(&self_->fsm, SD_E_PORT_FOUND);
- TR_INFO((self_->base->ucs_user_ptr, "[SD]", "Sd_CalcPort SD_E_PORT_FOUND", 0U));
- }
- else /* switch to next branch if possible*/
- {
- if (self_->num_ports == (self_->curr_branch + 1U)) /* last branch */
- {
- Fsm_SetEvent(&self_->fsm, SD_E_ALL_DONE);
- TR_INFO((self_->base->ucs_user_ptr, "[SD]", "Sd_CalcPort SD_E_ALL_DONE", 0U));
- }
- else
- {
- self_->segment_nr = 1U; /* reset segment number */
- self_->curr_branch++; /* switch to next port */
- self_->source = self_->master;
- MISC_MEM_SET(&(self_->target), 0, sizeof(self_->target));
- Fsm_SetEvent(&self_->fsm, SD_E_BRANCH_FOUND);
- TR_INFO((self_->base->ucs_user_ptr, "[SD]", "Sd_CalcPort SD_E_BRANCH_FOUND", 0U));
- }
- }
- break;
-
- case SD_CABLE_LINK:
- if (self_->num_ports == (self_->curr_branch + 1U)) /* last branch */
- {
- Fsm_SetEvent(&self_->fsm, SD_E_ALL_DONE);
- TR_INFO((self_->base->ucs_user_ptr, "[SD]", "Sd_CalcPort SD_E_ALL_DONE", 0U));
- }
- else
- {
- self_->segment_nr = 1U; /* reset segment number */
- self_->curr_branch++; /* switch to next port */
- self_->source = self_->master;
- MISC_MEM_SET(&(self_->target), 0, sizeof(self_->target));
- Fsm_SetEvent(&self_->fsm, SD_E_BRANCH_FOUND);
- TR_INFO((self_->base->ucs_user_ptr, "[SD]", "Sd_CalcPort SD_E_BRANCH_FOUND", 0U));
- }
- break;
-
- default:
- break;
- }
-
- /*Srv_SetEvent(&self_->sd_srv, SD_EVENT_SERVICE);*/
-}
-
-
-/*! \brief FSM action function: Enable port
- *
- * \param *self Reference to System Diagnosis object
- */
-static void Sd_EnablePort(void *self)
-{
- CSysDiag *self_ = (CSysDiag *)self;
- uint16_t target_address;
- uint8_t port_number;
- Ucs_Return_t ret_val;
-
- if (self_->segment_nr == 0U)
- {
- port_number = self_->curr_branch;
- target_address = 0x0001U;
- }
- else
- {
- port_number = 1U;
- target_address = self_->source.node_address;
- }
-
- ret_val = Exc_EnablePort_Sr(self_->exc, target_address, port_number, true, &self_->sys_enable_port);
- Tm_SetTimer(&self_->base->tm,
- &self_->timer,
- &Sd_TimerCb,
- self_,
- SD_TIMEOUT_COMMAND,
- 0U);
-
- TR_ASSERT(self_->base->ucs_user_ptr, "[SD]", ret_val == UCS_RET_SUCCESS);
- MISC_UNUSED(ret_val);
-}
-
-
-/*! Function is called on reception of the EnablePort.Result messsage
- *
- * \param *self Reference to System Diagnosis object
- * \param *result_ptr
- */
-static void Sd_EnablePortResultCb(void *self, void *result_ptr)
-{
- CSysDiag *self_ = (CSysDiag *)self;
- Exc_StdResult_t *result_ptr_ = (Exc_StdResult_t *)result_ptr;
-
- Tm_ClearTimer(&self_->base->tm, &self_->timer);
-
- if (result_ptr_->result.code == UCS_RES_SUCCESS)
- {
- self_->segment_nr++;
- Fsm_SetEvent(&self_->fsm, SD_E_PORT_ENABLED);
- TR_INFO((self_->base->ucs_user_ptr, "[SD]", "Sd_EnablePortResultCb SD_E_PORT_ENABLED", 0U));
- }
- else
- {
- Fsm_SetEvent(&self_->fsm, SD_E_ERROR);
- TR_INFO((self_->base->ucs_user_ptr, "[SD]", "Sd_EnablePortResultCb SD_E_ERROR", 0U));
- }
-
- Srv_SetEvent(&self_->sd_srv, SD_EVENT_SERVICE);
-}
-
-
-/*! \brief FSM action function:
- *
- * \param *self Reference to System Diagnosis object
- */
-static void Sd_DisablePort(void *self)
-{
- CSysDiag *self_ = (CSysDiag *)self;
- uint16_t target_address;
- uint8_t port_number;
- Ucs_Return_t ret_val;
-
- target_address = self_->admin_node_address;
- port_number = self_->curr_branch;
-
- ret_val = Exc_EnablePort_Sr(self_->exc, target_address, port_number, false, &self_->sys_disable_port);
- Tm_SetTimer(&self_->base->tm,
- &self_->timer,
- &Sd_TimerCb,
- self_,
- SD_TIMEOUT_COMMAND,
- 0U);
-
- TR_ASSERT(self_->base->ucs_user_ptr, "[SD]", ret_val == UCS_RET_SUCCESS);
- MISC_UNUSED(ret_val);
-}
-
-
-static void Sd_DisablePortResultCb(void *self, void *result_ptr)
-{
- CSysDiag *self_ = (CSysDiag *)self;
- Exc_StdResult_t *result_ptr_ = (Exc_StdResult_t *)result_ptr;
-
- Tm_ClearTimer(&self_->base->tm, &self_->timer);
-
- if (result_ptr_->result.code == UCS_RES_SUCCESS)
- {
- Fsm_SetEvent(&self_->fsm, SD_E_PORT_DISABLED);
- TR_INFO((self_->base->ucs_user_ptr, "[SD]", "Sd_DisablePortResultCb SD_E_PORT_DISABLED", 0U));
- }
- else
- {
- Fsm_SetEvent(&self_->fsm, SD_E_ERROR);
- TR_INFO((self_->base->ucs_user_ptr, "[SD]", "Sd_DisablePortResultCb SD_E_ERROR", 0U));
- }
-
- Srv_SetEvent(&self_->sd_srv, SD_EVENT_SERVICE);
-}
-
-
-/*! \brief FSM action function: Start CableLinkDiagnosis
- *
- * \param *self Reference to System Diagnosis object
- */
-static void Sd_CableLinkDiagnosis(void *self)
-{
- CSysDiag *self_ = (CSysDiag *)self;
- uint16_t target_address;
- uint8_t port_number;
- Ucs_Return_t ret_val;
-
-
- if (self_->segment_nr != 0U) /* do not start CableLinkDiagnosis when connecting to local INIC */
- {
- target_address = self_->source.node_address;
-
- if (self_->segment_nr == 1U)
- {
- port_number = self_->curr_branch;
- }
- else
- {
- port_number = 1U; /* OS81119: always port 1 */
- }
-
- self_->last_result = SD_CABLE_LINK;
-
- ret_val = Exc_CableLinkDiagnosis_Start(self_->exc, target_address, port_number, &self_->sys_cable_link_diagnosis);
- TR_INFO((self_->base->ucs_user_ptr, "[SD]", "Sd_CableLinkDiagnosis", 0U));
-
- Tm_SetTimer(&self_->base->tm,
- &self_->timer,
- &Sd_TimerCb,
- self_,
- SD_TIMEOUT_CABLE_DIAGNOSIS,
- 0U);
-
- TR_ASSERT(self_->base->ucs_user_ptr, "[SD]", ret_val == UCS_RET_SUCCESS);
- MISC_UNUSED(ret_val);
-}
- else /* stop SystemDiagnosis when connecting to local INIC failed */
- {
- Fsm_SetEvent(&self_->fsm, SD_E_ERROR);
- Srv_SetEvent(&self_->sd_srv, SD_EVENT_SERVICE);
- }
-}
-
-
-static void Sd_CableLinkDiagnosisResultCb(void *self, void *result_ptr)
-{
- CSysDiag *self_ = (CSysDiag *)self;
-
- Exc_StdResult_t *result_ptr_ = (Exc_StdResult_t *)result_ptr;
-
- Tm_ClearTimer(&self_->base->tm, &self_->timer);
-
- if (result_ptr_->result.code == UCS_RES_SUCCESS)
- {
- MISC_MEM_SET(&self_->report, 0, sizeof(self_->report));
-
- self_->report.code = UCS_SD_CABLE_LINK_RES;
- self_->report.segment.branch = self_->curr_branch;
- self_->report.segment.num = self_->segment_nr;
- self_->report.segment.source = self_->source.signature;
- /*self_->report.segment.target = self_->target.signature;*/ /* structure is not written deliberately */
- self_->report.cable_link_info = (*(Exc_CableLinkDiagResult_t *)(result_ptr_->data_info)).result;
- /*self_->report.err_info = 0U;*/ /* element is not written deliberately */
-
- Ssub_Notify(&self_->sysdiag, &self_->report, false);
-
-
- Fsm_SetEvent(&self_->fsm, SD_E_CABLE_LINK_RES);
- TR_INFO((self_->base->ucs_user_ptr, "[SD]", "Sd_CableLinkDiagnosisResultCb SD_E_CABLE_LINK_RES", 0U));
- }
- else
- {
- Fsm_SetEvent(&self_->fsm, SD_E_ERROR);
- TR_INFO((self_->base->ucs_user_ptr, "[SD]", "Sd_CableLinkDiagnosisResultCb SD_E_ERROR %02X %02X %02X", 3U, result_ptr_->result.info_ptr[0], result_ptr_->result.info_ptr[1], result_ptr_->result.info_ptr[2]));
- }
-
- Srv_SetEvent(&self_->sd_srv, SD_EVENT_SERVICE);
-
-}
-
-
-/*! \brief FSM action function: React on Timeout of CableLinkDiagnosis
- *
- * \param *self Reference to System Diagnosis object
- */
-static void Sd_CableLinkDiagnosisTimeout(void *self)
-{
- CSysDiag *self_ = (CSysDiag *)self;
-
- MISC_MEM_SET(&self_->report, 0, sizeof(self_->report));
- self_->report.code = UCS_SD_ERROR;
- self_->report.err_info = UCS_SD_ERR_UNSPECIFIED;
- Ssub_Notify(&self_->sysdiag, &self_->report, false);
-
- TR_FAILED_ASSERT(self_->base->ucs_user_ptr, "[SD]");
- Sd_SysDiagStop(self_);
-}
-
-/*! \brief FSM action function: React on Timeout of Welcome
- *
- * \param *self Reference to System Diagnosis object
- */
-static void Sd_WelcomeTimeout(void *self)
-{
- CSysDiag *self_ = (CSysDiag *)self;
-
- MISC_MEM_SET(&self_->report, 0, sizeof(self_->report));
- self_->report.code = UCS_SD_ERROR;
- self_->report.err_info = UCS_SD_ERR_UNSPECIFIED;
- Ssub_Notify(&self_->sysdiag, &self_->report, false);
-
- TR_FAILED_ASSERT(self_->base->ucs_user_ptr, "[SD]");
- Sd_SysDiagStop(self_);
-}
-
-
-
-
-/*! \brief FSM action function: All branches and segments explored, finish System Diagnosis
- *
- * \param *self Reference to System Diagnosis object
- */
-static void Sd_AllDone(void *self)
-{
- CSysDiag *self_ = (CSysDiag *)self;
-
- TR_INFO((self_->base->ucs_user_ptr, "[SD]", "Sd_AllDone", 0U));
-
- Sd_SysDiagStop(self_);
-}
-
-
-/*! \brief FSM action function: INIC system Diagnosis mode ended
- *
- * \param *self Reference to System Diagnosis object
- */
-static void Sd_Finish(void *self)
-{
- CSysDiag *self_ = (CSysDiag *)self;
-
- MISC_MEM_SET(&self_->report, 0, sizeof(self_->report));
-
- self_->report.code = UCS_SD_FINISHED;
- Ssub_Notify(&self_->sysdiag, &self_->report, true);
-
- self_->startup_locked = false;
-
- TR_INFO((self_->base->ucs_user_ptr, "[SD]", "Sd_Finish", 0U));
-}
-
-/*! \brief FSM action function: An unexpected error occurred.
- *
- * \param *self Reference to System Diagnosis object
- */
-static void Sd_Error(void *self)
-{
- CSysDiag *self_ = (CSysDiag *)self;
-
- MISC_MEM_SET(&self_->report, 0, sizeof(self_->report));
- self_->report.code = UCS_SD_ERROR;
- self_->report.err_info = UCS_SD_ERR_UNSPECIFIED;
- Ssub_Notify(&self_->sysdiag, &self_->report, false);
-
- Sd_SysDiagStop(self_);
- TR_INFO((self_->base->ucs_user_ptr, "[SD]", "Sd_Error", 0U));
-}
-
-/*! \brief FSM action function: Welcome reports NoSuccess.
- *
- * \param *self Reference to System Diagnosis object
- */
-static void Sd_ErrorWelcome(void *self)
-{
- CSysDiag *self_ = (CSysDiag *)self;
-
- Sd_SysDiagStop(self_);
- TR_INFO((self_->base->ucs_user_ptr, "[SD]", "Sd_ErrorWelcome", 0U));
-}
-
-/*! \brief FSM action function: stopping system diagnosis mode failed
- *
- * \param *self Reference to System Diagnosis object
- */
-static void Sd_StopDiagFailed(void *self)
-{
- CSysDiag *self_ = (CSysDiag *)self;
-
- MISC_MEM_SET(&self_->report, 0, sizeof(self_->report));
- self_->report.code = UCS_SD_ERROR;
- self_->report.err_info = UCS_SD_ERR_STOP_SYSDIAG_FAILED;
- Ssub_Notify(&self_->sysdiag, &self_->report, false);
-
- /* always finish the System Diagnosis with event UCS_SD_FINISHED */
- MISC_MEM_SET(&self_->report, 0, sizeof(self_->report));
- self_->report.code = UCS_SD_FINISHED;
- Ssub_Notify(&self_->sysdiag, &self_->report, true); /* remove the observer function */
-
- self_->startup_locked = false;
-
- TR_INFO((self_->base->ucs_user_ptr, "[SD]", "Sd_StopDiagFailed", 0U));
-}
-
-/*! \brief FSM action function: Application requested to abort the System Diagnosis.
- *
- * \param *self Reference to System Diagnosis object
- */
-static void Sd_Abort(void *self)
-{
- CSysDiag *self_ = (CSysDiag *)self;
-
- MISC_MEM_SET(&self_->report, 0, sizeof(self_->report));
- self_->report.code = UCS_SD_ABORTED;
- Ssub_Notify(&self_->sysdiag, &self_->report, false);
-
- Sd_SysDiagStop(self_);
- TR_INFO((self_->base->ucs_user_ptr, "[SD]", "Sd_Abort", 0U));
-}
-
-
-
-/*! Function is called on severe internal errors
- *
- * \param *self Reference to System Diagnosis object
- * \param *result_ptr Reference to data
- */
-static void Sd_OnTerminateEventCb(void *self, void *result_ptr)
-{
- CSysDiag *self_ = (CSysDiag *)self;
-
- MISC_UNUSED(result_ptr);
-
- if (self_->fsm.current_state != SD_S_IDLE)
- {
- Tm_ClearTimer(&self_->base->tm, &self_->timer);
-
- MISC_MEM_SET(&self_->report, 0, sizeof(self_->report));
- self_->report.code = UCS_SD_ERROR;
- self_->report.err_info = UCS_SD_ERR_TERMINATED;
- Ssub_Notify(&self_->sysdiag, &self_->report, false);
-
- /* always finish the System Diagnosis with event UCS_SD_FINISHED */
- MISC_MEM_SET(&self_->report, 0, sizeof(self_->report));
- self_->report.code = UCS_SD_FINISHED;
- Ssub_Notify(&self_->sysdiag, &self_->report, true); /* remove the observer function */
-
- TR_INFO((self_->base->ucs_user_ptr, "[SD]", "Sd_OnTerminateEventCb", 0U));
-
- /* reset FSM */
- self_->startup_locked = false;
- Sd_SysDiagInit(self_);
- self_->fsm.current_state = SD_S_IDLE;
- }
-}
-
-
-
-
-/*!
- * @}
- * \endcond
- */
-
-/*------------------------------------------------------------------------------------------------*/
-/* End of file */
-/*------------------------------------------------------------------------------------------------*/
-