YARP
Yet Another Robot Platform
CanBusInterface.h
Go to the documentation of this file.
1 /*
2  * SPDX-FileCopyrightText: 2006-2021 Istituto Italiano di Tecnologia (IIT)
3  * SPDX-FileCopyrightText: 2006-2010 RobotCub Consortium
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #ifndef YARP_DEV_CANBUSINTERFACE_H
8 #define YARP_DEV_CANBUSINTERFACE_H
9 
10 #include <cstring> // for std::memset
11 
12 #include <yarp/dev/api.h>
13 #include <yarp/os/Log.h>
14 
17 namespace yarp {
18  namespace dev {
19  class ICanBus;
20  class ICanBufferFactory;
21  class ICanBusErrors;
22  class CanMessage;
23  class CanBuffer;
24  class CanErrors;
25  template <class M, class T> class ImplementCanBufferFactory;
26  }
27 }
28 
30 {
31 public:
33  {
34  txCanErrors=0; //can device tx errors
35  rxCanErrors=0; //can device rx errors
36  busoff=false; //bus off
37  rxCanFifoOvr=0; // can device rx overflow
38  txCanFifoOvr=0; // can device tx overflow
39  txBufferOvr=0; // tx buffer overflow
40  rxBufferOvr=0; // rx buffer overflow
41  }
42 
43  int txCanErrors; //can device tx errors
44  int rxCanErrors; //can device rx errors
45  bool busoff; //bus off
46  unsigned int rxCanFifoOvr; // can device rx overflow
47  unsigned int txCanFifoOvr; // can device tx overflow
48  unsigned int txBufferOvr; // tx buffer overflow
49  unsigned int rxBufferOvr; // rx buffer overflow
50 };
51 
53 {
54  public:
55  virtual ~CanMessage(){}
56  virtual CanMessage &operator=(const CanMessage &l)=0;
57  virtual unsigned int getId() const =0;
58  virtual unsigned char getLen() const =0;
59  virtual void setLen(unsigned char len) =0;
60  virtual void setId(unsigned int id) =0;
61  virtual const unsigned char *getData() const =0;
62  virtual unsigned char *getData() =0;
63  virtual unsigned char *getPointer()=0;
64  virtual const unsigned char *getPointer() const =0;
65  virtual void setBuffer(unsigned char *)=0;
66 };
67 
69 {
70  yarp::dev::CanMessage **data;
71  int size;
72 
73 public:
74  CanBuffer();
75 
76  void resize(CanMessage **d, int s)
77  {
78  size=s;
79  data=d;
80  }
81 
83  {
84  return data;
85  }
86 
87  const CanMessage *const *getPointer() const
88  {
89  return data;
90  }
91 
93  {
94  return *data[k];
95  }
96  const CanMessage &operator[](int k) const
97  {
98  return *data[k];
99  }
100 };
101 
103 {
104 public:
105  virtual ~ICanBufferFactory(){}
106  virtual CanBuffer createBuffer(int nmessage)=0;
107  virtual void destroyBuffer(CanBuffer &msgs)=0;
108 };
109 
115 template<class M, class IMPL>
117 {
118 public:
120 
121  virtual CanBuffer createBuffer(int elem)
122  {
123  CanBuffer ret;
124  IMPL *storage=new IMPL[elem];
125  CanMessage **messages=new CanMessage *[elem];
126  M *tmp=new M[elem];
127 
128  std::memset(storage, 0, sizeof(IMPL)*elem);
129 
130  for(int k=0;k<elem;k++)
131  {
132  messages[k]=&tmp[k];
133  messages[k]->setBuffer((unsigned char *)(&storage[k]));
134  }
135 
136  ret.resize(messages, elem);
137  return ret;
138  }
139 
141  {
142  CanMessage **m=buffer.getPointer();
143  IMPL *storage=0;
144  M *msgs=0;
145 
146  if (m==0)
147  {
148  yError("Warning trying to destroy non valid buffer\n");
149  return;
150  }
151 
152  storage=reinterpret_cast<IMPL *>(m[0]->getPointer());
153  msgs=dynamic_cast<M *>(m[0]);
154 
155  if ((msgs==0)||(storage==0))
156  {
157  yError("Warning, troubles destroying memory\n");
158  return;
159  }
160 
161  delete [] storage;
162  delete [] msgs;
163  delete [] m;
164  }
165 };
166 
171 {
172  public:
173  virtual ~ICanBus(){}
174 
175 
176  virtual bool canSetBaudRate(unsigned int rate)=0;
177  virtual bool canGetBaudRate(unsigned int *rate)=0;
178  virtual bool canIdAdd(unsigned int id)=0;
179  virtual bool canIdDelete(unsigned int id)=0;
180 
181  virtual bool canRead(CanBuffer &msgs,
182  unsigned int size,
183  unsigned int *read,
184  bool wait=false)=0;
185 
186  virtual bool canWrite(const CanBuffer &msgs,
187  unsigned int size,
188  unsigned int *sent,
189  bool wait=false)=0;
190 };
191 
193 {
194 public:
195  virtual bool canGetErrors(yarp::dev::CanErrors &err)=0;
196 
197  virtual ~ICanBusErrors(){}
198 };
199 
200 #endif // YARP_DEV_CANBUSINTERFACE_H
bool ret
#define yError(...)
Definition: Log.h:279
#define IMPL()
Definition: Port.cpp:43
const CanMessage & operator[](int k) const
const CanMessage *const * getPointer() const
CanMessage ** getPointer()
CanMessage & operator[](int k)
void resize(CanMessage **d, int s)
unsigned int rxCanFifoOvr
unsigned int rxBufferOvr
unsigned int txBufferOvr
unsigned int txCanFifoOvr
virtual unsigned char getLen() const =0
virtual CanMessage & operator=(const CanMessage &l)=0
virtual unsigned int getId() const =0
virtual const unsigned char * getData() const =0
virtual void setBuffer(unsigned char *)=0
virtual void setId(unsigned int id)=0
virtual unsigned char * getPointer()=0
virtual void setLen(unsigned char len)=0
virtual const unsigned char * getPointer() const =0
virtual unsigned char * getData()=0
virtual void destroyBuffer(CanBuffer &msgs)=0
virtual CanBuffer createBuffer(int nmessage)=0
virtual bool canGetErrors(yarp::dev::CanErrors &err)=0
Interface for a can bus device.
virtual bool canGetBaudRate(unsigned int *rate)=0
virtual bool canIdAdd(unsigned int id)=0
virtual bool canRead(CanBuffer &msgs, unsigned int size, unsigned int *read, bool wait=false)=0
virtual bool canWrite(const CanBuffer &msgs, unsigned int size, unsigned int *sent, bool wait=false)=0
virtual bool canSetBaudRate(unsigned int rate)=0
virtual bool canIdDelete(unsigned int id)=0
Implementation of a ICanBufferFactory.
virtual void destroyBuffer(CanBuffer &buffer)
virtual CanBuffer createBuffer(int elem)
bool read(ImageOf< PixelRgb > &dest, const std::string &src, image_fileformat format=FORMAT_ANY)
Definition: ImageFile.cpp:922
The main, catch-all namespace for YARP.
Definition: dirs.h:16
#define YARP_dev_API
Definition: api.h:18