Dynamixel  2.9.5
RoadNarrows Robotics Dynamixel Package
DynaServo.cxx
Go to the documentation of this file.
1 ////////////////////////////////////////////////////////////////////////////////
2 //
3 // Package: Dynamixel
4 //
5 // Library: libDynamixel
6 //
7 // File: DynaServo.cxx
8 //
9 /*! \file
10  *
11  * $LastChangedDate: 2015-03-13 13:28:02 -0600 (Fri, 13 Mar 2015) $
12  * $Rev: 3890 $
13  *
14  * \brief Dynamixel servo abstract base class.
15  *
16  * \author Robin Knight (robin.knight@roadnarrows.com)
17  *
18  * \copyright
19  * \h_copy 2011-2017. RoadNarrows LLC.\n
20  * http://www.roadnarrows.com\n
21  * All Rights Reserved
22  */
23 /*
24  * @EulaBegin@
25  *
26  * Unless otherwise stated explicitly, all materials contained are copyrighted
27  * and may not be used without RoadNarrows LLC's written consent,
28  * except as provided in these terms and conditions or in the copyright
29  * notice (documents and software) or other proprietary notice provided with
30  * the relevant materials.
31  *
32  * IN NO EVENT SHALL THE AUTHOR, ROADNARROWS LLC, OR ANY
33  * MEMBERS/EMPLOYEES/CONTRACTORS OF ROADNARROWS OR DISTRIBUTORS OF THIS SOFTWARE
34  * BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR
35  * CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS
36  * DOCUMENTATION, EVEN IF THE AUTHORS OR ANY OF THE ABOVE PARTIES HAVE BEEN
37  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38  *
39  * THE AUTHORS AND ROADNARROWS LLC SPECIFICALLY DISCLAIM ANY WARRANTIES,
40  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
41  * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN
42  * "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO
43  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
44  *
45  * @EulaEnd@
46  */
47 ////////////////////////////////////////////////////////////////////////////////
48 
49 #include <stdio.h>
50 #include <stdlib.h>
51 #include <libgen.h>
52 #include <string.h>
53 #include <stdarg.h>
54 
55 #include "rnr/rnrconfig.h"
56 #include "rnr/log.h"
57 #include "rnr/new.h"
58 #include "rnr/units.h"
59 
60 #include "Dynamixel/Dynamixel.h"
61 #include "Dynamixel/AX.h"
62 #include "Dynamixel/EX.h"
63 #include "Dynamixel/MX.h"
64 #include "Dynamixel/RX.h"
65 
66 #include "Dynamixel/DynaError.h"
67 #include "Dynamixel/DynaComm.h"
68 #include "Dynamixel/DynaOlio.h"
69 
70 #include "Dynamixel/DynaServo.h"
82 
83 #include "DynaLibInternal.h"
84 
85 
86 // ---------------------------------------------------------------------------
87 // DynaServo Abstract Class
88 // ---------------------------------------------------------------------------
89 
90 // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
91 // Constructors and Destructors
92 // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
93 
95 {
96  if( m_spec.m_sModelName != NULL )
97  {
98  delete[] m_spec.m_sModelName;
99  }
100 }
101 
102 DynaServo *DynaServo::New(DynaComm &comm, int nServoId)
103 {
104  uint_t uModelNum;
105  uint_t uFwVer;
106  DynaServo *pDynaServo;
107  int rc;
108 
109  // read the servo's model number
110  if( (rc = ReadModelNumber(comm, nServoId, &uModelNum)) < 0 )
111  {
112  DYNA_LOG_ERROR(rc, "Servo %d: Failed to get the model number.", nServoId);
113  return NULL;
114  }
115 
116  // read the servo's firmware version
117  if( (rc = ReadFirmwareVersion(comm, nServoId, &uFwVer)) < 0 )
118  {
119  DYNA_LOG_ERROR(rc, "Servo %d: Failed to get the firmware verions.",
120  nServoId);
121  return NULL;
122  }
123 
124  //
125  // Instantiate the specific derived DynaServo object.
126  //
127  switch( uModelNum )
128  {
129  case DynaServoAX12::DYNA_MODEL_NUM:
130  pDynaServo = new DynaServoAX12(comm, nServoId, uModelNum, uFwVer);
131  break;
132 
134  pDynaServo = new DynaServoEX106P(comm, nServoId, uModelNum, uFwVer);
135  break;
136 
138  pDynaServo = new DynaServoMX12W(comm, nServoId, uModelNum, uFwVer);
139  break;
140 
142  pDynaServo = new DynaServoMX28(comm, nServoId, uModelNum, uFwVer);
143  break;
144 
146  pDynaServo = new DynaServoMX64(comm, nServoId, uModelNum, uFwVer);
147  break;
148 
150  pDynaServo = new DynaServoMX106(comm, nServoId, uModelNum, uFwVer);
151  break;
152 
154  pDynaServo = new DynaServoRX10(comm, nServoId, uModelNum, uFwVer);
155  break;
156 
158  pDynaServo = new DynaServoRX24F(comm, nServoId, uModelNum, uFwVer);
159  break;
160 
162  pDynaServo = new DynaServoRX28(comm, nServoId, uModelNum, uFwVer);
163  break;
164 
166  pDynaServo = new DynaServoRX64(comm, nServoId, uModelNum, uFwVer);
167  break;
168 
170  default:
171  pDynaServo = new DynaServoGeneric(comm, nServoId, uModelNum, uFwVer);
172  break;
173  }
174 
175  /*!
176  * \todo TODO Add checks here, if object not errored (or exception thrown).
177  * If error, delete object and return null.
178  */
179 
180  return pDynaServo;
181 }
182 
183 
184 // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
185 // Servo Odometer Functions
186 // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
187 
188 int DynaServo::ResetOdometer(int nEncZeroPt, bool bIsReverse)
189 {
190  int nEncCurPos;
191  int nOdPos;
192 
193  nEncCurPos = (int)m_state.m_uCurPos;
194 
195  m_state.m_od.m_nEncZeroPt = nEncZeroPt;
196  m_state.m_od.m_nOdDir = bIsReverse? -1: 1;
197  m_state.m_od.m_nEncLastPos = nEncCurPos;
198 
199  nOdPos = m_state.m_od.m_nOdDir * (nEncCurPos - nEncZeroPt);
200 
201  m_state.m_od.m_bOdEnabled = true;
202  m_state.m_od.m_nOdometer = nOdPos;
203 
204  return m_state.m_od.m_nOdometer;
205 }
206 
207 int DynaServo::UpdateOdometer(int nEncCurPos)
208 {
209  int dp; // minimum delta position
210  int nOdPos; // new odometer position
211 
213  {
214  dp = nEncCurPos - m_state.m_od.m_nEncLastPos;
215 
216  if( iabs(dp) > m_spec.m_uRawPosMax/2 )
217  {
218  if( dp > 0 )
219  {
220  dp = dp - (int)m_spec.m_uRawPosMax;
221  }
222  else // dp < 0
223  {
224  dp = dp + (int)m_spec.m_uRawPosMax;
225  }
226  }
227 
228  nOdPos = m_state.m_od.m_nOdometer + dp * m_state.m_od.m_nOdDir;
229 
230  m_state.m_od.m_nOdometer = nOdPos;
231  m_state.m_od.m_nEncLastPos = nEncCurPos;
232 
233  }
234  else
235  {
236  m_state.m_od.m_nOdometer = nEncCurPos;
237  }
238 
239  return m_state.m_od.m_nOdometer;
240 }
241 
243 {
245  m_state.m_od.m_nOdDir = 1;
247  m_state.m_od.m_bOdEnabled = false;
249 }
250 
251 
252 // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
253 // Servo Read/Write Functions
254 // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
255 
257  int nServoId,
258  uint_t *pModelNum)
259 {
260  ushort_t val = 0;
261  int rc;
262 
263  DYNA_TRY_COMM(comm);
264  DYNA_TRY_SERVO_ID(nServoId);
265 
266  rc = comm.Read16(nServoId, DYNA_ADDR_MODEL_NUM_LSB, &val);
267 
268  if( rc == DYNA_OK )
269  {
270  *pModelNum = (uint_t)(val & DYNA_ADDR_MODEL_NUM_MASK);
271  }
272 
273  return rc;
274 }
275 
277  int nServoId,
278  uint_t *pFwVer)
279 {
280  byte_t val = 0;
281  int rc;
282 
283  DYNA_TRY_COMM(comm);
284  DYNA_TRY_SERVO_ID(nServoId);
285 
286  rc = comm.Read8(nServoId, DYNA_ADDR_FWVER, &val);
287 
288  if( rc == DYNA_OK )
289  {
290  *pFwVer = (uint_t)(val & DYNA_ADDR_FWVER_MASK);
291  }
292 
293  return rc;
294 }
295 
297  int nServoId,
298  int *pServoId)
299 {
300  uint_t val = 0;
301  int rc;
302 
303  DYNA_TRY_COMM(comm);
304  DYNA_TRY_SERVO_ID(nServoId);
305 
306  rc = comm.Read8(nServoId, DYNA_ADDR_ID, &val);
307 
308  if( rc == DYNA_OK )
309  {
310  *pServoId = (int)(val & DYNA_ADDR_ID_MASK);
311  }
312 
313  return rc;
314 }
315 
317  int nServoId,
318  int nNewServoId)
319 {
320  DYNA_TRY_COMM(comm);
321  DYNA_TRY_SERVO_ID(nServoId);
322  DYNA_TRY_SERVO_ID(nNewServoId);
323 
324  return comm.Write8(nServoId, DYNA_ADDR_ID, (uint_t)nNewServoId);
325 }
326 
327 int DynaServo::ReadBaudRate(DynaComm &comm, int nServoId, int *pBaudRate)
328 {
329  uint_t uBaudNum;
330  int nBaudRate;
331  int rc;
332 
333  DYNA_TRY_COMM(comm);
334  DYNA_TRY_SERVO_ID(nServoId);
335 
336  rc = comm.Read8(nServoId, DYNA_ADDR_BAUD_RATE, &uBaudNum);
337 
338  if( rc == DYNA_OK )
339  {
340  // convert to baudrate
341  if( (nBaudRate = comm.BaudNumToRate((int)uBaudNum)) < 0 )
342  {
343  rc = nBaudRate;
344  DYNA_LOG_ERROR(rc, "Servo %d: Unexpected baud number %u read.",
345  nServoId, uBaudNum);
346  }
347  else
348  {
349  *pBaudRate = nBaudRate;
350  rc = DYNA_OK;
351  }
352  }
353 
354  return rc;
355 }
356 
358  int nServoId,
359  int nNewBaudRate)
360 {
361  int nBaudNum;
362  int rc;
363 
364  DYNA_TRY_COMM(comm);
365  DYNA_TRY_SERVO_ID(nServoId);
366 
367  // convert to baudrate
368  if( (nBaudNum = comm.BaudRateToNum(nNewBaudRate)) < 0 )
369  {
370  rc = nBaudNum;
371  DYNA_LOG_ERROR(rc, "Servo %d: Unsupported baud rate %d.",
372  nServoId, nNewBaudRate);
373  }
374 
375  else
376  {
377  rc = comm.Write8(nServoId, DYNA_ADDR_BAUD_RATE, (uint_t)nBaudNum);
378  }
379 
380  return rc;
381 }
382 
383 bool DynaServo::Ping(DynaComm &comm, int nServoId)
384 {
385  DYNA_TRY_COMM(comm);
386  DYNA_TRY_SERVO_ID(nServoId);
387 
388  return comm.Ping(nServoId);
389 }
390 
391 int DynaServo::Reset(DynaComm &comm, int nServoId)
392 {
393  int rc;
394 
395  DYNA_TRY_COMM(comm);
396  DYNA_TRY_SERVO_ID(nServoId);
397 
398  return comm.Reset(nServoId);
399 }
400 
401 
402 // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
403 // Protected Interface
404 // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
405 
406 void DynaServo::Init(int nServoId, uint_t uModelNum, uint_t uFwVer)
407 {
408  m_spec.m_sModelName = newstr("abstract class");
409 
410  m_cfg.m_uModelNum = uModelNum;
411  m_cfg.m_uFwVer = uFwVer;
412  m_cfg.m_nServoId = nServoId;
413 
414  m_nServoId = nServoId; // for ease of use
415 
416  m_pAgent = NULL;
417  m_pAgentArg = NULL;
418 
419  Unlink();
420 }
421 
422 void DynaServo::DumpCtlTbl(const char *sTblName,
423  const DynaCtlTblEntry_T tblInfo[],
424  size_t uSize)
425 {
426  const DynaCtlTblEntry_T *p;
427 
428  size_t i;
429  uint_t uVal;
430  uint_t uMask;
431  int iVal;
432  int rc;
433 
434  // table name
435  printf(" %s Control Table\n", sTblName);
436  printf("Address Name Raw Value\n");
437  printf("------- ---- --- -----\n");
438 
439  //
440  // Loop through control table information and print.
441  //
442  for(i=0; i<uSize; ++i)
443  {
444  p = &tblInfo[i];
445 
446  printf("%2u (0x%02x) %-26s ", p->m_uAddr, p->m_uAddr, p->m_sName);
447 
448  //
449  // Control table entry size in bytes.
450  //
451  switch( p->m_uSize )
452  {
453  case 1:
454  rc = m_comm.Read8(m_nServoId, p->m_uAddr, &uVal);
455  break;
456  case 2:
457  rc = m_comm.Read16(m_nServoId, p->m_uAddr, &uVal);
458  break;
459  default:
460  rc = -DYNA_ECODE_BAD_VAL;
461  break;
462  }
463 
464  if( rc != DYNA_OK )
465  {
466  printf("Failed To Read\n");
467  continue;
468  }
469 
470  //
471  // Print the raw value before masking to display the exact contents of
472  // the control table entry.
473  //
474  switch( p->m_uSize )
475  {
476  case 1:
477  printf("0x%02x ", uVal);
478  break;
479  case 2:
480  default:
481  printf("0x%04x ", uVal);
482  break;
483  break;
484  }
485 
486  //
487  // Signed entry value. Upper most mask bit is the sign.
488  //
489  if( p->m_bSigned )
490  {
491  uMask = p->m_uMask >> 1;
492  iVal = (int)(uVal & uMask);
493  if( uVal & ~uMask )
494  {
495  iVal = -iVal;
496  }
497  }
498 
499  //
500  // Unsigned entry value.
501  //
502  else
503  {
504  iVal = (int)(uVal & p->m_uMask);
505  }
506 
507  //
508  // Print interpreted value.
509  //
510  if( p->m_sFmt != NULL )
511  {
512  printf(p->m_sFmt, iVal);
513  }
514 
515  printf("\n");
516  }
517 }
RoadNarrows Dynamixel Bus Communications Abstract Base Class Interface.
virtual int UpdateOdometer(int nEncCurPos)
Update the odometer from the current servo position and rotation direction.
Definition: DynaServo.cxx:207
static int BaudNumToRate(int nBaudRate)
Map baud number to Dynamixel baud rate.
Definition: DynaComm.cxx:382
RoadNarrows AX Series Dynamixel Declarations.
char * newstr(const char *s)
Allocate new duplicated string.
uint_t m_uAddr
control table entry address
Definition: DynaTypes.h:371
RoadNarrows MX-106T and MX-106R Dynamixel Servo Class Interface.
static int WriteBaudRate(DynaComm &comm, int nServoId, int nNewBaudRate)
Write the new baud rate to the servo&#39;s EEPROM.
Definition: DynaServo.cxx:357
#define DYNA_ADDR_FWVER_MASK
valid data mask
Definition: Dynamixel.h:369
RoadNarrows RX Series Dynamixel Declarations.
void DumpCtlTbl(const char *sTblName, const DynaCtlTblEntry_T tblInfo[], size_t uSize)
Dump the servo control tabl values to stdout.
Definition: DynaServo.cxx:422
bool_t m_bSigned
entry is [not] signed integer
Definition: DynaTypes.h:375
static const int DYNA_MODEL_NUM
#define DYNA_TRY_SERVO_ID(id)
Testing if the servo id is in range exception macro.
MX-28 Dynamixel Servo Class.
Definition: DynaServoMX28.h:77
#define DYNA_OK
not an error, success
Definition: Dynamixel.h:78
RoadNarrows MX Series Dynamixel Declarations.
static int ReadBaudRate(DynaComm &comm, int nServoId, int *pBaudRate)
Read the servo&#39;s baud rate from the servo&#39;s EEPROM.
Definition: DynaServo.cxx:327
int m_nOdDir
odometer direction: normal or reverse
Definition: DynaTypes.h:182
#define DYNA_ADDR_MODEL_NUM_LSB
model number lsb (R)
Definition: Dynamixel.h:353
uint_t m_uSize
entry size 1 or 2 bytes
Definition: DynaTypes.h:373
virtual ~DynaServo()
Destructor.
Definition: DynaServo.cxx:94
static const int DYNA_MODEL_NUM
virtual int Reset(int nServoId)=0
Reset a servo back to default values.
#define DYNA_ADDR_MODEL_NUM_MASK
valid data mask
Definition: Dynamixel.h:356
static const int DYNA_MODEL_NUM
Definition: DynaServoRX64.h:81
DynaAgent_T * m_pAgent
servo agent
Definition: DynaServo.h:841
RX-64 Dynamixel Servo Class.
Definition: DynaServoRX64.h:77
DynaServoCfg_T m_cfg
servo shadowed EEPROM configuration
Definition: DynaServo.h:838
AX-12, AX-12+, AX-12A Dynamixel Servo Class.
Definition: DynaServoAX12.h:77
virtual int Read8(int nServoId, uint_t uAddr, byte_t *pVal)=0
Read an 8-bit value from Dynamixel servo control table.
static int ReadModelNumber(DynaComm &comm, int nServoId, uint_t *pModelNum)
Read the servo model number from the servo&#39;s EEPROM.
Definition: DynaServo.cxx:256
RoadNarrows AX-12, AX-12+, AX-12A Dynamixel Servo Class Interface.
RX-10 Dynamixel Servo Class Interface.
Generic Dynamixel Servo Base Class Interface.
INLINE_IN_H int iabs(int a)
Return absolute value of a.
Definition: DynaOlio.h:91
static const int DYNA_MODEL_NUM
Definition: DynaServoMX64.h:81
static const int DYNA_MODEL_NUM
Definition: DynaServoMX28.h:81
virtual int Read16(int nServoId, uint_t uAddr, ushort_t *pVal)=0
Read a 16-bit value from Dynamixel servo control table.
virtual bool Ping(int nServoId)=0
Ping the servo.
const char * m_sFmt
alternal output format
Definition: DynaTypes.h:376
#define DYNA_ADDR_ID_MASK
valid data mask
Definition: Dynamixel.h:382
EX-106+ Dynamixel Servo Class.
Miscellaneous collection of useful utilities.
uint_t m_uFwVer
firmware version
Definition: DynaTypes.h:123
RoadNarrows EX Series Dynamixel Declarations.
Dynamixel Servo Abstract Base Class.
Definition: DynaServo.h:78
const char * m_sName
entry name
Definition: DynaTypes.h:372
#define DYNA_LOG_ERROR(ecode, efmt,...)
Log Error.
void * m_pAgentArg
servo agent callback argument
Definition: DynaServo.h:842
int m_nServoId
servo id
Definition: DynaTypes.h:124
virtual void DisableOdometer()
Disable odometer mapping.
Definition: DynaServo.cxx:242
virtual int Write8(int nServoId, uint_t uAddr, byte_t byVal)=0
Write an 8-bit value to Dynamixel servo control table.
static int WriteServoId(DynaComm &comm, int nServoId, int nNewServoId)
Write the new servo id to the servo&#39;s EEPROM.
Definition: DynaServo.cxx:316
static int Reset(DynaComm &comm, int nServoId)
Reset the given servo back to default values.
Definition: DynaServo.cxx:391
static int ReadFirmwareVersion(DynaComm &comm, int nServoId, uint_t *pFwVer)
Read the servo&#39;s firmware version from the servo&#39;s EEPROM.
Definition: DynaServo.cxx:276
int m_nEncLastPos
last encoder position read from servo
Definition: DynaTypes.h:184
Servo Control Table Entry.
Definition: DynaTypes.h:369
uint_t m_uModelNum
servo model number
Definition: DynaTypes.h:122
The libDynamixel internal declarations.
char * m_sModelName
model name
Definition: DynaTypes.h:83
RoadNarrows MX-12W Dynamixel Servo Class Interface.
static DynaServo * New(DynaComm &comm, int nServoId)
Archetype constructor to create a new Dynamixel servo instance.
Definition: DynaServo.cxx:102
Generic Dynamixel Servo Base Class.
int m_nOdometer
current odometer reading (accumulator)
Definition: DynaTypes.h:179
RoadNarrows RX-24F Dynamixel servo Class Interface.
MX-106 Dynamixel Servo Class.
int m_nEncZeroPt
servo encoder zero point position
Definition: DynaTypes.h:185
#define DYNA_ADDR_BAUD_RATE
baud rate enumeration (RW)
Definition: Dynamixel.h:396
static bool Ping(DynaComm &comm, int nServoId)
Ping the given servo.
Definition: DynaServo.cxx:383
virtual void Unlink()
Unlink this servo.
Definition: DynaServo.h:287
bool m_bOdEnabled
odometer mapping [not] enabled
Definition: DynaTypes.h:181
RX-28 Dynamixel Servo Class.
Definition: DynaServoRX28.h:77
MX-64 Dynamixel Servo Class.
Definition: DynaServoMX64.h:77
static const int DYNA_MODEL_NUM
RoadNarrows RX-28 Dynamixel Servo Class Interface.
void Init(int nServoId, uint_t uModelNum, uint_t uFwVer)
Initialize servo class instance.
Definition: DynaServo.cxx:406
RoadNarrows RX-64 Dynamixel Servo Class Interface.
DynaServoOdometer_T m_od
servo virtual odometer
Definition: DynaTypes.h:212
RoadNarrows Dynamixel Archetype Servo Abstract Base Class.
uint_t m_uCurPos
current position (encoder ticks)
Definition: DynaTypes.h:206
static const int DYNA_MODEL_NUM
static const int DYNA_MODEL_NUM
Definition: DynaServoRX10.h:81
int m_nServoId
servo id
Definition: DynaServo.h:836
#define DYNA_ADDR_ID
dynamixel id (RW)
Definition: Dynamixel.h:380
RoadNarrows Dynamixel Top-Level Package Header File.
EX-106+ Dynamixel Servo Class Interface.
RX-24F Dynamixel Servo Class.
DynaComm & m_comm
attached Dynamixel bus comm. object
Definition: DynaServo.h:835
uint_t m_uRawPosMax
maximum raw position value (servo mode)
Definition: DynaTypes.h:102
static const int DYNA_MODEL_NUM
Definition: DynaServoRX28.h:81
DynaServoState_T m_state
servo shadowed RAM state
Definition: DynaServo.h:839
static int ReadServoId(DynaComm &comm, int nServoId, int *pServoId)
Read the servo&#39;s id from the servo&#39;s EEPROM.
Definition: DynaServo.cxx:296
DynaServoSpec_T m_spec
servo specification
Definition: DynaServo.h:837
uint_t m_uMask
mask of entry
Definition: DynaTypes.h:374
static const int DYNA_MODEL_NUM
virtual int ResetOdometer(int nEncZeroPt, bool bIsReverse)
Reset the servo&#39;s virtual odometer.
Definition: DynaServo.cxx:188
#define DYNA_ECODE_BAD_VAL
bad value
Definition: Dynamixel.h:85
MX-12W Dynamixel Servo Class.
RoadNarrows MX-28 Dynamixel Servo Class Interface.
RX-10 Dynamixel Servo Class.
Definition: DynaServoRX10.h:77
RoadNarrows MX-64 Dynamixel Servo Class Interface.
#define DYNA_ADDR_FWVER
firmware version (R)
Definition: Dynamixel.h:367
RoadNarrows Dynamixel Library Error and Logging Routines.
static int BaudRateToNum(int nBaudRate)
Map baud rate to Dynamixel baud number.
Definition: DynaComm.cxx:368
Dynamixel Bus Communications Abstract Base Class.
Definition: DynaComm.h:80
#define DYNA_TRY_COMM(comm)
Test if bus communication is available exception macro.