YARP
Yet Another Robot Platform
 
Loading...
Searching...
No Matches
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
17namespace yarp::dev {
18class ICanBus;
19class ICanBufferFactory;
20class ICanBusErrors;
21class CanMessage;
22class CanBuffer;
23class CanErrors;
24template <class M, class T>
25class ImplementCanBufferFactory;
26} // namespace yarp::dev
27
29{
30public:
32 {
33 txCanErrors=0; //can device tx errors
34 rxCanErrors=0; //can device rx errors
35 busoff=false; //bus off
36 rxCanFifoOvr=0; // can device rx overflow
37 txCanFifoOvr=0; // can device tx overflow
38 txBufferOvr=0; // tx buffer overflow
39 rxBufferOvr=0; // rx buffer overflow
40 }
41
42 int txCanErrors; //can device tx errors
43 int rxCanErrors; //can device rx errors
44 bool busoff; //bus off
45 unsigned int rxCanFifoOvr; // can device rx overflow
46 unsigned int txCanFifoOvr; // can device tx overflow
47 unsigned int txBufferOvr; // tx buffer overflow
48 unsigned int rxBufferOvr; // rx buffer overflow
49};
50
52{
53 public:
54 virtual ~CanMessage(){}
55 virtual CanMessage &operator=(const CanMessage &l)=0;
56 virtual unsigned int getId() const =0;
57 virtual unsigned char getLen() const =0;
58 virtual void setLen(unsigned char len) =0;
59 virtual void setId(unsigned int id) =0;
60 virtual const unsigned char *getData() const =0;
61 virtual unsigned char *getData() =0;
62 virtual unsigned char *getPointer()=0;
63 virtual const unsigned char *getPointer() const =0;
64 virtual void setBuffer(unsigned char *)=0;
65};
66
68{
70 int size;
71
72public:
73 CanBuffer();
74
75 void resize(CanMessage **d, int s)
76 {
77 size=s;
78 data=d;
79 }
80
82 {
83 return data;
84 }
85
86 const CanMessage *const *getPointer() const
87 {
88 return data;
89 }
90
92 {
93 return *data[k];
94 }
95 const CanMessage &operator[](int k) const
96 {
97 return *data[k];
98 }
99};
100
102{
103public:
105 virtual CanBuffer createBuffer(int nmessage)=0;
106 virtual void destroyBuffer(CanBuffer &msgs)=0;
107};
108
114template<class M, class IMPL>
116{
117public:
119
120 virtual CanBuffer createBuffer(int elem)
121 {
123 IMPL *storage=new IMPL[elem];
124 CanMessage **messages=new CanMessage *[elem];
125 M *tmp=new M[elem];
126
127 std::memset(storage, 0, sizeof(IMPL)*elem);
128
129 for(int k=0;k<elem;k++)
130 {
131 messages[k]=&tmp[k];
132 messages[k]->setBuffer((unsigned char *)(&storage[k]));
133 }
134
135 ret.resize(messages, elem);
136 return ret;
137 }
138
140 {
141 CanMessage **m=buffer.getPointer();
142 IMPL *storage=0;
143 M *msgs=0;
144
145 if (m==0)
146 {
147 yError("Warning trying to destroy non valid buffer\n");
148 return;
149 }
150
151 storage=reinterpret_cast<IMPL *>(m[0]->getPointer());
152 msgs=dynamic_cast<M *>(m[0]);
153
154 if ((msgs==0)||(storage==0))
155 {
156 yError("Warning, troubles destroying memory\n");
157 return;
158 }
159
160 delete [] storage;
161 delete [] msgs;
162 delete [] m;
163 }
164};
165
170{
171 public:
172 virtual ~ICanBus(){}
173
174
175 virtual bool canSetBaudRate(unsigned int rate)=0;
176 virtual bool canGetBaudRate(unsigned int *rate)=0;
177 virtual bool canIdAdd(unsigned int id)=0;
178 virtual bool canIdDelete(unsigned int id)=0;
179
180 virtual bool canRead(CanBuffer &msgs,
181 unsigned int size,
182 unsigned int *read,
183 bool wait=false)=0;
184
185 virtual bool canWrite(const CanBuffer &msgs,
186 unsigned int size,
187 unsigned int *sent,
188 bool wait=false)=0;
189};
190
192{
193public:
194 virtual bool canGetErrors(yarp::dev::CanErrors &err)=0;
195
196 virtual ~ICanBusErrors(){}
197};
198
199#endif // YARP_DEV_CANBUSINTERFACE_H
bool ret
#define yError(...)
Definition Log.h:361
#define IMPL()
Definition Port.cpp:43
const CanMessage & operator[](int k) const
CanMessage & operator[](int k)
void resize(CanMessage **d, int s)
CanMessage ** getPointer()
const CanMessage *const * getPointer() const
unsigned int rxCanFifoOvr
unsigned int txCanFifoOvr
virtual unsigned char * getData()=0
virtual unsigned char getLen() const =0
virtual unsigned int getId() const =0
virtual const unsigned char * getData() const =0
virtual CanMessage & operator=(const CanMessage &l)=0
virtual void setBuffer(unsigned char *)=0
virtual const unsigned char * getPointer() const =0
virtual unsigned char * getPointer()=0
virtual void setId(unsigned int id)=0
virtual void setLen(unsigned char len)=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)
For streams capable of holding different kinds of content, check what they actually have.
Definition jointData.cpp:13
The main, catch-all namespace for YARP.
Definition dirs.h:16
#define YARP_dev_API
Definition api.h:18