XLinkStream.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 // Std
4 #include <atomic>
5 #include <chrono>
6 #include <cstdint>
7 #include <list>
8 #include <memory>
9 #include <mutex>
10 #include <stdexcept>
11 #include <string>
12 #include <thread>
13 #include <tuple>
14 #include <unordered_map>
15 #include <utility>
16 #include <vector>
17 
18 // libraries
19 #include <XLink/XLinkPublicDefines.h>
20 #include <XLink/XLinkTime.h>
21 
22 // project
24 
25 namespace dai {
26 
27 class StreamPacketDesc : public streamPacketDesc_t {
28  public:
29  StreamPacketDesc() noexcept : streamPacketDesc_t{nullptr, 0, {}, {}} {};
30  StreamPacketDesc(const StreamPacketDesc&) = delete;
31  StreamPacketDesc(StreamPacketDesc&& other) noexcept;
33  StreamPacketDesc& operator=(StreamPacketDesc&& other) noexcept;
34  ~StreamPacketDesc() noexcept;
35 };
36 
37 class XLinkStream {
38  // static
39  constexpr static int STREAM_OPEN_RETRIES = 5;
40  constexpr static std::chrono::milliseconds WAIT_FOR_STREAM_RETRY{50};
41 
42  std::shared_ptr<XLinkConnection> connection;
43  std::string streamName;
44  streamId_t streamId{INVALID_STREAM_ID};
45 
46  public:
47  XLinkStream(const std::shared_ptr<XLinkConnection> conn, const std::string& name, std::size_t maxWriteSize);
48  XLinkStream(const XLinkStream&) = delete;
49  XLinkStream(XLinkStream&& stream);
50  XLinkStream& operator=(const XLinkStream&) = delete;
52  ~XLinkStream();
53 
54  // Blocking
55  void write(const void* data, std::size_t size);
56  void write(const std::uint8_t* data, std::size_t size);
57  void write(const std::vector<std::uint8_t>& data);
58  std::vector<std::uint8_t> read();
59  std::vector<std::uint8_t> read(XLinkTimespec& timestampReceived);
60  void read(std::vector<std::uint8_t>& data);
61  void read(std::vector<std::uint8_t>& data, XLinkTimespec& timestampReceived);
62  // split write helper
63  void writeSplit(const void* data, std::size_t size, std::size_t split);
64  void writeSplit(const std::vector<uint8_t>& data, std::size_t split);
65  StreamPacketDesc readMove();
66 
67  // Timeout
68  bool write(const void* data, std::size_t size, std::chrono::milliseconds timeout);
69  bool write(const std::uint8_t* data, std::size_t size, std::chrono::milliseconds timeout);
70  bool write(const std::vector<std::uint8_t>& data, std::chrono::milliseconds timeout);
71  bool read(std::vector<std::uint8_t>& data, std::chrono::milliseconds timeout);
72  bool readMove(StreamPacketDesc& packet, const std::chrono::milliseconds timeout);
73  // TODO optional<StreamPacketDesc> readMove(timeout) -or- tuple<bool, StreamPacketDesc> readMove(timeout)
74 
75  // deprecated use readMove() instead; readRaw leads to memory violations and/or memory leaks
76  [[deprecated("use readMove()")]] streamPacketDesc_t* readRaw();
77  // deprecated use readMove(packet, timeout) instead; readRaw leads to memory violations and/or memory leaks
78  [[deprecated("use readMove(packet, timeout)")]] bool readRaw(streamPacketDesc_t*& pPacket, std::chrono::milliseconds timeout);
79  // deprecated; unsafe leads to memory violations and/or memory leaks
80  [[deprecated]] void readRawRelease();
81 
82  streamId_t getStreamId() const;
83 };
84 
85 struct XLinkError : public std::runtime_error {
86  const XLinkError_t status = X_LINK_ERROR;
87  const std::string streamName;
88 
89  using std::runtime_error::runtime_error;
90 
91  XLinkError(XLinkError_t statusID, std::string stream, const std::string& message)
92  : runtime_error(message), status(statusID), streamName(std::move(stream)) {}
93 };
94 struct XLinkReadError : public XLinkError {
96  XLinkReadError(XLinkError_t status, const std::string& stream);
97 };
98 struct XLinkWriteError : public XLinkError {
100  XLinkWriteError(XLinkError_t status, const std::string& stream);
101 };
102 
103 } // namespace dai
dai::XLinkReadError::XLinkError
XLinkError XLinkError
Definition: XLinkStream.hpp:95
dai::XLinkError::XLinkError
XLinkError(XLinkError_t statusID, std::string stream, const std::string &message)
Definition: XLinkStream.hpp:91
dai::StreamPacketDesc::StreamPacketDesc
StreamPacketDesc() noexcept
Definition: XLinkStream.hpp:29
dai::StreamPacketDesc
Definition: XLinkStream.hpp:27
dai::XLinkError
Definition: XLinkStream.hpp:85
dai::XLinkStream
Definition: XLinkStream.hpp:37
dai::XLinkReadError
Definition: XLinkStream.hpp:94
split
std::vector< int > split(std::string s, std::string delimiter)
Definition: poe_set_ip.cpp:9
dai::XLinkWriteError::XLinkError
XLinkError XLinkError
Definition: XLinkStream.hpp:99
dai::XLinkStream::connection
std::shared_ptr< XLinkConnection > connection
Definition: XLinkStream.hpp:42
DAI_SPAN_NAMESPACE_NAME::detail::data
constexpr auto data(C &c) -> decltype(c.data())
Definition: span.hpp:177
dai::XLinkWriteError
Definition: XLinkStream.hpp:98
DAI_SPAN_NAMESPACE_NAME::detail::size
constexpr auto size(const C &c) -> decltype(c.size())
Definition: span.hpp:167
dai::XLinkError::streamName
const std::string streamName
Definition: XLinkStream.hpp:87
XLinkConnection.hpp
dai::StreamPacketDesc::~StreamPacketDesc
~StreamPacketDesc() noexcept
Definition: XLinkStream.cpp:72
dai::StreamPacketDesc::operator=
StreamPacketDesc & operator=(const StreamPacketDesc &)=delete
nanorpc::core::detail::pack::meta::status
status
Definition: pack_meta.h:33
std
Definition: Node.hpp:366
dai
Definition: CameraExposureOffset.hpp:6
dai::XLinkStream::streamName
std::string streamName
Definition: XLinkStream.hpp:43


depthai
Author(s): Martin Peterlin
autogenerated on Sat Mar 22 2025 02:58:19