.. _program_listing_file_include_depthai_xlink_XLinkStream.hpp: Program Listing for File XLinkStream.hpp ======================================== |exhale_lsh| :ref:`Return to documentation for file ` (``include/depthai/xlink/XLinkStream.hpp``) .. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS .. code-block:: cpp #pragma once // Std #include #include #include #include #include #include #include #include #include #include #include #include #include // libraries #include #include // project #include "depthai/xlink/XLinkConnection.hpp" namespace dai { class StreamPacketDesc : public streamPacketDesc_t { public: StreamPacketDesc() noexcept : streamPacketDesc_t{nullptr, 0, {}, {}} {}; StreamPacketDesc(const StreamPacketDesc&) = delete; StreamPacketDesc(StreamPacketDesc&& other) noexcept; StreamPacketDesc& operator=(const StreamPacketDesc&) = delete; StreamPacketDesc& operator=(StreamPacketDesc&& other) noexcept; ~StreamPacketDesc() noexcept; }; class XLinkStream { // static constexpr static int STREAM_OPEN_RETRIES = 5; constexpr static std::chrono::milliseconds WAIT_FOR_STREAM_RETRY{50}; std::shared_ptr connection; std::string streamName; streamId_t streamId{INVALID_STREAM_ID}; public: XLinkStream(const std::shared_ptr conn, const std::string& name, std::size_t maxWriteSize); XLinkStream(const XLinkStream&) = delete; XLinkStream(XLinkStream&& stream); XLinkStream& operator=(const XLinkStream&) = delete; XLinkStream& operator=(XLinkStream&& stream); ~XLinkStream(); // Blocking void write(const void* data, std::size_t size); void write(const std::uint8_t* data, std::size_t size); void write(const std::vector& data); std::vector read(); std::vector read(XLinkTimespec& timestampReceived); void read(std::vector& data); void read(std::vector& data, XLinkTimespec& timestampReceived); // split write helper void writeSplit(const void* data, std::size_t size, std::size_t split); void writeSplit(const std::vector& data, std::size_t split); StreamPacketDesc readMove(); // Timeout bool write(const void* data, std::size_t size, std::chrono::milliseconds timeout); bool write(const std::uint8_t* data, std::size_t size, std::chrono::milliseconds timeout); bool write(const std::vector& data, std::chrono::milliseconds timeout); bool read(std::vector& data, std::chrono::milliseconds timeout); bool readMove(StreamPacketDesc& packet, const std::chrono::milliseconds timeout); // TODO optional readMove(timeout) -or- tuple readMove(timeout) // deprecated use readMove() instead; readRaw leads to memory violations and/or memory leaks [[deprecated("use readMove()")]] streamPacketDesc_t* readRaw(); // deprecated use readMove(packet, timeout) instead; readRaw leads to memory violations and/or memory leaks [[deprecated("use readMove(packet, timeout)")]] bool readRaw(streamPacketDesc_t*& pPacket, std::chrono::milliseconds timeout); // deprecated; unsafe leads to memory violations and/or memory leaks [[deprecated]] void readRawRelease(); streamId_t getStreamId() const; }; struct XLinkError : public std::runtime_error { const XLinkError_t status = X_LINK_ERROR; const std::string streamName; using std::runtime_error::runtime_error; XLinkError(XLinkError_t statusID, std::string stream, const std::string& message) : runtime_error(message), status(statusID), streamName(std::move(stream)) {} }; struct XLinkReadError : public XLinkError { using XLinkError = XLinkError; XLinkReadError(XLinkError_t status, const std::string& stream); }; struct XLinkWriteError : public XLinkError { using XLinkError = XLinkError; XLinkWriteError(XLinkError_t status, const std::string& stream); }; } // namespace dai