YARP
Yet Another Robot Platform
ControlBoardRemapperHelpers.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 
8 
9 #include <yarp/os/LogStream.h>
10 
11 
12 using namespace yarp::os;
13 using namespace yarp::dev;
14 using namespace yarp::sig;
15 
16 
18 {
19  id = "";
20 
21  pid = nullptr;
22  pos = nullptr;
23  posDir = nullptr;
24  vel = nullptr;
25  iJntEnc = nullptr;
26  iMotEnc = nullptr;
27  amp = nullptr;
28  lim = nullptr;
29  calib = nullptr;
30  remcalib = nullptr;
31  iTimed= nullptr;
32  info = nullptr;
33  iTorque=nullptr;
34  iImpedance=nullptr;
35  iMode=nullptr;
36  iInteract=nullptr;
37  imotor=nullptr;
38  iVar = nullptr;
39  iPwm = nullptr;
40  iCurr = nullptr;
41 
42  subdevice=nullptr;
43 
44 
45  attachedF=false;
46  _subDevVerbose = false;
47 }
48 
49 
51 {
52  subdevice=nullptr;
53 
54  pid=nullptr;
55  pos=nullptr;
56  posDir=nullptr;
57  vel=nullptr;
58  amp = nullptr;
59  iJntEnc=nullptr;
60  iMotEnc=nullptr;
61  lim=nullptr;
62  calib=nullptr;
63  info=nullptr;
64  iTorque=nullptr;
65  iImpedance=nullptr;
66  iMode=nullptr;
67  iTimed=nullptr;
68  iInteract=nullptr;
69  imotor=nullptr;
70  iVar = nullptr;
71  iPwm = nullptr;
72  iCurr = nullptr;
73 
74  attachedF=false;
75 }
76 
78 {
79  if (id!=k)
80  {
81  yCError(CONTROLBOARDREMAPPER) << "Wrong device" << k.c_str();
82  return false;
83  }
84 
85  if (d==nullptr)
86  {
87  yCError(CONTROLBOARDREMAPPER) << "Invalid device (null pointer)";
88  return false;
89  }
90 
91  subdevice=d;
92 
93  if (subdevice->isValid())
94  {
95  subdevice->view(pid);
96  subdevice->view(pos);
97  subdevice->view(posDir);
98  subdevice->view(vel);
99  subdevice->view(amp);
100  subdevice->view(lim);
101  subdevice->view(calib);
102  subdevice->view(remcalib);
103  subdevice->view(info);
104  subdevice->view(iTimed);
105  subdevice->view(iTorque);
106  subdevice->view(iImpedance);
107  subdevice->view(iMode);
108  subdevice->view(iJntEnc);
109  subdevice->view(iMotEnc);
110  subdevice->view(iInteract);
111  subdevice->view(imotor);
112  subdevice->view(iVar);
113  subdevice->view(iPwm);
114  subdevice->view(iCurr);
115  }
116  else
117  {
118  yCError(CONTROLBOARDREMAPPER) << "Invalid device" << k << "(isValid() returned false)";
119  return false;
120  }
121 
122  if ((iTorque==nullptr) && (_subDevVerbose))
123  {
124  yCWarning(CONTROLBOARDREMAPPER) << "iTorque not valid interface";
125  }
126 
127  if ((iImpedance==nullptr) && (_subDevVerbose))
128  {
129  yCWarning(CONTROLBOARDREMAPPER) << "iImpedance not valid interface";
130  }
131 
132  if ((iInteract==nullptr) && (_subDevVerbose))
133  {
134  yCWarning(CONTROLBOARDREMAPPER) << "iInteractionMode not valid interface";
135  }
136 
137  if ((iMotEnc==nullptr) && (_subDevVerbose))
138  {
139  yCWarning(CONTROLBOARDREMAPPER) << "IMotorEncoders not valid interface";
140  }
141 
142  if ((imotor==nullptr) && (_subDevVerbose))
143  {
144  yCWarning(CONTROLBOARDREMAPPER) << "IMotor not valid interface";
145  }
146 
147  if ((iVar == nullptr) && (_subDevVerbose))
148  {
149  yCWarning(CONTROLBOARDREMAPPER) << "IRemoveVariables not valid interface";
150  }
151 
152  if ((info == nullptr) && (_subDevVerbose))
153  {
154  yCWarning(CONTROLBOARDREMAPPER) << "IAxisInfo not valid interface";
155  }
156 
157  if ((iPwm == nullptr) && (_subDevVerbose))
158  {
159  yCWarning(CONTROLBOARDREMAPPER) << "IPWMControl not valid interface";
160  }
161 
162  if ((iCurr == nullptr) && (_subDevVerbose))
163  {
164  yCWarning(CONTROLBOARDREMAPPER) << "ICurrentControl not valid interface";
165  }
166 
167 
168  // checking minimum set of intefaces required
169  if( !(pos) )
170  {
171  yCError(CONTROLBOARDREMAPPER, "IPositionControl interface was not found in subdevice. Quitting");
172  return false;
173  }
174 
175  if( ! (vel) )
176  {
177  yCError(CONTROLBOARDREMAPPER, "IVelocityControl interface was not found in subdevice. Quitting");
178  return false;
179  }
180 
181  if(!iJntEnc)
182  {
183  yCError(CONTROLBOARDREMAPPER, "IEncoderTimed interface was not found in subdevice, exiting.");
184  return false;
185  }
186 
187  if(!iMode)
188  {
189  yCError(CONTROLBOARDREMAPPER, "IControlMode interface was not found in subdevice, exiting.");
190  return false;
191  }
192 
193  int deviceJoints=0;
194  if (pos!=nullptr)
195  {
196  if (!pos->getAxes(&deviceJoints))
197  {
198  yCError(CONTROLBOARDREMAPPER) << "failed to get axes number for subdevice" << k.c_str();
199  return false;
200  }
201  if(deviceJoints <= 0)
202  {
203  yCError(CONTROLBOARDREMAPPER, "attached device has an invalid number of joints (%d)", deviceJoints);
204  return false;
205  }
206  }
207 
208  attachedF=true;
209  return true;
210 }
211 
213 {
214  // Resize buffers
215  m_nrOfControlledAxesInRemappedCtrlBrd = remappedControlBoards.getNrOfRemappedAxes();
216 
217  size_t nrOfSubControlBoards = remappedControlBoards.getNrOfSubControlBoards();
218 
219  m_nJointsInSubControlBoard.resize(nrOfSubControlBoards,0);
220  m_jointsInSubControlBoard.resize(nrOfSubControlBoards);
221 
222  m_bufferForSubControlBoard.resize(nrOfSubControlBoards);
223  m_bufferForSubControlBoardControlModes.resize(nrOfSubControlBoards);
224  m_bufferForSubControlBoardInteractionModes.resize(nrOfSubControlBoards);
225 
226  m_counterForControlBoard.resize(nrOfSubControlBoards);
227 
228  for(size_t ctrlBrd=0; ctrlBrd < nrOfSubControlBoards; ctrlBrd++)
229  {
230  m_nJointsInSubControlBoard[ctrlBrd] = 0;
231  m_jointsInSubControlBoard[ctrlBrd].clear();
232  m_bufferForSubControlBoard[ctrlBrd].clear();
233  m_bufferForSubControlBoardControlModes[ctrlBrd].clear();
234  m_bufferForSubControlBoardInteractionModes[ctrlBrd].clear();
235  }
236 
237  // Fill buffers
238  for(size_t j=0; j < remappedControlBoards.getNrOfRemappedAxes(); j++)
239  {
240  int off=(int)remappedControlBoards.lut[j].axisIndexInSubControlBoard;
241  size_t subIndex=remappedControlBoards.lut[j].subControlBoardIndex;
242 
243  m_nJointsInSubControlBoard[subIndex]++;
244  m_jointsInSubControlBoard[subIndex].push_back(off);
245  }
246 
247  // Allocate enough space in buffers
248  for(size_t ctrlBrd=0; ctrlBrd < nrOfSubControlBoards; ctrlBrd++)
249  {
250  m_bufferForSubControlBoard[ctrlBrd].resize(m_nJointsInSubControlBoard[ctrlBrd]);
251  m_bufferForSubControlBoardControlModes[ctrlBrd].resize(m_nJointsInSubControlBoard[ctrlBrd]);
252  m_bufferForSubControlBoardInteractionModes[ctrlBrd].resize(m_nJointsInSubControlBoard[ctrlBrd]);
253 
254  m_counterForControlBoard[ctrlBrd] = 0;
255  }
256 
257  return true;
258 }
259 
260 
261 
263 {
264  for(size_t ctrlBrd=0; ctrlBrd < remappedControlBoards.getNrOfSubControlBoards(); ctrlBrd++)
265  {
266  m_bufferForSubControlBoard[ctrlBrd].clear();
267  }
268 
269  for(int j=0; j < m_nrOfControlledAxesInRemappedCtrlBrd; j++)
270  {
271  size_t subIndex=remappedControlBoards.lut[j].subControlBoardIndex;
272 
273  m_bufferForSubControlBoard[subIndex].push_back(full[j]);
274  }
275 }
276 
278 {
279  for(size_t ctrlBrd=0; ctrlBrd < remappedControlBoards.getNrOfSubControlBoards(); ctrlBrd++)
280  {
281  m_counterForControlBoard[ctrlBrd] = 0;
282  }
283 
284  for(int j=0; j < m_nrOfControlledAxesInRemappedCtrlBrd; j++)
285  {
286  size_t subIndex=remappedControlBoards.lut[j].subControlBoardIndex;
287  full[j] = m_bufferForSubControlBoard[subIndex][m_counterForControlBoard[subIndex]];
288  m_counterForControlBoard[subIndex]++;
289  }
290 }
291 
293 {
294  for(size_t ctrlBrd=0; ctrlBrd < remappedControlBoards.getNrOfSubControlBoards(); ctrlBrd++)
295  {
296  m_bufferForSubControlBoardControlModes[ctrlBrd].clear();
297  }
298 
299  for(int j=0; j < m_nrOfControlledAxesInRemappedCtrlBrd; j++)
300  {
301  size_t subIndex=remappedControlBoards.lut[j].subControlBoardIndex;
302 
303  m_bufferForSubControlBoardControlModes[subIndex].push_back(full[j]);
304  }
305 }
306 
308 {
309  for(size_t ctrlBrd=0; ctrlBrd < remappedControlBoards.getNrOfSubControlBoards(); ctrlBrd++)
310  {
311  m_counterForControlBoard[ctrlBrd] = 0;
312  }
313 
314  for(int j=0; j < m_nrOfControlledAxesInRemappedCtrlBrd; j++)
315  {
316  size_t subIndex=remappedControlBoards.lut[j].subControlBoardIndex;
317  full[j] = m_bufferForSubControlBoardControlModes[subIndex][m_counterForControlBoard[subIndex]];
318  m_counterForControlBoard[subIndex]++;
319  }
320 }
321 
323 {
324  for(size_t ctrlBrd=0; ctrlBrd < remappedControlBoards.getNrOfSubControlBoards(); ctrlBrd++)
325  {
326  m_bufferForSubControlBoardInteractionModes[ctrlBrd].clear();
327  }
328 
329  for(int j=0; j < m_nrOfControlledAxesInRemappedCtrlBrd; j++)
330  {
331  size_t subIndex=remappedControlBoards.lut[j].subControlBoardIndex;
332 
333  m_bufferForSubControlBoardInteractionModes[subIndex].push_back(full[j]);
334  }
335 }
336 
338 {
339  for(size_t ctrlBrd=0; ctrlBrd < remappedControlBoards.getNrOfSubControlBoards(); ctrlBrd++)
340  {
341  m_counterForControlBoard[ctrlBrd] = 0;
342  }
343 
344  for(int j=0; j < m_nrOfControlledAxesInRemappedCtrlBrd; j++)
345  {
346  size_t subIndex=remappedControlBoards.lut[j].subControlBoardIndex;
347  full[j] = m_bufferForSubControlBoardInteractionModes[subIndex][m_counterForControlBoard[subIndex]];
348  m_counterForControlBoard[subIndex]++;
349  }
350 }
351 
353 {
354  // Resize buffers
355  size_t nrOfSubControlBoards = remappedControlBoards.getNrOfSubControlBoards();
356 
357  m_nJointsInSubControlBoard.resize(nrOfSubControlBoards,0);
358  m_jointsInSubControlBoard.resize(nrOfSubControlBoards);
359  m_bufferForSubControlBoard.resize(nrOfSubControlBoards);
360  m_bufferForSubControlBoardControlModes.resize(nrOfSubControlBoards);
361  m_bufferForSubControlBoardInteractionModes.resize(nrOfSubControlBoards);
362 
363  m_counterForControlBoard.resize(nrOfSubControlBoards);
364 
365  for(size_t ctrlBrd=0; ctrlBrd < nrOfSubControlBoards; ctrlBrd++)
366  {
367  m_jointsInSubControlBoard[ctrlBrd].clear();
368  m_bufferForSubControlBoard[ctrlBrd].clear();
369  m_bufferForSubControlBoardControlModes[ctrlBrd].clear();
370  m_bufferForSubControlBoardInteractionModes[ctrlBrd].clear();
371 
372  }
373 
374  // Count the maximum number of joints
375  for(size_t j=0; j < remappedControlBoards.getNrOfRemappedAxes(); j++)
376  {
377  size_t subIndex=remappedControlBoards.lut[j].subControlBoardIndex;
378 
379  m_nJointsInSubControlBoard[subIndex]++;
380  }
381 
382  // Allocate enough space in buffers
383  for(size_t ctrlBrd=0; ctrlBrd < nrOfSubControlBoards; ctrlBrd++)
384  {
385  m_bufferForSubControlBoard[ctrlBrd].resize(m_nJointsInSubControlBoard[ctrlBrd]);
386  m_bufferForSubControlBoardControlModes[ctrlBrd].resize(m_nJointsInSubControlBoard[ctrlBrd]);
387  m_bufferForSubControlBoardInteractionModes[ctrlBrd].resize(m_nJointsInSubControlBoard[ctrlBrd]);
388 
389  m_counterForControlBoard[ctrlBrd] = 0;
390  m_jointsInSubControlBoard[ctrlBrd].resize(m_nJointsInSubControlBoard[ctrlBrd]);
391  }
392 
393  return true;
394 }
395 
396 
397 
399  const int n_joints,
400  const int *joints,
401  const RemappedControlBoards& remappedControlBoards)
402 {
403  for(size_t ctrlBrd=0; ctrlBrd < remappedControlBoards.getNrOfSubControlBoards(); ctrlBrd++)
404  {
405  m_counterForControlBoard[ctrlBrd] = 0;
406  }
407 
408  for(int j=0; j < n_joints; j++)
409  {
410  size_t subIndex=remappedControlBoards.lut[joints[j]].subControlBoardIndex;
411  arbitraryVec[j] = m_bufferForSubControlBoard[subIndex][m_counterForControlBoard[subIndex]];
412  m_counterForControlBoard[subIndex]++;
413  }
414 }
415 
416 
418  const int n_joints,
419  const int *joints,
420  const RemappedControlBoards& remappedControlBoards)
421 {
422  this->createListOfJointsDecomposition(n_joints,joints,remappedControlBoards);
423 
424  for(size_t ctrlBrd=0; ctrlBrd < remappedControlBoards.getNrOfSubControlBoards(); ctrlBrd++)
425  {
426  m_bufferForSubControlBoard[ctrlBrd].clear();
427  }
428 
429  for(int j=0; j < n_joints; j++)
430  {
431  size_t subIndex=remappedControlBoards.lut[joints[j]].subControlBoardIndex;
432  m_bufferForSubControlBoard[subIndex].push_back(arbitraryVec[j]);
433  }
434 }
435 
436 
438  const int n_joints,
439  const int *joints,
440  const RemappedControlBoards& remappedControlBoards)
441 {
442  for(size_t ctrlBrd=0; ctrlBrd < remappedControlBoards.getNrOfSubControlBoards(); ctrlBrd++)
443  {
444  m_counterForControlBoard[ctrlBrd] = 0;
445  }
446 
447  for(int j=0; j < n_joints; j++)
448  {
449  size_t subIndex=remappedControlBoards.lut[joints[j]].subControlBoardIndex;
450  arbitraryVec[j] = m_bufferForSubControlBoardControlModes[subIndex][m_counterForControlBoard[subIndex]];
451  m_counterForControlBoard[subIndex]++;
452  }
453 }
454 
455 
457  const int n_joints,
458  const int *joints,
459  const RemappedControlBoards& remappedControlBoards)
460 {
461  this->createListOfJointsDecomposition(n_joints,joints,remappedControlBoards);
462 
463  for(size_t ctrlBrd=0; ctrlBrd < remappedControlBoards.getNrOfSubControlBoards(); ctrlBrd++)
464  {
465  m_bufferForSubControlBoardControlModes[ctrlBrd].clear();
466  }
467 
468  for(int j=0; j < n_joints; j++)
469  {
470  size_t subIndex=remappedControlBoards.lut[joints[j]].subControlBoardIndex;
471  m_bufferForSubControlBoardControlModes[subIndex].push_back(arbitraryVec[j]);
472  }
473 }
474 
475 
477  const int n_joints,
478  const int *joints,
479  const RemappedControlBoards& remappedControlBoards)
480 {
481  for(size_t ctrlBrd=0; ctrlBrd < remappedControlBoards.getNrOfSubControlBoards(); ctrlBrd++)
482  {
483  m_counterForControlBoard[ctrlBrd] = 0;
484  }
485 
486  for(int j=0; j < n_joints; j++)
487  {
488  size_t subIndex=remappedControlBoards.lut[joints[j]].subControlBoardIndex;
489  arbitraryVec[j] = m_bufferForSubControlBoardInteractionModes[subIndex][m_counterForControlBoard[subIndex]];
490  m_counterForControlBoard[subIndex]++;
491  }
492 }
493 
494 
496  const int n_joints,
497  const int *joints,
498  const RemappedControlBoards& remappedControlBoards)
499 {
500  this->createListOfJointsDecomposition(n_joints,joints,remappedControlBoards);
501 
502  for(size_t ctrlBrd=0; ctrlBrd < remappedControlBoards.getNrOfSubControlBoards(); ctrlBrd++)
503  {
504  m_bufferForSubControlBoardInteractionModes[ctrlBrd].clear();
505  }
506 
507  for(int j=0; j < n_joints; j++)
508  {
509  size_t subIndex=remappedControlBoards.lut[joints[j]].subControlBoardIndex;
510  m_bufferForSubControlBoardInteractionModes[subIndex].push_back(arbitraryVec[j]);
511  }
512 }
513 
514 
515 void ControlBoardArbitraryAxesDecomposition::createListOfJointsDecomposition(const int n_joints, const int* joints, const RemappedControlBoards & remappedControlBoards)
516 {
517  for(size_t ctrlBrd=0; ctrlBrd < remappedControlBoards.getNrOfSubControlBoards(); ctrlBrd++)
518  {
519  m_nJointsInSubControlBoard[ctrlBrd] = 0;
520  m_jointsInSubControlBoard[ctrlBrd].clear();
521  }
522 
523  // Fill buffers
524  for(int j=0; j < n_joints; j++)
525  {
526  int off=(int)remappedControlBoards.lut[joints[j]].axisIndexInSubControlBoard;
527  size_t subIndex=remappedControlBoards.lut[joints[j]].subControlBoardIndex;
528 
529  m_nJointsInSubControlBoard[subIndex]++;
530  m_jointsInSubControlBoard[subIndex].push_back(off);
531  }
532 
533 }
534 
535 void ControlBoardArbitraryAxesDecomposition::resizeSubControlBoardBuffers(const int n_joints, const int *joints, const RemappedControlBoards & remappedControlBoards)
536 {
537  // Properly populate the m_nJointsInSubControlBoard and m_jointsInSubControlBoard methods
538  createListOfJointsDecomposition(n_joints,joints,remappedControlBoards);
539 
540  for(size_t ctrlBrd=0; ctrlBrd < remappedControlBoards.getNrOfSubControlBoards(); ctrlBrd++)
541  {
542  yCAssert(CONTROLBOARDREMAPPER, (unsigned)m_nJointsInSubControlBoard[ctrlBrd] == m_jointsInSubControlBoard[ctrlBrd].size());
543  m_bufferForSubControlBoard.resize(m_nJointsInSubControlBoard[ctrlBrd]);
544  }
545 }
const yarp::os::LogComponent & CONTROLBOARDREMAPPER()
bool configure(const RemappedControlBoards &remappedControlBoards)
Resize the buffers using the information in the RemappedControlBoards.
void fillSubControlBoardBuffersFromArbitraryJointVector(const double *arbitraryVec, const int n_joints, const int *joints, const RemappedControlBoards &remappedControlBoards)
Fill buffers for the SubControlBoard from a vector of joints of the RemappedControlBoards.
void resizeSubControlBoardBuffers(const int n_joints, const int *joints, const RemappedControlBoards &remappedControlBoards)
Resize buffers to have the dimension of specified by the method (used for multi joint methods that re...
void fillArbitraryJointVectorFromSubControlBoardBuffers(double *arbitraryVec, const int n_joints, const int *joints, const RemappedControlBoards &remappedControlBoards)
Fill a vector of joints of the ControlBoardRemapper from the buffers of the SubControlBoard .
bool configure(const RemappedControlBoards &remappedControlBoards)
Resize the buffers using the information in the RemappedControlBoards.
void fillCompleteJointVectorFromSubControlBoardBuffers(double *full, const RemappedControlBoards &remappedControlBoards)
Fill a vector of joints of the ControlBoardRemapper from the buffers of the SubControlBoard .
void fillSubControlBoardBuffersFromCompleteJointVector(const double *full, const RemappedControlBoards &remappedControlBoards)
Fill buffers for the SubControlBoard from a vector of joints of the RemappedControlBoards.
std::vector< RemappedAxis > lut
Vector of dimension getNrOfRemappedAxes .
bool attach(yarp::dev::PolyDriver *d, const std::string &id)
bool view(T *&x)
Get an interface to the device driver.
Definition: DeviceDriver.h:74
A container for a device driver.
Definition: PolyDriver.h:24
#define yCError(component,...)
Definition: LogComponent.h:154
#define yCAssert(component, x)
Definition: LogComponent.h:169
#define yCWarning(component,...)
Definition: LogComponent.h:143
An interface for the device drivers.
An interface to the operating system, including Port based communication.
Signal processing.
Definition: Image.h:22