Program Listing for File node.hpp

Return to documentation for file (/tmp/ws/src/myactuator_rmd/include/myactuator_rmd/can/node.hpp)

#ifndef MYACTUATOR_RMD__CAN__NODE
#define MYACTUATOR_RMD__CAN__NODE
#pragma once

#include <array>
#include <chrono>
#include <cstdint>
#include <string>

#include "myactuator_rmd/can/frame.hpp"


namespace myactuator_rmd {
  namespace can {

    class Node {
      public:
        Node(std::string const& ifname, std::chrono::microseconds const& send_timeout = std::chrono::seconds(1),
             std::chrono::microseconds const& receive_timeout = std::chrono::seconds(1), bool const is_signal_errors = true);
        Node() = delete;
        Node(Node const&) = delete;
        Node& operator = (Node const&) = default;
        Node(Node&&) = default;
        Node& operator = (Node&&) = default;
        ~Node();

        void setLoopback(bool const is_loopback);

        void setRecvFilter(std::uint32_t const& can_id, bool const is_invert = false);

        void setSendTimeout(std::chrono::microseconds const& timeout);

        void setRecvTimeout(std::chrono::microseconds const& timeout);

        void setErrorFilters(bool const is_signal_errors);

        [[nodiscard]]
        Frame read() const;

        void write(Frame const& frame);

        void write(std::uint32_t const can_id, std::array<std::uint8_t,8> const& data);

      protected:
        void initSocket(std::string const& ifname);

        void closeSocket() noexcept;

        std::string ifname_;
        int socket_;
    };

  }
}

#endif // MYACTUATOR_RMD__CAN__NODE