feat(tcp): TCPStreamer DataSources, in-process TCPStreamService, stream multiplexing and TCPStreamJoin
Add TCPStreamer/TCPStreamerClient (TCP transport behind the UDPSServerI/UDPSClientI seam), an optional single in-process TCPStreamService serving many streams over worker threads, multiplexed SUBSCRIBE (comma list, stream index in fragmentIdx), and TCPStreamJoin, which merges several streams into one sample-and-hold stream paced by a master. StreamHub takes a comma list of streams over one connection. Includes GTests, E2E scenarios s58-s73 and docs. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
1 parent
5562877c99
commit
50d85363a3
79 files changed
+12348
-138
No files matched your search
@@ -0,0 +1,71 @@
|
||||
#ifndef UDPS_TRANSPORT_I_H_
|
||||
#define UDPS_TRANSPORT_I_H_
|
||||
|
||||
/**
|
||||
* @file UDPSTransportI.h
|
||||
* @brief Abstract transport seams used by the UDPStreamer / UDPStreamerClient
|
||||
* DataSources.
|
||||
*
|
||||
* The DataSources only ever touch their transport through these few calls, so
|
||||
* a different transport (TCP) can be plugged in without duplicating the
|
||||
* serialisation, quantisation, publishing and decode logic.
|
||||
*/
|
||||
|
||||
#include "CompilerTypes.h"
|
||||
#include "StructuredDataI.h"
|
||||
|
||||
namespace MARTe {
|
||||
|
||||
class UDPSClientListener;
|
||||
|
||||
/**
|
||||
* @brief Producer-side transport. NOT thread-safe: every call must come from
|
||||
* the owner's sender thread.
|
||||
*/
|
||||
class UDPSServerI {
|
||||
public:
|
||||
virtual ~UDPSServerI() {}
|
||||
|
||||
/** Read the transport configuration. */
|
||||
virtual bool Initialise(StructuredDataI &data) = 0;
|
||||
/** Open sockets and start accepting clients (idempotent). */
|
||||
virtual bool Start() = 0;
|
||||
/** Close everything (idempotent). */
|
||||
virtual bool Stop() = 0;
|
||||
/** Non-blocking housekeeping: accept/evict clients, drain queues. */
|
||||
virtual void ServiceClients() = 0;
|
||||
/** Publish (and cache) a CONFIG payload. */
|
||||
virtual bool SendConfig(const uint8 *payload, uint32 payloadSize) = 0;
|
||||
/** Publish a DATA payload. */
|
||||
virtual bool SendData(uint32 counter, const uint8 *payload, uint32 payloadSize) = 0;
|
||||
/** @return true when at least one client is attached. */
|
||||
virtual bool HasClients() const = 0;
|
||||
/** @return true when the transport uses multicast. */
|
||||
virtual bool IsMulticast() const = 0;
|
||||
/** @return the (bound) port. */
|
||||
virtual uint16 GetPort() const = 0;
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Consumer-side transport. Delivers through UDPSClientListener.
|
||||
*/
|
||||
class UDPSClientI {
|
||||
public:
|
||||
virtual ~UDPSClientI() {}
|
||||
|
||||
virtual bool Initialise(StructuredDataI &data) = 0;
|
||||
/** Must be called before Start(). */
|
||||
virtual void SetListener(UDPSClientListener *listener) = 0;
|
||||
virtual bool Start() = 0;
|
||||
virtual bool Stop() = 0;
|
||||
/**
|
||||
* @return Packets missing between the previous DATA packet and the one
|
||||
* being delivered (valid inside OnUDPSData). 0 when the transport does
|
||||
* not track it.
|
||||
*/
|
||||
virtual uint32 GetLastDataGap() const { return 0u; }
|
||||
};
|
||||
|
||||
} // namespace MARTe
|
||||
|
||||
#endif // UDPS_TRANSPORT_I_H_
|
||||
Reference in new issue
Block a user