1
0
mirror of https://gitlab.com/obbart/universal_robots_ros_driver.git synced 2026-04-10 18:10:47 +02:00

Improved pipeline design

This commit is contained in:
Simon Rasmussen
2017-04-13 10:39:22 +02:00
parent a4ca9f1703
commit 06b2db45bf
3 changed files with 54 additions and 6 deletions

View File

@@ -1,6 +1,7 @@
#pragma once #pragma once
#include <atomic> #include <atomic>
#include <chrono>
#include <thread> #include <thread>
#include <vector> #include <vector>
#include "ur_modern_driver/log.h" #include "ur_modern_driver/log.h"
@@ -23,7 +24,52 @@ public:
{ {
} }
virtual bool consume(unique_ptr<T> product) = 0; virtual bool consume(shared_ptr<T> product) = 0;
};
template <typename T>
class MultiConsumer : public IConsumer<T>
{
private:
std::vector<IConsumer<T>*> consumers_;
public:
MultiConsumer(std::vector<IConsumer<T>*> consumers) : consumers_(consumers)
{
}
virtual void setupConsumer()
{
for(auto &con : consumers_)
{
con->setupConsumer();
}
}
virtual void teardownConsumer()
{
for(auto &con : consumers_)
{
con->teardownConsumer();
}
}
virtual void stopConsumer()
{
for(auto &con : consumers_)
{
con->stopConsumer();
}
}
bool consume(shared_ptr<T> product)
{
bool res = true;
for(auto &con : consumers_)
{
if(!con->consume(product))
res = false;
}
return res;
}
}; };
template <typename T> template <typename T>
@@ -87,8 +133,8 @@ private:
{ {
// 16000us timeout was chosen because we should // 16000us timeout was chosen because we should
// roughly recieve messages at 125hz which is every // roughly recieve messages at 125hz which is every
// 8ms == 8000us and double it for some error margin // 8ms so double it for some error margin
if (!queue_.wait_dequeue_timed(product, 16000)) if (!queue_.wait_dequeue_timed(product, std::chrono::milliseconds(16)))
{ {
continue; continue;
} }

View File

@@ -10,7 +10,7 @@
class URRTPacketConsumer : public IConsumer<RTPacket> class URRTPacketConsumer : public IConsumer<RTPacket>
{ {
public: public:
virtual bool consume(unique_ptr<RTPacket> packet) virtual bool consume(shared_ptr<RTPacket> packet)
{ {
return packet->consumeWith(*this); return packet->consumeWith(*this);
} }
@@ -24,7 +24,7 @@ public:
class URStatePacketConsumer : public IConsumer<StatePacket> class URStatePacketConsumer : public IConsumer<StatePacket>
{ {
public: public:
virtual bool consume(unique_ptr<StatePacket> packet) virtual bool consume(shared_ptr<StatePacket> packet)
{ {
return packet->consumeWith(*this); return packet->consumeWith(*this);
} }
@@ -41,7 +41,7 @@ public:
class URMessagePacketConsumer : public IConsumer<MessagePacket> class URMessagePacketConsumer : public IConsumer<MessagePacket>
{ {
public: public:
virtual bool consume(unique_ptr<MessagePacket> packet) virtual bool consume(shared_ptr<MessagePacket> packet)
{ {
return packet->consumeWith(*this); return packet->consumeWith(*this);
} }

View File

@@ -32,6 +32,8 @@ class URStatePacketConsumer;
class StatePacket class StatePacket
{ {
public: public:
StatePacket() {}
virtual ~StatePacket() {}
virtual bool parseWith(BinParser& bp) = 0; virtual bool parseWith(BinParser& bp) = 0;
virtual bool consumeWith(URStatePacketConsumer& consumer) = 0; virtual bool consumeWith(URStatePacketConsumer& consumer) = 0;
}; };