Program Listing for File hi_can.hpp¶
↰ Return to documentation for file (software/shared/hi-can/include/hi_can.hpp)
#pragma once
#include <set>
#include "hi_can_address.hpp"
#include "hi_can_packet.hpp"
#include "hi_can_parameter.hpp"
namespace hi_can
{
class CanInterface
{
public:
virtual void transmit(const Packet& packet) = 0;
virtual std::optional<Packet> receive(bool blocking = false) = 0;
virtual void receive_all(bool block = true);
virtual void set_receive_callback(const packet_callback_t& callback) { _receive_callback = callback; };
void clear_receive_callback() { set_receive_callback(nullptr); }
protected:
packet_callback_t _receive_callback = nullptr;
};
class FilteredCanInterface : public CanInterface
{
public:
virtual FilteredCanInterface& add_filter(const addressing::filter_t& filter);
virtual FilteredCanInterface& remove_filter(const addressing::filter_t& filter);
virtual const std::set<addressing::filter_t>& get_filters() const { return _filters; }
virtual std::optional<addressing::filter_t> find_matching_filter(const addressing::flagged_address_t& address) const;
virtual bool address_matches_filters(const addressing::flagged_address_t& address) const;
protected:
std::set<addressing::filter_t> _filters;
};
class SoftwareFilteredCanInterface : public FilteredCanInterface
{
public:
SoftwareFilteredCanInterface(const std::shared_ptr<CanInterface> interface)
: _interface(interface)
{
}
// note: docs inherited from base class
void transmit(const Packet& packet) override { _interface->transmit(packet); }
std::optional<Packet> receive(bool blocking = false) override;
// note: no need to override set_receive_callback since that's based on the receive method
private:
const std::shared_ptr<CanInterface> _interface;
};
};