socket_can_wrapper.cpp
Go to the documentation of this file.
1 
6 #include <fcntl.h>
7 #include <poll.h>
8 #include <string.h>
9 #include <unistd.h>
10 #include <linux/can/raw.h>
11 #include <net/if.h>
12 #include <sys/ioctl.h>
13 #include <stdint.h>
14 #include <ros/console.h>
15 #include "socket_can_wrapper.h"
16 
19 {
20  ROS_DEBUG_STREAM("[SocketCAN::" << __func__ << "] called");
21 
22  can_socket_ = -1;
23  interface_name_ = "";
24 }
25 
27 {
28  ROS_DEBUG_STREAM("[SocketCAN::" << __func__ << "] called");
29 }
30 
31 bool SocketCAN::initialize(const char *interface_name)
32 {
33  bool b_result = false;
34  struct sockaddr_can addr;
35  struct ifreq ifr;
36  int flags;
37 
38  ROS_INFO_STREAM("[SocketCAN::" << __func__ << "] called");
39 
40 #ifdef DUMMYMODE
41  ROS_INFO_STREAM("DUMMY " << __func__ << ", always TRUE");
42  b_result = true;
43 #else
44 
45  if(can_socket_ == -1)
46  {
47  this->interface_name_ = interface_name;
48 
49  /* Create the socket */
50  can_socket_ = socket(PF_CAN, SOCK_RAW, CAN_RAW);
51 
52  if (can_socket_ != -1)
53  {
54  /* Get the interface index by interface name */
55  addr.can_family = AF_CAN;
56  strcpy(ifr.ifr_name, interface_name_.c_str());
57 
58  if(ioctl(can_socket_, SIOCGIFINDEX, &ifr) != -1)
59  {
60  addr.can_ifindex = ifr.ifr_ifindex;
61 
62  /* Set the non-blocking socket flag */
63  flags = fcntl(can_socket_, F_GETFL, 0);
64 
65  if(flags != -1)
66  {
67  fcntl(can_socket_, F_SETFL, flags | O_NONBLOCK);
68 
69  /* Bind the socket */
70  if(bind(can_socket_, (struct sockaddr *) &addr, sizeof(addr)) == 0)
71  {
72  b_result = true;
73  }
74  else
75  {
76  ROS_ERROR_STREAM("[" << __func__ << "] Binding the CAN socket failed");
77  close(can_socket_);
78  can_socket_ = -1;
79  }
80  }
81  else
82  {
83  ROS_ERROR_STREAM("[" << __func__ << "] Setting F_GETFL flag failed");
84  close(can_socket_);
85  can_socket_ = -1;
86  }
87  }
88  else
89  {
90  ROS_ERROR_STREAM("[" << __func__ << "] Getting the interface index failed");
91  close(can_socket_);
92  can_socket_ = -1;
93  }
94  }
95  else
96  {
97  ROS_ERROR_STREAM("[" << __func__ << "] Creating a CAN socket failed");
98  }
99  }
100  else
101  {
102  ROS_ERROR_STREAM("[" << __func__ << "] There is an opened CAN socket already");
103  }
104 
105 #endif
106  return b_result;
107 }
108 
110 {
111  ROS_INFO_STREAM("[SocketCAN::" << __func__ << "] called");
112 
113 #ifdef DUMMYMODE
114  ROS_INFO_STREAM("DUMMY " << __func__ << ", always TRUE");
115 #else
116 
117  if (can_socket_ != -1)
118  {
119  close(can_socket_);
120  can_socket_ = -1;
121  }
122 
123 #endif
124  return;
125 }
126 
128 {
129  bool b_result = false;
130 
131 #ifdef DUMMYMODE
132  b_result = true;
133 #else
134 
135  if (can_socket_ != -1)
136  {
137  struct pollfd pfd;
138 
139  pfd.fd = can_socket_;
140  pfd.revents = 0;
141  pfd.events = POLLIN;
142 
143  /* Poll the CAN socket for incoming data */
144  if (poll(&pfd, 1, 0) == 1)
145  {
146  /* Ignore all events except for incoming data */
147  if (pfd.revents == POLLIN)
148  {
149  b_result = true;
150  }
151  }
152  }
153  else
154  {
155  ROS_ERROR_STREAM("[" << __func__ << "] Error: No opened CAN socket");
156  }
157 
158 #endif
159  return b_result;
160 }
161 
162 bool SocketCAN::readFrame(uint32_t *id, uint8_t *data, uint8_t *size)
163 {
164  bool b_result = false;
165 
166 #ifdef DUMMYMODE
167  b_result = true;
168 #else
169 
170  if(can_socket_ != -1)
171  {
172  can_frame frame;
173  ssize_t count = read(can_socket_, &frame, sizeof(can_frame));
174 
175  if (count == sizeof(can_frame))
176  {
177  *id = frame.can_id;
178  *size = frame.can_dlc;
179  memcpy(data, frame.data, frame.can_dlc);
180  b_result = true;
181  }
182  else
183  {
184  ROS_ERROR_STREAM("[" << __func__ << "] Error: Incorrect size of CAN frame (size = " << count << ")");
185  }
186  }
187  else
188  {
189  ROS_ERROR_STREAM("[" << __func__ << "] Error: No opened CAN socket");
190  }
191 
192 #endif
193  return b_result;
194 }
195 
196 bool SocketCAN::writeFrame(uint32_t id, uint8_t *data, uint8_t size)
197 {
198  bool b_result = false;
199 
200 #ifdef DUMMYMODE
201  b_result = true;
202 #else
203 
204  if (can_socket_ != -1)
205  {
206  can_frame frame;
207 
208  frame.can_id = id;
209  frame.can_dlc = size;
210  memcpy(frame.data, data, frame.can_dlc);
211 
212  ssize_t count = write(can_socket_, &frame, sizeof(can_frame));
213 
214  if (count == sizeof(can_frame))
215  {
216  b_result = true;
217  }
218  else
219  {
220  ROS_ERROR_STREAM("[" << __func__ << "] Error: Incorrect size of CAN frame (size = " << count << ")");
221  }
222  }
223  else
224  {
225  ROS_ERROR_STREAM("[" << __func__ << "] Error: No opened CAN socket");
226  }
227 
228 #endif
229  return b_result;
230 }
231 
ROS_ERROR_STREAM
#define ROS_ERROR_STREAM(args)
SocketCAN::initialize
bool initialize(const char *interface_name)
Definition: socket_can_wrapper.cpp:31
SocketCAN::framesAvailable
bool framesAvailable()
Definition: socket_can_wrapper.cpp:127
ROS_DEBUG_STREAM
#define ROS_DEBUG_STREAM(args)
console.h
SocketCAN::deinitialize
void deinitialize()
Definition: socket_can_wrapper.cpp:109
SocketCAN::can_socket_
int can_socket_
Definition: socket_can_wrapper.h:34
SocketCAN::interface_name_
std::string interface_name_
Definition: socket_can_wrapper.h:35
SocketCAN::writeFrame
bool writeFrame(uint32_t id, uint8_t *data, uint8_t size)
Definition: socket_can_wrapper.cpp:196
ROS_INFO_STREAM
#define ROS_INFO_STREAM(args)
SocketCAN::SocketCAN
SocketCAN()
Definition: socket_can_wrapper.cpp:18
SocketCAN::readFrame
bool readFrame(uint32_t *id, uint8_t *data, uint8_t *size)
Definition: socket_can_wrapper.cpp:162
socket_can_wrapper.h
SocketCAN::~SocketCAN
~SocketCAN()
Definition: socket_can_wrapper.cpp:26


adi_tmcl
Author(s):
autogenerated on Wed Apr 2 2025 02:43:01