/* * Copyright (C) 2014 Pavel Kirienko */ #pragma once #include #include #include #include #include "../node/test_node.hpp" template class SubscriptionCollector : uavcan::Noncopyable { typedef uavcan::ReceivedDataStructure ReceivedDataStructType; void handler(const ReceivedDataStructType& msg) { this->msg.reset(new ReceivedDataStructType(msg)); } public: std::auto_ptr msg; typedef uavcan::MethodBinder Binder; Binder bind() { return Binder(this, &SubscriptionCollector::handler); } }; template struct SubscriberWithCollector { typedef SubscriptionCollector Collector; typedef uavcan::Subscriber Subscriber; Collector collector; Subscriber subscriber; SubscriberWithCollector(uavcan::INode& node) : subscriber(node) { } int start() { return subscriber.start(collector.bind()); } }; template class ServiceCallResultCollector : uavcan::Noncopyable { typedef uavcan::ServiceCallResult ResultType; void handler(const ResultType& result) { this->result.reset(new ResultType(result)); } public: std::auto_ptr result; typedef uavcan::MethodBinder Binder; Binder bind() { return Binder(this, &ServiceCallResultCollector::handler); } }; template struct ServiceClientWithCollector { typedef ServiceCallResultCollector Collector; typedef uavcan::ServiceClient ServiceClient; Collector collector; ServiceClient client; ServiceClientWithCollector(uavcan::INode& node) : client(node) { } int call(uavcan::NodeID node_id, const typename DataType::Request& request) { client.setCallback(collector.bind()); return client.call(node_id, request); } }; struct BackgroundSpinner : uavcan::TimerBase { uavcan::INode& spinning_node; BackgroundSpinner(uavcan::INode& spinning_node, uavcan::INode& running_node) : uavcan::TimerBase(running_node) , spinning_node(spinning_node) { } virtual void handleTimerEvent(const uavcan::TimerEvent&) { spinning_node.spin(uavcan::MonotonicDuration::fromMSec(1)); } };