8 # pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant" 16 #include "../transport/can/can.hpp" 34 scheduler(can_driver, pool, clock_driver),
35 internal_failure_count(0)
42 std::cout <<
"TestNode internal failure: " << msg << std::endl;
43 internal_failure_count++;
67 this->others.insert(with);
87 if (inout_masks.
read == 1)
89 inout_masks.
read = (!read_queue.empty() || !loopback_queue.empty()) ? 1 : 0;
91 if (inout_masks.
read || inout_masks.
write)
104 assert(!others.empty());
105 for (std::set<PairableCanDriver*>::iterator it = others.begin(); it != others.end(); ++it)
107 (*it)->read_queue.push(frame);
111 loopback_queue.push(frame);
120 if (loopback_queue.empty())
122 assert(read_queue.size());
123 out_frame = read_queue.front();
129 out_frame = loopback_queue.front();
130 loopback_queue.pop();
133 out_ts_utc = clock.
getUtc();
139 read_queue.push(can_frame);
148 template <
typename ClockType>
161 , a(can_a, clock_a, nid_first)
162 , b(can_b, clock_b, nid_second)
170 , a(can_a, clock_a, 1)
171 , b(can_b, clock_b, 2)
179 unsigned nspins2 = unsigned(duration.
toMSec() / 2);
180 nspins2 = nspins2 ? nspins2 : 1;
181 while (nspins2 --> 0)
203 template <
unsigned NumNodes>
214 , node(can_driver, clock, node_id)
218 std::unique_ptr<NodeEnvironment> nodes[NumNodes];
231 nodes[i]->can_driver.linkTogether(&nodes[k]->can_driver);
237 assert(nodes[i]->can_driver.others.size() == (NumNodes - 1));
244 unsigned nspins = unsigned(duration.
toMSec() / NumNodes);
245 nspins = nspins ? nspins : 1;
262 if (index >= NumNodes)
264 throw std::out_of_range(
"No such test node");
266 return nodes[index]->node;
virtual void registerInternalFailure(const char *msg)
virtual uavcan::uint64_t getErrorCount() const
virtual MonotonicTime getMonotonic() const =0
void pushRxToAllIfaces(const uavcan::CanFrame &can_frame)
virtual UtcTime getUtc() const =0
virtual uavcan::ICanIface * getIface(uavcan::uint8_t iface_index)
std::queue< uavcan::CanFrame > loopback_queue
virtual uavcan::int16_t select(uavcan::CanSelectMasks &inout_masks, const uavcan::CanFrame *(&)[uavcan::MaxCanIfaces], uavcan::MonotonicTime blocking_deadline)
std::set< PairableCanDriver * > others
uavcan::HeapBasedPoolAllocator< uavcan::MemPoolBlockSize > pool
uint64_t internal_failure_count
virtual uavcan::uint8_t getNumIfaces() const
void linkTogether(PairableCanDriver *with)
TestNetwork(uavcan::uint8_t first_node_id=1)
virtual uavcan::IPoolAllocator & getAllocator()
virtual const uavcan::Scheduler & getScheduler() const
InterlinkedTestNodes< SystemClockMock > InterlinkedTestNodesWithClockMock
InterlinkedTestNodes(uavcan::NodeID nid_first, uavcan::NodeID nid_second)
TestNode & operator[](unsigned index)
Implicitly convertible to/from uavcan.Timestamp.
uavcan::ISystemClock & clock
TestNode(uavcan::ICanDriver &can_driver, uavcan::ISystemClock &clock_driver, uavcan::NodeID self_node_id)
InterlinkedTestNodes< SystemClockDriver > InterlinkedTestNodesWithSysClock
virtual uavcan::int16_t configureFilters(const uavcan::CanFilterConfig *, uavcan::uint16_t)
virtual uavcan::int16_t send(const uavcan::CanFrame &frame, uavcan::MonotonicTime, uavcan::CanIOFlags flags)
virtual uavcan::int16_t receive(uavcan::CanFrame &out_frame, uavcan::MonotonicTime &out_ts_monotonic, uavcan::UtcTime &out_ts_utc, uavcan::CanIOFlags &out_flags)
int spin(MonotonicTime deadline)
virtual uavcan::uint16_t getNumFilters() const
int spinAll(uavcan::MonotonicDuration duration)
virtual uavcan::Scheduler & getScheduler()
uavcan::Scheduler scheduler
static const CanIOFlags CanIOFlagLoopback
static MonotonicDuration fromMSec(int64_t ms)
int spinBoth(uavcan::MonotonicDuration duration)
std::queue< uavcan::CanFrame > read_queue
PairableCanDriver(uavcan::ISystemClock &clock)
NodeEnvironment(uavcan::NodeID node_id)
PairableCanDriver can_driver
virtual const uavcan::ICanIface * getIface(uavcan::uint8_t iface_index) const
bool setNodeID(NodeID nid)