cmvr_head/packages/erpc-1.14.0/erpc_c/setup/erpc_client_setup.cpp

204 lines
5.5 KiB
C++
Raw Normal View History

2025-12-30 15:44:41 +08:00
/*
* 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 *>(transport);
castedTransport->setCrc16(crc16);
client->setTransport(castedTransport);
client->setCodecFactory(codecFactory);
client->setMessageBufferFactory(reinterpret_cast<MessageBufferFactory *>(message_buffer_factory));
}
g_client = client;
return reinterpret_cast<erpc_client_t>(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<ClientManager *>(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<ClientManager *>(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<ClientManager *>(client);
clientManager->setServer(reinterpret_cast<Server *>(server));
}
void erpc_client_set_server_thread_id(erpc_client_t client, void *serverThreadId)
{
erpc_assert(client != NULL);
ClientManager *clientManager = reinterpret_cast<ClientManager *>(client);
clientManager->setServerThreadId(reinterpret_cast<Thread::thread_id_t *>(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<ClientManager *>(client);
return clientManager->addMessageLogger(reinterpret_cast<Transport *>(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<ClientManager *>(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<ClientManager *>(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<ClientManager *>(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<ClientManager *>(client);
delete clientManager->getCodecFactory();
delete clientManager->getTransport()->getCrc16();
delete clientManager;
#endif
}