4 #include "XLink/XLink.h"
5 #include "spdlog/fmt/fmt.h"
16 XLinkStream::XLinkStream(
const std::shared_ptr<XLinkConnection> conn,
const std::string& name, std::size_t maxWriteSize) : connection(conn), streamName(name) {
17 if(name.empty())
throw std::invalid_argument(
"Cannot create XLinkStream using empty stream name");
18 if(!
connection ||
connection->getLinkId() == -1)
throw std::invalid_argument(
"Cannot create XLinkStream using unconnected XLinkConnection");
32 if(
streamId == INVALID_STREAM_ID)
throw std::runtime_error(
"Couldn't open stream");
37 : connection(
std::move(other.connection)), streamName(
std::exchange(other.streamName, {})), streamId(std::exchange(other.streamId, INVALID_STREAM_ID)) {
44 streamId = std::exchange(other.streamId, INVALID_STREAM_ID);
45 streamName = std::exchange(other.streamName, {});
64 data = std::exchange(other.data,
nullptr);
65 length = std::exchange(other.length, 0);
66 tRemoteSent = std::exchange(other.tRemoteSent, {});
67 tReceived = std::exchange(other.tReceived, {});
73 XLinkDeallocateMoveData(
data, length);
82 if(
status != X_LINK_SUCCESS) {
97 if(
status != X_LINK_SUCCESS) {
100 data = std::vector<std::uint8_t>(packet.data, packet.data + packet.length);
106 if(
status != X_LINK_SUCCESS) {
109 data = std::vector<std::uint8_t>(packet.data, packet.data + packet.length);
110 timestampReceived = packet.tReceived;
114 std::vector<std::uint8_t>
data;
120 std::vector<std::uint8_t>
data;
128 if(
status != X_LINK_SUCCESS) {
136 streamPacketDesc_t* pPacket =
nullptr;
138 if(
status != X_LINK_SUCCESS) {
152 const uint8_t*
data = (
const uint8_t*)d;
153 std::size_t currentOffset = 0;
154 std::size_t remaining =
size;
155 std::size_t sizeToTransmit = 0;
156 XLinkError_t ret = X_LINK_SUCCESS;
157 while(remaining > 0) {
158 sizeToTransmit = remaining >
split ?
split : remaining;
159 ret = XLinkWriteData(
streamId,
data + currentOffset,
static_cast<int>(sizeToTransmit));
160 if(ret != X_LINK_SUCCESS) {
163 currentOffset += sizeToTransmit;
164 remaining =
size - currentOffset;
177 auto status = XLinkWriteDataWithTimeout(
streamId,
data,
static_cast<int>(
size),
static_cast<unsigned int>(timeout.count()));
178 if(
status == X_LINK_SUCCESS) {
180 }
else if(
status == X_LINK_TIMEOUT) {
188 return write(
reinterpret_cast<const std::uint8_t*
>(
data),
size, timeout);
197 const auto status = XLinkReadMoveDataWithTimeout(
streamId, &packet,
static_cast<unsigned int>(timeout.count()));
198 if(
status == X_LINK_SUCCESS) {
199 data = std::vector<std::uint8_t>(packet.data, packet.data + packet.length);
201 }
else if(
status == X_LINK_TIMEOUT) {
209 const auto status = XLinkReadMoveDataWithTimeout(
streamId, &packet,
static_cast<unsigned int>(timeout.count()));
210 if(
status == X_LINK_SUCCESS) {
212 }
else if(
status == X_LINK_TIMEOUT) {
220 auto status = XLinkReadDataWithTimeout(
streamId, &pPacket,
static_cast<unsigned int>(timeout.count()));
221 if(
status == X_LINK_SUCCESS) {
223 }
else if(
status == X_LINK_TIMEOUT) {