Autoware.Auto
socket_can_sender.hpp
Go to the documentation of this file.
1 // Copyright 2019 the Autoware Foundation
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //    http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 //
15 // Co-developed by Tier IV, Inc. and Apex.AI, Inc.
18 #ifndef SOCKETCAN__SOCKET_CAN_SENDER_HPP_
19 #define SOCKETCAN__SOCKET_CAN_SENDER_HPP_
20 
21 #include <common/types.hpp>
24 
25 #include <chrono>
26 #include <string>
27 
29 
30 namespace autoware
31 {
32 namespace drivers
33 {
34 namespace socketcan
35 {
36 
39 {
40 public:
42  explicit SocketCanSender(
43  const std::string & interface = "can0",
44  const CanId & default_id = CanId{});
46  ~SocketCanSender() noexcept;
47 
56  void send(
57  const void * const data,
58  const std::size_t length,
59  const std::chrono::nanoseconds timeout = std::chrono::nanoseconds::zero()) const;
69  void send(
70  const void * const data,
71  const std::size_t length,
72  const CanId id,
73  const std::chrono::nanoseconds timeout = std::chrono::nanoseconds::zero()) const;
81  template<typename T, typename = std::enable_if_t<!std::is_pointer<T>::value>>
82  void send(
83  const T & data,
84  const std::chrono::nanoseconds timeout = std::chrono::nanoseconds::zero()) const
85  {
86  send(data, m_default_id, timeout);
87  }
88 
97  template<typename T, typename = std::enable_if_t<!std::is_pointer<T>::value>>
98  void send(
99  const T & data,
100  const CanId id,
101  const std::chrono::nanoseconds timeout = std::chrono::nanoseconds::zero()) const
102  {
103  static_assert(sizeof(data) <= MAX_DATA_LENGTH, "Data type too large for CAN");
104  //lint -e586 I have to use reinterpret cast because I'm operating on bytes, see below NOLINT
105  send_impl(reinterpret_cast<const char8_t *>(&data), sizeof(data), id, timeout);
106  // reinterpret_cast to byte, or (unsigned) char is well defined;
107  // all pointers can implicitly convert to void *
108  }
109 
111  CanId default_id() const noexcept;
112 
113 private:
114  // Underlying implementation of sending, data is assumed to be of an appropriate length
115  void send_impl(
116  const void * const data,
117  const std::size_t length,
118  const CanId id,
119  const std::chrono::nanoseconds timeout) const;
120  // Wait for file descriptor to be available to send data via select()
121  SOCKETCAN_LOCAL void wait(const std::chrono::nanoseconds timeout) const;
122 
123  int32_t m_file_descriptor{};
124  CanId m_default_id;
125 }; // class SocketCanSender
126 
127 } // namespace socketcan
128 } // namespace drivers
129 } // namespace autoware
130 
131 #endif // SOCKETCAN__SOCKET_CAN_SENDER_HPP_
autoware::drivers::socketcan::SocketCanSender::send
void send(const T &data, const CanId id, const std::chrono::nanoseconds timeout=std::chrono::nanoseconds::zero()) const
Definition: socket_can_sender.hpp:98
visibility_control.hpp
catr_diff.T
T
Definition: catr_diff.py:22
autoware::drivers::socketcan::SocketCanSender
Simple RAII wrapper around a raw CAN sender.
Definition: socket_can_sender.hpp:38
types.hpp
This file includes common type definition.
autoware::drivers::socketcan::MAX_DATA_LENGTH
constexpr std::size_t MAX_DATA_LENGTH
Definition: socket_can_id.hpp:36
SOCKETCAN_PUBLIC
#define SOCKETCAN_PUBLIC
Definition: drivers/socketcan/include/socketcan/visibility_control.hpp:44
SOCKETCAN_LOCAL
#define SOCKETCAN_LOCAL
Definition: drivers/socketcan/include/socketcan/visibility_control.hpp:45
autoware::common::types::char8_t
char char8_t
Definition: types.hpp:34
autoware
This file defines the lanelet2_map_provider_node class.
Definition: quick_sort.hpp:24
autoware::drivers::socketcan::SocketCanSender::send
void send(const T &data, const std::chrono::nanoseconds timeout=std::chrono::nanoseconds::zero()) const
Definition: socket_can_sender.hpp:82
autoware::drivers::socketcan::CanId
Definition: socket_can_id.hpp:64
socket_can_id.hpp
This file defines a class a socket sender.