10 #include <gtest/gtest.h> 29 : ts_monotonic(tr.getMonotonicTimestamp())
30 , ts_utc(tr.getUtcTimestamp())
31 , priority(tr.getPriority())
32 , transfer_type(tr.getTransferType())
33 , transfer_id(tr.getTransferID())
34 , src_node_id(tr.getSrcNodeID())
36 , data_type(data_type)
42 int res = tr.
read(offset, buf,
sizeof(buf));
45 std::cout <<
"IncomingTransferContainer: read failure " << res << std::endl;
52 payload += std::string(reinterpret_cast<const char*>(buf),
unsigned(res));
53 offset += unsigned(res);
60 : ts_monotonic(ts_monotonic)
63 , transfer_type(transfer_type)
64 , transfer_id(transfer_id)
65 , src_node_id(src_node_id)
66 , dst_node_id(dst_node_id)
67 , data_type(data_type)
74 : ts_monotonic(
uavcan::MonotonicTime::fromUSec(ts_monotonic))
75 , ts_utc(
uavcan::UtcTime::fromUSec(ts_utc))
77 , transfer_type(transfer_type)
78 , transfer_id(transfer_id)
79 , src_node_id(src_node_id)
80 , dst_node_id(dst_node_id)
81 , data_type(data_type)
101 std::ostringstream os;
102 os <<
"ts_m=" << ts_monotonic
103 <<
" ts_utc=" << ts_utc
104 <<
" prio=" <<
int(priority.
get())
105 <<
" tt=" <<
int(transfer_type)
106 <<
" tid=" <<
int(transfer_id.
get())
107 <<
" snid=" <<
int(src_node_id.
get())
108 <<
" dnid=" <<
int(dst_node_id.
get())
109 <<
" dtid=" <<
int(data_type.
getID().
get())
110 <<
"\n\t'" << payload <<
"'";
129 : Base(perf, data_type, max_buffer_size, allocator)
134 const Transfer rx(transfer, Base::getDataTypeDescriptor());
136 std::cout <<
"Received transfer: " << rx.
toString() << std::endl;
140 const bool anonymous = single_frame &&
149 if (transfers_.empty())
151 std::cout <<
"No received transfers" << std::endl;
155 const Transfer tr = transfers_.front();
158 const bool res = (tr == reference);
161 std::cout <<
"TestSubscriber: Transfer mismatch:\n" 162 <<
"Expected: " << reference.
toString() <<
"\n" 163 <<
"Received: " << tr.
toString() << std::endl;
169 bool isEmpty()
const {
return transfers_.empty(); }
176 std::vector<uavcan::RxFrame> serializeTransfer(
const Transfer& transfer)
180 std::vector<uint8_t> raw_payload;
186 raw_payload.push_back(
uint8_t(payload_crc.
get() & 0xFF));
187 raw_payload.push_back(
uint8_t((payload_crc.
get() >> 8) & 0xFF));
189 raw_payload.insert(raw_payload.end(), transfer.
payload.begin(), transfer.
payload.end());
191 std::vector<uavcan::RxFrame> output;
203 const int bytes_left =
int(raw_payload.size()) -
int(offset);
204 EXPECT_TRUE(bytes_left >= 0);
206 const int spres = frm.setPayload(&*(raw_payload.begin() + offset),
unsigned(bytes_left));
209 std::cerr <<
">_<" << std::endl;
212 if (spres == bytes_left)
214 frm.setEndOfTransfer(
true);
217 offset += unsigned(spres);
223 output.push_back(rxfrm);
224 if (frm.isEndOfTransfer())
229 frm.setStartOfTransfer(
false);
252 : dst_node_id_(dst_node_id)
265 (dst_node_id_override.isValid() ? dst_node_id_override : dst_node_id_);
266 const Transfer tr(ts_, utc, priority, transfer_type, tid_, source_node_id, dst_node_id, payload, type);
273 void send(
const std::vector<std::vector<uavcan::RxFrame> >& sers)
279 bool all_empty =
true;
280 for (std::vector<std::vector<uavcan::RxFrame> >::const_iterator it = sers.begin(); it != sers.end(); ++it)
282 if (it->size() <= index)
287 std::cout <<
"Incoming Transfer Emulator: Sending: " << it->at(index).toString() << std::endl;
288 sendOneFrame(it->at(index));
300 std::vector<std::vector<uavcan::RxFrame> > sers;
301 while (num_transfers--)
303 sers.push_back(serializeTransfer(*transfers++));
308 template <
int SIZE>
void send(
const Transfer (&transfers)[SIZE]) {
send(transfers, SIZE); }
void send(const Transfer(&transfers)[SIZE])
void handleIncomingTransfer(uavcan::IncomingTransfer &transfer)
bool matchAndPop(const Transfer &reference)
Transfer(uint64_t ts_monotonic, uint64_t ts_utc, uavcan::TransferPriority priority, uavcan::TransferType transfer_type, uavcan::TransferID transfer_id, uavcan::NodeID src_node_id, uavcan::NodeID dst_node_id, const std::string &payload, const uavcan::DataTypeDescriptor &data_type)
Transfer(uavcan::MonotonicTime ts_monotonic, uavcan::UtcTime ts_utc, uavcan::TransferPriority priority, uavcan::TransferType transfer_type, uavcan::TransferID transfer_id, uavcan::NodeID src_node_id, uavcan::NodeID dst_node_id, const std::string &payload, const uavcan::DataTypeDescriptor &data_type)
static UtcTime fromUSec(uint64_t us)
void setStartOfTransfer(bool x)
static const NodeID Broadcast
uavcan::NodeID src_node_id
std::queue< Transfer > transfers_
uavcan::MonotonicTime ts_monotonic
unsigned getNumReceivedTransfers() const
uavcan::TransferType transfer_type
IncomingTransferEmulatorBase(uavcan::NodeID dst_node_id)
virtual void deallocate(const void *)
uavcan::DataTypeDescriptor data_type
Transfer(const uavcan::IncomingTransfer &tr, const uavcan::DataTypeDescriptor &data_type)
uavcan::NodeID dst_node_id_
Implicitly convertible to/from uavcan.Timestamp.
uavcan::MonotonicTime ts_
void send(const std::vector< std::vector< uavcan::RxFrame > > &sers)
virtual bool isAnonymousTransfer() const
uavcan::TransferListener Base
const DataTypeSignature & getSignature() const
virtual int read(unsigned offset, uint8_t *data, unsigned len) const =0
TestListener(uavcan::TransferPerfCounter &perf, const uavcan::DataTypeDescriptor &data_type, uavcan::uint16_t max_buffer_size, uavcan::IPoolAllocator &allocator)
uavcan::TransferPriority priority
static MonotonicDuration fromUSec(int64_t us)
Transfer makeTransfer(uavcan::TransferPriority priority, uavcan::TransferType transfer_type, uint8_t source_node_id, const std::string &payload, const uavcan::DataTypeDescriptor &type, uavcan::NodeID dst_node_id_override=uavcan::NodeID())
virtual uint16_t getBlockCapacity() const
uavcan::NodeID dst_node_id
TransferType getTransferType() const
virtual void * allocate(std::size_t)
std::string toString() const
virtual ~IncomingTransferEmulatorBase()
uavcan::TransferID transfer_id
bool operator==(const Transfer &rhs) const
void send(const Transfer *transfers, unsigned num_transfers)
NodeID getSrcNodeID() const
TransferCRC toTransferCRC() const