Porting mros2 as an Mbed library.

Dependents:   mbed-os-example-mros2 example-mbed-mros2-sub-pose example-mbed-mros2-pub-twist example-mbed-mros2-mturtle-teleop

Committer:
smoritaemb
Date:
Sat Mar 19 09:23:37 2022 +0900
Revision:
7:c80f65422d99
Parent:
0:580aba13d1a1
Merge test_assortment_of_msgs branch.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
smoritaemb 0:580aba13d1a1 1 /*
smoritaemb 0:580aba13d1a1 2 The MIT License
smoritaemb 0:580aba13d1a1 3 Copyright (c) 2019 Lehrstuhl Informatik 11 - RWTH Aachen University
smoritaemb 0:580aba13d1a1 4 Permission is hereby granted, free of charge, to any person obtaining a copy
smoritaemb 0:580aba13d1a1 5 of this software and associated documentation files (the "Software"), to deal
smoritaemb 0:580aba13d1a1 6 in the Software without restriction, including without limitation the rights
smoritaemb 0:580aba13d1a1 7 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
smoritaemb 0:580aba13d1a1 8 copies of the Software, and to permit persons to whom the Software is
smoritaemb 0:580aba13d1a1 9 furnished to do so, subject to the following conditions:
smoritaemb 0:580aba13d1a1 10 The above copyright notice and this permission notice shall be included in
smoritaemb 0:580aba13d1a1 11 all copies or substantial portions of the Software.
smoritaemb 0:580aba13d1a1 12 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
smoritaemb 0:580aba13d1a1 13 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
smoritaemb 0:580aba13d1a1 14 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
smoritaemb 0:580aba13d1a1 15 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
smoritaemb 0:580aba13d1a1 16 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
smoritaemb 0:580aba13d1a1 17 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
smoritaemb 0:580aba13d1a1 18 THE SOFTWARE
smoritaemb 0:580aba13d1a1 19
smoritaemb 0:580aba13d1a1 20 This file is part of embeddedRTPS.
smoritaemb 0:580aba13d1a1 21
smoritaemb 0:580aba13d1a1 22 Author: i11 - Embedded Software, RWTH Aachen University
smoritaemb 0:580aba13d1a1 23 */
smoritaemb 0:580aba13d1a1 24
smoritaemb 0:580aba13d1a1 25 #ifndef RTPS_THREADPOOL_H
smoritaemb 0:580aba13d1a1 26 #define RTPS_THREADPOOL_H
smoritaemb 0:580aba13d1a1 27
smoritaemb 0:580aba13d1a1 28 #ifdef __MBED__
smoritaemb 0:580aba13d1a1 29 #ifdef __cplusplus
smoritaemb 0:580aba13d1a1 30 extern "C" {
smoritaemb 0:580aba13d1a1 31 #endif
smoritaemb 0:580aba13d1a1 32 void sys_msleep(unsigned int ms);
smoritaemb 0:580aba13d1a1 33 #ifdef __cplusplus
smoritaemb 0:580aba13d1a1 34 }
smoritaemb 0:580aba13d1a1 35 #endif
smoritaemb 0:580aba13d1a1 36 #endif /* __MBED__ */
smoritaemb 0:580aba13d1a1 37 #include "lwip/sys.h"
smoritaemb 0:580aba13d1a1 38 #include "rtps/communication/PacketInfo.h"
smoritaemb 0:580aba13d1a1 39 #include "rtps/communication/UdpDriver.h"
smoritaemb 0:580aba13d1a1 40 #include "rtps/config.h"
smoritaemb 0:580aba13d1a1 41 #include "rtps/storages/PBufWrapper.h"
smoritaemb 0:580aba13d1a1 42 #include "rtps/storages/ThreadSafeCircularBuffer.h"
smoritaemb 0:580aba13d1a1 43
smoritaemb 0:580aba13d1a1 44 #include <array>
smoritaemb 0:580aba13d1a1 45
smoritaemb 0:580aba13d1a1 46 namespace rtps {
smoritaemb 0:580aba13d1a1 47
smoritaemb 0:580aba13d1a1 48 class Writer;
smoritaemb 0:580aba13d1a1 49
smoritaemb 0:580aba13d1a1 50 class ThreadPool {
smoritaemb 0:580aba13d1a1 51 public:
smoritaemb 0:580aba13d1a1 52 using receiveJumppad_fp = void (*)(void *callee, const PacketInfo &packet);
smoritaemb 0:580aba13d1a1 53
smoritaemb 0:580aba13d1a1 54 ThreadPool(receiveJumppad_fp receiveCallback, void *callee);
smoritaemb 0:580aba13d1a1 55
smoritaemb 0:580aba13d1a1 56 ~ThreadPool();
smoritaemb 0:580aba13d1a1 57
smoritaemb 0:580aba13d1a1 58 bool startThreads();
smoritaemb 0:580aba13d1a1 59 void stopThreads();
smoritaemb 0:580aba13d1a1 60
smoritaemb 0:580aba13d1a1 61 void clearQueues();
smoritaemb 0:580aba13d1a1 62 bool addWorkload(Writer *workload);
smoritaemb 0:580aba13d1a1 63 bool addNewPacket(PacketInfo &&packet);
smoritaemb 0:580aba13d1a1 64
smoritaemb 0:580aba13d1a1 65 static void readCallback(void *arg, udp_pcb *pcb, pbuf *p,
smoritaemb 0:580aba13d1a1 66 const ip_addr_t *addr, Ip4Port_t port);
smoritaemb 0:580aba13d1a1 67 static void writerThreadFunction(void *arg);
smoritaemb 0:580aba13d1a1 68 static void readerThreadFunction(void *arg);
smoritaemb 0:580aba13d1a1 69
smoritaemb 0:580aba13d1a1 70 private:
smoritaemb 0:580aba13d1a1 71 receiveJumppad_fp m_receiveJumppad;
smoritaemb 0:580aba13d1a1 72 void *m_callee;
smoritaemb 0:580aba13d1a1 73 bool m_running = false;
smoritaemb 0:580aba13d1a1 74 std::array<sys_thread_t, Config::THREAD_POOL_NUM_WRITERS> m_writers;
smoritaemb 0:580aba13d1a1 75 std::array<sys_thread_t, Config::THREAD_POOL_NUM_READERS> m_readers;
smoritaemb 0:580aba13d1a1 76
smoritaemb 0:580aba13d1a1 77 sys_sem_t m_readerNotificationSem;
smoritaemb 0:580aba13d1a1 78 sys_sem_t m_writerNotificationSem;
smoritaemb 0:580aba13d1a1 79
smoritaemb 0:580aba13d1a1 80 ThreadSafeCircularBuffer<Writer *, Config::THREAD_POOL_WORKLOAD_QUEUE_LENGTH>
smoritaemb 0:580aba13d1a1 81 m_queueOutgoing;
smoritaemb 0:580aba13d1a1 82 ThreadSafeCircularBuffer<PacketInfo,
smoritaemb 0:580aba13d1a1 83 Config::THREAD_POOL_WORKLOAD_QUEUE_LENGTH>
smoritaemb 0:580aba13d1a1 84 m_queueIncoming;
smoritaemb 0:580aba13d1a1 85 void doWriterWork();
smoritaemb 0:580aba13d1a1 86 void doReaderWork();
smoritaemb 0:580aba13d1a1 87 };
smoritaemb 0:580aba13d1a1 88 } // namespace rtps
smoritaemb 0:580aba13d1a1 89 #ifdef __cplusplus
smoritaemb 0:580aba13d1a1 90 extern "C" {
smoritaemb 0:580aba13d1a1 91 #endif
smoritaemb 0:580aba13d1a1 92 void callWriterThreadFunction(void *arg);
smoritaemb 0:580aba13d1a1 93 void callReaderThreadFunction(void *arg);
smoritaemb 0:580aba13d1a1 94 #ifdef __cplusplus
smoritaemb 0:580aba13d1a1 95 }
smoritaemb 0:580aba13d1a1 96 #endif
smoritaemb 0:580aba13d1a1 97 #endif // RTPS_THREADPOOL_H