YARP
Yet Another Robot Platform
stateExtendedReader.cpp
Go to the documentation of this file.
1 /*
2  * SPDX-FileCopyrightText: 2006-2021 Istituto Italiano di Tecnologia (IIT)
3  * SPDX-License-Identifier: BSD-3-Clause
4  */
5 
6 #include "stateExtendedReader.h"
8 #include <cstring>
9 
10 #include <yarp/os/PortablePair.h>
11 #include <yarp/os/BufferedPort.h>
12 #include <yarp/os/Time.h>
13 #include <yarp/os/Network.h>
14 #include <yarp/os/Thread.h>
15 #include <yarp/os/Vocab.h>
16 #include <yarp/os/Stamp.h>
17 #include <yarp/os/LogStream.h>
18 
19 #include <yarp/sig/Vector.h>
20 
22 #include <yarp/dev/PolyDriver.h>
26 
27 
28 using namespace yarp::os;
29 using namespace yarp::dev;
30 using namespace yarp::sig;
31 
33 {
34  mutex.lock();
35  count=0;
36  deltaT=0;
37  deltaTMax=0;
38  deltaTMin=1e22;
39  now=Time::now();
40  prev=now;
41  mutex.unlock();
42 }
43 
45  deltaTMax{0},
46  deltaTMin{1e22},
47  now{Time::now()},
48  prev{now},
49  timeout{0.5},
50  valid{false},
51  count{0}
52 {
53 }
54 
55 void StateExtendedInputPort::init(int numberOfJoints)
56 {
57  last.jointPosition.resize(numberOfJoints);
58  last.jointVelocity.resize(numberOfJoints);
59  last.jointAcceleration.resize(numberOfJoints);
60  last.motorPosition.resize(numberOfJoints);
61  last.motorVelocity.resize(numberOfJoints);
62  last.motorAcceleration.resize(numberOfJoints);
63  last.torque.resize(numberOfJoints);
64  last.pwmDutycycle.resize(numberOfJoints);
65  last.current.resize(numberOfJoints);
66  last.controlMode.resize(numberOfJoints);
67  last.interactionMode.resize(numberOfJoints);
68 }
69 
71 {
72  now=Time::now();
73  mutex.lock();
74 
75  if (count>0)
76  {
77  double tmpDT=now-prev;
78  deltaT+=tmpDT;
79  if (tmpDT > deltaTMax) {
80  deltaTMax = tmpDT;
81  }
82  if (tmpDT < deltaTMin) {
83  deltaTMin = tmpDT;
84  }
85  }
86 
87  prev=now;
88  count++;
89 
90  valid=true;
91  last=v;
92  getEnvelope(lastStamp);
93  //check that timestamp are available
94  if (!lastStamp.isValid()) {
95  lastStamp.update(now);
96  }
97  mutex.unlock();
98 }
99 
100 void StateExtendedInputPort::setTimeout(const double& timeout) {
101  this->timeout = timeout;
102 }
103 
104 bool StateExtendedInputPort::getLastSingle(int j, int field, double *data, Stamp &stamp, double &localArrivalTime)
105 {
106  mutex.lock();
107  bool ret = valid;
108  if (ret)
109  {
110  switch(field)
111  {
112  case VOCAB_ENCODER:
113  *data = last.jointPosition[j];
114  ret = last.jointPosition_isValid;
115  break;
116 
117  case VOCAB_ENCODER_SPEED:
118  ret = last.jointVelocity_isValid;
119  *data = last.jointVelocity[j];
120  break;
121 
124  *data = last.jointAcceleration[j];
125  break;
126 
127  case VOCAB_MOTOR_ENCODER:
128  ret = last.motorPosition_isValid;
129  *data = last.motorPosition[j];
130  break;
131 
133  ret = last.motorVelocity_isValid;
134  *data = last.motorVelocity[j];
135  break;
136 
139  *data = last.motorAcceleration[j];
140  break;
141 
142  case VOCAB_TRQ:
143  ret = last.torque_isValid;
144  *data = last.torque[j];
145  break;
146 
148  ret = last.pwmDutycycle_isValid;
149  *data = last.pwmDutycycle[j];
150  break;
151 
152  case VOCAB_AMP_CURRENT:
153  ret = last.current_isValid;
154  *data = last.current[j];
155  break;
156 
157  default:
158  yCError(REMOTECONTROLBOARD) << "RemoteControlBoard internal error while reading data. Cannot get 'single' data of type " << yarp::os::Vocab32::decode(field);
159  break;
160  }
161 
162  localArrivalTime=now;
163  stamp = lastStamp;
164  if (ret && ((Time::now() - localArrivalTime) > timeout)) {
165  ret = false;
166  }
167  }
168  mutex.unlock();
169 
170  return ret;
171 }
172 
173 bool StateExtendedInputPort::getLastSingle(int j, int field, int *data, Stamp &stamp, double &localArrivalTime)
174 {
175  mutex.lock();
176  bool ret = valid;
177  if (ret)
178  {
179  switch(field)
180  {
182  ret = last.controlMode_isValid;
183  *data = last.controlMode[j];
184  break;
185 
188  *data = last.interactionMode[j];
189  break;
190 
191  default:
192  yCError(REMOTECONTROLBOARD) << "RemoteControlBoard internal error while reading data. Cannot get 'single' data of type " << yarp::os::Vocab32::decode(field);
193  break;
194  }
195  localArrivalTime=now;
196  stamp = lastStamp;
197  if (ret && ((Time::now() - localArrivalTime) > timeout)) {
198  ret = false;
199  }
200  }
201  mutex.unlock();
202  return ret;
203 }
204 
205 bool StateExtendedInputPort::getLastVector(int field, double* data, Stamp& stamp, double& localArrivalTime)
206 {
207  mutex.lock();
208  bool ret = valid;
209  if (ret)
210  {
211  switch(field)
212  {
213  case VOCAB_ENCODERS:
214  ret = last.jointPosition_isValid;
215  memcpy(data, last.jointPosition.data(), last.jointPosition.size() * last.jointPosition.getElementSize() );
216  break;
217 
219  ret = last.jointVelocity_isValid;
220  memcpy(data, last.jointVelocity.data(), last.jointVelocity.size() * last.jointVelocity.getElementSize() );
221  break;
222 
225  memcpy(data, last.jointAcceleration.data(), last.jointAcceleration.size() * last.jointAcceleration.getElementSize() );
226  break;
227 
229  ret = last.motorPosition_isValid;
230  memcpy(data, last.motorPosition.data(), last.motorPosition.size() * last.motorPosition.getElementSize() );
231  break;
232 
234  ret = last.motorVelocity_isValid;
235  memcpy(data, last.motorVelocity.data(), last.motorVelocity.size() * last.motorVelocity.getElementSize() );
236  break;
237 
240  memcpy(data, last.motorAcceleration.data(), last.motorAcceleration.size() * last.motorAcceleration.getElementSize() );
241  break;
242 
243  case VOCAB_TRQS:
244  ret = last.torque_isValid;
245  memcpy(data, last.torque.data(), last.torque.size() * last.torque.getElementSize() );
246  break;
247 
249  ret = last.pwmDutycycle_isValid;
250  memcpy(data, last.pwmDutycycle.data(), last.pwmDutycycle.size() * last.pwmDutycycle.getElementSize());
251  break;
252 
253  case VOCAB_AMP_CURRENTS:
254  ret = last.current_isValid;
255  memcpy(data, last.current.data(), last.current.size() * last.current.getElementSize());
256  break;
257 
258  default:
259  yCError(REMOTECONTROLBOARD) << "RemoteControlBoard internal error while reading data. Cannot get 'vector' data of type " << yarp::os::Vocab32::decode(field);
260  break;
261  }
262 
263  localArrivalTime=now;
264  stamp = lastStamp;
265  if (ret && ((Time::now() - localArrivalTime) > timeout)) {
266  ret = false;
267  }
268  }
269  mutex.unlock();
270 
271  return ret;
272 }
273 
274 bool StateExtendedInputPort::getLastVector(int field, int* data, Stamp& stamp, double& localArrivalTime)
275 {
276  mutex.lock();
277  bool ret = valid;
278  if (ret)
279  {
280  switch(field)
281  {
283  ret = last.controlMode_isValid;
284  memcpy(data, last.controlMode.data(), last.controlMode.size() * last.controlMode.getElementSize());
285  break;
286 
289  memcpy(data, last.interactionMode.data(), last.interactionMode.size() * last.interactionMode.getElementSize());
290  break;
291 
292  default:
293  yCError(REMOTECONTROLBOARD) << "RemoteControlBoard internal error while reading data. Cannot get 'vector' data of type " << yarp::os::Vocab32::decode(field);
294  break;
295  }
296  localArrivalTime=now;
297  stamp = lastStamp;
298  if (ret && ((Time::now() - localArrivalTime) > timeout)) {
299  ret = false;
300  }
301  }
302  mutex.unlock();
303  return ret;
304 }
305 
307 {
308  mutex.lock();
309  int ret=count;
310  mutex.unlock();
311  return ret;
312 }
313 
314 // time is in ms
315 void StateExtendedInputPort::getEstFrequency(int &ite, double &av, double &min, double &max)
316 {
317  mutex.lock();
318  ite=count;
319  min=deltaTMin*1000;
320  max=deltaTMax*1000;
321  if (count<1)
322  {
323  av=0;
324  }
325  else
326  {
327  av=deltaT/count;
328  }
329  av=av*1000;
330  mutex.unlock();
331 }
define control board standard interfaces
constexpr yarp::conf::vocab32_t VOCAB_AMP_CURRENT
constexpr yarp::conf::vocab32_t VOCAB_AMP_CURRENTS
constexpr yarp::conf::vocab32_t VOCAB_CM_CONTROL_MODES
Definition: IControlMode.h:119
constexpr yarp::conf::vocab32_t VOCAB_CM_CONTROL_MODE
Definition: IControlMode.h:117
constexpr yarp::conf::vocab32_t VOCAB_ENCODER_ACCELERATIONS
Definition: IEncoders.h:215
constexpr yarp::conf::vocab32_t VOCAB_ENCODER
Definition: IEncoders.h:208
constexpr yarp::conf::vocab32_t VOCAB_ENCODER_SPEEDS
Definition: IEncoders.h:213
constexpr yarp::conf::vocab32_t VOCAB_ENCODER_SPEED
Definition: IEncoders.h:212
constexpr yarp::conf::vocab32_t VOCAB_ENCODER_ACCELERATION
Definition: IEncoders.h:214
constexpr yarp::conf::vocab32_t VOCAB_ENCODERS
Definition: IEncoders.h:209
constexpr yarp::conf::vocab32_t VOCAB_INTERACTION_MODES
constexpr yarp::conf::vocab32_t VOCAB_INTERACTION_MODE
constexpr yarp::conf::vocab32_t VOCAB_MOTOR_ENCODER_SPEED
constexpr yarp::conf::vocab32_t VOCAB_MOTOR_ENCODER_ACCELERATIONS
constexpr yarp::conf::vocab32_t VOCAB_MOTOR_ENCODER_ACCELERATION
constexpr yarp::conf::vocab32_t VOCAB_MOTOR_ENCODER
constexpr yarp::conf::vocab32_t VOCAB_MOTOR_ENCODER_SPEEDS
constexpr yarp::conf::vocab32_t VOCAB_MOTOR_ENCODERS
constexpr yarp::conf::vocab32_t VOCAB_PWMCONTROL_PWM_OUTPUTS
Definition: IPWMControl.h:146
constexpr yarp::conf::vocab32_t VOCAB_PWMCONTROL_PWM_OUTPUT
Definition: IPWMControl.h:145
constexpr yarp::conf::vocab32_t VOCAB_TRQ
constexpr yarp::conf::vocab32_t VOCAB_TRQS
bool ret
const yarp::os::LogComponent & REMOTECONTROLBOARD()
contains the definition of a Vector type
void onRead(yarp::dev::impl::jointData &v) override
void setTimeout(const double &timeout)
setTimeout, set the timeout for retrieving data
bool getLastVector(int field, double *data, Stamp &stamp, double &localArrivalTime)
bool getLastSingle(int j, int field, double *data, Stamp &stamp, double &localArrivalTime)
void init(int numberOfJoints)
void getEstFrequency(int &ite, double &av, double &min, double &max)
yarp::sig::VectorOf< double > motorVelocity
Definition: jointData.h:37
yarp::sig::VectorOf< double > jointAcceleration
Definition: jointData.h:33
yarp::sig::VectorOf< int > controlMode
Definition: jointData.h:47
yarp::sig::VectorOf< int > interactionMode
Definition: jointData.h:49
yarp::sig::VectorOf< double > current
Definition: jointData.h:45
yarp::sig::VectorOf< double > motorAcceleration
Definition: jointData.h:39
yarp::sig::VectorOf< double > motorPosition
Definition: jointData.h:35
yarp::sig::VectorOf< double > pwmDutycycle
Definition: jointData.h:43
yarp::sig::VectorOf< double > torque
Definition: jointData.h:41
yarp::sig::VectorOf< double > jointPosition
Definition: jointData.h:29
yarp::sig::VectorOf< double > jointVelocity
Definition: jointData.h:31
bool getEnvelope(PortReader &envelope) override
An abstraction for a time stamp and/or sequence number.
Definition: Stamp.h:22
void update()
Set the timestamp to the current time, and increment the sequence number (wrapping to 0 if the sequen...
Definition: Stamp.cpp:124
bool isValid() const
Check if this Stamp is valid.
Definition: Stamp.cpp:39
void resize(size_t size) override
Resize the vector.
Definition: Vector.h:222
size_t size() const
Definition: Vector.h:323
T * data()
Return a pointer to the first element of the vector.
Definition: Vector.h:207
size_t getElementSize() const override
Definition: Vector.h:165
#define yCError(component,...)
Definition: LogComponent.h:154
yarp::rosmsg::std_msgs::Time Time
Definition: Time.h:21
An interface for the device drivers.
double now()
Return the current time in seconds, relative to an arbitrary starting point.
Definition: Time.cpp:121
std::string decode(NetInt32 code)
Convert a vocabulary identifier into a string.
Definition: Vocab.cpp:33
An interface to the operating system, including Port based communication.
Signal processing.
Definition: Image.h:22