Dynamixel  2.9.5
RoadNarrows Robotics Dynamixel Package
DynaCommSerial Class Reference

Dynamixel Serial Bus Communications Class. More...

#include <DynaCommSerial.h>

Inheritance diagram for DynaCommSerial:
DynaComm

Public Types

enum  CtlSignal {
  CtlSignalMinGPIO = -999,
  CtlSignalMaxGPIO = 999,
  CtlSignalModemRTS = 1000,
  CtlSignalModemCTS = 1001,
  CtlSignalCustom = 1010,
  CtlSignalNone = 1011
}
 Half-duplex control signals. More...
 
- Public Types inherited from DynaComm
typedef void(* HalfDuplexTxFunc_T) (void *pArg)
 Half-duplex control transmit function type.
 
typedef void(* HalfDuplexRxFunc_T) (void *pArg, size_t uNumTxBytes)
 Half-duplex control receive function type.
 

Public Member Functions

 DynaCommSerial ()
 Default constructor.
 
 DynaCommSerial (const char *sSerialDevName, int nBaudRate)
 Initialization constructor. More...
 
virtual ~DynaCommSerial ()
 Destructor.
 
const char * GetSerialDeviceName () const
 
virtual int GetResourceId () const
 Get system-unique resource identifier. More...
 
virtual int Open (const char *sSerialDevName, int nBaudRate)
 Open serial communication to dynamixel bus. More...
 
virtual int Open ()
 (Re)Open serial communication to dynamixel bus. More...
 
virtual int Close ()
 Close serial communication to dynamixel bus. More...
 
virtual int SetBaudRate (int nNewBaudRate)
 Set the Dynamixel Bus new baud rate. More...
 
virtual int SetHalfDuplexCtl (int nSignal, HalfDuplexTxFunc_T fnEnableTx=NULL, HalfDuplexRxFunc_T fnEnableRx=NULL)
 
virtual int Read8 (int nServoId, uint_t uAddr, byte_t *pVal)
 Read an 8-bit value from Dynamixel servo control table. More...
 
virtual int Write8 (int nServoId, uint_t uAddr, byte_t byVal)
 Write an 8-bit value to Dynamixel servo control table. More...
 
virtual int Read16 (int nServoId, uint_t uAddr, ushort_t *pVal)
 Read a 16-bit value from Dynamixel servo control table. More...
 
virtual int Write16 (int nServoId, uint_t uAddr, ushort_t uhVal)
 Write a 16-bit value to Dynamixel servo control table. More...
 
virtual int SyncWrite (uint_t uAddr, uint_t uValSize, DynaSyncWriteTuple_T tuples[], uint_t uCount)
 Synchronous Write 8/16-bit values to a list of Dynamixel servos. More...
 
virtual bool Ping (int nServoId)
 Ping the servo. More...
 
virtual int Reset (int nServoId)
 Reset a servo back to default values. More...
 
- Public Member Functions inherited from DynaComm
 DynaComm ()
 
 DynaComm (const char *sUri, int nBaudRate)
 
virtual ~DynaComm ()
 Destructor.
 
const char * GetDeviceUri () const
 
const int GetBaudRate () const
 
virtual int Read8 (int nServoId, uint_t uAddr, uint_t *pVal)
 Read an 8-bit value from Dynamixel servo control table. More...
 
virtual int Write8 (int nServoId, uint_t uAddr, uint_t uVal)
 Write an 8-bit value to Dynamixel servo control table. More...
 
virtual int Read16 (int nServoId, uint_t uAddr, uint_t *pVal)
 Read a 16-bit value from Dynamixel servo control table. More...
 
virtual int Write16 (int nServoId, uint_t uAddr, uint_t uVal)
 Write a 16-bit value to Dynamixel servo control table. More...
 
virtual int vSyncWrite (uint_t uAddr, uint_t uValSize, uint_t uCount,...)
 Synchronous write 8/16-bit values to a list of Dynamixel servos. More...
 
virtual bool IsOpen ()
 Test if Dynamixel Bus is open. More...
 
virtual uint_t GetAlarms ()
 Get current alarms. More...
 
virtual void ClearAlarms ()
 Clear current alarms.
 
virtual uint_t GetBusStatus ()
 Get the Dynamixel Bus status. More...
 

Static Public Attributes

static const int RetryMax = 5
 maximum number of I/O retries
 
static const int RetryWait = 20000
 microsecond wait between retries
 

Protected Member Functions

int MakeSerialIndex (const char *sSerialDevName)
 Make serial index from serial device name. More...
 
void InitRTS ()
 Intialize RTS signalling.
 
void InitCTS ()
 Intialize CTS signalling.
 
void InitGPIO (int nGpioNum)
 Intialize GPIO signalling. More...
 

Static Protected Member Functions

static void EnableTxRTS (void *pArg)
 Enable transmit via RTS signal. More...
 
static void EnableRxRTS (void *pArg, size_t uNumTxBytes)
 Enable receive via RTS signal. More...
 
static void EnableTxCTS (void *pArg)
 Enable transmit via CTS signal. More...
 
static void EnableRxCTS (void *pArg, size_t uNumTxBytes)
 Enable receive via CTS signal. More...
 
static void EnableTxGPIO (void *pArg)
 Enable transmit via GPIO signal. More...
 
static void EnableRxGPIO (void *pArg, size_t uNumTxBytes)
 Enable receive via GPIO signal. More...
 

Protected Attributes

char * m_sSerialDevName
 serial device name
 
int m_fd
 serial file descriptor
 
int m_nGpioNum
 gpio number
 
int m_fdGpio
 gpio file descriptor
 
int m_nGpioVal
 gpio shadow'ed value
 
libdxl::dxl m_dxl
 dxl low-level interface
 
- Protected Attributes inherited from DynaComm
char * m_sDevUri
 dynamixel bus device URI
 
int m_nBaudRate
 baud rate
 
bool m_bIsOpen
 dynamixel bus communication is [not] open
 
uint_t m_uBusStatus
 bus comminication status
 
uint_t m_uAlarms
 servo alarms from last I/O operation
 
shm_mutex_t m_mutexComm
 synchonization mutex
 

Additional Inherited Members

- Static Public Member Functions inherited from DynaComm
static DynaCommNew (const char *sUri, int nBaudRate)
 Archetype constructor to create a new Dynamixel bus communication derived instance. More...
 
static std::string GetAlarmsString (const uint_t uAlarms, const std::string &strSep="; ")
 Get a formatted servo alarms string associated with the alarms. More...
 
static std::string GetAlarmsShortString (const uint_t uAlarms, const std::string &strSep=",")
 Get a formatted servo alarms short string associated with the alarms. More...
 
static const char * GetBusStatusString (uint_t uBusStatus)
 Get the string describing the Dynamixel servo communication status. More...
 
static int BaudRateToNum (int nBaudRate)
 Map baud rate to Dynamixel baud number. More...
 
static int BaudNumToRate (int nBaudRate)
 Map baud number to Dynamixel baud rate. More...
 
static int BaudRateAt (int nIndex)
 Get the baud rate associated with the given index. More...
 
static int BaudNumAt (int nIndex)
 Get the baud number associated with the given index. More...
 
- Static Protected Attributes inherited from DynaComm
static const key_t ShmKey = 0x70add12a
 shared memory key More...
 

Detailed Description

Dynamixel Serial Bus Communications Class.

Definition at line 74 of file DynaCommSerial.h.

Member Enumeration Documentation

Half-duplex control signals.

Note
Keep out of any potential non-modem signal space (e.g. GPIO 123, etc).
Enumerator
CtlSignalMinGPIO 

gpio signal is inverted (tx = low, rx = high)

CtlSignalMaxGPIO 

gpio signal (tx = high, rx = low)

CtlSignalModemRTS 

request to send

CtlSignalModemCTS 

clear to send

CtlSignalCustom 

custom interface (requires callbacks)

CtlSignalNone 

not a signal, but a value to clear signal

Definition at line 86 of file DynaCommSerial.h.

87  {
88  // GPIO: [-999, 999]
89  CtlSignalMinGPIO = -999, ///< gpio signal is inverted (tx = low, rx = high)
90  CtlSignalMaxGPIO = 999, ///< gpio signal (tx = high, rx = low)
91 
92  // modem
93  CtlSignalModemRTS = 1000, ///< request to send
94  CtlSignalModemCTS = 1001, ///< clear to send
95 
96  // other
97  CtlSignalCustom = 1010, ///< custom interface (requires callbacks)
98  CtlSignalNone = 1011 ///< not a signal, but a value to clear signal
99  };
gpio signal (tx = high, rx = low)
not a signal, but a value to clear signal
gpio signal is inverted (tx = low, rx = high)
custom interface (requires callbacks)

Constructor & Destructor Documentation

DynaCommSerial::DynaCommSerial ( const char *  sSerialDevName,
int  nBaudRate 
)

Initialization constructor.

The given serial device is opened at the baud rate.

Parameters
sSerialDevNameSerial device name.
nBaudRateSerial device baud rate.

Definition at line 89 of file DynaCommSerial.cxx.

References m_fd, m_fdGpio, m_nGpioNum, m_nGpioVal, m_sSerialDevName, newstr(), and Open().

89  :
90  DynaComm(sSerialDevName, nBaudRate)
91 {
92  m_sSerialDevName = newstr(sSerialDevName);
93  m_fd = -1;
94  m_nGpioNum = 0;
95  m_fdGpio = -1;
96  m_nGpioVal = -1;
97 
98  Open();
99 }
char * newstr(const char *s)
Allocate new duplicated string.
int m_nGpioVal
gpio shadow&#39;ed value
char * m_sSerialDevName
serial device name
virtual int Open()
(Re)Open serial communication to dynamixel bus.
int m_fd
serial file descriptor
int m_fdGpio
gpio file descriptor
int m_nGpioNum
gpio number

Member Function Documentation

int DynaCommSerial::Close ( )
virtual

Close serial communication to dynamixel bus.

Implements DynaComm.

Definition at line 185 of file DynaCommSerial.cxx.

References libdxl::dxl::close(), DYNA_OK, DynaComm::m_bIsOpen, m_dxl, and m_fd.

Referenced by GetResourceId(), Open(), and ~DynaCommSerial().

186 {
187  if( m_bIsOpen )
188  {
189  m_dxl.close();
190  m_fd = -1;
191  m_bIsOpen = false;
192  }
193  return DYNA_OK;
194 }
#define DYNA_OK
not an error, success
Definition: Dynamixel.h:78
bool m_bIsOpen
dynamixel bus communication is [not] open
Definition: DynaComm.h:501
libdxl::dxl m_dxl
dxl low-level interface
int m_fd
serial file descriptor
void close()
Close the Dynamixel Bus serial interface.
Definition: dynamixel.cxx:89
void DynaCommSerial::EnableRxCTS ( void *  pArg,
size_t  uNumTxBytes 
)
staticprotected

Enable receive via CTS signal.

Parameters
pArgPointer to this.
uNumTxBytesNumber of transmit bytes (being) transmitted.

Definition at line 598 of file DynaCommSerial.cxx.

References m_fd.

Referenced by SetHalfDuplexCtl().

599 {
600  DynaCommSerial *pThis = (DynaCommSerial *)pArg;
601 
602  SerDevFIFOOutputDrain(pThis->m_fd);
603  SerDevDeassertCTS(pThis->m_fd);
604 }
Dynamixel Serial Bus Communications Class.
int m_fd
serial file descriptor
void DynaCommSerial::EnableRxGPIO ( void *  pArg,
size_t  uNumTxBytes 
)
staticprotected

Enable receive via GPIO signal.

Parameters
pArgPointer to this.
uNumTxBytesNumber of transmit bytes (being) transmitted.

Definition at line 638 of file DynaCommSerial.cxx.

References m_fdGpio, DynaComm::m_nBaudRate, m_nGpioNum, and m_nGpioVal.

Referenced by SetHalfDuplexCtl().

639 {
640  static double TuneMargin = -30.0; // sleep margin in usec
641 
642  DynaCommSerial *pThis = (DynaCommSerial *)pArg;
643  int val;
644  float usecTx;
645 
646  if( pThis->m_fdGpio < 0 )
647  {
648  return;
649  }
650 
651  val = pThis->m_nGpioNum < 0? 1: 0;
652 
653  // already in receive mode
654  if( val == pThis->m_nGpioVal )
655  {
656  return;
657  }
658 
659  // tcdrain() takes too long to return - disappointing. so can't use
660  //SerDevFIFOOutputDrain(pThis->m_fd);
661 
662  //
663  // Estimate time to transmit. Each byte = 10 bits with Start and Stop bits.
664  //
665  usecTx = (double)(uNumTxBytes * 10)/(double)pThis->m_nBaudRate * 1000000.0
666  + TuneMargin;
667 
668  if( usecTx > 0.0 )
669  {
670  unsigned int usec = (unsigned int)usecTx;
671 
672  // wait
673  usleep(usec);
674  }
675 
676  // already at this value
677  if( gpioQuickWrite(pThis->m_fdGpio, val) == OK )
678  {
679  pThis->m_nGpioVal = val;
680  }
681 }
Dynamixel Serial Bus Communications Class.
int m_nBaudRate
baud rate
Definition: DynaComm.h:500
int m_nGpioVal
gpio shadow&#39;ed value
int m_fdGpio
gpio file descriptor
int m_nGpioNum
gpio number
void DynaCommSerial::EnableRxRTS ( void *  pArg,
size_t  uNumTxBytes 
)
staticprotected

Enable receive via RTS signal.

Parameters
pArgPointer to this.
uNumTxBytesNumber of transmit bytes (being) transmitted.

Definition at line 578 of file DynaCommSerial.cxx.

References m_fd.

Referenced by SetHalfDuplexCtl().

579 {
580  DynaCommSerial *pThis = (DynaCommSerial *)pArg;
581 
582  SerDevFIFOOutputDrain(pThis->m_fd);
583  SerDevDeassertRTS(pThis->m_fd);
584 }
Dynamixel Serial Bus Communications Class.
int m_fd
serial file descriptor
void DynaCommSerial::EnableTxCTS ( void *  pArg)
staticprotected

Enable transmit via CTS signal.

Parameters
pArgPointer to this.

Definition at line 591 of file DynaCommSerial.cxx.

References m_fd.

Referenced by SetHalfDuplexCtl().

592 {
593  DynaCommSerial *pThis = (DynaCommSerial *)pArg;
594 
595  SerDevAssertCTS(pThis->m_fd);
596 }
Dynamixel Serial Bus Communications Class.
int m_fd
serial file descriptor
void DynaCommSerial::EnableTxGPIO ( void *  pArg)
staticprotected

Enable transmit via GPIO signal.

Parameters
pArgPointer to this.

Definition at line 623 of file DynaCommSerial.cxx.

References m_fdGpio, m_nGpioNum, and m_nGpioVal.

Referenced by SetHalfDuplexCtl().

624 {
625  DynaCommSerial *pThis = (DynaCommSerial *)pArg;
626  int val;
627 
628  if( pThis->m_fdGpio >= 0 )
629  {
630  val = pThis->m_nGpioNum < 0? 0: 1;
631  if( gpioQuickWrite(pThis->m_fdGpio, val) == OK )
632  {
633  pThis->m_nGpioVal = val;
634  }
635  }
636 }
Dynamixel Serial Bus Communications Class.
int m_nGpioVal
gpio shadow&#39;ed value
int m_fdGpio
gpio file descriptor
int m_nGpioNum
gpio number
void DynaCommSerial::EnableTxRTS ( void *  pArg)
staticprotected

Enable transmit via RTS signal.

Parameters
pArgPointer to this.

Definition at line 571 of file DynaCommSerial.cxx.

References m_fd.

Referenced by SetHalfDuplexCtl().

572 {
573  DynaCommSerial *pThis = (DynaCommSerial *)pArg;
574 
575  SerDevAssertRTS(pThis->m_fd);
576 }
Dynamixel Serial Bus Communications Class.
int m_fd
serial file descriptor
virtual int DynaCommSerial::GetResourceId ( ) const
inlinevirtual

Get system-unique resource identifier.

Returns
Resource id.

Implements DynaComm.

Definition at line 136 of file DynaCommSerial.h.

References Close(), m_fd, Open(), Ping(), Read16(), Read8(), Reset(), SetBaudRate(), SetHalfDuplexCtl(), SyncWrite(), Write16(), and Write8().

137  {
138  return m_fd;
139  }
int m_fd
serial file descriptor
const char* DynaCommSerial::GetSerialDeviceName ( ) const
inline

Get the Dynamixel Bus serial device name.

Returns
Returns name.

Definition at line 126 of file DynaCommSerial.h.

References m_sSerialDevName.

127  {
128  return m_sSerialDevName;
129  }
char * m_sSerialDevName
serial device name
void DynaCommSerial::InitGPIO ( int  nGpioNum)
protected

Intialize GPIO signalling.

Parameters
nGpioNumGPIO number.

Definition at line 606 of file DynaCommSerial.cxx.

References m_fdGpio, m_nGpioNum, and m_nGpioVal.

Referenced by SetHalfDuplexCtl().

607 {
608  if( m_fdGpio >= 0 )
609  {
610  gpioClose(m_fdGpio);
611  m_fdGpio = -1;
612  }
613 
614  m_nGpioNum = nGpioNum;
615  m_nGpioVal = -1;
616 
617  if( (m_fdGpio = gpioOpen(abs(m_nGpioNum))) < 0 )
618  {
619  LOGERROR("GPIO %d: Failed to open.", abs(m_nGpioNum));
620  }
621 }
int m_nGpioVal
gpio shadow&#39;ed value
int m_fdGpio
gpio file descriptor
int m_nGpioNum
gpio number
int DynaCommSerial::MakeSerialIndex ( const char *  sSerialDevName)
protected

Make serial index from serial device name.

Examples:
/dev/ttyUSB0 0
COM3 3
Parameters
sSeriaDevNameSerial device name.
Returns
Returns serial index on success.

Definition at line 534 of file DynaCommSerial.cxx.

References DYNA_ECODE_BAD_DEV, and DYNA_ECODE_BAD_VAL.

Referenced by Open().

535 {
536  int i, j, index;
537 
538  if( (sSerialDevName == NULL) || (*sSerialDevName == 0) )
539  {
540  return -DYNA_ECODE_BAD_VAL;
541  }
542 
543  if( access(sSerialDevName, F_OK) )
544  {
545  return -DYNA_ECODE_BAD_DEV;
546  }
547 
548  for(i=j=(int)strlen(sSerialDevName)-1; i>=0; --i)
549  {
550  if( !isdigit(sSerialDevName[i]) )
551  {
552  break;
553  }
554  }
555 
556  if( (i < 0) || (i == j) )
557  {
558  return -DYNA_ECODE_BAD_VAL;
559  }
560 
561  index = atoi(sSerialDevName+i+1);
562 
563  return index;
564 }
#define DYNA_ECODE_BAD_DEV
no or bad serial device
Definition: Dynamixel.h:87
#define DYNA_ECODE_BAD_VAL
bad value
Definition: Dynamixel.h:85
int DynaCommSerial::Open ( const char *  sSerialDevName,
int  nBaudRate 
)
virtual

Open serial communication to dynamixel bus.

The given serial device is opened at the given baud rate.

Parameters
sSerialDevNameSerial device name.
nBaudRateSerial device baud rate.

Implements DynaComm.

Definition at line 111 of file DynaCommSerial.cxx.

References Close(), DynaComm::m_nBaudRate, m_sSerialDevName, newstr(), and Open().

112 {
113  Close();
114 
115  if( m_sSerialDevName != NULL )
116  {
117  delete[] m_sSerialDevName;
118  }
119 
120  m_sSerialDevName = newstr(sSerialDevName);
121  m_nBaudRate = nBaudRate;
122 
123  return Open();
124 }
char * newstr(const char *s)
Allocate new duplicated string.
int m_nBaudRate
baud rate
Definition: DynaComm.h:500
char * m_sSerialDevName
serial device name
virtual int Open()
(Re)Open serial communication to dynamixel bus.
virtual int Close()
Close serial communication to dynamixel bus.
int DynaCommSerial::Open ( )
virtual

(Re)Open serial communication to dynamixel bus.

Implements DynaComm.

Definition at line 126 of file DynaCommSerial.cxx.

References DynaComm::BaudRateToNum(), Close(), libdxl::dxl::dxl_initialize(), DYNA_ECODE_BAD_DEV, DYNA_ECODE_BAD_VAL, DYNA_LOG_ERROR, DYNA_OK, libdxl::dxl::getFd(), DynaComm::m_bIsOpen, m_dxl, m_fd, DynaComm::m_nBaudRate, m_sSerialDevName, MakeSerialIndex(), and libdxl::dxl::open().

Referenced by DynaCommSerial(), GetResourceId(), and Open().

127 {
128 #if 0 // old dxl library
129  int nSerialIndex;
130  int nBaudNum;
131 #endif
132  int rc;
133 
134  Close();
135 
136  if( (m_sSerialDevName == NULL) || (*m_sSerialDevName == 0) )
137  {
138  rc = -DYNA_ECODE_BAD_VAL;
139  DYNA_LOG_ERROR(rc, "Unspecified serial device.");
140  }
141 
142 #if 0 // old dxl library
143  // make serial index from serial device
144  else if( (nSerialIndex = MakeSerialIndex(m_sSerialDevName)) < 0 )
145  {
146  DYNA_LOG_ERROR(nSerialIndex, "Bad serial device name: \"%s\".",
148  rc = nSerialIndex;
149  }
150 
151  // map baudrate to internal baud enumeration value
152  else if( (nBaudNum = BaudRateToNum(m_nBaudRate)) < 0 )
153  {
154  DYNA_LOG_ERROR(nBaudNum, "%d: Unsupported baudrate.", m_nBaudRate);
155  rc = nBaudNum;
156  }
157 
158  else if( m_dxl.dxl_initialize(nSerialIndex, nBaudNum) == 0 )
159  {
160  rc = -DYNA_ECODE_BAD_DEV;
161  DYNA_LOG_ERROR(rc, "Serial device \"%s\": Failed to initalize interface.",
163  }
164 #endif
165 
166  else if( m_dxl.open(m_sSerialDevName, m_nBaudRate) == 0 )
167  {
168  rc = -DYNA_ECODE_BAD_DEV;
169  DYNA_LOG_ERROR(rc, "Serial device \"%s\": Failed to initalize interface.",
171  }
172 
173  else
174  {
175  m_bIsOpen = true;
176  m_fd = m_dxl.getFd();
177  rc = DYNA_OK;
178  LOGDIAG3("Dynamixel bus communication opened on \"%s\"@%d.",
180  }
181 
182  return rc;
183 }
#define DYNA_OK
not an error, success
Definition: Dynamixel.h:78
int m_nBaudRate
baud rate
Definition: DynaComm.h:500
bool m_bIsOpen
dynamixel bus communication is [not] open
Definition: DynaComm.h:501
char * m_sSerialDevName
serial device name
#define DYNA_ECODE_BAD_DEV
no or bad serial device
Definition: Dynamixel.h:87
#define DYNA_LOG_ERROR(ecode, efmt,...)
Log Error.
int MakeSerialIndex(const char *sSerialDevName)
Make serial index from serial device name.
libdxl::dxl m_dxl
dxl low-level interface
int open(const char *deviceName, int baudrate)
Open Dynamixel Bus serial interface.
Definition: dynamixel.cxx:59
virtual int Close()
Close serial communication to dynamixel bus.
int m_fd
serial file descriptor
int getFd()
Get the Dynamixel Bus serial device file descriptor.
Definition: dynamixel.cxx:110
#define DYNA_ECODE_BAD_VAL
bad value
Definition: Dynamixel.h:85
int dxl_initialize(int deviceIndex, int baudnum)
Initialize Dynamixel Bus USB serial interface by index.
Definition: dynamixel.cxx:72
static int BaudRateToNum(int nBaudRate)
Map baud rate to Dynamixel baud number.
Definition: DynaComm.cxx:368
bool DynaCommSerial::Ping ( int  nServoId)
virtual

Ping the servo.

Parameters
nServoIdServo id.
Returns
Returns true if the servo responded, else false.

Implements DynaComm.

Definition at line 487 of file DynaCommSerial.cxx.

References DXL_COMM_RXSUCCESS, DYNA_TRY_COMM, libdxl::dxl::getResult(), m_dxl, DynaComm::m_mutexComm, and libdxl::dxl::ping().

Referenced by GetResourceId().

488 {
489  DYNA_TRY_COMM(*this);
490 
491  shm_mutex_lock(&m_mutexComm);
492 
493  m_dxl.ping(nServoId);
494 
495  shm_mutex_unlock(&m_mutexComm);
496 
497  return m_dxl.getResult() == DXL_COMM_RXSUCCESS? true: false;
498 }
int getResult()
Get last transmit/receive result.
Definition: dynamixel.cxx:446
#define DXL_COMM_RXSUCCESS
receive success
Definition: dxl.h:109
shm_mutex_t m_mutexComm
synchonization mutex
Definition: DynaComm.h:504
libdxl::dxl m_dxl
dxl low-level interface
void ping(int id)
Ping servo.
Definition: dynamixel.cxx:451
#define DYNA_TRY_COMM(comm)
Test if bus communication is available exception macro.
int DynaCommSerial::Read16 ( int  nServoId,
uint_t  uAddr,
ushort_t *  pVal 
)
virtual

Read a 16-bit value from Dynamixel servo control table.

Parameters
nServoIdServo id.
uAddrServo control table address.
[out]pValValue read.

Implements DynaComm.

Definition at line 338 of file DynaCommSerial.cxx.

References DXL_COMM_RXSUCCESS, DYNA_ECODE_RX_TIMEOUT, DYNA_LOG_ERROR, DYNA_LOG_SERVO_ALARMS, DYNA_OK, DYNA_TRY_COMM, DynaMapDxlToEcode(), libdxl::dxl::getResult(), libdxl::dxl::getRxPacketErrBits(), m_dxl, DynaComm::m_mutexComm, DynaComm::m_uAlarms, DynaComm::m_uBusStatus, libdxl::dxl::readWord(), RetryMax, and RetryWait.

Referenced by GetResourceId().

339 {
340  int nTries = 0;
341  int rc;
342 
343  DYNA_TRY_COMM(*this);
344 
345  shm_mutex_lock(&m_mutexComm);
346 
347  do
348  {
349  *pVal = (ushort_t)m_dxl.readWord(nServoId, (int)uAddr);
350 
351  m_uBusStatus = (uint_t)m_dxl.getResult();
352 
354  {
355  m_uAlarms = (uint_t)m_dxl.getRxPacketErrBits();
356  DYNA_LOG_SERVO_ALARMS(nServoId, m_uAlarms);
357  rc = DYNA_OK;
358  }
359  else
360  {
362  usleep(RetryWait);
363  }
364  } while( (rc == -DYNA_ECODE_RX_TIMEOUT) && (++nTries < RetryMax) );
365 
366  shm_mutex_unlock(&m_mutexComm);
367 
368  if (rc < 0 )
369  {
370  DYNA_LOG_ERROR(rc, "Read16(%d, 0x%02x)", nServoId, uAddr);
371  }
372 
373  return rc;
374 }
uint_t m_uAlarms
servo alarms from last I/O operation
Definition: DynaComm.h:503
int DynaMapDxlToEcode(int nDxlError)
Map DXL library error code to Dynamixel error code.
Definition: DynaError.cxx:117
#define DYNA_OK
not an error, success
Definition: Dynamixel.h:78
int getResult()
Get last transmit/receive result.
Definition: dynamixel.cxx:446
#define DYNA_ECODE_RX_TIMEOUT
dynamixel receive packet time out
Definition: Dynamixel.h:93
#define DXL_COMM_RXSUCCESS
receive success
Definition: dxl.h:109
shm_mutex_t m_mutexComm
synchonization mutex
Definition: DynaComm.h:504
#define DYNA_LOG_ERROR(ecode, efmt,...)
Log Error.
libdxl::dxl m_dxl
dxl low-level interface
#define DYNA_LOG_SERVO_ALARMS(id, alarms)
Log servo alarms.
uint_t m_uBusStatus
bus comminication status
Definition: DynaComm.h:502
static const int RetryMax
maximum number of I/O retries
unsigned int getRxPacketErrBits()
Get receive packet error bits field.
Definition: dynamixel.cxx:135
static const int RetryWait
microsecond wait between retries
int readWord(int id, int address)
Read word from servo&#39;s control table.
Definition: dynamixel.cxx:490
#define DYNA_TRY_COMM(comm)
Test if bus communication is available exception macro.
int DynaCommSerial::Read8 ( int  nServoId,
uint_t  uAddr,
byte_t *  pVal 
)
virtual

Read an 8-bit value from Dynamixel servo control table.

Parameters
nServoIdServo id.
uAddrServo control table address.
[out]pValValue read.

Implements DynaComm.

Definition at line 262 of file DynaCommSerial.cxx.

References DXL_COMM_RXSUCCESS, DYNA_ECODE_RX_TIMEOUT, DYNA_LOG_ERROR, DYNA_LOG_SERVO_ALARMS, DYNA_OK, DYNA_TRY_COMM, DynaMapDxlToEcode(), libdxl::dxl::getResult(), libdxl::dxl::getRxPacketErrBits(), m_dxl, DynaComm::m_mutexComm, DynaComm::m_uAlarms, DynaComm::m_uBusStatus, libdxl::dxl::readByte(), RetryMax, and RetryWait.

Referenced by GetResourceId().

263 {
264  int nTries = 0;
265  int rc;
266 
267  DYNA_TRY_COMM(*this);
268 
269  shm_mutex_lock(&m_mutexComm);
270 
271  do
272  {
273  *pVal = (byte_t)m_dxl.readByte(nServoId, (int)uAddr);
274 
275  m_uBusStatus = (uint_t)m_dxl.getResult();
276 
278  {
279  m_uAlarms = (uint_t)m_dxl.getRxPacketErrBits();
280  DYNA_LOG_SERVO_ALARMS(nServoId, m_uAlarms);
281  rc = DYNA_OK;
282  }
283  else
284  {
286  usleep(RetryWait);
287  }
288  } while( (rc == -DYNA_ECODE_RX_TIMEOUT) && (++nTries < RetryMax) );
289 
290  shm_mutex_unlock(&m_mutexComm);
291 
292  if (rc < 0 )
293  {
294  DYNA_LOG_ERROR(rc, "Read8(%d, 0x%02x)", nServoId, uAddr);
295  }
296 
297  return rc;
298 }
uint_t m_uAlarms
servo alarms from last I/O operation
Definition: DynaComm.h:503
int DynaMapDxlToEcode(int nDxlError)
Map DXL library error code to Dynamixel error code.
Definition: DynaError.cxx:117
#define DYNA_OK
not an error, success
Definition: Dynamixel.h:78
int getResult()
Get last transmit/receive result.
Definition: dynamixel.cxx:446
#define DYNA_ECODE_RX_TIMEOUT
dynamixel receive packet time out
Definition: Dynamixel.h:93
#define DXL_COMM_RXSUCCESS
receive success
Definition: dxl.h:109
shm_mutex_t m_mutexComm
synchonization mutex
Definition: DynaComm.h:504
#define DYNA_LOG_ERROR(ecode, efmt,...)
Log Error.
libdxl::dxl m_dxl
dxl low-level interface
#define DYNA_LOG_SERVO_ALARMS(id, alarms)
Log servo alarms.
uint_t m_uBusStatus
bus comminication status
Definition: DynaComm.h:502
static const int RetryMax
maximum number of I/O retries
unsigned int getRxPacketErrBits()
Get receive packet error bits field.
Definition: dynamixel.cxx:135
int readByte(int id, int address)
Read byte from servo&#39;s control table.
Definition: dynamixel.cxx:462
static const int RetryWait
microsecond wait between retries
#define DYNA_TRY_COMM(comm)
Test if bus communication is available exception macro.
int DynaCommSerial::Reset ( int  nServoId)
virtual

Reset a servo back to default values.

Warning
All configuration is lost.
Parameters
nServoIdServo id.

Implements DynaComm.

Definition at line 500 of file DynaCommSerial.cxx.

References DXL_COMM_RXSUCCESS, DXL_INST_RESET, DYNA_LOG_ERROR, DYNA_LOG_SERVO_ALARMS, DYNA_OK, DYNA_TRY_COMM, DynaMapDxlToEcode(), libdxl::dxl::getResult(), libdxl::dxl::getRxPacketErrBits(), m_dxl, DynaComm::m_mutexComm, DynaComm::m_uAlarms, DynaComm::m_uBusStatus, libdxl::dxl::setTxPacketId(), libdxl::dxl::setTxPacketInstruction(), libdxl::dxl::setTxPacketLength(), and libdxl::dxl::txrxPacket().

Referenced by GetResourceId().

501 {
502  int rc;
503 
504  DYNA_TRY_COMM(*this);
505 
506  shm_mutex_lock(&m_mutexComm);
507 
508  // make reset packet
509  m_dxl.setTxPacketId(nServoId);
512 
513  m_dxl.txrxPacket();
514 
515  m_uBusStatus = (uint_t)m_dxl.getResult();
516 
518  {
519  m_uAlarms = (uint_t)m_dxl.getRxPacketErrBits();
520  DYNA_LOG_SERVO_ALARMS(nServoId, m_uAlarms);
521  rc = DYNA_OK;
522  }
523  else
524  {
526  DYNA_LOG_ERROR(rc, "Reset(%d)", nServoId);
527  }
528 
529  shm_mutex_unlock(&m_mutexComm);
530 
531  return rc;
532 }
uint_t m_uAlarms
servo alarms from last I/O operation
Definition: DynaComm.h:503
int DynaMapDxlToEcode(int nDxlError)
Map DXL library error code to Dynamixel error code.
Definition: DynaError.cxx:117
#define DYNA_OK
not an error, success
Definition: Dynamixel.h:78
#define DXL_INST_RESET
reset servo defaults
Definition: dxl.h:84
int getResult()
Get last transmit/receive result.
Definition: dynamixel.cxx:446
#define DXL_COMM_RXSUCCESS
receive success
Definition: dxl.h:109
void txrxPacket()
Transmit instruction packet and receive status response packet.
Definition: dynamixel.cxx:431
void setTxPacketId(int id)
Set transmit packet servo id.
Definition: dynamixel.cxx:115
shm_mutex_t m_mutexComm
synchonization mutex
Definition: DynaComm.h:504
#define DYNA_LOG_ERROR(ecode, efmt,...)
Log Error.
void setTxPacketInstruction(int instruction)
Set transmit packet instruction.
Definition: dynamixel.cxx:120
libdxl::dxl m_dxl
dxl low-level interface
#define DYNA_LOG_SERVO_ALARMS(id, alarms)
Log servo alarms.
uint_t m_uBusStatus
bus comminication status
Definition: DynaComm.h:502
unsigned int getRxPacketErrBits()
Get receive packet error bits field.
Definition: dynamixel.cxx:135
void setTxPacketLength(int length)
Set transmit packet length.
Definition: dynamixel.cxx:130
#define DYNA_TRY_COMM(comm)
Test if bus communication is available exception macro.
int DynaCommSerial::SetBaudRate ( int  nNewBaudRate)
virtual

Set the Dynamixel Bus new baud rate.

Parameters
nNewBaudRateNew baud rate.

Implements DynaComm.

Definition at line 196 of file DynaCommSerial.cxx.

References DynaComm::BaudRateToNum(), DYNA_ECODE_SYS, DYNA_LOG_ERROR, DYNA_LOG_SYS_ERROR, DYNA_OK, DynaComm::m_bIsOpen, m_dxl, DynaComm::m_nBaudRate, m_sSerialDevName, and libdxl::dxl::setBaudRate().

Referenced by GetResourceId().

197 {
198  int rc; // return code
199 
200  // check baud rate against supported
201  if( (rc = BaudRateToNum(nNewBaudRate)) < 0 )
202  {
203  DYNA_LOG_ERROR(rc, "%d: Unsupported baudrate.", nNewBaudRate);
204  return rc;
205  }
206 
207  // already open, adjust serial parameters
208  if( m_bIsOpen )
209  {
210  if( !m_dxl.setBaudRate(nNewBaudRate) )
211  {
212  rc = -DYNA_ECODE_SYS;
214  "Serial device \"%s\": Failed to set baud rate %d.",
215  m_sSerialDevName, nNewBaudRate);
216  return rc;
217  }
218  }
219 
220  m_nBaudRate = nNewBaudRate;
221 
222  return DYNA_OK;
223 }
#define DYNA_LOG_SYS_ERROR(ecode, efmt,...)
Log System Error.
#define DYNA_OK
not an error, success
Definition: Dynamixel.h:78
int m_nBaudRate
baud rate
Definition: DynaComm.h:500
#define DYNA_ECODE_SYS
system (errno) error
Definition: Dynamixel.h:81
bool m_bIsOpen
dynamixel bus communication is [not] open
Definition: DynaComm.h:501
char * m_sSerialDevName
serial device name
#define DYNA_LOG_ERROR(ecode, efmt,...)
Log Error.
libdxl::dxl m_dxl
dxl low-level interface
int setBaudRate(int baudrate)
Set Dynamixel Bus serial device baud rate.
Definition: dynamixel.cxx:94
static int BaudRateToNum(int nBaudRate)
Map baud rate to Dynamixel baud number.
Definition: DynaComm.cxx:368
int DynaCommSerial::SetHalfDuplexCtl ( int  nSignal,
DynaComm::HalfDuplexTxFunc_T  fnEnableTx = NULL,
DynaComm::HalfDuplexRxFunc_T  fnEnableRx = NULL 
)
virtual

Set Dynamixel Bus half-duplex software control.

The Dynamixel 3-wire bus is half-duplex. Hardware may automatically control toggling between transmit and receive (e.g. RoadNarrows DynaUSB dongle). If there is no hardware support, then software must provide the tx/rx toggle functions.

Parameters
nSignalSignal assign to toggle.
fnEnableTxEnable transmit function.
fnEnableRxEnable receive function.

Implements DynaComm.

Definition at line 225 of file DynaCommSerial.cxx.

References CtlSignalCustom, CtlSignalModemCTS, CtlSignalModemRTS, CtlSignalNone, DYNA_OK, EnableRxCTS(), EnableRxGPIO(), EnableRxRTS(), EnableTxCTS(), EnableTxGPIO(), EnableTxRTS(), InitCTS(), InitGPIO(), InitRTS(), m_dxl, m_fd, and libdxl::dxl::setHalfDuplexCallbacks().

Referenced by GetResourceId().

228 {
229  switch( nSignal )
230  {
231  case CtlSignalModemRTS: // serial request to send
232  InitRTS();
233  SerDevSetHwFlowControl(m_fd, true);
236  this);
237  break;
238  case CtlSignalModemCTS: // serial clear to send
239  InitCTS();
240  SerDevSetHwFlowControl(m_fd, true);
243  this);
244  break;
245  case CtlSignalNone: // clear callbacks
246  m_dxl.setHalfDuplexCallbacks(NULL, NULL, NULL);
247  break;
248  case CtlSignalCustom: // custom signal
249  m_dxl.setHalfDuplexCallbacks(fnEnableTx, fnEnableRx, this);
250  break;
251  default: // gpio signal
252  InitGPIO(nSignal);
255  this);
256  break;
257  }
258 
259  return DYNA_OK;
260 }
void InitCTS()
Intialize CTS signalling.
#define DYNA_OK
not an error, success
Definition: Dynamixel.h:78
not a signal, but a value to clear signal
int setHalfDuplexCallbacks(dxl_hdctl_tx_cb_t enable_tx_cb, dxl_hdctl_rx_cb_t enable_rx_cb, void *arg)
Set serial half-duplex callbacks.
Definition: dynamixel.cxx:99
static void EnableRxRTS(void *pArg, size_t uNumTxBytes)
Enable receive via RTS signal.
static void EnableRxGPIO(void *pArg, size_t uNumTxBytes)
Enable receive via GPIO signal.
static void EnableRxCTS(void *pArg, size_t uNumTxBytes)
Enable receive via CTS signal.
libdxl::dxl m_dxl
dxl low-level interface
void InitRTS()
Intialize RTS signalling.
void InitGPIO(int nGpioNum)
Intialize GPIO signalling.
custom interface (requires callbacks)
int m_fd
serial file descriptor
static void EnableTxGPIO(void *pArg)
Enable transmit via GPIO signal.
static void EnableTxRTS(void *pArg)
Enable transmit via RTS signal.
static void EnableTxCTS(void *pArg)
Enable transmit via CTS signal.
int DynaCommSerial::SyncWrite ( uint_t  uAddr,
uint_t  uValSize,
DynaSyncWriteTuple_T  tuples[],
uint_t  uCount 
)
virtual

Synchronous Write 8/16-bit values to a list of Dynamixel servos.

Parameters
uAddrServo control table write address.
uValSizeValue storage size at addtess. 1 or 2 bytes.
tuplesArray of servo id, write value 2-tuples.
uCountNumber of tuples.

Implements DynaComm.

Definition at line 414 of file DynaCommSerial.cxx.

References DXL_BROADCAST_ID, DXL_COMM_RXSUCCESS, DXL_INST_SYNC_WRITE, DYNA_ECODE_RX_TIMEOUT, DYNA_LOG_ERROR, DYNA_OK, DYNA_TRY_COMM, DynaMapDxlToEcode(), libdxl::dxl::getHighByte(), libdxl::dxl::getLowByte(), libdxl::dxl::getResult(), m_dxl, DynaComm::m_mutexComm, DynaComm::m_uBusStatus, DynaSyncWriteTuple_T::m_uVal, RetryMax, RetryWait, libdxl::dxl::setTxPacketId(), libdxl::dxl::setTxPacketInstruction(), libdxl::dxl::setTxPacketLength(), libdxl::dxl::setTxPacketParameter(), and libdxl::dxl::txrxPacket().

Referenced by GetResourceId().

418 {
419  int i;
420  int j;
421  int nTries = 0;
422  int rc;
423 
424  DYNA_TRY_COMM(*this);
425 
426  shm_mutex_lock(&m_mutexComm);
427 
428  //
429  // packet header
430  //
431  j = 0;
432  m_dxl.setTxPacketId(DXL_BROADCAST_ID); // broadcast id
434  m_dxl.setTxPacketParameter(j++, (int)uAddr); // write address
435  m_dxl.setTxPacketParameter(j++, (int)uValSize); // value size at address
436 
437  //
438  // servo_id, val_lsb[, val_msb]
439  //
440  for(i=0; i<(int)uCount; ++i)
441  {
442  m_dxl.setTxPacketParameter(j++, tuples[i].m_nServoId);
443 
444  if( uValSize == 1 )
445  {
446  m_dxl.setTxPacketParameter(j++, m_dxl.getLowByte((int)tuples[i].m_uVal));
447  }
448  else
449  {
450  m_dxl.setTxPacketParameter(j++, m_dxl.getLowByte((int)tuples[i].m_uVal));
451  m_dxl.setTxPacketParameter(j++, m_dxl.getHighByte((int)tuples[i].m_uVal));
452  }
453  }
454 
455  // packet length in header
457 
458  do
459  {
460  // send sync packet
461  m_dxl.txrxPacket();
462 
463  m_uBusStatus = (uint_t)m_dxl.getResult();
464 
466  {
467  rc = DYNA_OK;
468  }
469  else
470  {
472  usleep(RetryWait);
473  }
474  } while( (rc == -DYNA_ECODE_RX_TIMEOUT) && (++nTries < RetryMax) );
475 
476  shm_mutex_unlock(&m_mutexComm);
477 
478  if (rc < 0 )
479  {
480  DYNA_LOG_ERROR(rc, "SyncWrite(0x%02x, %d, tuples, %d)",
481  uAddr, uValSize, uCount);
482  }
483 
484  return rc;
485 }
int DynaMapDxlToEcode(int nDxlError)
Map DXL library error code to Dynamixel error code.
Definition: DynaError.cxx:117
int getHighByte(int word)
Get high byte from word.
Definition: dynamixel.cxx:173
#define DXL_INST_SYNC_WRITE
synchronous write servo(s) data
Definition: dxl.h:85
#define DYNA_OK
not an error, success
Definition: Dynamixel.h:78
int getLowByte(int word)
Get low byte from word.
Definition: dynamixel.cxx:165
void setTxPacketParameter(int index, int value)
Set transmit packet parameter value.
Definition: dynamixel.cxx:125
int getResult()
Get last transmit/receive result.
Definition: dynamixel.cxx:446
#define DYNA_ECODE_RX_TIMEOUT
dynamixel receive packet time out
Definition: Dynamixel.h:93
#define DXL_COMM_RXSUCCESS
receive success
Definition: dxl.h:109
void txrxPacket()
Transmit instruction packet and receive status response packet.
Definition: dynamixel.cxx:431
void setTxPacketId(int id)
Set transmit packet servo id.
Definition: dynamixel.cxx:115
shm_mutex_t m_mutexComm
synchonization mutex
Definition: DynaComm.h:504
#define DYNA_LOG_ERROR(ecode, efmt,...)
Log Error.
void setTxPacketInstruction(int instruction)
Set transmit packet instruction.
Definition: dynamixel.cxx:120
libdxl::dxl m_dxl
dxl low-level interface
uint_t m_uBusStatus
bus comminication status
Definition: DynaComm.h:502
static const int RetryMax
maximum number of I/O retries
uint_t m_uVal
write value
Definition: DynaTypes.h:297
void setTxPacketLength(int length)
Set transmit packet length.
Definition: dynamixel.cxx:130
static const int RetryWait
microsecond wait between retries
#define DXL_BROADCAST_ID
broadcast "servo" id
Definition: dxl.h:92
#define DYNA_TRY_COMM(comm)
Test if bus communication is available exception macro.
int DynaCommSerial::Write16 ( int  nServoId,
uint_t  uAddr,
ushort_t  uhVal 
)
virtual

Write a 16-bit value to Dynamixel servo control table.

Parameters
nServoIdServo id.
uAddrServo control table address.
uhValValue written.

Implements DynaComm.

Definition at line 376 of file DynaCommSerial.cxx.

References DXL_COMM_RXSUCCESS, DYNA_ECODE_RX_TIMEOUT, DYNA_LOG_ERROR, DYNA_LOG_SERVO_ALARMS, DYNA_OK, DYNA_TRY_COMM, DynaMapDxlToEcode(), libdxl::dxl::getResult(), libdxl::dxl::getRxPacketErrBits(), m_dxl, DynaComm::m_mutexComm, DynaComm::m_uAlarms, DynaComm::m_uBusStatus, RetryMax, RetryWait, and libdxl::dxl::writeWord().

Referenced by GetResourceId().

377 {
378  int nTries = 0;
379  int rc;
380 
381  DYNA_TRY_COMM(*this);
382 
383  shm_mutex_lock(&m_mutexComm);
384 
385  do
386  {
387  m_dxl.writeWord(nServoId, (int)uAddr, (int)uhVal);
388 
389  m_uBusStatus = (uint_t)m_dxl.getResult();
390 
392  {
393  m_uAlarms = (uint_t)m_dxl.getRxPacketErrBits();
394  DYNA_LOG_SERVO_ALARMS(nServoId, m_uAlarms);
395  rc = DYNA_OK;
396  }
397  else
398  {
400  usleep(RetryWait);
401  }
402  } while( (rc == -DYNA_ECODE_RX_TIMEOUT) && (++nTries < RetryMax) );
403 
404  shm_mutex_unlock(&m_mutexComm);
405 
406  if (rc < 0 )
407  {
408  DYNA_LOG_ERROR(rc, "Write16(%d, 0x%02x, 0x%04x)", nServoId, uAddr, uhVal);
409  }
410 
411  return rc;
412 }
uint_t m_uAlarms
servo alarms from last I/O operation
Definition: DynaComm.h:503
int DynaMapDxlToEcode(int nDxlError)
Map DXL library error code to Dynamixel error code.
Definition: DynaError.cxx:117
void writeWord(int id, int address, int value)
Write word to servo&#39;s control table.
Definition: dynamixel.cxx:505
#define DYNA_OK
not an error, success
Definition: Dynamixel.h:78
int getResult()
Get last transmit/receive result.
Definition: dynamixel.cxx:446
#define DYNA_ECODE_RX_TIMEOUT
dynamixel receive packet time out
Definition: Dynamixel.h:93
#define DXL_COMM_RXSUCCESS
receive success
Definition: dxl.h:109
shm_mutex_t m_mutexComm
synchonization mutex
Definition: DynaComm.h:504
#define DYNA_LOG_ERROR(ecode, efmt,...)
Log Error.
libdxl::dxl m_dxl
dxl low-level interface
#define DYNA_LOG_SERVO_ALARMS(id, alarms)
Log servo alarms.
uint_t m_uBusStatus
bus comminication status
Definition: DynaComm.h:502
static const int RetryMax
maximum number of I/O retries
unsigned int getRxPacketErrBits()
Get receive packet error bits field.
Definition: dynamixel.cxx:135
static const int RetryWait
microsecond wait between retries
#define DYNA_TRY_COMM(comm)
Test if bus communication is available exception macro.
int DynaCommSerial::Write8 ( int  nServoId,
uint_t  uAddr,
byte_t  byVal 
)
virtual

Write an 8-bit value to Dynamixel servo control table.

Parameters
nServoIdServo id.
uAddrServo control table address.
byValValue written.

Implements DynaComm.

Definition at line 300 of file DynaCommSerial.cxx.

References DXL_COMM_RXSUCCESS, DYNA_ECODE_RX_TIMEOUT, DYNA_LOG_ERROR, DYNA_LOG_SERVO_ALARMS, DYNA_OK, DYNA_TRY_COMM, DynaMapDxlToEcode(), libdxl::dxl::getResult(), libdxl::dxl::getRxPacketErrBits(), m_dxl, DynaComm::m_mutexComm, DynaComm::m_uAlarms, DynaComm::m_uBusStatus, RetryMax, RetryWait, and libdxl::dxl::writeByte().

Referenced by GetResourceId().

301 {
302  int nTries = 0;
303  int rc;
304 
305  DYNA_TRY_COMM(*this);
306 
307  shm_mutex_lock(&m_mutexComm);
308 
309  do
310  {
311  m_dxl.writeByte(nServoId, (int)uAddr, (int)byVal);
312 
313  m_uBusStatus = (uint_t)m_dxl.getResult();
314 
316  {
317  m_uAlarms = (uint_t)m_dxl.getRxPacketErrBits();
318  DYNA_LOG_SERVO_ALARMS(nServoId, m_uAlarms);
319  rc = DYNA_OK;
320  }
321  else
322  {
324  usleep(RetryWait);
325  }
326  } while( (rc == -DYNA_ECODE_RX_TIMEOUT) && (++nTries < RetryMax) );
327 
328  shm_mutex_unlock(&m_mutexComm);
329 
330  if (rc < 0 )
331  {
332  DYNA_LOG_ERROR(rc, "Write8(%d, 0x%02x, 0x%02x)", nServoId, uAddr, byVal);
333  }
334 
335  return rc;
336 }
uint_t m_uAlarms
servo alarms from last I/O operation
Definition: DynaComm.h:503
int DynaMapDxlToEcode(int nDxlError)
Map DXL library error code to Dynamixel error code.
Definition: DynaError.cxx:117
#define DYNA_OK
not an error, success
Definition: Dynamixel.h:78
int getResult()
Get last transmit/receive result.
Definition: dynamixel.cxx:446
#define DYNA_ECODE_RX_TIMEOUT
dynamixel receive packet time out
Definition: Dynamixel.h:93
#define DXL_COMM_RXSUCCESS
receive success
Definition: dxl.h:109
void writeByte(int id, int address, int value)
Write byte to servo&#39;s control table.
Definition: dynamixel.cxx:477
shm_mutex_t m_mutexComm
synchonization mutex
Definition: DynaComm.h:504
#define DYNA_LOG_ERROR(ecode, efmt,...)
Log Error.
libdxl::dxl m_dxl
dxl low-level interface
#define DYNA_LOG_SERVO_ALARMS(id, alarms)
Log servo alarms.
uint_t m_uBusStatus
bus comminication status
Definition: DynaComm.h:502
static const int RetryMax
maximum number of I/O retries
unsigned int getRxPacketErrBits()
Get receive packet error bits field.
Definition: dynamixel.cxx:135
static const int RetryWait
microsecond wait between retries
#define DYNA_TRY_COMM(comm)
Test if bus communication is available exception macro.

The documentation for this class was generated from the following files: