diff --git a/include/ur_modern_driver/pipeline.h b/include/ur_modern_driver/pipeline.h index 49b1c9e..9f487b1 100644 --- a/include/ur_modern_driver/pipeline.h +++ b/include/ur_modern_driver/pipeline.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include #include "ur_modern_driver/log.h" @@ -23,7 +24,52 @@ public: { } - virtual bool consume(unique_ptr product) = 0; + virtual bool consume(shared_ptr product) = 0; +}; + +template +class MultiConsumer : public IConsumer +{ +private: + std::vector*> consumers_; + +public: + MultiConsumer(std::vector*> 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 product) + { + bool res = true; + for(auto &con : consumers_) + { + if(!con->consume(product)) + res = false; + } + return res; + } }; template @@ -87,8 +133,8 @@ private: { // 16000us timeout was chosen because we should // roughly recieve messages at 125hz which is every - // 8ms == 8000us and double it for some error margin - if (!queue_.wait_dequeue_timed(product, 16000)) + // 8ms so double it for some error margin + if (!queue_.wait_dequeue_timed(product, std::chrono::milliseconds(16))) { continue; } diff --git a/include/ur_modern_driver/ur/consumer.h b/include/ur_modern_driver/ur/consumer.h index 991401a..6617a80 100644 --- a/include/ur_modern_driver/ur/consumer.h +++ b/include/ur_modern_driver/ur/consumer.h @@ -10,7 +10,7 @@ class URRTPacketConsumer : public IConsumer { public: - virtual bool consume(unique_ptr packet) + virtual bool consume(shared_ptr packet) { return packet->consumeWith(*this); } @@ -24,7 +24,7 @@ public: class URStatePacketConsumer : public IConsumer { public: - virtual bool consume(unique_ptr packet) + virtual bool consume(shared_ptr packet) { return packet->consumeWith(*this); } @@ -41,7 +41,7 @@ public: class URMessagePacketConsumer : public IConsumer { public: - virtual bool consume(unique_ptr packet) + virtual bool consume(shared_ptr packet) { return packet->consumeWith(*this); } diff --git a/include/ur_modern_driver/ur/state.h b/include/ur_modern_driver/ur/state.h index b76d34e..4aeddba 100644 --- a/include/ur_modern_driver/ur/state.h +++ b/include/ur_modern_driver/ur/state.h @@ -32,6 +32,8 @@ class URStatePacketConsumer; class StatePacket { public: + StatePacket() {} + virtual ~StatePacket() {} virtual bool parseWith(BinParser& bp) = 0; virtual bool consumeWith(URStatePacketConsumer& consumer) = 0; };