diff options
Diffstat (limited to 'ucs2-lib/src/ucs_inic.c')
-rw-r--r-- | ucs2-lib/src/ucs_inic.c | 1817 |
1 files changed, 0 insertions, 1817 deletions
diff --git a/ucs2-lib/src/ucs_inic.c b/ucs2-lib/src/ucs_inic.c deleted file mode 100644 index 5d96a49..0000000 --- a/ucs2-lib/src/ucs_inic.c +++ /dev/null @@ -1,1817 +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 INIC - * \details Contains the general, device an network management parts of INIC management - * - * \cond UCS_INTERNAL_DOC - * \addtogroup G_INIC - * @{ - */ - -/*------------------------------------------------------------------------------------------------*/ -/* Includes */ -/*------------------------------------------------------------------------------------------------*/ -#include "ucs_misc.h" -#include "ucs_ret_pb.h" -#include "ucs_inic.h" - -/*------------------------------------------------------------------------------------------------*/ -/* Internal constants */ -/*------------------------------------------------------------------------------------------------*/ -/*! \brief List of all INIC messages */ -static const Dec_FktOpIcm_t inic_handler[] = /* parasoft-suppress MISRA2004-8_7 "Value shall be part of the module, not part of a function." */ -{ - { DEC_FKTOP(INIC_FID_NOTIFICATION, UCS_OP_STATUS), Inic_Notification_Status }, - { DEC_FKTOP(INIC_FID_NOTIFICATION, UCS_OP_ERROR), Inic_Notification_Error }, - { DEC_FKTOP(INIC_FID_DEVICE_STATUS, UCS_OP_STATUS), Inic_DeviceStatus_Status }, - { DEC_FKTOP(INIC_FID_DEVICE_STATUS, UCS_OP_ERROR), Inic_DummyHandler }, - { DEC_FKTOP(INIC_FID_DEVICE_VERSION, UCS_OP_STATUS), Inic_DeviceVersion_Status }, - { DEC_FKTOP(INIC_FID_DEVICE_VERSION, UCS_OP_ERROR), Inic_DeviceVersion_Error }, - { DEC_FKTOP(INIC_FID_DEVICE_POWER_OFF, UCS_OP_STATUS), Inic_DummyHandler }, - { DEC_FKTOP(INIC_FID_DEVICE_POWER_OFF, UCS_OP_ERROR), Inic_DummyHandler }, - { DEC_FKTOP(INIC_FID_DEVICE_ATTACH, UCS_OP_RESULT), Inic_DeviceAttach_Result }, - { DEC_FKTOP(INIC_FID_DEVICE_ATTACH, UCS_OP_ERROR), Inic_DeviceAttach_Error }, - { DEC_FKTOP(INIC_FID_DEVICE_SYNC, UCS_OP_RESULT), Inic_DeviceSync_Result }, - { DEC_FKTOP(INIC_FID_DEVICE_SYNC, UCS_OP_ERROR), Inic_DeviceSync_Error }, - { DEC_FKTOP(INIC_FID_MOST_NW_STATUS, UCS_OP_STATUS), Inic_NwStatus_Status }, - { DEC_FKTOP(INIC_FID_MOST_NW_STATUS, UCS_OP_ERROR), Inic_DummyHandler }, - { DEC_FKTOP(INIC_FID_MOST_NW_CFG, UCS_OP_STATUS), Inic_NwConfig_Status }, - { DEC_FKTOP(INIC_FID_MOST_NW_CFG, UCS_OP_ERROR), Inic_NwConfig_Error }, - { DEC_FKTOP(INIC_FID_MOST_NW_FRAME_COUNTER, UCS_OP_STATUS), Inic_NwFrameCounter_Status }, - { DEC_FKTOP(INIC_FID_MOST_NW_FRAME_COUNTER, UCS_OP_ERROR), Inic_NwFrameCounter_Error }, - { DEC_FKTOP(INIC_FID_MOST_NW_STARTUP, UCS_OP_RESULT), Inic_NwStartup_Result }, - { DEC_FKTOP(INIC_FID_MOST_NW_STARTUP, UCS_OP_ERROR), Inic_NwStartup_Error }, - { DEC_FKTOP(INIC_FID_MOST_NW_SHUTDOWN, UCS_OP_RESULT), Inic_NwShutdown_Result }, - { DEC_FKTOP(INIC_FID_MOST_NW_SHUTDOWN, UCS_OP_ERROR), Inic_NwShutdown_Error }, - { DEC_FKTOP(INIC_FID_MOST_NW_TRIGGER_RBD, UCS_OP_RESULT), Inic_NwTriggerRbd_Result }, - { DEC_FKTOP(INIC_FID_MOST_NW_TRIGGER_RBD, UCS_OP_ERROR), Inic_NwTriggerRbd_Error }, - { DEC_FKTOP(INIC_FID_MOST_NW_RBD_RESULT, UCS_OP_STATUS), Inic_NwRbdResult_Status }, - { DEC_FKTOP(INIC_FID_MOST_NW_RBD_RESULT, UCS_OP_ERROR), Inic_NwRbdResult_Error }, - { DEC_FKTOP(INIC_FID_MOST_NW_ATTACH, UCS_OP_RESULT), Inic_NwAttach_Result }, - { DEC_FKTOP(INIC_FID_MOST_NW_ATTACH, UCS_OP_ERROR), Inic_NwAttach_Error }, - { DEC_FKTOP(INIC_FID_MOST_NW_FORCE_NO_AVAIL, UCS_OP_STATUS), Inic_NwForceNotAvailable_Status }, - { DEC_FKTOP(INIC_FID_MOST_NW_FORCE_NO_AVAIL, UCS_OP_ERROR), Inic_NwForceNotAvailable_Error }, - { DEC_FKTOP(INIC_FID_MOST_NW_SYS_DIAGNOSIS, UCS_OP_RESULT), Inic_NwSysDiagnosis_Result }, - { DEC_FKTOP(INIC_FID_MOST_NW_SYS_DIAGNOSIS, UCS_OP_ERROR), Inic_NwSysDiagnosis_Error }, - { DEC_FKTOP(INIC_FID_MOST_NW_SYS_DIAG_END, UCS_OP_RESULT), Inic_NwSysDiagEnd_Result }, - { DEC_FKTOP(INIC_FID_MOST_NW_SYS_DIAG_END, UCS_OP_ERROR), Inic_NwSysDiagEnd_Error }, - { DEC_FKTOP(INIC_FID_BACK_CHANNEL_DIAGNOSIS, UCS_OP_RESULT), Inic_BCDiagnosis_Result }, - { DEC_FKTOP(INIC_FID_BACK_CHANNEL_DIAGNOSIS, UCS_OP_ERROR), Inic_BCDiagnosis_Error }, - { DEC_FKTOP(INIC_FID_BACK_CHANNEL_DIAG_END, UCS_OP_RESULT), Inic_BCDiagEnd_Result }, - { DEC_FKTOP(INIC_FID_BACK_CHANNEL_DIAG_END, UCS_OP_ERROR), Inic_BCDiagEnd_Error }, - { DEC_FKTOP(INIC_FID_MOST_PORT_STATUS, UCS_OP_STATUS), Inic_MostPortStatus_Status }, - { DEC_FKTOP(INIC_FID_MOST_PORT_STATUS, UCS_OP_ERROR), Inic_MostPortStatus_Error }, - { DEC_FKTOP(INIC_FID_MOST_SOCKET_CREATE, UCS_OP_RESULT), Inic_MostSocketCreate_Result }, - { DEC_FKTOP(INIC_FID_MOST_SOCKET_CREATE, UCS_OP_ERROR), Inic_MostSocketCreate_Error }, - { DEC_FKTOP(INIC_FID_MOST_SOCKET_STATUS, UCS_OP_STATUS), Inic_DummyHandler }, - { DEC_FKTOP(INIC_FID_MOST_SOCKET_STATUS, UCS_OP_ERROR), Inic_DummyHandler }, - { DEC_FKTOP(INIC_FID_MLB_PORT_CREATE, UCS_OP_RESULT), Inic_MlbPortCreate_Result }, - { DEC_FKTOP(INIC_FID_MLB_PORT_CREATE, UCS_OP_ERROR), Inic_MlbPortCreate_Error }, -/* { DEC_FKTOP(INIC_FID_MLB_PORT_ALLOCATE_ONLY, UCS_OP_RESULT), Inic_DummyHandler }, */ -/* { DEC_FKTOP(INIC_FID_MLB_PORT_ALLOCATE_ONLY, UCS_OP_ERROR), Inic_DummyHandler }, */ -/* { DEC_FKTOP(INIC_FID_MLB_PORT_DEALLOC_ONLY, UCS_OP_RESULT), Inic_DummyHandler }, */ -/* { DEC_FKTOP(INIC_FID_MLB_PORT_DEALLOC_ONLY, UCS_OP_ERROR), Inic_DummyHandler }, */ - { DEC_FKTOP(INIC_FID_MLB_SOCKET_CREATE, UCS_OP_RESULT), Inic_MlbSocketCreate_Result }, - { DEC_FKTOP(INIC_FID_MLB_SOCKET_CREATE, UCS_OP_ERROR), Inic_MlbSocketCreate_Error }, - { DEC_FKTOP(INIC_FID_SPI_PORT_CREATE, UCS_OP_RESULT), Inic_DummyHandler }, - { DEC_FKTOP(INIC_FID_SPI_PORT_CREATE, UCS_OP_ERROR), Inic_DummyHandler }, - { DEC_FKTOP(INIC_FID_SPI_SOCKET_CREATE, UCS_OP_RESULT), Inic_DummyHandler }, - { DEC_FKTOP(INIC_FID_SPI_SOCKET_CREATE, UCS_OP_ERROR), Inic_DummyHandler }, - { DEC_FKTOP(INIC_FID_USB_PORT_CREATE, UCS_OP_RESULT), Inic_UsbPortCreate_Result }, - { DEC_FKTOP(INIC_FID_USB_PORT_CREATE, UCS_OP_ERROR), Inic_UsbPortCreate_Error }, - { DEC_FKTOP(INIC_FID_USB_SOCKET_CREATE, UCS_OP_RESULT), Inic_UsbSocketCreate_Result }, - { DEC_FKTOP(INIC_FID_USB_SOCKET_CREATE, UCS_OP_ERROR), Inic_UsbSocketCreate_Error }, - { DEC_FKTOP(INIC_FID_STREAM_PORT_CONFIG, UCS_OP_STATUS), Inic_StreamPortConfig_Status }, - { DEC_FKTOP(INIC_FID_STREAM_PORT_CONFIG, UCS_OP_ERROR), Inic_StreamPortConfig_Error }, - { DEC_FKTOP(INIC_FID_STREAM_PORT_CREATE, UCS_OP_RESULT), Inic_StreamPortCreate_Result }, - { DEC_FKTOP(INIC_FID_STREAM_PORT_CREATE, UCS_OP_ERROR), Inic_StreamPortCreate_Error }, - { DEC_FKTOP(INIC_FID_STREAM_PORT_LOOPBACK, UCS_OP_STATUS), Inic_DummyHandler }, - { DEC_FKTOP(INIC_FID_STREAM_PORT_LOOPBACK, UCS_OP_ERROR), Inic_DummyHandler }, - { DEC_FKTOP(INIC_FID_STREAM_SOCKET_CREATE, UCS_OP_RESULT), Inic_StreamSocketCreate_Result }, - { DEC_FKTOP(INIC_FID_STREAM_SOCKET_CREATE, UCS_OP_ERROR), Inic_StreamSocketCreate_Error }, - { DEC_FKTOP(INIC_FID_RMCK_PORT_CREATE, UCS_OP_RESULT), Inic_RmckPortCreate_Result }, - { DEC_FKTOP(INIC_FID_RMCK_PORT_CREATE, UCS_OP_ERROR), Inic_RmckPortCreate_Error }, - { DEC_FKTOP(INIC_FID_I2C_PORT_CREATE, UCS_OP_RESULT), Inic_I2cPortCreate_Result }, - { DEC_FKTOP(INIC_FID_I2C_PORT_CREATE, UCS_OP_ERROR), Inic_I2cPortCreate_Error }, - { DEC_FKTOP(INIC_FID_I2C_PORT_READ, UCS_OP_RESULT), Inic_I2cPortRead_Result }, - { DEC_FKTOP(INIC_FID_I2C_PORT_READ, UCS_OP_ERROR), Inic_I2cPortRead_Error }, - { DEC_FKTOP(INIC_FID_I2C_PORT_WRITE, UCS_OP_RESULT), Inic_I2cPortWrite_Result }, - { DEC_FKTOP(INIC_FID_I2C_PORT_WRITE, UCS_OP_ERROR), Inic_I2cPortWrite_Error }, - { DEC_FKTOP(INIC_FID_PCI_PORT_CREATE, UCS_OP_RESULT), Inic_PciPortCreate_Result }, - { DEC_FKTOP(INIC_FID_PCI_PORT_CREATE, UCS_OP_ERROR), Inic_PciPortCreate_Error }, - { DEC_FKTOP(INIC_FID_PCI_SOCKET_CREATE, UCS_OP_RESULT), Inic_PciSocketCreate_Result }, - { DEC_FKTOP(INIC_FID_PCI_SOCKET_CREATE, UCS_OP_ERROR), Inic_PciSocketCreate_Error }, - { DEC_FKTOP(INIC_FID_GPIO_PORT_CREATE, UCS_OP_RESULT), Inic_GpioPortCreate_Result }, - { DEC_FKTOP(INIC_FID_GPIO_PORT_CREATE, UCS_OP_ERROR), Inic_GpioPortCreate_Error }, - { DEC_FKTOP(INIC_FID_MOST_PORT_ENABLE, UCS_OP_RESULT), Inic_MostPortEnable_Result }, - { DEC_FKTOP(INIC_FID_MOST_PORT_ENABLE, UCS_OP_ERROR), Inic_MostPortEnable_Error }, - { DEC_FKTOP(INIC_FID_GPIO_PORT_PIN_MODE, UCS_OP_STATUS), Inic_GpioPortPinMode_Status }, - { DEC_FKTOP(INIC_FID_GPIO_PORT_PIN_MODE, UCS_OP_ERROR), Inic_GpioPortPinMode_Error }, - { DEC_FKTOP(INIC_FID_GPIO_PORT_PIN_STATE, UCS_OP_STATUS), Inic_GpioPortPinState_Status }, - { DEC_FKTOP(INIC_FID_GPIO_PORT_PIN_STATE, UCS_OP_ERROR), Inic_GpioPortPinState_Error }, - { DEC_FKTOP(INIC_FID_GPIO_PORT_TRIGGER_EVENT, UCS_OP_STATUS), Inic_GpioPortTrigger_Status }, - { DEC_FKTOP(INIC_FID_GPIO_PORT_TRIGGER_EVENT, UCS_OP_ERROR), Inic_GpioPortTrigger_Error }, - { DEC_FKTOP(INIC_FID_RESOURCE_DESTROY, UCS_OP_RESULT), Inic_ResourceDestroy_Result }, - { DEC_FKTOP(INIC_FID_RESOURCE_DESTROY, UCS_OP_ERROR), Inic_ResourceDestroy_Error }, - { DEC_FKTOP(INIC_FID_RESOURCE_INVALID_LIST, UCS_OP_STATUS), Inic_ResourceInvalidList_Status }, - { DEC_FKTOP(INIC_FID_RESOURCE_INVALID_LIST, UCS_OP_ERROR), Inic_ResourceInvalidList_Error }, - { DEC_FKTOP(INIC_FID_RESOURCE_MONITOR, UCS_OP_STATUS), Inic_ResourceMonitor_Status }, - { DEC_FKTOP(INIC_FID_RESOURCE_MONITOR, UCS_OP_ERROR), Inic_ResourceMonitor_Error }, -/* { DEC_FKTOP(INIC_FID_PACKET_ATTACH_SOCKETS, UCS_OP_RESULT), Inic_DummyHandler }, */ -/* { DEC_FKTOP(INIC_FID_PACKET_ATTACH_SOCKETS, UCS_OP_ERROR), Inic_DummyHandler }, */ -/* { DEC_FKTOP(INIC_FID_PACKET_DETACH_SOCKETS, UCS_OP_RESULT), Inic_DummyHandler }, */ -/* { DEC_FKTOP(INIC_FID_PACKET_DETACH_SOCKETS, UCS_OP_ERROR), Inic_DummyHandler }, */ - { DEC_FKTOP(INIC_FID_QOS_CREATE, UCS_OP_RESULT), Inic_QoSCreate_Result }, - { DEC_FKTOP(INIC_FID_QOS_CREATE, UCS_OP_ERROR), Inic_QoSCreate_Error }, - { DEC_FKTOP(INIC_FID_AVP_CREATE, UCS_OP_RESULT), Inic_AvpCreate_Result }, - { DEC_FKTOP(INIC_FID_AVP_CREATE, UCS_OP_ERROR), Inic_AvpCreate_Error }, - { DEC_FKTOP(INIC_FID_SYNC_CREATE, UCS_OP_RESULT), Inic_SyncCreate_Result }, - { DEC_FKTOP(INIC_FID_SYNC_CREATE, UCS_OP_ERROR), Inic_SyncCreate_Error }, - { DEC_FKTOP(INIC_FID_SYNC_MUTE, UCS_OP_RESULT), Inic_SyncMute_Result }, - { DEC_FKTOP(INIC_FID_SYNC_MUTE, UCS_OP_ERROR), Inic_SyncMute_Error }, - { DEC_FKTOP(INIC_FID_SYNC_DEMUTE, UCS_OP_RESULT), Inic_SyncDemute_Result }, - { DEC_FKTOP(INIC_FID_SYNC_DEMUTE, UCS_OP_ERROR), Inic_SyncDemute_Error }, - { DEC_FKTOP(INIC_FID_DFIPHASE_CREATE, UCS_OP_RESULT), Inic_DfiPhaseCreate_Result }, - { DEC_FKTOP(INIC_FID_DFIPHASE_CREATE, UCS_OP_ERROR), Inic_DfiPhaseCreate_Error }, - { DEC_FKTOP(INIC_FID_IPC_CREATE, UCS_OP_RESULT), Inic_IpcCreate_Result }, - { DEC_FKTOP(INIC_FID_IPC_CREATE, UCS_OP_ERROR), Inic_IpcCreate_Error }, - { DEC_FKTOP(INIC_FID_COMBINER_CREATE, UCS_OP_RESULT), Inic_CombinerCreate_Result }, - { DEC_FKTOP(INIC_FID_COMBINER_CREATE, UCS_OP_ERROR), Inic_CombinerCreate_Error }, - { DEC_FKTOP(INIC_FID_SPLITTER_CREATE, UCS_OP_RESULT), Inic_SplitterCreate_Result }, - { DEC_FKTOP(INIC_FID_SPLITTER_CREATE, UCS_OP_ERROR), Inic_SplitterCreate_Error }, - { DEC_FKTOP_TERMINATION, NULL } -}; - -/*------------------------------------------------------------------------------------------------*/ -/* Internal definitions */ -/*------------------------------------------------------------------------------------------------*/ -/*! \brief Bitmask for API method Inic_NwForceNotAvailable() used by API locking manager */ -#define INIC_API_NW_FORCE_NA 0x01U -/*! \brief Bitmask for API method Inic_NwShutdown() used by API locking manager */ -#define INIC_API_NW_SHUTDOWN 0x02U -/*! \brief Bitmask for API method Inic_NwFrameCounter_Get() used by API locking manager */ -#define INIC_API_NW_FRAME_COUNTER 0x04U -/*! \brief Bitmask for API method Inic_NwTriggerRbd() used by API locking manager */ -#define INIC_API_NW_TRIGGER_RBD 0x08U -/*! \brief Bitmask for API method Inic_NwRbdResult_Get() used by API locking manager */ -#define INIC_API_NW_RBD_RESULT 0x10U -/*! \brief Bitmask for API method Inic_DeviceVersion_Get() used by API locking manager */ -#define INIC_API_DEVICE_VERSION_GET 0x20U - -/*------------------------------------------------------------------------------------------------*/ -/* Internal prototypes */ -/*------------------------------------------------------------------------------------------------*/ -static void Inic_HandleInternalErrors(void *self, void *error_code_ptr); -static void Inic_HandleApiTimeout(void *self, void *method_mask_ptr); -static void Inic_DecodeIcm(CInic *self, Msg_MostTel_t *msg_ptr); -static void Inic_MsgTxStatusCb(void *self, Msg_MostTel_t *tel_ptr, Ucs_MsgTxStatus_t status); - -/*------------------------------------------------------------------------------------------------*/ -/* Implementation */ -/*------------------------------------------------------------------------------------------------*/ - -/*! \brief Constructor of class CInic. - * \param self Reference to CInic instance - * \param init_ptr Reference to initialization data - */ -void Inic_Ctor(CInic *self, Inic_InitData_t *init_ptr) -{ - uint8_t i; - MISC_MEM_SET((void *)self, 0, sizeof(*self)); - - self->base_ptr = init_ptr->base_ptr; - self->xcvr_ptr = init_ptr->xcvr_ptr; - self->fkt_op_list_ptr = &inic_handler[0]; - self->target_address = init_ptr->tgt_addr; - - /* create instances of single-observers */ - for(i=0U; i<INIC_NUM_SSUB; i++) - { - Ssub_Ctor(&self->ssubs[i], self->base_ptr->ucs_user_ptr); - } - - /* create instances of "normal" observers */ - for(i=0U; i<INIC_NUM_SUB; i++) - { - Sub_Ctor(&self->subs[i], self->base_ptr->ucs_user_ptr); - } - - /* Observe internal errors and events */ - Mobs_Ctor(&self->internal_error_obs, self, EH_M_TERMINATION_EVENTS, &Inic_HandleInternalErrors); - Eh_AddObsrvInternalEvent(&self->base_ptr->eh, &self->internal_error_obs); - - /* Initialize API locking mechanism */ - Sobs_Ctor(&self->lock.observer, self, &Inic_HandleApiTimeout); - Al_Ctor(&self->lock.api, &self->lock.observer, self->base_ptr->ucs_user_ptr); - Alm_RegisterApi(&self->base_ptr->alm, &self->lock.api); - - /* Initialize Resource Management part */ - Inic_InitResourceManagement(self); -} - -/*! \brief Handles internal errors and events - * \param self Instance pointer - * \param error_code_ptr Reference to reported error code - */ -static void Inic_HandleInternalErrors(void *self, void *error_code_ptr) -{ - uint8_t i; - Inic_StdResult_t res_data; - CInic *self_ = (CInic *)self; - MISC_UNUSED(error_code_ptr); - - res_data.data_info = NULL; - res_data.result.code = UCS_RES_ERR_SYSTEM; - res_data.result.info_ptr = NULL; - res_data.result.info_size = 0U; - - /* Internal error has been occurred => Cancel running jobs */ - for(i=0U; i<INIC_NUM_SSUB; i++) - { - Ssub_Notify(&self_->ssubs[i], &res_data, true); - } -} - -/*! \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 Inic_HandleApiTimeout(void *self, void *method_mask_ptr) -{ - CInic *self_ = (CInic *)self; - Alm_ModuleMask_t method_mask = *((Alm_ModuleMask_t *)method_mask_ptr); - Inic_StdResult_t res_data; - - res_data.data_info = NULL; - res_data.result.code = UCS_RES_ERR_TIMEOUT; - res_data.result.info_ptr = NULL; - - switch(method_mask) - { - case INIC_API_NW_SHUTDOWN: - Ssub_Notify(&self_->ssubs[INIC_SSUB_NW_SHUTDOWN], &res_data, true); - TR_ERROR((self_->base_ptr->ucs_user_ptr, "[INIC]", "API locking timeout occurred for method Inic_NwShutdown().", 0U)); - break; - case INIC_API_NW_FRAME_COUNTER: - Ssub_Notify(&self_->ssubs[INIC_SSUB_NW_FRAME_COUNTER], &res_data, true); - TR_ERROR((self_->base_ptr->ucs_user_ptr, "[INIC]", "API locking timeout occurred for method Inic_NwFrameCounter_Get().", 0U)); - break; - case INIC_API_NW_TRIGGER_RBD: - self_->lock.rbd_trigger_timeout_counter++; - if(self_->lock.rbd_trigger_timeout_counter < 5U) - { - (void)Al_Lock(&self_->lock.api, INIC_API_NW_TRIGGER_RBD); - } - else - { - Inic_StdResult_t rbd_result_data; - Ucs_StdResult_t result = {UCS_RES_ERR_TIMEOUT, NULL, 0U}; - rbd_result_data.data_info = NULL; - rbd_result_data.result = result; - Ssub_Notify(&self_->ssubs[INIC_SSUB_NW_TRIGGER_RBD], &rbd_result_data, true); - TR_ERROR((self_->base_ptr->ucs_user_ptr, "[INIC]", "API locking timeout occurred for method Inic_NwTriggerRbd().", 0U)); - } - break; - case INIC_API_NW_RBD_RESULT: - Ssub_Notify(&self_->ssubs[INIC_SSUB_NW_RBD_RESULT], &res_data, true); - TR_ERROR((self_->base_ptr->ucs_user_ptr, "[INIC]", "API locking timeout occurred for method Inic_NwRbdResult_Get().", 0U)); - break; - default: - TR_ERROR((self_->base_ptr->ucs_user_ptr, "[INIC]", "Unknown API locking bitmask detected. Mask: 0x%02X", 1U, method_mask)); - break; - } -} - -/*! \brief Decode an ICM message - * \param self Instance pointer to FBlock INIC - * \param msg_ptr pointer to the ICM message to decode - */ -static void Inic_DecodeIcm(CInic *self, Msg_MostTel_t *msg_ptr) -{ - Dec_Return_t result; - uint16_t index; - - result = Dec_SearchFktOpIcm(self->fkt_op_list_ptr, &index, msg_ptr->id.function_id, msg_ptr->id.op_type); - - if (result == DEC_RET_SUCCESS) - { - self->fkt_op_list_ptr[index].handler_function_ptr(self, msg_ptr); - } - else - { - TR_ERROR((self->base_ptr->ucs_user_ptr, "[INIC]", "Unknown ICM received. FBlockId: 0x%02X, InstId: 0x%02X, FktId: 0x%04X, OPType: 0x%02X", 4U, msg_ptr->id.fblock_id, msg_ptr->id.instance_id, msg_ptr->id.function_id, msg_ptr->id.op_type)); - } -} - -/*! \brief Receives ICMs - * \param self reference to INIC object - * \param tel_ptr received message - */ -void Inic_OnIcmRx(void *self, Msg_MostTel_t *tel_ptr) -{ - CInic *self_ = (CInic *)self; - - if ((tel_ptr->source_addr == MSG_ADDR_INIC) && (tel_ptr->destination_addr == MSG_ADDR_EHC_CFG)) - { - Inic_DecodeIcm(self_, tel_ptr); - } - - Trcv_RxReleaseMsg(self_->xcvr_ptr, tel_ptr); /* free Rx telegram */ -} - -/*! \brief Filters RCM Rx messages - * \details The filter function shall not release the message object - * \param self Reference to INIC object - * \param tel_ptr Reference to the RCM Rx message object - */ -void Inic_OnRcmRxFilter(void *self, Msg_MostTel_t *tel_ptr) -{ - uint16_t index; - CInic *self_ = (CInic *)self; - - if (Dec_SearchFktOpIcm(self_->fkt_op_list_ptr, &index, tel_ptr->id.function_id, tel_ptr->id.op_type) == DEC_RET_SUCCESS) - { - self_->fkt_op_list_ptr[index].handler_function_ptr(self, tel_ptr); - } -} - -/*! \brief Handle message Tx status and free message objects - * \param self The instance - * \param tel_ptr Reference to transmitted message - * \param status Status of the transmitted message - */ -static void Inic_MsgTxStatusCb(void *self, Msg_MostTel_t *tel_ptr, Ucs_MsgTxStatus_t status) -{ - CInic *self_ = (CInic *)self; - - if ((status != UCS_MSG_STAT_OK) && (tel_ptr->info_ptr != NULL)) - { - Inic_StdResult_t res_data; - CSingleSubject *ssub_ptr = (CSingleSubject *)tel_ptr->info_ptr; - - res_data.data_info = &status; - res_data.result.code = UCS_RES_ERR_TRANSMISSION; - res_data.result.info_ptr = NULL; - res_data.result.info_size = 0U; - Ssub_Notify(ssub_ptr, &res_data, true); - } - Trcv_TxReleaseMsg(tel_ptr); - - /* ICM messages pending? */ - if (Sub_GetNumObservers(&self_->subs[INIC_SUB_TX_MSG_OBJ_AVAIL]) > 0U) - { - Sub_Notify(&self_->subs[INIC_SUB_TX_MSG_OBJ_AVAIL], NULL); - } -} - -/*! \brief Add an observer to be notified when a tx message object is available - * \param self instance of CInic - * \param obs_ptr pointer to observer to be informed - */ -void Inic_AddObsrvOnTxMsgObjAvail(CInic *self, CObserver *obs_ptr) -{ - (void)Sub_AddObserver(&self->subs[INIC_SUB_TX_MSG_OBJ_AVAIL], obs_ptr); -} - -/*! \brief Delete an observer set by Inic_AddObsrvOnTxMsgObjAvail() - * \param self instance of CInic - * \param obs_ptr pointer to observer to be removed - */ -void Inic_DelObsrvOnTxMsgObjAvail(CInic *self, CObserver *obs_ptr) -{ - (void)Sub_RemoveObserver(&self->subs[INIC_SUB_TX_MSG_OBJ_AVAIL], obs_ptr); -} - -/*! \brief Add an observer to the NetworkStatus subject - * \param self instance of CInic - * \param obs_ptr pointer to observer to be informed - */ -void Inic_AddObsrvNwStatus(CInic *self, CObserver *obs_ptr) -{ - (void)Sub_AddObserver(&self->subs[INIC_SUB_NW_STATUS], obs_ptr); -} - -/*! \brief Delete an observer to the NetworkStatus subject - * \param self instance of CInic - * \param obs_ptr pointer to observer to be removed - */ -void Inic_DelObsrvNwStatus(CInic *self, CObserver *obs_ptr) -{ - (void)Sub_RemoveObserver(&self->subs[INIC_SUB_NW_STATUS], obs_ptr); -} - -/*! \brief Add an observer to the NetworkConfiguration subject - * \param self instance of CInic - * \param obs_ptr pointer to observer to be informed - */ -void Inic_AddObsvrNwConfig(CInic *self, CObserver *obs_ptr) -{ - (void)Sub_AddObserver(&self->subs[INIC_SUB_NW_CONFIG], obs_ptr); -} - -/*! \brief Delete an observer to the NetworkConfiguration subject - * \param self instance of CInic - * \param obs_ptr pointer to observer to be removed - */ -void Inic_DelObsvrNwConfig(CInic *self, CObserver *obs_ptr) -{ - (void)Sub_RemoveObserver(&self->subs[INIC_SUB_NW_CONFIG], obs_ptr); -} - -/*! \brief Add an observer to the DeviceStatus subject - * \details The provided data points to a \ref Inic_DeviceStatus_t structure - * \param self instance of CInic - * \param obs_ptr pointer to observer to be informed - */ -void Inic_AddObsvrDeviceStatus(CInic *self, CObserver *obs_ptr) -{ - (void)Sub_AddObserver(&self->subs[INIC_SUB_DEVICE_STATUS], obs_ptr); -} - -/*! \brief Delete an observer to the DeviceStatus subject - * \param self instance of CInic - * \param obs_ptr pointer to observer to be removed - */ -void Inic_DelObsvrDeviceStatus(CInic *self, CObserver *obs_ptr) -{ - (void)Sub_RemoveObserver(&self->subs[INIC_SUB_DEVICE_STATUS], obs_ptr); -} - -/*------------------------------------------------------------------------------------------------*/ -/* Internal API */ -/*------------------------------------------------------------------------------------------------*/ -/*! \brief This method requests the INIC version info - * \param self Reference to CInic 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 Inic_DeviceVersion_Get(CInic *self, CSingleObserver *obs_ptr) -{ - Ucs_Return_t result = UCS_RET_SUCCESS; - - if(Al_Lock(&self->lock.api, INIC_API_DEVICE_VERSION_GET) != false) - { - Msg_MostTel_t *msg_ptr = Trcv_TxAllocateMsg(self->xcvr_ptr, 0U); - - if (msg_ptr != NULL) - { - msg_ptr->destination_addr = self->target_address; - - msg_ptr->id.fblock_id = FB_INIC; - msg_ptr->id.instance_id = 0U; - msg_ptr->id.function_id = INIC_FID_DEVICE_VERSION; - msg_ptr->id.op_type = UCS_OP_GET; - - msg_ptr->info_ptr = &self->ssubs[INIC_SSUB_DEVICE_VERSION]; - Trcv_TxSendMsgExt(self->xcvr_ptr, msg_ptr, &Inic_MsgTxStatusCb, self); - - (void)Ssub_AddObserver(&self->ssubs[INIC_SSUB_DEVICE_VERSION], obs_ptr); - } - else - { - Al_Release(&self->lock.api, INIC_API_DEVICE_VERSION_GET); - result = UCS_RET_ERR_BUFFER_OVERFLOW; - } - } - else - { - result = UCS_RET_ERR_API_LOCKED; - } - - return result; -} - -/*! \brief Attach EHC to the INIC - * \param self Reference to CInic 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 - */ -Ucs_Return_t Inic_DeviceAttach(CInic *self, 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 = self->target_address; - - msg_ptr->id.fblock_id = FB_INIC; - msg_ptr->id.instance_id = 0U; - msg_ptr->id.function_id = INIC_FID_DEVICE_ATTACH; - msg_ptr->id.op_type = UCS_OP_STARTRESULT; - - msg_ptr->info_ptr = &self->ssubs[INIC_SSUB_DEVICE_ATTACH]; - Trcv_TxSendMsgExt(self->xcvr_ptr, msg_ptr, &Inic_MsgTxStatusCb, self); - - (void)Ssub_AddObserver(&self->ssubs[INIC_SSUB_DEVICE_ATTACH], obs_ptr); - } - else - { - result = UCS_RET_ERR_BUFFER_OVERFLOW; - } - - return result; -} - -/*! \brief Attaches the given PMS channel to the network - * \param self Reference to CInic instance - * \param pmp_channel_handle Port message channel resource handle - * \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 Inic_NwAttach(CInic *self, - uint16_t pmp_channel_handle, - 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 = self->target_address; - - msg_ptr->id.fblock_id = FB_INIC; - msg_ptr->id.instance_id = 0U; - msg_ptr->id.function_id = INIC_FID_MOST_NW_ATTACH; - msg_ptr->id.op_type = UCS_OP_STARTRESULT; - - msg_ptr->tel.tel_data_ptr[0] = MISC_HB(pmp_channel_handle); - msg_ptr->tel.tel_data_ptr[1] = MISC_LB(pmp_channel_handle); - - msg_ptr->info_ptr = &self->ssubs[INIC_SSUB_NW_ATTACH]; - Trcv_TxSendMsgExt(self->xcvr_ptr, msg_ptr, &Inic_MsgTxStatusCb, self); - - (void)Ssub_AddObserver(&self->ssubs[INIC_SSUB_NW_ATTACH], obs_ptr); - } - else - { - result = UCS_RET_ERR_BUFFER_OVERFLOW; - } - - return result; -} - - -/*! \brief Starts the System diagnosis - * \param self Reference to CInic 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 - */ -Ucs_Return_t Inic_NwSysDiagnosis(CInic *self, 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 = self->target_address; - - msg_ptr->id.fblock_id = FB_INIC; - msg_ptr->id.instance_id = 0U; - msg_ptr->id.function_id = INIC_FID_MOST_NW_SYS_DIAGNOSIS; - msg_ptr->id.op_type = UCS_OP_STARTRESULT; - - msg_ptr->info_ptr = &self->ssubs[INIC_SSUB_NW_SYS_DIAGNOSIS]; - Trcv_TxSendMsgExt(self->xcvr_ptr, msg_ptr, &Inic_MsgTxStatusCb, self); - - (void)Ssub_AddObserver(&self->ssubs[INIC_SSUB_NW_SYS_DIAGNOSIS], obs_ptr); - } - else - { - result = UCS_RET_ERR_BUFFER_OVERFLOW; - } - - return result; -} - -/*! \brief Stops the System diagnosis - * \param self Reference to CInic 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 - */ -Ucs_Return_t Inic_NwSysDiagEnd(CInic *self, 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 = self->target_address; - - msg_ptr->id.fblock_id = FB_INIC; - msg_ptr->id.instance_id = 0U; - msg_ptr->id.function_id = INIC_FID_MOST_NW_SYS_DIAG_END; - msg_ptr->id.op_type = UCS_OP_STARTRESULT; - - msg_ptr->info_ptr = &self->ssubs[INIC_SSUB_NW_SYS_DIAGEND]; - Trcv_TxSendMsgExt(self->xcvr_ptr, msg_ptr, &Inic_MsgTxStatusCb, self); - - (void)Ssub_AddObserver(&self->ssubs[INIC_SSUB_NW_SYS_DIAGEND], obs_ptr); - } - else - { - result = UCS_RET_ERR_BUFFER_OVERFLOW; - } - - return result; -} - -/*! \brief Starts the Backchannel Diagnosis Mode - * - * \param *self Reference to CInic 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 - */ -Ucs_Return_t Inic_BCDiagnosis(CInic *self, 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 = MSG_ADDR_INIC; - - msg_ptr->id.fblock_id = FB_INIC; - msg_ptr->id.instance_id = 0U; - msg_ptr->id.function_id = INIC_FID_BACK_CHANNEL_DIAGNOSIS; - msg_ptr->id.op_type = UCS_OP_STARTRESULT; - - msg_ptr->info_ptr = &self->ssubs[INIC_SSUB_BC_DIAGNOSIS]; - Trcv_TxSendMsgExt(self->xcvr_ptr, msg_ptr, &Inic_MsgTxStatusCb, self); - - (void)Ssub_AddObserver(&self->ssubs[INIC_SSUB_BC_DIAGNOSIS], obs_ptr); - } - else - { - result = UCS_RET_ERR_BUFFER_OVERFLOW; - } - - return result; -} - -/*! \brief Stops the Backchannel Diagnosis Mode - * - * \param *self Reference to CInic 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 - */ -Ucs_Return_t Inic_BCDiagEnd(CInic *self, 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 = MSG_ADDR_INIC; - - msg_ptr->id.fblock_id = FB_INIC; - msg_ptr->id.instance_id = 0U; - msg_ptr->id.function_id = INIC_FID_BACK_CHANNEL_DIAG_END; - msg_ptr->id.op_type = UCS_OP_STARTRESULT; - - msg_ptr->info_ptr = &self->ssubs[INIC_SSUB_BC_DIAG_END]; - Trcv_TxSendMsgExt(self->xcvr_ptr, msg_ptr, &Inic_MsgTxStatusCb, self); - - (void)Ssub_AddObserver(&self->ssubs[INIC_SSUB_BC_DIAG_END], obs_ptr); - } - else - { - result = UCS_RET_ERR_BUFFER_OVERFLOW; - } - - return result; -} - - -/*! \brief Requests the INIC.MOSTNetworRBDResult.Status message - * \param self Reference to CInic 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 Inic_NwRbdResult_Get(CInic *self, CSingleObserver *obs_ptr) -{ - Ucs_Return_t result = UCS_RET_SUCCESS; - - if(Al_Lock(&self->lock.api, INIC_API_NW_RBD_RESULT) != false) - { - Msg_MostTel_t *msg_ptr = Trcv_TxAllocateMsg(self->xcvr_ptr, 0U); - - if (msg_ptr != NULL) - { - msg_ptr->destination_addr = self->target_address; - - msg_ptr->id.fblock_id = FB_INIC; - msg_ptr->id.instance_id = 0U; - msg_ptr->id.function_id = INIC_FID_MOST_NW_RBD_RESULT; - msg_ptr->id.op_type = UCS_OP_GET; - - msg_ptr->info_ptr = &self->ssubs[INIC_SSUB_NW_RBD_RESULT]; - Trcv_TxSendMsgExt(self->xcvr_ptr, msg_ptr, &Inic_MsgTxStatusCb, self); - - (void)Ssub_AddObserver(&self->ssubs[INIC_SSUB_NW_RBD_RESULT], obs_ptr); - } - else - { - Al_Release(&self->lock.api, INIC_API_NW_RBD_RESULT); - result = UCS_RET_ERR_BUFFER_OVERFLOW; - } - } - else - { - result = UCS_RET_ERR_API_LOCKED; - } - - return result; -} - - -/*! \brief This functions starts up the MOST network. - * \param self Reference to CInic instance - * \param auto_forced_na The delay time to shutdown the network after INIC has entered the - * protected mode. - * \param packet_bandwidth The desired packed bandwidth - * \param obs_ptr Reference to an optional observer. The result must be casted into type - * Inic_StdResult_t. - * \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 Inic_NwStartup(CInic *self, uint16_t auto_forced_na, - uint16_t packet_bandwidth, CSingleObserver *obs_ptr) -{ - Ucs_Return_t result = UCS_RET_SUCCESS; - - if (self->startup_locked == false) - { - Msg_MostTel_t *msg_ptr = Trcv_TxAllocateMsg(self->xcvr_ptr, 4U); - - if (msg_ptr != NULL) - { - self->startup_locked = true; - - msg_ptr->destination_addr = self->target_address; - msg_ptr->id.fblock_id = FB_INIC; - msg_ptr->id.instance_id = 0U; - msg_ptr->id.function_id = INIC_FID_MOST_NW_STARTUP; - msg_ptr->id.op_type = UCS_OP_STARTRESULT; - msg_ptr->tel.tel_data_ptr[0] = MISC_HB(auto_forced_na); - msg_ptr->tel.tel_data_ptr[1] = MISC_LB(auto_forced_na); - msg_ptr->tel.tel_data_ptr[2] = MISC_HB(packet_bandwidth); - msg_ptr->tel.tel_data_ptr[3] = MISC_LB(packet_bandwidth); - - msg_ptr->info_ptr = &self->ssubs[INIC_SSUB_NW_STARTUP]; - Trcv_TxSendMsgExt(self->xcvr_ptr, msg_ptr, &Inic_MsgTxStatusCb, self); - - (void)Ssub_AddObserver(&self->ssubs[INIC_SSUB_NW_STARTUP], obs_ptr); - } - else - { - self->startup_locked = false; - result = UCS_RET_ERR_BUFFER_OVERFLOW; - } - } - else - { - result = UCS_RET_ERR_API_LOCKED; - } - - return result; -} - -/*! \brief This function shuts down the entire MOST network. - * \param self Reference to CInic instance - * \param obs_ptr Reference to an optional observer. The result must be casted into type - * Inic_StdResult_t. - * \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 Inic_NwShutdown(CInic *self, CSingleObserver *obs_ptr) -{ - Ucs_Return_t result = UCS_RET_SUCCESS; - - if(Al_Lock(&self->lock.api, INIC_API_NW_SHUTDOWN) != false) - { - Msg_MostTel_t *msg_ptr = Trcv_TxAllocateMsg(self->xcvr_ptr, 0U); - - if (msg_ptr != NULL) - { - msg_ptr->destination_addr = self->target_address; - - msg_ptr->id.fblock_id = FB_INIC; - msg_ptr->id.instance_id = 0U; - msg_ptr->id.function_id = INIC_FID_MOST_NW_SHUTDOWN; - msg_ptr->id.op_type = UCS_OP_STARTRESULT; - - msg_ptr->info_ptr = &self->ssubs[INIC_SSUB_NW_SHUTDOWN]; - Trcv_TxSendMsgExt(self->xcvr_ptr, msg_ptr, &Inic_MsgTxStatusCb, self); - - (void)Ssub_AddObserver(&self->ssubs[INIC_SSUB_NW_SHUTDOWN], obs_ptr); - } - else - { - Al_Release(&self->lock.api, INIC_API_NW_SHUTDOWN); - result = UCS_RET_ERR_BUFFER_OVERFLOW; - } - } - else - { - result = UCS_RET_ERR_API_LOCKED; - } - - return result; -} - -/*! \brief This function triggers the Ring Break Diagnosis. - * \param self Reference to CInic instance - * \param type Specifies if the INIC starts the RBD as a TimingMaster or TimingSlave. - * \param obs_ptr Reference to an optional observer. The result must be casted into type - * Inic_StdResult_t. - * \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 Inic_NwTriggerRbd(CInic *self, Ucs_Diag_RbdType_t type, CSingleObserver *obs_ptr) -{ - Ucs_Return_t result = UCS_RET_SUCCESS; - - if(Al_Lock(&self->lock.api, INIC_API_NW_TRIGGER_RBD) != false) - { - Msg_MostTel_t *msg_ptr = Trcv_TxAllocateMsg(self->xcvr_ptr, 1U); - - if (msg_ptr != NULL) - { - self->lock.rbd_trigger_timeout_counter = 0U; - - msg_ptr->destination_addr = self->target_address; - - msg_ptr->id.fblock_id = FB_INIC; - msg_ptr->id.instance_id = 0U; - msg_ptr->id.function_id = INIC_FID_MOST_NW_TRIGGER_RBD; - msg_ptr->id.op_type = UCS_OP_STARTRESULT; - - msg_ptr->tel.tel_data_ptr[0] = (uint8_t)type; - - msg_ptr->info_ptr = &self->ssubs[INIC_SSUB_NW_TRIGGER_RBD]; - Trcv_TxSendMsgExt(self->xcvr_ptr, msg_ptr, &Inic_MsgTxStatusCb, self); - - (void)Ssub_AddObserver(&self->ssubs[INIC_SSUB_NW_TRIGGER_RBD], obs_ptr); - } - else - { - Al_Release(&self->lock.api, INIC_API_NW_TRIGGER_RBD); - result = UCS_RET_ERR_BUFFER_OVERFLOW; - } - } - else - { - result = UCS_RET_ERR_API_LOCKED; - } - - return result; -} - -/*! \brief This function triggers the INIC to force the NotAvailable state - * \param self Reference to CInic instance - * \param force Is \c true if the INIC shall force the network in NotAvailable state. - * If \c false the INIC shall no no longer force the network to NotAvailable state. - * \param obs_ptr Reference to an optional observer. The result must be casted into type - * Inic_StdResult_t. - * \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 Inic_NwForceNotAvailable(CInic *self, bool force, CSingleObserver *obs_ptr) -{ - Ucs_Return_t result = UCS_RET_SUCCESS; - - if (Al_Lock(&self->lock.api, INIC_API_NW_FORCE_NA) != false) - { - Msg_MostTel_t *msg_ptr = Trcv_TxAllocateMsg(self->xcvr_ptr, 1U); - - if (msg_ptr != NULL) - { - msg_ptr->destination_addr = self->target_address; - msg_ptr->id.fblock_id = FB_INIC; - msg_ptr->id.instance_id = 0U; - msg_ptr->id.function_id = INIC_FID_MOST_NW_FORCE_NO_AVAIL; - msg_ptr->id.op_type = UCS_OP_SETGET; - - if (force == false) - { - msg_ptr->tel.tel_data_ptr[0] = 0U; - } - else - { - msg_ptr->tel.tel_data_ptr[0] = 1U; - } - - msg_ptr->info_ptr = &self->ssubs[INIC_SSUB_NW_FORCE_NA]; - Trcv_TxSendMsgExt(self->xcvr_ptr, msg_ptr, &Inic_MsgTxStatusCb, self); - - (void)Ssub_AddObserver(&self->ssubs[INIC_SSUB_NW_FORCE_NA], obs_ptr); - } - else - { - Al_Release(&self->lock.api, INIC_API_NW_FORCE_NA); - result = UCS_RET_ERR_BUFFER_OVERFLOW; - } - } - else - { - result = UCS_RET_ERR_API_LOCKED; - } - - return result; -} - -/*! \brief This function modifies the INIC network configuration. - * \param self Reference to CInic instance - * \param mask Allows to change a single, multiple, or all parameters - * \param config Holds the parameter values - * \param obs_ptr Reference to an optional observer. The result must be casted into type - * Inic_StdResult_t. - * \return UCS_RET_SUCCESS message was created - * \return UCS_RET_ERR_BUFFER_OVERFLOW no message buffer available - */ -Ucs_Return_t Inic_NwConfig_SetGet(CInic *self, uint16_t mask, Inic_NetworkConfig_t config, - CSingleObserver *obs_ptr) -{ - Ucs_Return_t result = UCS_RET_SUCCESS; - Msg_MostTel_t *msg_ptr = Trcv_TxAllocateMsg(self->xcvr_ptr, 24U); - - if (msg_ptr != NULL) - { - mask = mask & 7U; /* allow only bit 0..2 */ - msg_ptr->destination_addr = self->target_address; - - msg_ptr->id.fblock_id = FB_INIC; - msg_ptr->id.instance_id = 0U; - msg_ptr->id.function_id = INIC_FID_MOST_NW_CFG; - msg_ptr->id.op_type = UCS_OP_SETGET; - - msg_ptr->tel.tel_data_ptr[0] = MISC_HB(mask); - msg_ptr->tel.tel_data_ptr[1] = MISC_LB(mask); - msg_ptr->tel.tel_data_ptr[2] = MISC_HB(config.node_address); - msg_ptr->tel.tel_data_ptr[3] = MISC_LB(config.node_address); - msg_ptr->tel.tel_data_ptr[4] = MISC_HB(config.group_address); - msg_ptr->tel.tel_data_ptr[5] = MISC_LB(config.group_address); - msg_ptr->tel.tel_data_ptr[6] = config.llrbc; - MISC_MEM_SET(&msg_ptr->tel.tel_data_ptr[7], 0, 17U); - - Trcv_TxSendMsg(self->xcvr_ptr, msg_ptr); - - (void)Ssub_AddObserver(&self->ssubs[INIC_SSUB_NW_CONFIG], obs_ptr); - } - else - { - result = UCS_RET_ERR_BUFFER_OVERFLOW; - } - - return result; -} - -/*! \brief Requests the INIC.NetworkConfiguration.Status message - * \param self Reference to CInic instance - * \param obs_ptr Reference to an optional observer. The result must be casted into type - * Inic_StdResult_t. - * \return UCS_RET_SUCCESS message was created - * \return UCS_RET_ERR_BUFFER_OVERFLOW no message buffer available - */ -Ucs_Return_t Inic_NwConfig_Get(CInic *self, 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 = self->target_address; - - msg_ptr->id.fblock_id = FB_INIC; - msg_ptr->id.instance_id = 0U; - msg_ptr->id.function_id = INIC_FID_MOST_NW_CFG; - msg_ptr->id.op_type = UCS_OP_GET; - - Trcv_TxSendMsg(self->xcvr_ptr, msg_ptr); - - (void)Ssub_AddObserver(&self->ssubs[INIC_SSUB_NW_CONFIG], obs_ptr); - } - else - { - result = UCS_RET_ERR_BUFFER_OVERFLOW; - } - - return result; -} - -/*! \brief Requests the INIC.MOSTNetworkFrameCounter.Status message - * \param self Reference to CInic instance - * \param reference Reference counter value - * \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 Inic_NwFrameCounter_Get(CInic *self, uint32_t reference, CSingleObserver *obs_ptr) -{ - Ucs_Return_t result = UCS_RET_SUCCESS; - - if(Al_Lock(&self->lock.api, INIC_API_NW_FRAME_COUNTER) != false) - { - Msg_MostTel_t *msg_ptr = Trcv_TxAllocateMsg(self->xcvr_ptr, 4U); - - if (msg_ptr != NULL) - { - msg_ptr->destination_addr = self->target_address; - - msg_ptr->id.fblock_id = FB_INIC; - msg_ptr->id.instance_id = 0U; - msg_ptr->id.function_id = INIC_FID_MOST_NW_FRAME_COUNTER; - msg_ptr->id.op_type = UCS_OP_GET; - - msg_ptr->tel.tel_data_ptr[0] = (uint8_t)(reference >> 24); - msg_ptr->tel.tel_data_ptr[1] = (uint8_t)(reference >> 16); - msg_ptr->tel.tel_data_ptr[2] = (uint8_t)(reference >> 8); - msg_ptr->tel.tel_data_ptr[3] = (uint8_t)reference; - - msg_ptr->info_ptr = &self->ssubs[INIC_SSUB_NW_FRAME_COUNTER]; - Trcv_TxSendMsgExt(self->xcvr_ptr, msg_ptr, &Inic_MsgTxStatusCb, self); - - (void)Ssub_AddObserver(&self->ssubs[INIC_SSUB_NW_FRAME_COUNTER], obs_ptr); - } - else - { - Al_Release(&self->lock.api, INIC_API_NW_FRAME_COUNTER); - result = UCS_RET_ERR_BUFFER_OVERFLOW; - } - } - else - { - result = UCS_RET_ERR_API_LOCKED; - } - - return result; -} - - - - - -/*------------------------------------------------------------------------------------------------*/ -/* Handler functions */ -/*------------------------------------------------------------------------------------------------*/ - -/*! \brief Dummy handler function for unused INIC functions - * - * \param self instance of CInic - * \param msg_ptr Pointer to received message - */ -void Inic_DummyHandler(void *self, Msg_MostTel_t *msg_ptr) -{ - MISC_UNUSED(self); - MISC_UNUSED(msg_ptr); -} - -/*! \brief Handler function for INIC.DeviceStatus.Status - * \param self Reference to CInic instance - * \param msg_ptr Pointer to received message - */ -void Inic_DeviceStatus_Status(void *self, Msg_MostTel_t *msg_ptr) -{ - CInic *self_ = (CInic *)self; - - if (msg_ptr->tel.tel_len > 0U) - { - TR_ASSERT(self_->base_ptr->ucs_user_ptr, "[INIC]", (msg_ptr->tel.tel_len == 5U)); - self_->device_status.config_iface_state= (Inic_AttachState_t)msg_ptr->tel.tel_data_ptr[0]; - self_->device_status.app_iface_state = (Inic_AttachState_t)msg_ptr->tel.tel_data_ptr[1]; - self_->device_status.power_state = (Ucs_Inic_PowerState_t)msg_ptr->tel.tel_data_ptr[2]; - self_->device_status.bist = (Inic_Bist_t)msg_ptr->tel.tel_data_ptr[3]; - self_->device_status.last_reset_reason = (Ucs_Inic_LastResetReason_t)msg_ptr->tel.tel_data_ptr[4]; - - /* INIC BIST error detected */ - if (self_->device_status.bist == INIC_BIST_ERROR) - { - Eh_ReportEvent(&self_->base_ptr->eh, EH_E_BIST_FAILED); - } - - Sub_Notify(&self_->subs[INIC_SUB_DEVICE_STATUS], &self_->device_status); - } -} - -/*! \brief Handler function for INIC.DeviceVersion.Status - * \param self Reference to CInic instance - * \param msg_ptr Pointer to received message - */ -void Inic_DeviceVersion_Status(void *self, Msg_MostTel_t *msg_ptr) -{ - CInic *self_ = (CInic *)self; - Inic_StdResult_t res_data; - - if (msg_ptr->tel.tel_len > 0U) - { - MISC_DECODE_DWORD(&(self_->device_version.product_identifier), &(msg_ptr->tel.tel_data_ptr[0])); - self_->device_version.major_version = msg_ptr->tel.tel_data_ptr[4]; - self_->device_version.minor_version = msg_ptr->tel.tel_data_ptr[5]; - self_->device_version.release_version = msg_ptr->tel.tel_data_ptr[6]; - MISC_DECODE_DWORD(&(self_->device_version.build_version), &(msg_ptr->tel.tel_data_ptr[7])); - self_->device_version.hw_revision = msg_ptr->tel.tel_data_ptr[11]; - MISC_DECODE_WORD(&(self_->device_version.diagnosis_id), &(msg_ptr->tel.tel_data_ptr[12])); - - TR_ASSERT(self_->base_ptr->ucs_user_ptr, "[INIC]", (msg_ptr->tel.tel_data_ptr[14] == 0x01U)); /* ExtIdentifier == CFGS ? */ - - self_->device_version.cs_major_version = msg_ptr->tel.tel_data_ptr[15]; - self_->device_version.cs_minor_version = msg_ptr->tel.tel_data_ptr[16]; - self_->device_version.cs_release_version = msg_ptr->tel.tel_data_ptr[17]; - - - res_data.data_info = &self_->device_version; - res_data.result.code = UCS_RES_SUCCESS; - res_data.result.info_ptr = NULL; - - - Ssub_Notify(&self_->ssubs[INIC_SSUB_DEVICE_VERSION], &res_data, true); - } - Al_Release(&self_->lock.api, INIC_API_DEVICE_VERSION_GET); -} - -/*! \brief Handler function for INIC.DeviceVersion.Error - * \param self Reference to CInic instance - * \param msg_ptr Pointer to received message - */ -void Inic_DeviceVersion_Error(void *self, Msg_MostTel_t *msg_ptr) -{ - CInic *self_ = (CInic *)self; - Inic_StdResult_t res_data; - - if (msg_ptr->tel.tel_len > 0U) - { - res_data.data_info = NULL; - res_data.result = Inic_TranslateError(self_, - &msg_ptr->tel.tel_data_ptr[0], - msg_ptr->tel.tel_len); - - Ssub_Notify(&self_->ssubs[INIC_SSUB_DEVICE_VERSION], &res_data, true); - } - Al_Release(&self_->lock.api, INIC_API_DEVICE_VERSION_GET); -} - -/*! \brief Handler function for INIC.NetworkStatus.Status - * \param self Reference to CInic instance - * \param msg_ptr Pointer to received message - */ -void Inic_NwStatus_Status(void *self, Msg_MostTel_t *msg_ptr) -{ - CInic *self_ = (CInic *)self; - Inic_StdResult_t res_data; - - if (msg_ptr->tel.tel_len > 0U) - { - res_data.data_info = &self_->network_status; - res_data.result.code = UCS_RES_SUCCESS; - res_data.result.info_ptr = NULL; - - TR_ASSERT(self_->base_ptr->ucs_user_ptr, "[INIC]", (msg_ptr->tel.tel_len == 11U)); - MISC_DECODE_WORD(&(self_->network_status.events), &(msg_ptr->tel.tel_data_ptr[0])); - self_->network_status.availability = (Ucs_Network_Availability_t)msg_ptr->tel.tel_data_ptr[2]; - self_->network_status.avail_info = (Ucs_Network_AvailInfo_t)msg_ptr->tel.tel_data_ptr[3]; - self_->network_status.avail_trans_cause = (Ucs_Network_AvailTransCause_t)msg_ptr->tel.tel_data_ptr[4]; - MISC_DECODE_WORD(&(self_->network_status.node_address), &(msg_ptr->tel.tel_data_ptr[5])); - self_->network_status.node_position = msg_ptr->tel.tel_data_ptr[7]; - self_->network_status.max_position = msg_ptr->tel.tel_data_ptr[8]; - MISC_DECODE_WORD(&(self_->network_status.packet_bw), &(msg_ptr->tel.tel_data_ptr[9])); - - Sub_Notify(&self_->subs[INIC_SUB_NW_STATUS], &res_data); - } -} - -/*! \brief Handler function for INIC.NetworkConfiguration.Status - * \param self Reference to CInic instance - * \param msg_ptr Pointer to received message - */ -void Inic_NwConfig_Status(void *self, Msg_MostTel_t *msg_ptr) -{ - CInic *self_ = (CInic *)self; - Inic_StdResult_t res_data; - - if (msg_ptr->tel.tel_len > 4U) - { - res_data.data_info = &self_->network_config; - res_data.result.code = UCS_RES_SUCCESS; - res_data.result.info_ptr = NULL; - - MISC_DECODE_WORD(&(self_->network_config.node_address), &(msg_ptr->tel.tel_data_ptr[0])); - MISC_DECODE_WORD(&(self_->network_config.group_address), &(msg_ptr->tel.tel_data_ptr[2])); - self_->network_config.llrbc = msg_ptr->tel.tel_data_ptr[4]; - - Sub_Notify(&self_->subs[INIC_SUB_NW_CONFIG], &res_data); - Ssub_Notify(&self_->ssubs[INIC_SSUB_NW_CONFIG], &res_data, true); - } -} - -/*! \brief Handler function for INIC.NetworkConfiguration.Error - * \param self Reference to CInic instance - * \param msg_ptr Pointer to received message - */ -void Inic_NwConfig_Error(void *self, Msg_MostTel_t *msg_ptr) -{ - CInic *self_ = (CInic *)self; - Inic_StdResult_t res_data; - - if (msg_ptr->tel.tel_len > 0U) - { - res_data.data_info = NULL; - res_data.result = Inic_TranslateError(self_, - &msg_ptr->tel.tel_data_ptr[0], - msg_ptr->tel.tel_len); - - Ssub_Notify(&self_->ssubs[INIC_SSUB_NW_CONFIG], &res_data, true); - } -} - -/*! \brief Handler function for INIC.MOSTNetworkFrameCounter.Status - * \param self Reference to CInic instance - * \param msg_ptr Pointer to received message - */ -void Inic_NwFrameCounter_Status(void *self, Msg_MostTel_t *msg_ptr) -{ - CInic *self_ = (CInic *)self; - Inic_StdResult_t res_data; - Inic_FrameCounterStatus_t frame_counter_status; - - if (msg_ptr->tel.tel_len > 0U) - { - MISC_DECODE_DWORD(&frame_counter_status.reference, &(msg_ptr->tel.tel_data_ptr[0])); - MISC_DECODE_DWORD(&frame_counter_status.frame_counter, &(msg_ptr->tel.tel_data_ptr[4])); - frame_counter_status.lock = msg_ptr->tel.tel_data_ptr[8]; - res_data.data_info = &frame_counter_status; - res_data.result.code = UCS_RES_SUCCESS; - res_data.result.info_ptr = NULL; - - Ssub_Notify(&self_->ssubs[INIC_SSUB_NW_FRAME_COUNTER], &res_data, true); /* provides pointer to Inic_StdResult_t structure */ - } - Al_Release(&self_->lock.api, INIC_SSUB_NW_FRAME_COUNTER); -} - -/*! \brief Handler function for INIC.MOSTNetworkFrameCounter.Error - * \param self Reference to CInic instance - * \param msg_ptr Pointer to received message - */ -void Inic_NwFrameCounter_Error(void *self, Msg_MostTel_t *msg_ptr) -{ - CInic *self_ = (CInic *)self; - Inic_StdResult_t res_data; - - if (msg_ptr->tel.tel_len > 0U) - { - res_data.data_info = NULL; - res_data.result = Inic_TranslateError(self_, - &msg_ptr->tel.tel_data_ptr[0], - msg_ptr->tel.tel_len); - - Ssub_Notify(&self_->ssubs[INIC_SSUB_NW_FRAME_COUNTER], &res_data, true); /* provides pointer to Inic_StdResult_t structure */ - } - Al_Release(&self_->lock.api, INIC_SSUB_NW_FRAME_COUNTER); -} - -/*! \brief Handler function for INIC.MOSTNetworkStartup.ErrorAck - * \param self Reference to CInic instance - * \param msg_ptr Pointer to received message - */ -void Inic_NwStartup_Error(void *self, Msg_MostTel_t *msg_ptr) -{ - CInic *self_ = (CInic *)self; - Inic_StdResult_t res_data; - - self_->startup_locked = false; - res_data.data_info = NULL; - res_data.result = Inic_TranslateError(self_, - &msg_ptr->tel.tel_data_ptr[0], - (msg_ptr->tel.tel_len)); - Ssub_Notify(&self_->ssubs[INIC_SSUB_NW_STARTUP], &res_data, true); -} - -/*! \brief Handler function for INIC.MOSTNetworkStartup.ResultAck - * \param self Reference to CInic instance - * \param msg_ptr Pointer to received message - */ -void Inic_NwStartup_Result(void *self, Msg_MostTel_t *msg_ptr) -{ - CInic *self_ = (CInic *)self; - Inic_StdResult_t res_data; - MISC_UNUSED(msg_ptr); - - self_->startup_locked = false; - res_data.data_info = NULL; - res_data.result.code = UCS_RES_SUCCESS; - res_data.result.info_ptr = NULL; - Ssub_Notify(&self_->ssubs[INIC_SSUB_NW_STARTUP], &res_data, true); -} - -/*! \brief Handler function for INIC.MOSTNetworkShutdown.ErrorAck - * \param self Reference to CInic instance - * \param msg_ptr Pointer to received message - */ -void Inic_NwShutdown_Error(void *self, Msg_MostTel_t *msg_ptr) -{ - CInic *self_ = (CInic *)self; - Inic_StdResult_t res_data; - - if (msg_ptr->tel.tel_len > 0U) - { - res_data.data_info = NULL; - res_data.result = Inic_TranslateError(self_, - &msg_ptr->tel.tel_data_ptr[0], - (msg_ptr->tel.tel_len)); - Ssub_Notify(&self_->ssubs[INIC_SSUB_NW_SHUTDOWN], &res_data, true); - } - Al_Release(&self_->lock.api, INIC_API_NW_SHUTDOWN); -} - -/*! \brief Handler function for INIC.MOSTNetworkShutdown.ResultAck - * \param self Reference to CInic instance - * \param msg_ptr Pointer to received message - */ -void Inic_NwShutdown_Result(void *self, Msg_MostTel_t *msg_ptr) -{ - CInic *self_ = (CInic *)self; - Inic_StdResult_t res_data; - MISC_UNUSED(msg_ptr); - - res_data.data_info = NULL; - res_data.result.code = UCS_RES_SUCCESS; - res_data.result.info_ptr = NULL; - Ssub_Notify(&self_->ssubs[INIC_SSUB_NW_SHUTDOWN], &res_data, true); - Al_Release(&self_->lock.api, INIC_API_NW_SHUTDOWN); -} - -/*! \brief Handler function for INIC.MOSTNetworkTriggerRBD.ErrorAck - * \param self Reference to CInic instance - * \param msg_ptr Pointer to received message - */ -void Inic_NwTriggerRbd_Error(void *self, Msg_MostTel_t *msg_ptr) -{ - CInic *self_ = (CInic *)self; - Inic_StdResult_t res_data; - - if (msg_ptr->tel.tel_len > 0U) - { - res_data.data_info = NULL; - res_data.result = Inic_TranslateError(self_, - &msg_ptr->tel.tel_data_ptr[0], - (msg_ptr->tel.tel_len)); - Ssub_Notify(&self_->ssubs[INIC_SSUB_NW_TRIGGER_RBD], &res_data, true); - } - Al_Release(&self_->lock.api, INIC_API_NW_TRIGGER_RBD); -} - -/*! \brief Handler function for INIC.MOSTNetworkTriggerRBD.ResultAck - * \param self Reference to CInic instance - * \param msg_ptr Pointer to received message - */ -void Inic_NwTriggerRbd_Result(void *self, Msg_MostTel_t *msg_ptr) -{ - CInic *self_ = (CInic *)self; - Inic_StdResult_t res_data; - MISC_UNUSED(msg_ptr); - - res_data.data_info = NULL; - res_data.result.code = UCS_RES_SUCCESS; - res_data.result.info_ptr = NULL; - Ssub_Notify(&self_->ssubs[INIC_SSUB_NW_TRIGGER_RBD], &res_data, true); - Al_Release(&self_->lock.api, INIC_API_NW_TRIGGER_RBD); -} - -/*! \brief Handler function for INIC.MOSTNetworkForceNotAvailable.ErrorAck - * \param self Reference to CInic instance - * \param msg_ptr Pointer to received message - */ -void Inic_NwForceNotAvailable_Error(void *self, Msg_MostTel_t *msg_ptr) -{ - CInic *self_ = (CInic *)self; - Inic_StdResult_t res_data; - - if (msg_ptr->tel.tel_len > 0U) - { - res_data.data_info = NULL; - res_data.result = Inic_TranslateError(self_, - &msg_ptr->tel.tel_data_ptr[0], - (msg_ptr->tel.tel_len)); - Ssub_Notify(&self_->ssubs[INIC_SSUB_NW_FORCE_NA], &res_data, true); - } - Al_Release(&self_->lock.api, INIC_API_NW_FORCE_NA); -} - -/*! \brief Handler function for INIC.MOSTNetworkForceNotAvailable.ResultAck - * \param self Reference to CInic instance - * \param msg_ptr Pointer to received message - */ -void Inic_NwForceNotAvailable_Status(void *self, Msg_MostTel_t *msg_ptr) -{ - CInic *self_ = (CInic *)self; - Inic_StdResult_t res_data; - MISC_UNUSED(msg_ptr); - - res_data.data_info = NULL; - res_data.result.code = UCS_RES_SUCCESS; - res_data.result.info_ptr = NULL; - Ssub_Notify(&self_->ssubs[INIC_SSUB_NW_FORCE_NA], &res_data, true); - Al_Release(&self_->lock.api, INIC_API_NW_FORCE_NA); -} - -/*! \brief Handler function for INIC.DeviceAttach.Error - * \param self reference to INIC object - * \param msg_ptr received message - */ -void Inic_DeviceAttach_Error(void *self, Msg_MostTel_t *msg_ptr) -{ - CInic *self_ = (CInic *)self; - Inic_StdResult_t res_data; - - if (msg_ptr->tel.tel_len > 0U) - { - res_data.data_info = NULL; - res_data.result = Inic_TranslateError(self_, - &msg_ptr->tel.tel_data_ptr[0], - (msg_ptr->tel.tel_len)); - Ssub_Notify(&self_->ssubs[INIC_SSUB_DEVICE_ATTACH], &res_data, true); - } -} - -/*! \brief Handler function for INIC.DeviceAttach.Result - * \param self reference to INIC object - * \param msg_ptr received message - */ -void Inic_DeviceAttach_Result(void *self, Msg_MostTel_t *msg_ptr) -{ - CInic *self_ = (CInic *)self; - Inic_StdResult_t res_data; - - MISC_UNUSED(msg_ptr); - - res_data.data_info = NULL; - res_data.result.code = UCS_RES_SUCCESS; - res_data.result.info_ptr = NULL; - Ssub_Notify(&self_->ssubs[INIC_SSUB_DEVICE_ATTACH], &res_data, true); -} - -/*! \brief Handler function for INIC.NetworkAttach.ErrorAck - * \param self reference to INIC object - * \param msg_ptr received message - */ -void Inic_NwAttach_Error(void *self, Msg_MostTel_t *msg_ptr) -{ - CInic *self_ = (CInic *)self; - Inic_StdResult_t res_data; - - if (msg_ptr->tel.tel_len > 0U) - { - res_data.data_info = NULL; - res_data.result = Inic_TranslateError(self_, - &msg_ptr->tel.tel_data_ptr[0], - (msg_ptr->tel.tel_len)); - Ssub_Notify(&self_->ssubs[INIC_SSUB_NW_ATTACH], &res_data, true); - } -} - -/*! \brief Handler function for INIC.NetworkAttach.ResultAck - * \param self reference to INIC object - * \param msg_ptr received message - */ -void Inic_NwAttach_Result(void *self, Msg_MostTel_t *msg_ptr) -{ - CInic *self_ = (CInic *)self; - Inic_StdResult_t res_data; - - MISC_UNUSED(msg_ptr); - - res_data.data_info = NULL; - res_data.result.code = UCS_RES_SUCCESS; - res_data.result.info_ptr = NULL; - Ssub_Notify(&self_->ssubs[INIC_SSUB_NW_ATTACH], &res_data, true); -} - - - - -/*! \brief Handler function for INIC.MOSTNetworkSystemDiagnosis.Error - * \param self reference to INIC object - * \param msg_ptr received message - */ -void Inic_NwSysDiagnosis_Error(void *self, Msg_MostTel_t *msg_ptr) -{ - CInic *self_ = (CInic *)self; - Inic_StdResult_t res_data; - - if (msg_ptr->tel.tel_len > 0U) - { - res_data.data_info = NULL; - res_data.result = Inic_TranslateError(self_, - &msg_ptr->tel.tel_data_ptr[0], - (msg_ptr->tel.tel_len)); - Ssub_Notify(&self_->ssubs[INIC_SSUB_NW_SYS_DIAGNOSIS], &res_data, true); - } -} - -/*! \brief Handler function for INIC.MOSTNetworkSystemDiagnosis.Result - * \param self reference to INIC object - * \param msg_ptr received message - */ -void Inic_NwSysDiagnosis_Result(void *self, Msg_MostTel_t *msg_ptr) -{ - CInic *self_ = (CInic *)self; - Inic_StdResult_t res_data; - - MISC_UNUSED(msg_ptr); - - res_data.data_info = NULL; - res_data.result.code = UCS_RES_SUCCESS; - res_data.result.info_ptr = NULL; - Ssub_Notify(&self_->ssubs[INIC_SSUB_NW_SYS_DIAGNOSIS], &res_data, true); -} - -/*! \brief Handler function for INIC.MOSTNetworkSystemDiagnosisEnd.Error - * \param self reference to INIC object - * \param msg_ptr received message - */ -void Inic_NwSysDiagEnd_Error(void *self, Msg_MostTel_t *msg_ptr) -{ - CInic *self_ = (CInic *)self; - Inic_StdResult_t res_data; - - if (msg_ptr->tel.tel_len > 0U) - { - res_data.data_info = NULL; - res_data.result = Inic_TranslateError(self_, - &msg_ptr->tel.tel_data_ptr[0], - (msg_ptr->tel.tel_len)); - Ssub_Notify(&self_->ssubs[INIC_SSUB_NW_SYS_DIAGEND], &res_data, true); - } -} - -/*! \brief Handler function for INIC.MOSTNetworkSystemDiagnosisEnd.Result - * \param self reference to INIC object - * \param msg_ptr received message - */ -void Inic_NwSysDiagEnd_Result(void *self, Msg_MostTel_t *msg_ptr) -{ - CInic *self_ = (CInic *)self; - Inic_StdResult_t res_data; - - MISC_UNUSED(msg_ptr); - - res_data.data_info = NULL; - res_data.result.code = UCS_RES_SUCCESS; - res_data.result.info_ptr = NULL; - Ssub_Notify(&self_->ssubs[INIC_SSUB_NW_SYS_DIAGEND], &res_data, true); -} - - - -/*! \brief Handler function for INIC.BCDiag.Error - * \param self reference to INIC object - * \param msg_ptr received message - */ -void Inic_BCDiagnosis_Error(void *self, Msg_MostTel_t *msg_ptr) -{ - CInic *self_ = (CInic *)self; - Inic_StdResult_t res_data; - - res_data.data_info = NULL; - res_data.result = Inic_TranslateError(self_, - &msg_ptr->tel.tel_data_ptr[0], - (msg_ptr->tel.tel_len)); - Ssub_Notify(&self_->ssubs[INIC_SSUB_BC_DIAGNOSIS], &res_data, true); -} - -/*! \brief Handler function for INIC.BCDiag.ResultAck - * \param self reference to INIC object - * \param msg_ptr received message - */ -void Inic_BCDiagnosis_Result(void *self, Msg_MostTel_t *msg_ptr) -{ - CInic *self_ = (CInic *)self; - Inic_StdResult_t res_data; - - MISC_UNUSED(msg_ptr); - - res_data.data_info = NULL; - res_data.result.code = UCS_RES_SUCCESS; - res_data.result.info_ptr = NULL; - Ssub_Notify(&self_->ssubs[INIC_SSUB_BC_DIAGNOSIS], &res_data, true); -} - -/*! \brief Handler function for INIC.BCDiagEnd.Error - * \param self reference to INIC object - * \param msg_ptr received message - */ -void Inic_BCDiagEnd_Error(void *self, Msg_MostTel_t *msg_ptr) -{ - CInic *self_ = (CInic *)self; - Inic_StdResult_t res_data; - - res_data.data_info = NULL; - res_data.result = Inic_TranslateError(self_, - &msg_ptr->tel.tel_data_ptr[0], - (msg_ptr->tel.tel_len)); - Ssub_Notify(&self_->ssubs[INIC_SSUB_BC_DIAG_END], &res_data, true); -} - -/*! \brief Handler function for INIC.BCDiagEnd.Result - * \param self reference to INIC object - * \param msg_ptr received message - */ -void Inic_BCDiagEnd_Result(void *self, Msg_MostTel_t *msg_ptr) -{ - CInic *self_ = (CInic *)self; - Inic_StdResult_t res_data; - - MISC_UNUSED(msg_ptr); - - res_data.data_info = NULL; - res_data.result.code = UCS_RES_SUCCESS; - res_data.result.info_ptr = NULL; - Ssub_Notify(&self_->ssubs[INIC_SSUB_BC_DIAG_END], &res_data, true); -} - - - - - -/*! \brief Handler function for INIC.MOSTNetworkRBDResult.Status - * \param self Reference to INIC object - * \param msg_ptr Received message - */ -void Inic_NwRbdResult_Status(void *self, Msg_MostTel_t *msg_ptr) -{ - CInic *self_ = (CInic *)self; - Inic_RbdResult_t rbd_result_data; - Inic_StdResult_t res_data; - - if (msg_ptr->tel.tel_len > 0U) - { - rbd_result_data.result = (Ucs_Diag_RbdResult_t)msg_ptr->tel.tel_data_ptr[0]; - rbd_result_data.position = msg_ptr->tel.tel_data_ptr[1]; - rbd_result_data.status = msg_ptr->tel.tel_data_ptr[2]; - MISC_DECODE_WORD(&(rbd_result_data.diag_id), &(msg_ptr->tel.tel_data_ptr[3])); - res_data.data_info = &rbd_result_data; - res_data.result.code = UCS_RES_SUCCESS; - res_data.result.info_ptr = NULL; - - Ssub_Notify(&self_->ssubs[INIC_SSUB_NW_RBD_RESULT], &res_data, true); - } - Al_Release(&self_->lock.api, INIC_API_NW_RBD_RESULT); -} - -/*! \brief Handler function for INIC.MOSTNetworkRBDResult.Error - * \param self reference to INIC object - * \param msg_ptr received message - */ -void Inic_NwRbdResult_Error(void *self, Msg_MostTel_t *msg_ptr) -{ - CInic *self_ = (CInic *)self; - Inic_StdResult_t res_data; - - if (msg_ptr->tel.tel_len > 0U) - { - res_data.data_info = NULL; - res_data.result = Inic_TranslateError(self_, - &msg_ptr->tel.tel_data_ptr[0], - msg_ptr->tel.tel_len); - - Ssub_Notify(&self_->ssubs[INIC_SSUB_NW_RBD_RESULT], &res_data, true); - } - Al_Release(&self_->lock.api, INIC_API_NW_RBD_RESULT); -} - - - - -/*------------------------------------------------------------------------------------------------*/ -/* Helper functions */ -/*------------------------------------------------------------------------------------------------*/ -/*! \brief Translates INIC error codes into UNICENS error codes and wraps the raw INIC - * error data to a byte stream. - * \param self Instance of CInic - * \param error_data[] INIC error data - * \param error_size Size of INIC error data in bytes - * \return The formatted error - */ -Ucs_StdResult_t Inic_TranslateError(CInic *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; -} - - -/*------------------------------------------------------------------------------------------------*/ -/* Synchronous Getters */ -/*------------------------------------------------------------------------------------------------*/ -uint16_t Inic_GetGroupAddress(CInic *self) -{ - return self->network_config.group_address; -} - -uint16_t Inic_GetPacketDataBandwidth(CInic *self) -{ - return self->network_status.packet_bw; -} - -uint16_t Inic_GetNodeAddress(CInic *self) -{ - return self->network_status.node_address; -} - -uint8_t Inic_GetNodePosition(CInic *self) -{ - return self->network_status.node_position; -} - -uint8_t Inic_GetNumberOfNodes(CInic *self) -{ - return self->network_status.max_position; -} - -uint8_t Inic_GetInicLlrbc(CInic *self) -{ - return self->network_config.llrbc; -} - -Ucs_Inic_Version_t Inic_GetDeviceVersion(CInic *self) -{ - return self->device_version; -} - -Ucs_Inic_LastResetReason_t Inic_GetLastResetReason(CInic *self) -{ - return self->device_status.last_reset_reason; -} - -Ucs_Inic_PowerState_t Inic_GetDevicePowerState(CInic *self) -{ - return self->device_status.power_state; -} - -Ucs_Network_Availability_t Inic_GetAvailability(CInic *self) -{ - return self->network_status.availability; -} - -uint16_t Inic_GetTargetAddress (CInic *self) -{ - return self->target_address; -} - -/*! - * @} - * \endcond - */ -/*------------------------------------------------------------------------------------------------*/ -/* End of file */ -/*------------------------------------------------------------------------------------------------*/ - |