Dispatcher class, tests to come

This commit is contained in:
Pavel Kirienko
2014-02-14 19:19:23 +04:00
parent 69fa8643d4
commit 20c828912f
2 changed files with 304 additions and 0 deletions
@@ -0,0 +1,93 @@
/*
* Copyright (C) 2014 Pavel Kirienko <pavel.kirienko@gmail.com>
*/
#pragma once
#include <cassert>
#include <stdint.h>
#include <uavcan/internal/transport/transfer_listener.hpp>
#include <uavcan/internal/transport/outgoing_transfer_registry.hpp>
#include <uavcan/internal/transport/can_io.hpp>
#include <uavcan/internal/linked_list.hpp>
namespace uavcan
{
class Dispatcher : Noncopyable
{
CanIOManager canio_;
ISystemClock* const sysclock_;
IOutgoingTransferRegistry* const outgoing_transfer_reg_;
class ListenerRegister
{
LinkedListRoot<TransferListenerBase> list_;
class DataTypeIDInsertionComparator
{
const uint16_t id_;
public:
DataTypeIDInsertionComparator(uint16_t id) : id_(id) { }
bool operator()(const TransferListenerBase* listener) const
{
assert(listener);
return id_ > listener->getDataTypeDescriptor()->id;
}
};
public:
enum Mode { UNIQUE_LISTENER, MANY_LISTENERS };
bool add(TransferListenerBase* listener, Mode mode);
void remove(TransferListenerBase* listener);
void cleanup(uint64_t ts_monotonic);
void handleFrame(const RxFrame& frame);
};
ListenerRegister lmsg_;
ListenerRegister lsrv_req_;
ListenerRegister lsrv_resp_;
const uint8_t self_node_id_;
void handleFrame(const CanRxFrame& can_frame);
public:
Dispatcher(ICanDriver* driver, IAllocator* allocator, ISystemClock* sysclock, IOutgoingTransferRegistry* otr,
uint8_t self_node_id)
: canio_(driver, allocator, sysclock)
, sysclock_(sysclock)
, outgoing_transfer_reg_(otr)
, self_node_id_(self_node_id)
{
assert(driver);
assert(allocator);
assert(sysclock);
assert(otr);
}
int spin(uint64_t monotonic_deadline);
/**
* Refer to CanIOManager::send() for the parameter description
*/
int send(const Frame& frame, uint64_t monotonic_tx_deadline, uint64_t monotonic_blocking_deadline,
CanTxQueue::Qos qos);
void cleanup(uint64_t ts_monotonic);
bool registerMessageListener(TransferListenerBase* listener);
bool registerServiceRequestListener(TransferListenerBase* listener);
bool registerServiceResponseListener(TransferListenerBase* listener);
void unregisterMessageListener(TransferListenerBase* listener);
void unregisterServiceRequestListener(TransferListenerBase* listener);
void unregisterServiceResponseListener(TransferListenerBase* listener);
IOutgoingTransferRegistry* getOutgoingTransferRegistry() { return outgoing_transfer_reg_; }
uint8_t getSelfNodeID() const { return self_node_id_; }
};
}