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