/* * Copyright (c) 2014-2016, Freescale Semiconductor, Inc. * Copyright 2016-2017 NXP * Copyright 2020-2021 ACRIOS Systems s.r.o. * All rights reserved. * * * SPDX-License-Identifier: BSD-3-Clause */ #include "erpc_client_setup.h" #include "erpc_basic_codec.hpp" #include "erpc_client_manager.h" #include "erpc_crc16.hpp" #include "erpc_manually_constructed.hpp" #include "erpc_message_buffer.hpp" #include "erpc_transport.hpp" #if ERPC_NESTED_CALLS #include "erpc_threading.h" #endif using namespace erpc; //////////////////////////////////////////////////////////////////////////////// // Variables //////////////////////////////////////////////////////////////////////////////// // global client variables ERPC_MANUALLY_CONSTRUCTED_STATIC(ClientManager, s_client); #if defined(__MINGW32__) __declspec(selectany) #endif ClientManager *g_client; #if !defined(__MINGW32__) #pragma weak g_client #endif ERPC_MANUALLY_CONSTRUCTED_STATIC(BasicCodecFactory, s_codecFactory); ERPC_MANUALLY_CONSTRUCTED_STATIC(Crc16, s_crc16); //////////////////////////////////////////////////////////////////////////////// // Code //////////////////////////////////////////////////////////////////////////////// erpc_client_t erpc_client_init(erpc_transport_t transport, erpc_mbf_t message_buffer_factory) { erpc_assert(transport != NULL); erpc_assert(message_buffer_factory != NULL); Transport *castedTransport; BasicCodecFactory *codecFactory; Crc16 *crc16; ClientManager *client; #if ERPC_ALLOCATION_POLICY == ERPC_ALLOCATION_POLICY_STATIC if (s_codecFactory.isUsed() || s_crc16.isUsed() || s_client.isUsed()) { client = NULL; } else { // Init factories. s_codecFactory.construct(); codecFactory = s_codecFactory.get(); s_crc16.construct(); crc16 = s_crc16.get(); // Init the client manager. s_client.construct(); client = s_client.get(); } #elif ERPC_ALLOCATION_POLICY == ERPC_ALLOCATION_POLICY_DYNAMIC // Init factories. codecFactory = new BasicCodecFactory(); crc16 = new Crc16(); // Init the client manager. client = new ClientManager(); if ((codecFactory == NULL) || (crc16 == NULL) || (client == NULL)) { if (codecFactory != NULL) { delete codecFactory; } if (crc16 != NULL) { delete crc16; } if (client != NULL) { delete client; } client = NULL; } #else #error "Unknown eRPC allocation policy!" #endif if (client != NULL) { // Init client manager with the provided transport. castedTransport = reinterpret_cast(transport); castedTransport->setCrc16(crc16); client->setTransport(castedTransport); client->setCodecFactory(codecFactory); client->setMessageBufferFactory(reinterpret_cast(message_buffer_factory)); } g_client = client; return reinterpret_cast(client); } void erpc_client_set_error_handler(erpc_client_t client, client_error_handler_t error_handler) { erpc_assert(client != NULL); ClientManager *clientManager = reinterpret_cast(client); clientManager->setErrorHandler(error_handler); } void erpc_client_set_crc(erpc_client_t client, uint32_t crcStart) { erpc_assert(client != NULL); ClientManager *clientManager = reinterpret_cast(client); clientManager->getTransport()->getCrc16()->setCrcStart(crcStart); } #if ERPC_NESTED_CALLS void erpc_client_set_server(erpc_client_t client, erpc_server_t server) { erpc_assert(client != NULL); ClientManager *clientManager = reinterpret_cast(client); clientManager->setServer(reinterpret_cast(server)); } void erpc_client_set_server_thread_id(erpc_client_t client, void *serverThreadId) { erpc_assert(client != NULL); ClientManager *clientManager = reinterpret_cast(client); clientManager->setServerThreadId(reinterpret_cast(serverThreadId)); } #endif #if ERPC_MESSAGE_LOGGING bool erpc_client_add_message_logger(erpc_client_t client, erpc_transport_t transport) { erpc_assert(client != NULL); ClientManager *clientManager = reinterpret_cast(client); return clientManager->addMessageLogger(reinterpret_cast(transport)); } #endif #if ERPC_PRE_POST_ACTION void erpc_client_add_pre_cb_action(erpc_client_t client, pre_post_action_cb preCB) { erpc_assert(client != NULL); ClientManager *clientManager = reinterpret_cast(client); clientManager->addPreCB(preCB); } void erpc_client_add_post_cb_action(erpc_client_t client, pre_post_action_cb postCB) { erpc_assert(client != NULL); ClientManager *clientManager = reinterpret_cast(client); clientManager->addPostCB(postCB); } #endif void erpc_client_deinit(erpc_client_t client) { #if ERPC_ALLOCATION_POLICY == ERPC_ALLOCATION_POLICY_STATIC (void)client; erpc_assert(reinterpret_cast(client) == s_client.get()); s_codecFactory.destroy(); s_crc16.destroy(); s_client.destroy(); #elif ERPC_ALLOCATION_POLICY == ERPC_ALLOCATION_POLICY_DYNAMIC erpc_assert(client != NULL); ClientManager *clientManager = reinterpret_cast(client); delete clientManager->getCodecFactory(); delete clientManager->getTransport()->getCrc16(); delete clientManager; #endif }