/* * 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_server_setup.h" #include "erpc_basic_codec.hpp" #include "erpc_crc16.hpp" #include "erpc_manually_constructed.hpp" #include "erpc_message_buffer.hpp" #include "erpc_simple_server.hpp" #include "erpc_transport.hpp" using namespace erpc; //////////////////////////////////////////////////////////////////////////////// // Variables //////////////////////////////////////////////////////////////////////////////// // global server variables ERPC_MANUALLY_CONSTRUCTED_STATIC(SimpleServer, s_server); ERPC_MANUALLY_CONSTRUCTED_STATIC(BasicCodecFactory, s_codecFactory); ERPC_MANUALLY_CONSTRUCTED_STATIC(Crc16, s_crc16); //////////////////////////////////////////////////////////////////////////////// // Code //////////////////////////////////////////////////////////////////////////////// erpc_server_t erpc_server_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; SimpleServer *simpleServer; #if ERPC_ALLOCATION_POLICY == ERPC_ALLOCATION_POLICY_STATIC if (s_codecFactory.isUsed() || s_crc16.isUsed() || s_server.isUsed()) { simpleServer = NULL; } else { // Init factories. s_codecFactory.construct(); codecFactory = s_codecFactory.get(); s_crc16.construct(); crc16 = s_crc16.get(); // Init the client manager. s_server.construct(); simpleServer = s_server.get(); } #elif ERPC_ALLOCATION_POLICY == ERPC_ALLOCATION_POLICY_DYNAMIC // Init factories. codecFactory = new BasicCodecFactory(); crc16 = new Crc16(); // Init the client manager. simpleServer = new SimpleServer(); if ((codecFactory == NULL) || (crc16 == NULL) || (simpleServer == NULL)) { if (codecFactory != NULL) { delete codecFactory; } if (crc16 != NULL) { delete crc16; } if (simpleServer != NULL) { delete simpleServer; } simpleServer = NULL; } #else #error "Unknown eRPC allocation policy!" #endif if (simpleServer != NULL) { // Init server with the provided transport. castedTransport = reinterpret_cast(transport); castedTransport->setCrc16(crc16); simpleServer->setTransport(castedTransport); simpleServer->setCodecFactory(codecFactory); simpleServer->setMessageBufferFactory(reinterpret_cast(message_buffer_factory)); } return reinterpret_cast(simpleServer); } void erpc_server_deinit(erpc_server_t server) { #if ERPC_ALLOCATION_POLICY == ERPC_ALLOCATION_POLICY_STATIC (void)server; erpc_assert(reinterpret_cast(server) == s_server.get()); s_crc16.destroy(); s_codecFactory.destroy(); s_server.destroy(); #elif ERPC_ALLOCATION_POLICY == ERPC_ALLOCATION_POLICY_DYNAMIC erpc_assert(server != NULL); SimpleServer *simpleServer = reinterpret_cast(server); delete simpleServer->getCodecFactory(); delete simpleServer->getTransport()->getCrc16(); delete simpleServer; #else #error "Unknown eRPC allocation policy!" #endif } void erpc_add_service_to_server(erpc_server_t server, void *service) { erpc_assert(server != NULL); SimpleServer *simpleServer = reinterpret_cast(server); simpleServer->addService(static_cast(service)); } void erpc_remove_service_from_server(erpc_server_t server, void *service) { erpc_assert(server != NULL); erpc_assert(service != NULL); SimpleServer *simpleServer = reinterpret_cast(server); simpleServer->removeService(static_cast(service)); } void erpc_server_set_crc(erpc_server_t server, uint32_t crcStart) { erpc_assert(server != NULL); SimpleServer *simpleServer = reinterpret_cast(server); simpleServer->getTransport()->getCrc16()->setCrcStart(crcStart); } erpc_status_t erpc_server_run(erpc_server_t server) { erpc_assert(server != NULL); SimpleServer *simpleServer = reinterpret_cast(server); return simpleServer->run(); } erpc_status_t erpc_server_poll(erpc_server_t server) { erpc_assert(server != NULL); SimpleServer *simpleServer = reinterpret_cast(server); return simpleServer->poll(); } void erpc_server_stop(erpc_server_t server) { erpc_assert(server != NULL); SimpleServer *simpleServer = reinterpret_cast(server); simpleServer->stop(); } #if ERPC_MESSAGE_LOGGING bool erpc_server_add_message_logger(erpc_server_t server, erpc_transport_t transport) { erpc_assert(server != NULL); SimpleServer *simpleServer = reinterpret_cast(server); return simpleServer->addMessageLogger(reinterpret_cast(transport)); } #endif #if ERPC_PRE_POST_ACTION void erpc_client_add_pre_cb_action(erpc_server_t server, pre_post_action_cb preCB) { erpc_assert(server != NULL); SimpleServer *simpleServer = reinterpret_cast(server); simpleServer->addPreCB(preCB); } void erpc_client_add_post_cb_action(erpc_server_t server, pre_post_action_cb postCB) { erpc_assert(server != NULL); SimpleServer *simpleServer = reinterpret_cast(server); simpleServer->addPostCB(postCB); } #endif