diff options
author | Ronan Le Martret <ronan.lemartret@iot.bzh> | 2017-06-12 11:17:04 +0200 |
---|---|---|
committer | Ronan Le Martret <ronan.lemartret@iot.bzh> | 2017-06-29 14:40:09 +0200 |
commit | ec59d20bafb3acaaff2bbcab185a074825319e20 (patch) | |
tree | 2262fa512acadeb1dfa68bad7b2bb5a5c7de2467 /ucs2-lib/src/ucs_exc.c | |
parent | a57c0b35c05c84f31ec09d3ac46b298555aa0cfb (diff) |
Update package
* use sub module for ucs2-lib (tmp fork from IoT.bzh github)
* add packaging for native build
Signed-off-by: Ronan Le Martret <ronan.lemartret@iot.bzh>
Diffstat (limited to 'ucs2-lib/src/ucs_exc.c')
-rw-r--r-- | ucs2-lib/src/ucs_exc.c | 1711 |
1 files changed, 0 insertions, 1711 deletions
diff --git a/ucs2-lib/src/ucs_exc.c b/ucs2-lib/src/ucs_exc.c deleted file mode 100644 index 5f5b5db..0000000 --- a/ucs2-lib/src/ucs_exc.c +++ /dev/null @@ -1,1711 +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 FBlock ExtendedNetworkControl - * \details Contains the housekeeping functions of INIC management - * - * \cond UCS_INTERNAL_DOC - * \addtogroup G_EXC - * @{ - */ - -/*------------------------------------------------------------------------------------------------*/ -/* Includes */ -/*------------------------------------------------------------------------------------------------*/ -#include "ucs_misc.h" -#include "ucs_ret_pb.h" -#include "ucs_exc.h" - - - -/*------------------------------------------------------------------------------------------------*/ -/* Internal definitions */ -/*------------------------------------------------------------------------------------------------*/ -/*! \brief Bitmask for API method Exc_PhyTestResult_Get() used by API locking manager */ -#define EXC_API_PHY_LAY_TEST_RESULT 0x01U -/*! \brief Bitmask for API method Exc_MemSessionOpen_Sr() used by API locking manager */ -#define EXC_API_MEM_SESSION_OPEN 0x02U -/*! \brief Bitmask for API method Exc_MemSessionClose_Sr() used by API locking manager */ -#define EXC_API_MEM_SESSION_CLOSE 0x04U -/*! \brief Bitmask for API method Exc_MemoryRead_Sr() used by API locking manager */ -#define EXC_API_MEM_READ 0x08U -/*! \brief Bitmask for API method Exc_MemoryWrite_Sr() used by API locking manager */ -#define EXC_API_MEM_WRITE 0x10U - -/*! \brief max. number of elements used in MemoryWrite and MemoryWrite messages */ -#define MAX_UNIT_LEN 18U - -/*! \brief length of signature (V1) */ -#define EXC_SIGNATURE_LEN_V1 26U - - -/*------------------------------------------------------------------------------------------------*/ -/* Internal prototypes */ -/*------------------------------------------------------------------------------------------------*/ -static void Exc_DecodeMsg(CExc *self, Msg_MostTel_t *msg_rx_ptr); -static void Exc_EnablePort_Error(void *self, Msg_MostTel_t *msg_ptr); -static void Exc_EnablePort_Result(void *self, Msg_MostTel_t *msg_ptr); -static void Exc_Hello_Status(void *self, Msg_MostTel_t *msg_ptr); -static void Exc_Hello_Error(void *self, Msg_MostTel_t *msg_ptr); -static void Exc_Welcome_Error(void *self, Msg_MostTel_t *msg_ptr); -static void Exc_Welcome_Result(void *self, Msg_MostTel_t *msg_ptr); -static void Exc_Signature_Status(void *self, Msg_MostTel_t *msg_ptr); -static void Exc_Signature_Error(void *self, Msg_MostTel_t *msg_ptr); -static void Exc_DeviceInit_Error(void *self, Msg_MostTel_t *msg_ptr); -static void Exc_CableLinkDiag_Error(void *self, Msg_MostTel_t *msg_ptr); -static void Exc_CableLinkDiag_Result(void *self, Msg_MostTel_t *msg_ptr); -static void Exc_NwPhyTest_Error(void *self, Msg_MostTel_t *msg_ptr); -static void Exc_NwPhyTestResult_Status(void *self, Msg_MostTel_t *msg_ptr); -static void Exc_NwPhyTestResult_Error(void *self, Msg_MostTel_t *msg_ptr); -static void Exc_BC_Diag_Result(void *self, Msg_MostTel_t *msg_ptr); -static void Exc_BC_Diag_Error(void *self, Msg_MostTel_t *msg_ptr); -static void Exc_BC_EnableTx_Result(void *self, Msg_MostTel_t *msg_ptr); -static void Exc_BC_EnableTx_Error(void *self, Msg_MostTel_t *msg_ptr); -static void Exc_MemoryRead_Result(void *self, Msg_MostTel_t *msg_ptr); -static void Exc_MemoryRead_Error(void *self, Msg_MostTel_t *msg_ptr); -static void Exc_MemoryWrite_Result(void *self, Msg_MostTel_t *msg_ptr); -static void Exc_MemoryWrite_Error(void *self, Msg_MostTel_t *msg_ptr); -static void Exc_MemSessionOpen_Result(void *self, Msg_MostTel_t *msg_ptr); -static void Exc_MemSessionOpen_Error(void *self, Msg_MostTel_t *msg_ptr); -static void Exc_MemSessionClose_Result(void *self, Msg_MostTel_t *msg_ptr); -static void Exc_MemSessionClose_Error(void *self, Msg_MostTel_t *msg_ptr); - -static void Exc_HandleApiTimeout(void *self, void *method_mask_ptr); - -static Ucs_StdResult_t Exc_TranslateError(CExc *self, uint8_t error_data[], uint8_t error_size); -static void Exc_Read_Signature(Ucs_Signature_t *dest, uint8_t source[]); - - -/*------------------------------------------------------------------------------------------------*/ -/* Internal constants */ -/*------------------------------------------------------------------------------------------------*/ -/*! \brief List of all EXC messages */ -static const Dec_FktOpIsh_t exc_handler[] = /* parasoft-suppress MISRA2004-8_7 "Value shall be part of the module, not part of a function." */ -{ - { DEC_FKTOP(EXC_FID_HELLO, UCS_OP_STATUS), Exc_Hello_Status }, - { DEC_FKTOP(EXC_FID_HELLO, UCS_OP_ERROR), Exc_Hello_Error }, - { DEC_FKTOP(EXC_FID_WELCOME, UCS_OP_RESULT), Exc_Welcome_Result }, - { DEC_FKTOP(EXC_FID_WELCOME, UCS_OP_ERROR), Exc_Welcome_Error }, - { DEC_FKTOP(EXC_FID_SIGNATURE, UCS_OP_STATUS), Exc_Signature_Status }, - { DEC_FKTOP(EXC_FID_SIGNATURE, UCS_OP_ERROR), Exc_Signature_Error }, - { DEC_FKTOP(EXC_FID_DEVICE_INIT, UCS_OP_ERROR), Exc_DeviceInit_Error }, - { DEC_FKTOP(EXC_FID_ENABLEPORT, UCS_OP_RESULT), Exc_EnablePort_Result }, - { DEC_FKTOP(EXC_FID_ENABLEPORT, UCS_OP_ERROR), Exc_EnablePort_Error }, - { DEC_FKTOP(EXC_FID_CABLE_LINK_DIAG, UCS_OP_RESULT), Exc_CableLinkDiag_Result }, - { DEC_FKTOP(EXC_FID_CABLE_LINK_DIAG, UCS_OP_ERROR), Exc_CableLinkDiag_Error }, - { DEC_FKTOP(EXC_FID_PHY_LAY_TEST, UCS_OP_ERROR), Exc_NwPhyTest_Error }, - { DEC_FKTOP(EXC_FID_PHY_LAY_TEST_RES, UCS_OP_STATUS), Exc_NwPhyTestResult_Status }, - { DEC_FKTOP(EXC_FID_PHY_LAY_TEST_RES, UCS_OP_ERROR), Exc_NwPhyTestResult_Error }, - { DEC_FKTOP(EXC_FID_BC_DIAG, UCS_OP_RESULT), Exc_BC_Diag_Result }, - { DEC_FKTOP(EXC_FID_BC_DIAG, UCS_OP_ERROR), Exc_BC_Diag_Error }, - { DEC_FKTOP(EXC_FID_BC_ENABLE_TX, UCS_OP_RESULT), Exc_BC_EnableTx_Result }, - { DEC_FKTOP(EXC_FID_BC_ENABLE_TX, UCS_OP_ERROR), Exc_BC_EnableTx_Error }, - { DEC_FKTOP(EXC_FID_MEM_SESSION_OPEN, UCS_OP_RESULT), Exc_MemSessionOpen_Result }, - { DEC_FKTOP(EXC_FID_MEM_SESSION_OPEN, UCS_OP_ERROR), Exc_MemSessionOpen_Error }, - { DEC_FKTOP(EXC_FID_MEM_SESSION_CLOSE, UCS_OP_RESULT), Exc_MemSessionClose_Result }, - { DEC_FKTOP(EXC_FID_MEM_SESSION_CLOSE, UCS_OP_ERROR), Exc_MemSessionClose_Error }, - { DEC_FKTOP(EXC_FID_MEMORY_READ, UCS_OP_RESULT), Exc_MemoryRead_Result }, - { DEC_FKTOP(EXC_FID_MEMORY_READ, UCS_OP_ERROR), Exc_MemoryRead_Error }, - { DEC_FKTOP(EXC_FID_MEMORY_WRITE, UCS_OP_RESULT), Exc_MemoryWrite_Result }, - { DEC_FKTOP(EXC_FID_MEMORY_WRITE, UCS_OP_ERROR), Exc_MemoryWrite_Error }, - { DEC_FKTOP_TERMINATION, NULL } -}; - - -/*------------------------------------------------------------------------------------------------*/ -/* Implementation */ -/*------------------------------------------------------------------------------------------------*/ - -/*! \brief Constructor of class CExc. - * \param self Reference to CExc instance - * \param base_ptr Reference to a Base instance - * \param rcm_ptr Reference to Transceiver instance - */ -void Exc_Ctor(CExc *self, CBase *base_ptr, CTransceiver *rcm_ptr) -{ - - MISC_MEM_SET((void *)self, 0, sizeof(*self)); - - self->base_ptr = base_ptr; - self->xcvr_ptr = rcm_ptr; - - self->fkt_op_list_ptr = &exc_handler[0]; - - - /* Initialize API locking mechanism */ - Sobs_Ctor(&self->lock.observer, self, &Exc_HandleApiTimeout); - Al_Ctor(&self->lock.api, &self->lock.observer, self->base_ptr->ucs_user_ptr); - Alm_RegisterApi(&self->base_ptr->alm, &self->lock.api); - -} - - -/*! \brief Callback function to filter RCM Rx messages - * \details Do not release the message object here - * \param self reference to INIC object - * \param tel_ptr received message - */ -void Exc_OnRcmRxFilter(void *self, Msg_MostTel_t *tel_ptr) -{ - CExc *self_ = (CExc *)self; - Exc_DecodeMsg(self_, tel_ptr); - -} - - -/*! \brief Decode a message for FBlock EXC - * \param self Instance pointer to FBlock EXC - * \param msg_rx_ptr pointer to the MCM message to decode - */ -static void Exc_DecodeMsg(CExc *self, Msg_MostTel_t *msg_rx_ptr) -{ - Dec_Return_t result; - uint16_t index; - - result = Dec_SearchFktOpIsh(self->fkt_op_list_ptr, &index, msg_rx_ptr->id.function_id, msg_rx_ptr->id.op_type); - - if (result == DEC_RET_SUCCESS) - { - self->fkt_op_list_ptr[index].handler_function_ptr(self, msg_rx_ptr); - } - else - { - /* no handling of decoding error for shadow OpTypes */ - } -} - - - -/*! \brief Handles an API timeout - * \param self Instance pointer - * \param method_mask_ptr Bitmask to signal which API method has caused the timeout - */ -static void Exc_HandleApiTimeout(void *self, void *method_mask_ptr) -{ - CExc *self_ = (CExc *)self; - Alm_ModuleMask_t method_mask = *((Alm_ModuleMask_t *)method_mask_ptr); - Exc_StdResult_t res_data; - - res_data.result.code = UCS_RES_ERR_TIMEOUT; - res_data.result.info_ptr = NULL; - res_data.result.info_size = 0U; - res_data.data_info = NULL; - - switch(method_mask) - { -#if 0 /* System Diagnosis supervises timeouts for these functions */ - case EXC_API_ENABLE_PORT: - Ssub_Notify(&self_->ssubs.enableport, &res_data, false); - TR_ERROR((self_->base_ptr->ucs_user_ptr, "[EXC]", "API locking timeout occurred for method Exc_EnablePort_Sr().", 0U)); - break; - case EXC_API_HELLO: - Ssub_Notify(&self_->ssubs.hello, &res_data, false); - TR_ERROR((self_->base_ptr->ucs_user_ptr, "[EXC]", "API locking timeout occurred for method Exc_Hello_Get().", 0U)); - break; - case EXC_API_WELCOME: - Ssub_Notify(&self_->ssubs.welcome, &res_data, false); - TR_ERROR((self_->base_ptr->ucs_user_ptr, "[EXC]", "API locking timeout occurred for method Exc_Welcome_Sr().", 0U)); - break; - case EXC_API_CABLE_LINK_DIAG: - Ssub_Notify(&self_->ssubs.cablelinkdiag, &res_data, false); - TR_ERROR((self_->base_ptr->ucs_user_ptr, "[EXC]", "API locking timeout occurred for method Exc_CableLinkDiagnosis_Start().", 0U)); - break; -#endif - case EXC_API_PHY_LAY_TEST_RESULT: - Ssub_Notify(&self_->ssubs.phylaytestresult, &res_data, false); - TR_ERROR((self_->base_ptr->ucs_user_ptr, "[EXC]", "API locking timeout occurred for method Exc_PhyTestResult_Get().", 0U)); - break; - case EXC_API_MEM_SESSION_OPEN: - Ssub_Notify(&self_->ssubs.memsessionopen, &res_data, false); - TR_ERROR((self_->base_ptr->ucs_user_ptr, "[EXC]", "API locking timeout occurred for method Exc_MemSessionOpen_Sr().", 0U)); - break; - case EXC_API_MEM_SESSION_CLOSE: - Ssub_Notify(&self_->ssubs.memsessionclose, &res_data, false); - TR_ERROR((self_->base_ptr->ucs_user_ptr, "[EXC]", "API locking timeout occurred for method Exc_MemSessionClose_Sr().", 0U)); - break; - case EXC_API_MEM_READ: - Ssub_Notify(&self_->ssubs.memoryread, &res_data, false); - TR_ERROR((self_->base_ptr->ucs_user_ptr, "[EXC]", "API locking timeout occurred for method Exc_MemoryRead_Sr().", 0U)); - break; - case EXC_API_MEM_WRITE: - Ssub_Notify(&self_->ssubs.memorywrite, &res_data, false); - TR_ERROR((self_->base_ptr->ucs_user_ptr, "[EXC]", "API locking timeout occurred for method Exc_MemoryWrite_Sr().", 0U)); - break; - - default: - TR_ERROR((self_->base_ptr->ucs_user_ptr, "[EXC]", "Unknown API locking bitmask detected. Mask: 0x%02X", 1U, method_mask)); - break; - } -} - - - - -/*------------------------------------------------------------------------------------------------*/ -/* Internal API */ -/*------------------------------------------------------------------------------------------------*/ -/*! \brief This method sends the Hello.Get message - * \param self Reference to CExc instance - * \param target_address Target address - * \param version_limit Signature version limit - * \param obs_ptr Reference to an optional observer - * \return UCS_RET_SUCCESS message was created - * \return UCS_RET_ERR_BUFFER_OVERFLOW no message buffer available - */ -Ucs_Return_t Exc_Hello_Get(CExc *self, - uint16_t target_address, - uint8_t version_limit, - CSingleObserver *obs_ptr) -{ - Ucs_Return_t result = UCS_RET_SUCCESS; - - Msg_MostTel_t *msg_ptr = Trcv_TxAllocateMsg(self->xcvr_ptr, 1U); - - if (msg_ptr != NULL) - { - if (version_limit > UCS_EXC_SIGNATURE_VERSION_LIMIT) - { - version_limit = UCS_EXC_SIGNATURE_VERSION_LIMIT; - } - - msg_ptr->destination_addr = target_address; - - msg_ptr->id.fblock_id = FB_EXC; - msg_ptr->id.instance_id = 0U; - msg_ptr->id.function_id = EXC_FID_HELLO; - msg_ptr->id.op_type = UCS_OP_GET; - msg_ptr->tel.tel_data_ptr[0] = version_limit; - - msg_ptr->info_ptr = &self->ssubs.hello; - Trcv_TxSendMsg(self->xcvr_ptr, msg_ptr); - - (void)Ssub_AddObserver(&self->ssubs.hello, obs_ptr); - } - else - { - result = UCS_RET_ERR_BUFFER_OVERFLOW; - } - - return result; -} - - -/*! \brief This method send the Welcome.StartResult message - * \param self Reference to CExc instance - * \param target_address Target address - * \param admin_node_address The node address used during system diagnosis - * \param version Signature version - * \param signature Signature of the device - * \param obs_ptr Reference to an optional observer - * \return UCS_RET_SUCCESS message was created - * \return UCS_RET_ERR_BUFFER_OVERFLOW no message buffer available - */ -Ucs_Return_t Exc_Welcome_Sr(CExc *self, - uint16_t target_address, - uint16_t admin_node_address, - uint8_t version, - Ucs_Signature_t signature, - CSingleObserver *obs_ptr) -{ - Ucs_Return_t result = UCS_RET_SUCCESS; - - Msg_MostTel_t *msg_ptr = Trcv_TxAllocateMsg(self->xcvr_ptr, EXC_SIGNATURE_LEN_V1 + 3U); /* Signature v1 */ - - if (msg_ptr != NULL) - { - msg_ptr->destination_addr = target_address; - msg_ptr->id.fblock_id = FB_EXC; - msg_ptr->id.instance_id = 0U; - msg_ptr->id.function_id = EXC_FID_WELCOME; - msg_ptr->id.op_type = UCS_OP_STARTRESULT; - msg_ptr->tel.tel_data_ptr[0] = MISC_HB(admin_node_address); - msg_ptr->tel.tel_data_ptr[1] = MISC_LB(admin_node_address); - msg_ptr->tel.tel_data_ptr[2] = version; - msg_ptr->tel.tel_data_ptr[3] = MISC_HB(signature.node_address); - msg_ptr->tel.tel_data_ptr[4] = MISC_LB(signature.node_address); - msg_ptr->tel.tel_data_ptr[5] = MISC_HB(signature.group_address); - msg_ptr->tel.tel_data_ptr[6] = MISC_LB(signature.group_address); - msg_ptr->tel.tel_data_ptr[7] = MISC_HB(signature.mac_47_32); - msg_ptr->tel.tel_data_ptr[8] = MISC_LB(signature.mac_47_32); - msg_ptr->tel.tel_data_ptr[9] = MISC_HB(signature.mac_31_16); - msg_ptr->tel.tel_data_ptr[10] = MISC_LB(signature.mac_31_16); - msg_ptr->tel.tel_data_ptr[11] = MISC_HB(signature.mac_15_0); - msg_ptr->tel.tel_data_ptr[12] = MISC_LB(signature.mac_15_0); - msg_ptr->tel.tel_data_ptr[13] = MISC_HB(signature.node_pos_addr); - msg_ptr->tel.tel_data_ptr[14] = MISC_LB(signature.node_pos_addr); - msg_ptr->tel.tel_data_ptr[15] = MISC_HB(signature.diagnosis_id); - msg_ptr->tel.tel_data_ptr[16] = MISC_LB(signature.diagnosis_id); - msg_ptr->tel.tel_data_ptr[17] = signature.num_ports; - msg_ptr->tel.tel_data_ptr[18] = signature.chip_id; - msg_ptr->tel.tel_data_ptr[19] = signature.fw_major; - msg_ptr->tel.tel_data_ptr[20] = signature.fw_minor; - msg_ptr->tel.tel_data_ptr[21] = signature.fw_release; - msg_ptr->tel.tel_data_ptr[22] = MISC_HB((signature.fw_build) >>16U); - msg_ptr->tel.tel_data_ptr[23] = MISC_LB((signature.fw_build) >>16U); - msg_ptr->tel.tel_data_ptr[24] = MISC_HB(signature.fw_build); - msg_ptr->tel.tel_data_ptr[25] = MISC_LB(signature.fw_build); - msg_ptr->tel.tel_data_ptr[26] = signature.cs_major; - msg_ptr->tel.tel_data_ptr[27] = signature.cs_minor; - msg_ptr->tel.tel_data_ptr[28] = signature.cs_release; -/* msg_ptr->tel.tel_data_ptr[29] = signature.uid_persistency; - msg_ptr->tel.tel_data_ptr[30] = MISC_HB((signature.uid) >>16U); - msg_ptr->tel.tel_data_ptr[31] = MISC_LB((signature.uid) >>16U); - msg_ptr->tel.tel_data_ptr[32] = MISC_HB(signature.uid); - msg_ptr->tel.tel_data_ptr[33] = MISC_LB(signature.uid); -*/ - - msg_ptr->info_ptr = &self->ssubs.welcome; - Trcv_TxSendMsg(self->xcvr_ptr, msg_ptr); - - (void)Ssub_AddObserver(&self->ssubs.welcome, obs_ptr); - } - else - { - result = UCS_RET_ERR_BUFFER_OVERFLOW; - } - - return result; -} - - -/*! \brief This method sends the Signature.Get message - * \param self Reference to CExc instance - * \param target_address Target address - * \param version_limit Signature version limit - * \param obs_ptr Reference to an optional observer - * \return UCS_RET_SUCCESS message was created - * \return UCS_RET_ERR_BUFFER_OVERFLOW no message buffer available - */ -Ucs_Return_t Exc_Signature_Get(CExc *self, - uint16_t target_address, - uint8_t version_limit, - CSingleObserver *obs_ptr) -{ - Ucs_Return_t result = UCS_RET_SUCCESS; - - Msg_MostTel_t *msg_ptr = Trcv_TxAllocateMsg(self->xcvr_ptr, 1U); - - if (msg_ptr != NULL) - { - if (version_limit > UCS_EXC_SIGNATURE_VERSION_LIMIT) - { - version_limit = UCS_EXC_SIGNATURE_VERSION_LIMIT; - } - - msg_ptr->destination_addr = target_address; - - msg_ptr->id.fblock_id = FB_EXC; - msg_ptr->id.instance_id = 0U; - msg_ptr->id.function_id = EXC_FID_SIGNATURE; - msg_ptr->id.op_type = UCS_OP_GET; - msg_ptr->tel.tel_data_ptr[0] = version_limit; - - msg_ptr->info_ptr = &self->ssubs.signature; - Trcv_TxSendMsg(self->xcvr_ptr, msg_ptr); - - (void)Ssub_AddObserver(&self->ssubs.signature, obs_ptr); - } - else - { - result = UCS_RET_ERR_BUFFER_OVERFLOW; - } - - return result; -} - - -/*! \brief This method sends the DeviceInit.Start message - * \param self Reference to CExc instance - * \param target_address Target address - * \param obs_ptr Reference to an optional observer - * \return UCS_RET_SUCCESS message was created - * \return UCS_RET_ERR_BUFFER_OVERFLOW no message buffer available - */ -Ucs_Return_t Exc_DeviceInit_Start(CExc *self, - uint16_t target_address, - CSingleObserver *obs_ptr) -{ - Ucs_Return_t result = UCS_RET_SUCCESS; - - Msg_MostTel_t *msg_ptr = Trcv_TxAllocateMsg(self->xcvr_ptr, 0U); - - if (msg_ptr != NULL) - { - msg_ptr->destination_addr = target_address; - - msg_ptr->id.fblock_id = FB_EXC; - msg_ptr->id.instance_id = 0U; - msg_ptr->id.function_id = EXC_FID_DEVICE_INIT; - msg_ptr->id.op_type = UCS_OP_START; - - msg_ptr->info_ptr = &self->ssubs.deviceinit; - Trcv_TxSendMsg(self->xcvr_ptr, msg_ptr); - - (void)Ssub_AddObserver(&self->ssubs.deviceinit, obs_ptr); - } - else - { - result = UCS_RET_ERR_BUFFER_OVERFLOW; - } - - return result; -} - - -/*! \brief This method enables a port - * \param self Reference to CExc instance - * \param target_address Target address - * \param port_number PortNumber - * \param enabled Enabled - * \param obs_ptr Reference to an optional observer - * \return UCS_RET_SUCCESS message was created - * \return UCS_RET_ERR_BUFFER_OVERFLOW no message buffer available - */ -Ucs_Return_t Exc_EnablePort_Sr(CExc *self, - uint16_t target_address, - uint8_t port_number, - bool enabled, - CSingleObserver *obs_ptr) -{ - Ucs_Return_t result = UCS_RET_SUCCESS; - - Msg_MostTel_t *msg_ptr = Trcv_TxAllocateMsg(self->xcvr_ptr, 2U); - - if (msg_ptr != NULL) - { - msg_ptr->destination_addr = target_address; - - msg_ptr->id.fblock_id = FB_EXC; - msg_ptr->id.instance_id = 0U; - msg_ptr->id.function_id = EXC_FID_ENABLEPORT; - msg_ptr->id.op_type = UCS_OP_STARTRESULT; - msg_ptr->tel.tel_data_ptr[0] = port_number; - msg_ptr->tel.tel_data_ptr[1] = (uint8_t)enabled; - - msg_ptr->info_ptr = &self->ssubs.enableport; - Trcv_TxSendMsg(self->xcvr_ptr, msg_ptr); - - (void)Ssub_AddObserver(&self->ssubs.enableport, obs_ptr); - } - else - { - result = UCS_RET_ERR_BUFFER_OVERFLOW; - } - - return result; -} - -/*! \brief This method starts the Cable Link Diagnosis - * \param self Reference to CExc instance - * \param target_address Target address - * \param port_number PortNumber - * \param obs_ptr Reference to an optional observer - * \return UCS_RET_SUCCESS message was created - * \return UCS_RET_ERR_BUFFER_OVERFLOW no message buffer available - */ -Ucs_Return_t Exc_CableLinkDiagnosis_Start(CExc *self, - uint16_t target_address, - uint8_t port_number, - CSingleObserver *obs_ptr) -{ - Ucs_Return_t result = UCS_RET_SUCCESS; - - Msg_MostTel_t *msg_ptr = Trcv_TxAllocateMsg(self->xcvr_ptr, 1U); - - if (msg_ptr != NULL) - { - msg_ptr->destination_addr = target_address; - - msg_ptr->id.fblock_id = FB_EXC; - msg_ptr->id.instance_id = 0U; - msg_ptr->id.function_id = EXC_FID_CABLE_LINK_DIAG; - msg_ptr->id.op_type = UCS_OP_STARTRESULT; - msg_ptr->tel.tel_data_ptr[0] = port_number; - - msg_ptr->info_ptr = &self->ssubs.cablelinkdiag; - Trcv_TxSendMsg(self->xcvr_ptr, msg_ptr); - - (void)Ssub_AddObserver(&self->ssubs.cablelinkdiag, obs_ptr); - } - else - { - result = UCS_RET_ERR_BUFFER_OVERFLOW; - } - - return result; -} - -/*! \brief This method starts the Physical Layer Test - * \param self Reference to CExc instance - * \param port_number PortNumber - * \param type Type - * \param lead_in Lead-in - * \param duration Duration - * \param lead_out Lead-out - * \param obs_ptr Reference to an optional observer - * \return UCS_RET_SUCCESS message was created - * \return UCS_RET_ERR_BUFFER_OVERFLOW no message buffer available - */ -Ucs_Return_t Exc_PhyTest_Start(CExc *self, - uint8_t port_number, - Ucs_Diag_PhyTest_Type_t type, - uint16_t lead_in, - uint32_t duration, - uint16_t lead_out, - CSingleObserver *obs_ptr) -{ - Ucs_Return_t result = UCS_RET_SUCCESS; - - Msg_MostTel_t *msg_ptr = Trcv_TxAllocateMsg(self->xcvr_ptr, 10U); - - if (msg_ptr != NULL) - { - msg_ptr->destination_addr = MSG_ADDR_INIC; - - msg_ptr->id.fblock_id = FB_EXC; - msg_ptr->id.instance_id = 0U; - msg_ptr->id.function_id = EXC_FID_PHY_LAY_TEST; - msg_ptr->id.op_type = UCS_OP_START; - msg_ptr->tel.tel_data_ptr[0] = port_number; - msg_ptr->tel.tel_data_ptr[1] = (uint8_t)type; - msg_ptr->tel.tel_data_ptr[2] = MISC_HB(lead_in); - msg_ptr->tel.tel_data_ptr[3] = MISC_LB(lead_in); - msg_ptr->tel.tel_data_ptr[4] = (uint8_t)((duration) >> 24); - msg_ptr->tel.tel_data_ptr[5] = (uint8_t)((duration) >> 16); - msg_ptr->tel.tel_data_ptr[6] = (uint8_t)((duration) >> 8); - msg_ptr->tel.tel_data_ptr[7] = (uint8_t)(duration & (uint32_t)0xFF); - msg_ptr->tel.tel_data_ptr[8] = MISC_HB(lead_out); - msg_ptr->tel.tel_data_ptr[9] = MISC_LB(lead_out); - - - msg_ptr->info_ptr = &self->ssubs.phylaytest; - Trcv_TxSendMsg(self->xcvr_ptr, msg_ptr); - - (void)Ssub_AddObserver(&self->ssubs.phylaytest, obs_ptr); - } - else - { - result = UCS_RET_ERR_BUFFER_OVERFLOW; - } - - return result; -} - - -/*! \brief Requests the EXC.PhysicalLayerTestResult.Status message - * \param self Reference to CExc instance - * \param obs_ptr Reference to an optional observer - * \return UCS_RET_SUCCESS message was created - * \return UCS_RET_ERR_BUFFER_OVERFLOW no message buffer available - * \return UCS_RET_ERR_API_LOCKED Resource API is already used by another command - */ -Ucs_Return_t Exc_PhyTestResult_Get(CExc *self, - CSingleObserver *obs_ptr) -{ - Ucs_Return_t result = UCS_RET_SUCCESS; - - if(Al_Lock(&self->lock.api, EXC_API_PHY_LAY_TEST_RESULT) != false) - { - Msg_MostTel_t *msg_ptr = Trcv_TxAllocateMsg(self->xcvr_ptr, 0U); - - if (msg_ptr != NULL) - { - msg_ptr->destination_addr = MSG_ADDR_INIC; - - msg_ptr->id.fblock_id = FB_EXC; - msg_ptr->id.instance_id = 0U; - msg_ptr->id.function_id = EXC_FID_PHY_LAY_TEST_RES; - msg_ptr->id.op_type = UCS_OP_GET; - - msg_ptr->info_ptr = &self->ssubs.phylaytestresult; - Trcv_TxSendMsg(self->xcvr_ptr, msg_ptr); - - (void)Ssub_AddObserver(&self->ssubs.phylaytestresult, obs_ptr); - } - else - { - Al_Release(&self->lock.api, EXC_API_PHY_LAY_TEST_RESULT); - result = UCS_RET_ERR_BUFFER_OVERFLOW; - } - } - else - { - result = UCS_RET_ERR_API_LOCKED; - } - - return result; -} - - - -/*! Sends the BCDiag.Startresult command - * - * \param *self Reference to CExc instance - * \param position Position of the segment to be checked. - * \param admin_na Admin Node Address - * \param t_send Timing parameter t_Send - * \param t_wait4dut Timing parameter t_WaitForDUT - * \param t_switch Timing parameter t_Switch - * \param t_back Timing parameter t_Back - * \param autoback TBD - * \param *obs_ptr Reference to an optional observer - * \return UCS_RET_SUCCESS message was created - * \return UCS_RET_ERR_BUFFER_OVERFLOW no message buffer available - */ -Ucs_Return_t Exc_BCDiag_Start(CExc *self, - uint8_t position, - uint16_t admin_na, - uint16_t t_send, - uint16_t t_wait4dut, - uint16_t t_switch, - uint16_t t_back, - bool autoback, - CSingleObserver *obs_ptr) -{ - Ucs_Return_t result = UCS_RET_SUCCESS; - - Msg_MostTel_t *msg_ptr = Trcv_TxAllocateMsg(self->xcvr_ptr, 12U); - - if (msg_ptr != NULL) - { - msg_ptr->destination_addr = UCS_ADDR_BROADCAST_BLOCKING; - msg_ptr->id.fblock_id = FB_EXC; - msg_ptr->id.instance_id = 0U; - msg_ptr->id.function_id = EXC_FID_BC_DIAG; - msg_ptr->id.op_type = UCS_OP_STARTRESULT; - msg_ptr->tel.tel_data_ptr[0] = position; - msg_ptr->tel.tel_data_ptr[1] = MISC_HB(admin_na); - msg_ptr->tel.tel_data_ptr[2] = MISC_LB(admin_na); - msg_ptr->tel.tel_data_ptr[3] = MISC_HB(t_send); - msg_ptr->tel.tel_data_ptr[4] = MISC_LB(t_send); - msg_ptr->tel.tel_data_ptr[5] = MISC_HB(t_wait4dut); - msg_ptr->tel.tel_data_ptr[6] = MISC_LB(t_wait4dut); - msg_ptr->tel.tel_data_ptr[7] = MISC_HB(t_switch); - msg_ptr->tel.tel_data_ptr[8] = MISC_LB(t_switch); - msg_ptr->tel.tel_data_ptr[9] = MISC_HB(t_back); - msg_ptr->tel.tel_data_ptr[10] = MISC_LB(t_back); - msg_ptr->tel.tel_data_ptr[11] = (uint8_t)autoback; - - - msg_ptr->info_ptr = &self->ssubs.bcdiag; - Trcv_TxSendMsg(self->xcvr_ptr, msg_ptr); - - (void)Ssub_AddObserver(&self->ssubs.bcdiag, obs_ptr); - } - else - { - result = UCS_RET_ERR_BUFFER_OVERFLOW; - } - - return result; -} - - -/*! Enables the signal during backChannel Diagnosis - * - * \param *self Reference to CExc instance - * \param port Number of port which has to be enabled. - * \param *obs_ptr Reference to an optional observer - * \return UCS_RET_SUCCESS message was created - * \return UCS_RET_ERR_BUFFER_OVERFLOW no message buffer available - */ -Ucs_Return_t Exc_BCEnableTx_StartResult(CExc *self, - uint8_t port, - CSingleObserver *obs_ptr) -{ - Ucs_Return_t result = UCS_RET_SUCCESS; - - Msg_MostTel_t *msg_ptr = Trcv_TxAllocateMsg(self->xcvr_ptr, 1U); - - if (msg_ptr != NULL) - { - msg_ptr->destination_addr = UCS_ADDR_BROADCAST_BLOCKING; - msg_ptr->id.fblock_id = FB_EXC; - msg_ptr->id.instance_id = 0U; - msg_ptr->id.function_id = EXC_FID_BC_ENABLE_TX; - msg_ptr->id.op_type = UCS_OP_STARTRESULT; - msg_ptr->tel.tel_data_ptr[0] = port; - - msg_ptr->info_ptr = &self->ssubs.enabletx; - Trcv_TxSendMsg(self->xcvr_ptr, msg_ptr); - - (void)Ssub_AddObserver(&self->ssubs.enabletx, obs_ptr); - } - else - { - result = UCS_RET_ERR_BUFFER_OVERFLOW; - } - - return result; -} - - -/*! \brief This function is used to open a memory session. - * - * A memory session is used to control access to the memory resources. Before a memory could - * be read or written, a session of the appropriate type has to be opened. - * Only a single memory session is supported. Once opened, the session must be first - * closed before a new session of a different type could be used. Some session types - * (0x01, 0x02 and 0x04) require a hardware reset after they were closed. - * Function Exc_MemSessionOpen_Sr() also performs some preprocessing, - * depending on the session_type. This includes clearing of the configuration - * and identification strings before the error memory is programmed or erased. - * - * \param *self Reference to CExc instance - * \param target_address Target address - * \param session_type Defines the set of MemIDs and the memory access type(s) (read and/or write) - * \param *obs_ptr Reference to an optional observer - * - * \return UCS_RET_SUCCESS message was created and sent to INIC - * \return UCS_RET_ERR_BUFFER_OVERFLOW no message buffer available - * \return UCS_RET_ERR_API_LOCKED Resource API is already used by another command - */ -Ucs_Return_t Exc_MemSessionOpen_Sr(CExc *self, - uint16_t target_address, - uint8_t session_type, - CSingleObserver *obs_ptr) -{ - Ucs_Return_t result = UCS_RET_SUCCESS; - - if(Al_Lock(&self->lock.api, EXC_API_MEM_SESSION_OPEN) != false) - { - Msg_MostTel_t *msg_ptr = Trcv_TxAllocateMsg(self->xcvr_ptr, 1U); - - if (msg_ptr != NULL) - { - msg_ptr->destination_addr = target_address; - - msg_ptr->id.fblock_id = FB_EXC; - msg_ptr->id.instance_id = 0U; - msg_ptr->id.function_id = EXC_FID_MEM_SESSION_OPEN; - msg_ptr->id.op_type = UCS_OP_STARTRESULT; - msg_ptr->tel.tel_data_ptr[0] = session_type; - - msg_ptr->info_ptr = &self->ssubs.memsessionopen; - Trcv_TxSendMsg(self->xcvr_ptr, msg_ptr); - - (void)Ssub_AddObserver(&self->ssubs.memsessionopen, obs_ptr); - } - else - { - Al_Release(&self->lock.api, EXC_API_MEM_SESSION_OPEN); - result = UCS_RET_ERR_BUFFER_OVERFLOW; - } - } - else - { - result = UCS_RET_ERR_API_LOCKED; - } - - return result; -} - - -/*! \brief This function is used to close an active memory session that was previously opened by - * function Exc_MemSessionOpen_Sr(). - * - * In addition, the function performs some post-processing on given session types. This includes - * validation of the newly programmed configuration and identification strings as well as - * the deactivation of the current configuration and identification strings. In these cases, - * the new configuration becomes active after a hardware reset. - * - * \param *self Reference to CExc instance - * \param target_address Target address - * \param session_handle Unique number assigned to the active memory session - * \param *obs_ptr Reference to an optional observer - * - * \return UCS_RET_SUCCESS message was created and sent to INIC - * \return UCS_RET_ERR_BUFFER_OVERFLOW no message buffer available - * \return UCS_RET_ERR_API_LOCKED Resource API is already used by another command - */ -Ucs_Return_t Exc_MemSessionClose_Sr(CExc *self, - uint16_t target_address, - uint16_t session_handle, - CSingleObserver *obs_ptr) -{ - Ucs_Return_t result = UCS_RET_SUCCESS; - - if(Al_Lock(&self->lock.api, EXC_API_MEM_SESSION_CLOSE) != false) - { - Msg_MostTel_t *msg_ptr = Trcv_TxAllocateMsg(self->xcvr_ptr, 2U); - - if (msg_ptr != NULL) - { - msg_ptr->destination_addr = target_address; - - msg_ptr->id.fblock_id = FB_EXC; - msg_ptr->id.instance_id = 0U; - msg_ptr->id.function_id = EXC_FID_MEM_SESSION_CLOSE; - msg_ptr->id.op_type = UCS_OP_STARTRESULT; - msg_ptr->tel.tel_data_ptr[0] = MISC_HB(session_handle); - msg_ptr->tel.tel_data_ptr[1] = MISC_LB(session_handle); - - msg_ptr->info_ptr = &self->ssubs.memsessionclose; - Trcv_TxSendMsg(self->xcvr_ptr, msg_ptr); - - (void)Ssub_AddObserver(&self->ssubs.memsessionclose, obs_ptr); - } - else - { - Al_Release(&self->lock.api, EXC_API_MEM_SESSION_CLOSE); - result = UCS_RET_ERR_BUFFER_OVERFLOW; - } - } - else - { - result = UCS_RET_ERR_API_LOCKED; - } - - return result; -} - - -/*! \brief This function provides read access to the memories described by parameter MemID. - * - * In addition, the function can be used to retrieve the active Configuration String and - * Identification String. - * Reading the memory can only be done within an active memory session. Parameter - * session_handle authorizes the access to the memory resource defined by parameter - * MemID. The session_handle is provided by function Exc_MemSessionOpen_Sr(), - * which must be called in advance to memory access. - * - * \param *self Reference to CExc instance - * \param target_address Target address - * \param session_handle Unique number assigned to the active memory session - * \param mem_id Represents the memory resource to be read - * \param address Defines the memory location at which the reading operation starts - * \param unit_len Sets the number of memory units to be read. Memory units can be - * unsigned bytes, unsigned words or unsigned masked data depending - * on the memory type. - * \param *obs_ptr Reference to an optional observer - * - * \return UCS_RET_SUCCESS message was created and sent to INIC - * \return UCS_RET_ERR_BUFFER_OVERFLOW no message buffer available - * \return UCS_RET_ERR_PARAM parameter ubit_len ist too big - * \return UCS_RET_ERR_API_LOCKED Resource API is already used by another command - */ -Ucs_Return_t Exc_MemoryRead_Sr(CExc *self, - uint16_t target_address, - uint16_t session_handle, - uint8_t mem_id, - uint32_t address, - uint8_t unit_len, - CSingleObserver *obs_ptr) -{ - Ucs_Return_t result = UCS_RET_SUCCESS; - - if(Al_Lock(&self->lock.api, EXC_API_MEM_READ) != false) - { - if (unit_len > MAX_UNIT_LEN) - { - result = UCS_RET_ERR_PARAM; - } - - if (result == UCS_RET_SUCCESS) - { - Msg_MostTel_t *msg_ptr = Trcv_TxAllocateMsg(self->xcvr_ptr, 8U); - - if (msg_ptr != NULL) - { - msg_ptr->destination_addr = target_address; - msg_ptr->id.fblock_id = FB_EXC; - msg_ptr->id.instance_id = 0U; - msg_ptr->id.function_id = EXC_FID_MEMORY_READ; - msg_ptr->id.op_type = UCS_OP_STARTRESULT; - msg_ptr->tel.tel_data_ptr[0] = MISC_HB(session_handle); - msg_ptr->tel.tel_data_ptr[1] = MISC_LB(session_handle); - msg_ptr->tel.tel_data_ptr[2] = mem_id; - msg_ptr->tel.tel_data_ptr[3] = (uint8_t)((address) >> 24); - msg_ptr->tel.tel_data_ptr[4] = (uint8_t)((address) >> 16); - msg_ptr->tel.tel_data_ptr[5] = (uint8_t)((address) >> 8); - msg_ptr->tel.tel_data_ptr[6] = (uint8_t)(address & (uint32_t)0xFF); - msg_ptr->tel.tel_data_ptr[7] = unit_len; - - msg_ptr->info_ptr = &self->ssubs.memoryread; - Trcv_TxSendMsg(self->xcvr_ptr, msg_ptr); - - (void)Ssub_AddObserver(&self->ssubs.memoryread, obs_ptr); - } - else - { - Al_Release(&self->lock.api, EXC_API_MEM_READ); - result = UCS_RET_ERR_BUFFER_OVERFLOW; - } - } - } - else - { - result = UCS_RET_ERR_API_LOCKED; - } - - return result; -} - - -/*! \brief This function provides write access to the memories described by parameter MemID. - * - * In addition, the function can be used to program a new Configuration String and Identification - * String. - * Writing the memory can only be done within an active memory session. Parameter - * SessionHandle authorizes the access to the memory resource defined by parameter - * MemID. The SessionHandle is provided by function ExtendedNetworkControl.MemorySessionOpen(), - * which must be called in advance to memory access. - * - * \param *self Reference to CExc instance - * \param target_address Target address - * \param session_handle Unique number assigned to the active memory session - * \param mem_id Represents the memory resource to be read - * \param address Defines the memory location at which the reading operation starts - * \param unit_len Sets the number of memory units to be read. Memory units can be - * unsigned bytes, unsigned words or unsigned masked data depending - * on the memory type. - * \param *unit_data Contains the actual data written to the memory resource and formatted - * as memory units - * \param *obs_ptr Reference to an optional observer - * - * \return UCS_RET_SUCCESS message was created and sent to INIC - * \return UCS_RET_ERR_BUFFER_OVERFLOW no message buffer available - * \return UCS_RET_ERR_PARAM parameter ubit_len ist too big - * \return UCS_RET_ERR_API_LOCKED Resource API is already used by another command - */ -Ucs_Return_t Exc_MemoryWrite_Sr(CExc *self, - uint16_t target_address, - uint16_t session_handle, - uint8_t mem_id, - uint32_t address, - uint8_t unit_len, - uint8_t unit_data[], - CSingleObserver *obs_ptr) -{ - Ucs_Return_t result = UCS_RET_SUCCESS; - - if(Al_Lock(&self->lock.api, EXC_API_MEM_WRITE) != false) - { - if (unit_len > MAX_UNIT_LEN) - { - result = UCS_RET_ERR_PARAM; - } - - if (result == UCS_RET_SUCCESS) - { - Msg_MostTel_t *msg_ptr = Trcv_TxAllocateMsg(self->xcvr_ptr, 8U + unit_len); - - if (msg_ptr != NULL) - { - uint8_t i; - - msg_ptr->destination_addr = target_address; - msg_ptr->id.fblock_id = FB_EXC; - msg_ptr->id.instance_id = 0U; - msg_ptr->id.function_id = EXC_FID_MEMORY_WRITE; - msg_ptr->id.op_type = UCS_OP_STARTRESULT; - msg_ptr->tel.tel_data_ptr[0] = MISC_HB(session_handle); - msg_ptr->tel.tel_data_ptr[1] = MISC_LB(session_handle); - msg_ptr->tel.tel_data_ptr[2] = mem_id; - msg_ptr->tel.tel_data_ptr[3] = (uint8_t)((address) >> 24); - msg_ptr->tel.tel_data_ptr[4] = (uint8_t)((address) >> 16); - msg_ptr->tel.tel_data_ptr[5] = (uint8_t)((address) >> 8); - msg_ptr->tel.tel_data_ptr[6] = (uint8_t)(address & (uint32_t)0xFF); - msg_ptr->tel.tel_data_ptr[7] = unit_len; - for (i=0U; i<unit_len; ++i) - { - msg_ptr->tel.tel_data_ptr[8U+i] = *(unit_data + i); - } - - msg_ptr->info_ptr = &self->ssubs.memorywrite; - Trcv_TxSendMsg(self->xcvr_ptr, msg_ptr); - - (void)Ssub_AddObserver(&self->ssubs.memorywrite, obs_ptr); - } - else - { - Al_Release(&self->lock.api, EXC_API_MEM_WRITE); - result = UCS_RET_ERR_BUFFER_OVERFLOW; - } - } - } - else - { - result = UCS_RET_ERR_API_LOCKED; - } - - return result; -} - - - -/*------------------------------------------------------------------------------------------------*/ -/* Handler functions */ -/*------------------------------------------------------------------------------------------------*/ -/*! \brief Handler function for EXC.Hello.Status - * \param self Reference to EXC object - * \param msg_ptr Received message - */ -static void Exc_Hello_Status(void *self, Msg_MostTel_t *msg_ptr) -{ - CExc *self_ = (CExc *)self; - Exc_HelloStatus_t hello_data; - Exc_StdResult_t res_data; - - if (msg_ptr->tel.tel_len >= (EXC_SIGNATURE_LEN_V1 + 1U)) - { - hello_data.version = msg_ptr->tel.tel_data_ptr[0]; - Exc_Read_Signature(&(hello_data.signature), &(msg_ptr->tel.tel_data_ptr[1])); - - res_data.data_info = &hello_data; - res_data.result.code = UCS_RES_SUCCESS; - res_data.result.info_ptr = NULL; - res_data.result.info_size = 0U; - - /* Node Discovery sends the Hello.Get as broadcast message. So we will need the observer - several times. */ - Ssub_Notify(&self_->ssubs.hello, &res_data, false); - } -} - - -/*! \brief Handler function for EXC.Hello.Error - * \param self reference to EXC object - * \param msg_ptr received message - */ -static void Exc_Hello_Error(void *self, Msg_MostTel_t *msg_ptr) -{ - CExc *self_ = (CExc *)self; - Exc_StdResult_t res_data; - - if (msg_ptr->tel.tel_len > 0U) - { - res_data.data_info = NULL; - res_data.result = Exc_TranslateError(self_, - &msg_ptr->tel.tel_data_ptr[0], - (uint8_t)(msg_ptr->tel.tel_len)); - - /* Node Discovery sends the Hello.Get as broadcast message. So we will need the observer - several times. */ - Ssub_Notify(&self_->ssubs.hello, &res_data, false); - } -} - - -/*! \brief Handler function for EXC.Welcome.Error - * \param self reference to EXC object - * \param msg_ptr received message - */ -static void Exc_Welcome_Error(void *self, Msg_MostTel_t *msg_ptr) -{ - CExc *self_ = (CExc *)self; - Exc_StdResult_t res_data; - - if (msg_ptr->tel.tel_len > 0U) - { - res_data.data_info = NULL; - res_data.result = Exc_TranslateError(self_, - &msg_ptr->tel.tel_data_ptr[0], - (uint8_t)(msg_ptr->tel.tel_len)); - - Ssub_Notify(&self_->ssubs.welcome, &res_data, true); - } -} - -/*! \brief Handler function for the EXC.Welcome.Result message - * \param self reference to EXC object - * \param msg_ptr received message - */ -static void Exc_Welcome_Result(void *self, Msg_MostTel_t *msg_ptr) -{ - CExc *self_ = (CExc *)self; - Exc_WelcomeResult_t welcome_data; - Exc_StdResult_t res_data; - - if (msg_ptr->tel.tel_len >= (EXC_SIGNATURE_LEN_V1 + 2U)) - { - welcome_data.res = msg_ptr->tel.tel_data_ptr[0]; - welcome_data.version = msg_ptr->tel.tel_data_ptr[1]; - Exc_Read_Signature(&(welcome_data.signature), &(msg_ptr->tel.tel_data_ptr[2])); - res_data.data_info = &welcome_data; - res_data.result.code = UCS_RES_SUCCESS; - res_data.result.info_ptr = NULL; - - Ssub_Notify(&self_->ssubs.welcome, &res_data, true); - } -} - - -/*! Handler function for the EXC.Signature.Status message - * \param self reference to EXC object - * \param msg_ptr received message - */ -static void Exc_Signature_Status(void *self, Msg_MostTel_t *msg_ptr) -{ - CExc *self_ = (CExc *)self; - Exc_SignatureStatus_t signature_data; - Exc_StdResult_t res_data; - - if (msg_ptr->tel.tel_len >= (EXC_SIGNATURE_LEN_V1 + 1U)) - { - signature_data.version = msg_ptr->tel.tel_data_ptr[0]; - Exc_Read_Signature(&(signature_data.signature), &(msg_ptr->tel.tel_data_ptr[1])); - - res_data.data_info = &signature_data; - res_data.result.code = UCS_RES_SUCCESS; - res_data.result.info_ptr = NULL; - res_data.result.info_size = 0U; - - Ssub_Notify(&self_->ssubs.signature, &res_data, true); - } -} - - -/*! Handler function for the EXC.Signature.Error message - * \param self reference to EXC object - * \param msg_ptr received message - */ -static void Exc_Signature_Error(void *self, Msg_MostTel_t *msg_ptr) -{ - CExc *self_ = (CExc *)self; - Exc_StdResult_t res_data; - - if (msg_ptr->tel.tel_len > 0U) - { - res_data.data_info = NULL; - res_data.result = Exc_TranslateError(self_, - &msg_ptr->tel.tel_data_ptr[0], - (uint8_t)(msg_ptr->tel.tel_len)); - - Ssub_Notify(&self_->ssubs.signature, &res_data, true); - } -} - - -/*! Handler function for the EXC.DeviceInit.Error message - * \param self reference to EXC object - * \param msg_ptr received message - */ -static void Exc_DeviceInit_Error(void *self, Msg_MostTel_t *msg_ptr) -{ - CExc *self_ = (CExc *)self; - Exc_StdResult_t res_data; - - if (msg_ptr->tel.tel_len >0U) - { - res_data.data_info = NULL; - res_data.result = Exc_TranslateError(self_, - &msg_ptr->tel.tel_data_ptr[0], - (uint8_t)(msg_ptr->tel.tel_len)); - - Ssub_Notify(&self_->ssubs.deviceinit, &res_data, true); - } -} - - -/*! \brief Handler function for EXC.EnablePort.Error - * \param self reference to EXC object - * \param msg_ptr received message - */ -static void Exc_EnablePort_Error(void *self, Msg_MostTel_t *msg_ptr) -{ - CExc *self_ = (CExc *)self; - Exc_StdResult_t res_data; - - if (msg_ptr->tel.tel_len > 0U) - { - res_data.result = Exc_TranslateError(self_, - &msg_ptr->tel.tel_data_ptr[0], - (uint8_t)(msg_ptr->tel.tel_len)); - - Ssub_Notify(&self_->ssubs.enableport, &res_data, true); - } -} - -/*! \brief Handler function for EXC.EnablePort.Result - * \param self reference to EXC object - * \param msg_ptr received message - */ -static void Exc_EnablePort_Result(void *self, Msg_MostTel_t *msg_ptr) -{ - CExc *self_ = (CExc *)self; - Exc_StdResult_t res_data; - - MISC_UNUSED(msg_ptr); - - res_data.result.code = UCS_RES_SUCCESS; - res_data.result.info_ptr = NULL; - Ssub_Notify(&self_->ssubs.enableport, &res_data, true); -} - - -/*! \brief Handler function for EXC.CableLinkDiag.Error - * \param self reference to EXC object - * \param msg_ptr received message - */ -static void Exc_CableLinkDiag_Error(void *self, Msg_MostTel_t *msg_ptr) -{ - CExc *self_ = (CExc *)self; - Exc_StdResult_t res_data; - - if (msg_ptr->tel.tel_len > 0U) - { - res_data.data_info = NULL; - res_data.result = Exc_TranslateError(self_, - &msg_ptr->tel.tel_data_ptr[0], - (uint8_t)(msg_ptr->tel.tel_len)); - - Ssub_Notify(&self_->ssubs.cablelinkdiag, &res_data, true); - } -} - -/*! \brief Handler function for EXC.CableLinkDiag.Result - * \param self reference to EXC object - * \param msg_ptr received message - */ -static void Exc_CableLinkDiag_Result(void *self, Msg_MostTel_t *msg_ptr) -{ - CExc *self_ = (CExc *)self; - Exc_CableLinkDiagResult_t cable_link_diag_result_data; - Exc_StdResult_t res_data; - - if (msg_ptr->tel.tel_len > 0U) - { - cable_link_diag_result_data.port_number = msg_ptr->tel.tel_data_ptr[0]; - cable_link_diag_result_data.result = msg_ptr->tel.tel_data_ptr[1]; - res_data.data_info = &cable_link_diag_result_data; - res_data.result.code = UCS_RES_SUCCESS; - res_data.result.info_ptr = NULL; - - Ssub_Notify(&self_->ssubs.cablelinkdiag, &res_data, true); - } -} - - -/*! \brief Handler function for EXC.PhysicalLayerTest.Error - * \param self reference to EXC object - * \param msg_ptr received message - */static void Exc_NwPhyTest_Error(void *self, Msg_MostTel_t *msg_ptr) -{ - CExc *self_ = (CExc *)self; - Exc_StdResult_t res_data; - - if (msg_ptr->tel.tel_len > 0U) - { - res_data.data_info = NULL; - res_data.result = Exc_TranslateError(self_, - &msg_ptr->tel.tel_data_ptr[0], - (uint8_t)(msg_ptr->tel.tel_len)); - - Ssub_Notify(&self_->ssubs.phylaytest, &res_data, true); - } -} - - -/*! \brief Handler function for EXC.MOSTNetworkPhysicalLayerTestResult.Status - * \param self Reference to EXC object - * \param msg_ptr Received message - */ -static void Exc_NwPhyTestResult_Status(void *self, Msg_MostTel_t *msg_ptr) -{ - CExc *self_ = (CExc *)self; - Exc_PhyTestResult_t phy_test_result; - Exc_StdResult_t res_data; - - if (msg_ptr->tel.tel_len > 0U) - { - phy_test_result.port_number = msg_ptr->tel.tel_data_ptr[0]; - phy_test_result.lock_status = (msg_ptr->tel.tel_data_ptr[1] != 0U) ? true : false; - MISC_DECODE_WORD(&(phy_test_result.err_count), &(msg_ptr->tel.tel_data_ptr[2])); - res_data.data_info = &phy_test_result; - res_data.result.code = UCS_RES_SUCCESS; - res_data.result.info_ptr = NULL; - - Ssub_Notify(&self_->ssubs.phylaytestresult, &res_data, true); - } - Al_Release(&self_->lock.api, EXC_API_PHY_LAY_TEST_RESULT); -} - - -/*! \brief Handler function for EXC.MOSTNetworkPhysicalLayerTestResult.Error - * \param self reference to EXC object - * \param msg_ptr received message - */ -static void Exc_NwPhyTestResult_Error(void *self, Msg_MostTel_t *msg_ptr) -{ - CExc *self_ = (CExc *)self; - Exc_StdResult_t res_data; - - if (msg_ptr->tel.tel_len > 0U) - { - res_data.data_info = NULL; - res_data.result = Exc_TranslateError(self_, - &msg_ptr->tel.tel_data_ptr[0], - (uint8_t)(msg_ptr->tel.tel_len)); - - Ssub_Notify(&self_->ssubs.phylaytestresult, &res_data, true); - } - Al_Release(&self_->lock.api, EXC_API_PHY_LAY_TEST_RESULT); -} - - - -/*! \brief Handler function for EXC.BCDiag.Status - * \param self Reference to EXC object - * \param msg_ptr Received message - */ -static void Exc_BC_Diag_Result(void *self, Msg_MostTel_t *msg_ptr) -{ - CExc *self_ = (CExc *)self; - Exc_BCDiagResult bcd_result; - Exc_StdResult_t res_data; - - if (msg_ptr->tel.tel_len > 1U) - { - bcd_result.diag_result = (Exc_BCDiagResValue)(msg_ptr->tel.tel_data_ptr[0] >> 4U); - MISC_DECODE_WORD(&(bcd_result.admin_addr), &(msg_ptr->tel.tel_data_ptr[0])); - bcd_result.admin_addr &= 0x0FFFU; - res_data.data_info = &bcd_result; - res_data.result.code = UCS_RES_SUCCESS; - res_data.result.info_ptr = NULL; - - Ssub_Notify(&self_->ssubs.bcdiag, &res_data, true); - } -} - - -/*! \brief Handler function for EXC.BCDiag.Error - * \param self reference to EXC object - * \param msg_ptr received message - */ -static void Exc_BC_Diag_Error(void *self, Msg_MostTel_t *msg_ptr) -{ - CExc *self_ = (CExc *)self; - Exc_StdResult_t res_data; - - if (msg_ptr->tel.tel_len > 0U) - { - res_data.data_info = NULL; - res_data.result = Exc_TranslateError(self_, - &msg_ptr->tel.tel_data_ptr[0], - (uint8_t)(msg_ptr->tel.tel_len)); - - Ssub_Notify(&self_->ssubs.bcdiag, &res_data, true); - } -} - - - - -/*! \brief Handler function for EXC.BCEnableTx.Result - * \param self Reference to EXC object - * \param msg_ptr Received message - */ -static void Exc_BC_EnableTx_Result(void *self, Msg_MostTel_t *msg_ptr) -{ - CExc *self_ = (CExc *)self; - Exc_StdResult_t res_data; - - res_data.data_info = NULL; - res_data.result.code = UCS_RES_SUCCESS; - res_data.result.info_ptr = NULL; - - Ssub_Notify(&self_->ssubs.enabletx, &res_data, true); - - MISC_UNUSED(msg_ptr); -} - - -/*! \brief Handler function for EXC.BCEnableTx.Error - * \param self reference to EXC object - * \param msg_ptr received message - */ -static void Exc_BC_EnableTx_Error(void *self, Msg_MostTel_t *msg_ptr) -{ - CExc *self_ = (CExc *)self; - Exc_StdResult_t res_data; - - if (msg_ptr->tel.tel_len > 0U) - { - res_data.data_info = NULL; - res_data.result = Exc_TranslateError(self_, - &msg_ptr->tel.tel_data_ptr[0], - (uint8_t)(msg_ptr->tel.tel_len)); - - Ssub_Notify(&self_->ssubs.enabletx, &res_data, true); - } -} - - -/*! \brief Handler function for EXC.MemorySessionOpen.Result - * \param self reference to EXC object - * \param msg_ptr received message - */ -static void Exc_MemSessionOpen_Result(void *self, Msg_MostTel_t *msg_ptr) -{ - CExc *self_ = (CExc *)self; - uint16_t session_handle; - Exc_StdResult_t res_data; - - if (msg_ptr->tel.tel_len > 0U) - { - MISC_DECODE_WORD(&(session_handle), &(msg_ptr->tel.tel_data_ptr[0])); - res_data.data_info = &session_handle; - res_data.result.code = UCS_RES_SUCCESS; - res_data.result.info_ptr = NULL; - - Ssub_Notify(&self_->ssubs.memsessionopen, &res_data, true); - } - Al_Release(&self_->lock.api, EXC_API_MEM_SESSION_OPEN); -} - - -/*! \brief Handler function for EXC.MemorySessionOpen.Error - * \param self reference to EXC object - * \param msg_ptr received message - */ -static void Exc_MemSessionOpen_Error(void *self, Msg_MostTel_t *msg_ptr) -{ - CExc *self_ = (CExc *)self; - Exc_StdResult_t res_data; - - if (msg_ptr->tel.tel_len > 0U) - { - res_data.data_info = NULL; - res_data.result = Exc_TranslateError(self_, - &msg_ptr->tel.tel_data_ptr[0], - (uint8_t)(msg_ptr->tel.tel_len)); - - Ssub_Notify(&self_->ssubs.memsessionopen, &res_data, true); - } - Al_Release(&self_->lock.api, EXC_API_MEM_SESSION_OPEN); -} - - -/*! \brief Handler function for EXC.MemorySessionClose.Result - * \param self reference to EXC object - * \param msg_ptr received message - */ -static void Exc_MemSessionClose_Result(void *self, Msg_MostTel_t *msg_ptr) -{ - CExc *self_ = (CExc *)self; - uint8_t session_result; - Exc_StdResult_t res_data; - - if (msg_ptr->tel.tel_len > 0U) - { - session_result = msg_ptr->tel.tel_data_ptr[0]; - res_data.data_info = &session_result; - res_data.result.code = UCS_RES_SUCCESS; - res_data.result.info_ptr = NULL; - - Ssub_Notify(&self_->ssubs.memsessionclose, &res_data, true); - } - Al_Release(&self_->lock.api, EXC_API_MEM_SESSION_CLOSE); -} - -/*! \brief Handler function for EXC.MemorySessionClose.Error - * \param self reference to EXC object - * \param msg_ptr received message - */ -static void Exc_MemSessionClose_Error(void *self, Msg_MostTel_t *msg_ptr) -{ - CExc *self_ = (CExc *)self; - Exc_StdResult_t res_data; - - if (msg_ptr->tel.tel_len > 0U) - { - res_data.data_info = NULL; - res_data.result = Exc_TranslateError(self_, - &msg_ptr->tel.tel_data_ptr[0], - (uint8_t)(msg_ptr->tel.tel_len)); - - Ssub_Notify(&self_->ssubs.memsessionclose, &res_data, true); - } - Al_Release(&self_->lock.api, EXC_API_MEM_SESSION_CLOSE); -} - -/*! \brief Handler function for EXC.MemoryRead.Result - * \param self reference to EXC object - * \param msg_ptr received message - */ -static void Exc_MemoryRead_Result(void *self, Msg_MostTel_t *msg_ptr) -{ - CExc *self_ = (CExc *)self; - Exc_MemReadResult_t mem_read_result; - Exc_StdResult_t res_data; - uint8_t i; - - if (msg_ptr->tel.tel_len > 0U) - { - MISC_DECODE_WORD(&(mem_read_result.session_handle), &(msg_ptr->tel.tel_data_ptr[0])); - mem_read_result.mem_id = msg_ptr->tel.tel_data_ptr[2]; - MISC_DECODE_DWORD(&(mem_read_result.address), &(msg_ptr->tel.tel_data_ptr[3])); - mem_read_result.unit_len = msg_ptr->tel.tel_data_ptr[7]; - for (i=0U; (i<mem_read_result.unit_len) && (i<MAX_UNIT_LEN); ++i) - { - mem_read_result.unit_data[i] = msg_ptr->tel.tel_data_ptr[8U+i]; - } - - res_data.data_info = &mem_read_result; - res_data.result.code = UCS_RES_SUCCESS; - res_data.result.info_ptr = NULL; - - Ssub_Notify(&self_->ssubs.memoryread, &res_data, true); - } - Al_Release(&self_->lock.api, EXC_API_MEM_READ); -} - - -/*! \brief Handler function for EXC.MemoryRead.Error - * \param self reference to EXC object - * \param msg_ptr received message - */ -static void Exc_MemoryRead_Error(void *self, Msg_MostTel_t *msg_ptr) -{ - CExc *self_ = (CExc *)self; - Exc_StdResult_t res_data; - - if (msg_ptr->tel.tel_len > 0U) - { - res_data.data_info = NULL; - res_data.result = Exc_TranslateError(self_, - &msg_ptr->tel.tel_data_ptr[0], - (uint8_t)(msg_ptr->tel.tel_len)); - - Ssub_Notify(&self_->ssubs.memoryread, &res_data, true); - } - Al_Release(&self_->lock.api, EXC_API_MEM_READ); -} - - -/*! \brief Handler function for EXC.MemoryWrite.Result - * \param self reference to EXC object - * \param msg_ptr received message - */ -static void Exc_MemoryWrite_Result(void *self, Msg_MostTel_t *msg_ptr) -{ - CExc *self_ = (CExc *)self; - Exc_MemWriteResult_t mem_write_result; - Exc_StdResult_t res_data; - - if (msg_ptr->tel.tel_len > 0U) - { - MISC_DECODE_WORD(&(mem_write_result.session_handle), &(msg_ptr->tel.tel_data_ptr[0])); - mem_write_result.mem_id = msg_ptr->tel.tel_data_ptr[2]; - - res_data.data_info = &mem_write_result; - res_data.result.code = UCS_RES_SUCCESS; - res_data.result.info_ptr = NULL; - - Ssub_Notify(&self_->ssubs.memorywrite, &res_data, true); - } - Al_Release(&self_->lock.api, EXC_API_MEM_WRITE); -} - - -/*! \brief Handler function for EXC.MemoryWrite.Error - * \param self reference to EXC object - * \param msg_ptr received message - */ -static void Exc_MemoryWrite_Error(void *self, Msg_MostTel_t *msg_ptr) -{ - CExc *self_ = (CExc *)self; - Exc_StdResult_t res_data; - - if (msg_ptr->tel.tel_len > 0U) - { - res_data.data_info = NULL; - res_data.result = Exc_TranslateError(self_, - &msg_ptr->tel.tel_data_ptr[0], - (uint8_t)(msg_ptr->tel.tel_len)); - - Ssub_Notify(&self_->ssubs.memorywrite, &res_data, true); - } - Al_Release(&self_->lock.api, EXC_API_MEM_WRITE); -} - - - -/*------------------------------------------------------------------------------------------------*/ -/* Helper functions */ -/*------------------------------------------------------------------------------------------------*/ -/*! \brief Translates EXC error codes into UNICENS error codes and wraps the raw INIC - * error data to a byte stream. - * \param self Instance of CExc - * \param error_data[] EXC error data - * \param error_size Size of EXC error data in bytes - * \return The formatted error - */ -static Ucs_StdResult_t Exc_TranslateError(CExc *self, uint8_t error_data[], uint8_t error_size) -{ - Ucs_StdResult_t ret_val; - MISC_UNUSED(self); - - if(error_data[0] != 0x20U) - { - ret_val.code = UCS_RES_ERR_MOST_STANDARD; - } - else - { - ret_val.code = (Ucs_Result_t)(error_data[1] + 1U); - } - - ret_val.info_ptr = &error_data[0]; - ret_val.info_size = error_size; - - return ret_val; -} - - -/*! \brief Reads a signature from a message's payload - * - * \param dest Pointer to signature - * \param source Pointer to start of signature inabyte array - */ -static void Exc_Read_Signature(Ucs_Signature_t *dest, uint8_t source[]) -{ - MISC_DECODE_WORD(&(dest->node_address), source); - MISC_DECODE_WORD(&(dest->group_address), &(source[2])); - MISC_DECODE_WORD(&(dest->mac_47_32), &(source[4])); - MISC_DECODE_WORD(&(dest->mac_31_16), &(source[6])); - MISC_DECODE_WORD(&(dest->mac_15_0), &(source[8])); - MISC_DECODE_WORD(&(dest->node_pos_addr), &(source[10])); - MISC_DECODE_WORD(&(dest->diagnosis_id), &(source[12])); - dest->num_ports = source[14]; - dest->chip_id = source[15]; - dest->fw_major = source[16]; - dest->fw_minor = source[17]; - dest->fw_release = source[18]; - MISC_DECODE_DWORD(&(dest->fw_build), &(source[19])); - dest->cs_major = source[23]; - dest->cs_minor = source[24]; - dest->cs_release = source[25]; -/* dest->uid_persistency = source[26];*/ /* Signature v1 */ -/* MISC_DECODE_DWORD(&(dest->uid), &(source[27]));*/ - -} -/*! - * @} - * \endcond - */ - -/*------------------------------------------------------------------------------------------------*/ -/* End of file */ -/*------------------------------------------------------------------------------------------------*/ - |