Dynamixel  2.9.5
RoadNarrows Robotics Dynamixel Package
bsDynaClient.cxx
Go to the documentation of this file.
1 ////////////////////////////////////////////////////////////////////////////////
2 //
3 // Package: Dynamixel
4 //
5 // Module: bsDyna
6 //
7 // Library: libbsclient_dyna
8 //
9 // File: bsDynaClient.cxx
10 //
11 /*! \file
12  *
13  * $LastChangedDate: 2015-01-12 10:56:06 -0700 (Mon, 12 Jan 2015) $
14  * $Rev: 3845 $
15  *
16  * \brief BotSense bsProxy client proxied Dynamixel device.
17  *
18  * \author Robin Knight (robin.knight@roadnarrows.com)
19  *
20  * \copyright
21  * \h_copy 2012-2017. RoadNarrows LLC.\n
22  * http://www.roadnarrows.com\n
23  * All Rights Reserved
24  */
25 /*
26  * @EulaBegin@
27  *
28  * Unless otherwise stated explicitly, all materials contained are copyrighted
29  * and may not be used without RoadNarrows LLC's written consent,
30  * except as provided in these terms and conditions or in the copyright
31  * notice (documents and software) or other proprietary notice provided with
32  * the relevant materials.
33  *
34  * IN NO EVENT SHALL THE AUTHOR, ROADNARROWS LLC, OR ANY
35  * MEMBERS/EMPLOYEES/CONTRACTORS OF ROADNARROWS OR DISTRIBUTORS OF THIS SOFTWARE
36  * BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR
37  * CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS
38  * DOCUMENTATION, EVEN IF THE AUTHORS OR ANY OF THE ABOVE PARTIES HAVE BEEN
39  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
40  *
41  * THE AUTHORS AND ROADNARROWS LLC SPECIFICALLY DISCLAIM ANY WARRANTIES,
42  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
43  * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN
44  * "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO OBLIGATION TO
45  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
46  *
47  * @EulaEnd@
48  */
49 ////////////////////////////////////////////////////////////////////////////////
50 
51 #include <stdio.h>
52 #include <stdlib.h>
53 #include <libgen.h>
54 #include <string.h>
55 
56 #include "rnr/rnrconfig.h"
57 #include "rnr/log.h"
58 #include "rnr/netmsgs.h"
59 
60 #include "botsense/BotSense.h"
61 #include "botsense/libBotSense.h"
62 #include "botsense/bsProxyMsgs.h"
63 #include "botsense/bsDyna.h"
64 #include "botsense/bsDynaMsgs.h"
65 
66 
67 // ---------------------------------------------------------------------------
68 // Private Interface
69 // ---------------------------------------------------------------------------
70 
71 /*!
72  * \brief \h_botsense client application information.
73  */
74 static BsClientAppInfo_T bsDynaAppInfo =
75 {
76  "libbsclient_dyna",
77  "The proxied Dynamixel servo chain.",
78  "1.1.0",
79  "2015.01.09",
80  "RoadNarrows LLC",
81  "(C) 2012-2015 RoadNarrows LLC. All rights reserved.",
83 };
84 
85 // ---------------------------------------------------------------------------
86 // Public Interface
87 // ---------------------------------------------------------------------------
88 
89 const char *bsDynaGetMsgName(BsClient_P pClient,
90  BsVConnHnd_T hndVConn,
91  uint_t uMsgId)
92 {
93  const NMMsgDef_T *pMsgDef;
94 
95  pMsgDef = BsDynaLookupMsgDef((BsDynaMsgId_T)uMsgId);
96 
97  return pMsgDef!=NULL? pMsgDef->m_sMsgName: "unknown";
98 }
99 
100 int bsDynaOpen(BsClient_P pClient,
101  const char *sDevName,
102  int nBaudRate,
103  bool_t bInitTrace)
104 {
105  static BsDynaMsgId_T msgIdReq = BsDynaMsgIdReqOpenArgs;
106 
107  BsDynaReqOpenArgs_T msgReq; // specific open args
108  byte_t buf[BSPROXY_MSG_MAX_LEN]; // specific open args buffer
109  bool_t bTrace; // do [not] trace messages
110  int n; // num of bytes/return code
111 
112  // trace state
113  bTrace = bsClientAttrGetTraceState(pClient, BSPROXY_VCONN_SERVER);
114 
115  //
116  // Set specific open argument values.
117  //
118  msgReq.m_baudrate = (uint_t)nBaudRate;
119 
120  //
121  // Pack specific open arguments (returns bytes packed \h_ge 0 on success).
122  //
123  n = BsDynaPackReqOpenArgs(&msgReq, buf, sizeof(buf), bTrace);
124 
125  // check packing return code
126  BSCLIENT_TRY_NM_ECODE(pClient, n, "MsgId=%u", msgIdReq);
127 
128 
129  //
130  // Execute server transaction (returns handle \h_ge 0 on success).
131  //
132  n = bsServerReqOpenDev(pClient, sDevName, BS_DYNA_SERVER_MOD, buf, (size_t)n,
133  &bsDynaAppInfo, bInitTrace);
134 
135  // check transaction return code
136  BSCLIENT_TRY_ECODE(pClient, n, "bsServerReqOpenDev(dev='%s') failed.",
137  sDevName);
138 
139  // return handle
140  return n;
141 }
142 
143 int bsDynaClose(BsClient_P pClient, BsVConnHnd_T hndVConn)
144 {
145  return bsServerReqCloseDev(pClient, hndVConn);
146 }
147 
148 int bsDynaSetBaudRate(BsClient_P pClient,
149  BsVConnHnd_T hndVConn,
150  int nBaudRate)
151 {
152  static BsDynaMsgId_T msgIdReq = BsDynaMsgIdReqSetBaudRate;
153  static BsProxyMsgId_T msgIdRsp = BsProxyMsgIdRspOk;
154 
155  BsDynaReqSetBaudRate_T msgReq; // response message
156  byte_t buf[BSPROXY_MSG_MAX_LEN]; // req/rsp buffer
157  bool_t bTrace; // do [not] trace messages
158  int n; // num of bytes/return code
159 
160  //
161  // Parameter checks.
162  //
163  BSCLIENT_TRY_EXPR(pClient, BSCLIENT_HAS_VCONN(pClient, hndVConn),
164  BS_ECODE_BAD_VAL, "VConn=%d", hndVConn);
165 
166  // trace state
167  bTrace = bsClientAttrGetTraceState(pClient, hndVConn);
168 
169  //
170  // Set request message values.
171  //
172  msgReq.m_baudrate = (uint_t)nBaudRate;
173 
174  //
175  // Pack request.
176  //
177  n = BsDynaPackReqSetBaudRate(&msgReq, BSPROXY_BUF_BODY(buf), bTrace);
178 
179  // check packing return code
180  BSCLIENT_TRY_NM_ECODE(pClient, n, "MsgId=%u", msgIdReq);
181 
182  //
183  // Execute request-response transaction.
184  //
185  n = bsClientTrans(pClient, hndVConn,
186  msgIdReq, buf, (size_t)n,
187  msgIdRsp, buf, sizeof(buf));
188 
189  // check transaction return code
190  BSCLIENT_TRY_ECODE(pClient, n, "MsgId=%u: Transaction failed.", msgIdReq);
191 
192  LOGDIAG3("%s: SetBaudRate: %d", bsClientAttrGetName(pClient), nBaudRate);
193 
194  return BS_OK;
195 }
196 
197 int bsDynaRead8(BsClient_P pClient,
198  BsVConnHnd_T hndVConn,
199  int nServoId,
200  uint_t uAddr,
201  byte_t *pVal,
202  uint_t *pAlarms)
203 {
204  static BsDynaMsgId_T msgIdReq = BsDynaMsgIdReqRead8;
205  static BsDynaMsgId_T msgIdRsp = BsDynaMsgIdRspRead8;
206 
207  BsDynaReqRead8_T msgReq; // response message
208  BsDynaRspRead8_T msgRsp; // response message
209  byte_t buf[BSPROXY_MSG_MAX_LEN]; // req/rsp buffer
210  bool_t bTrace; // do [not] trace messages
211  int n; // num of bytes/return code
212 
213  //
214  // Parameter checks.
215  //
216  BSCLIENT_TRY_EXPR(pClient, BSCLIENT_HAS_VCONN(pClient, hndVConn),
217  BS_ECODE_BAD_VAL, "VConn=%d", hndVConn);
218 
219  // trace state
220  bTrace = bsClientAttrGetTraceState(pClient, hndVConn);
221 
222  //
223  // Set request message values.
224  //
225  msgReq.m_servo_id = (byte_t)nServoId;
226  msgReq.m_addr = (byte_t)uAddr;
227 
228  //
229  // Pack request.
230  //
231  n = BsDynaPackReqRead8(&msgReq, BSPROXY_BUF_BODY(buf), bTrace);
232 
233  // check packing return code
234  BSCLIENT_TRY_NM_ECODE(pClient, n, "MsgId=%u", msgIdReq);
235 
236  //
237  // Execute request-response transaction.
238  //
239  n = bsClientTrans(pClient, hndVConn,
240  msgIdReq, buf, (size_t)n,
241  msgIdRsp, buf, sizeof(buf));
242 
243  // check transaction return code
244  BSCLIENT_TRY_ECODE(pClient, n, "MsgId=%u: Transaction failed.", msgIdReq);
245 
246  //
247  // Unpack response.
248  //
249  n = BsDynaUnpackRspRead8(buf, (size_t)n, &msgRsp, bTrace);
250 
251  // check unpack return code
252  BSCLIENT_TRY_NM_ECODE(pClient, n, "MsgId=%u", msgIdRsp);
253 
254  //
255  // Set return values from response.
256  //
257  *pAlarms = (uint_t)msgRsp.m_alarms;
258  *pVal = msgRsp.m_val;
259 
260  LOGDIAG3("%s: Read8: 0x%02x --> 0x%02x.",
261  bsClientAttrGetName(pClient), uAddr, *pVal);
262 
263  return BS_OK;
264 }
265 
266 int bsDynaRead16(BsClient_P pClient,
267  BsVConnHnd_T hndVConn,
268  int nServoId,
269  uint_t uAddr,
270  ushort_t *pVal,
271  uint_t *pAlarms)
272 {
273  static BsDynaMsgId_T msgIdReq = BsDynaMsgIdReqRead16;
274  static BsDynaMsgId_T msgIdRsp = BsDynaMsgIdRspRead16;
275 
276  BsDynaReqRead16_T msgReq; // response message
277  BsDynaRspRead16_T msgRsp; // response message
278  byte_t buf[BSPROXY_MSG_MAX_LEN]; // req/rsp buffer
279  bool_t bTrace; // do [not] trace messages
280  int n; // num of bytes/return code
281 
282  //
283  // Parameter checks.
284  //
285  BSCLIENT_TRY_EXPR(pClient, BSCLIENT_HAS_VCONN(pClient, hndVConn),
286  BS_ECODE_BAD_VAL, "VConn=%d", hndVConn);
287 
288  // trace state
289  bTrace = bsClientAttrGetTraceState(pClient, hndVConn);
290 
291  //
292  // Set request message values.
293  //
294  msgReq.m_servo_id = (byte_t)nServoId;
295  msgReq.m_addr = (byte_t)uAddr;
296 
297  //
298  // Pack request.
299  //
300  n = BsDynaPackReqRead16(&msgReq, BSPROXY_BUF_BODY(buf), bTrace);
301 
302  // check packing return code
303  BSCLIENT_TRY_NM_ECODE(pClient, n, "MsgId=%u", msgIdReq);
304 
305  //
306  // Execute request-response transaction.
307  //
308  n = bsClientTrans(pClient, hndVConn,
309  msgIdReq, buf, (size_t)n,
310  msgIdRsp, buf, sizeof(buf));
311 
312  // check transaction return code
313  BSCLIENT_TRY_ECODE(pClient, n, "MsgId=%u: Transaction failed.", msgIdReq);
314 
315  //
316  // Unpack response.
317  //
318  n = BsDynaUnpackRspRead16(buf, (size_t)n, &msgRsp, bTrace);
319 
320  // check unpack return code
321  BSCLIENT_TRY_NM_ECODE(pClient, n, "MsgId=%u", msgIdRsp);
322 
323  //
324  // Set return values from response.
325  //
326  *pAlarms = (uint_t)msgRsp.m_alarms;
327  *pVal = msgRsp.m_val;
328 
329  LOGDIAG3("%s: Read16: 0x%02x --> 0x%04x.",
330  bsClientAttrGetName(pClient), uAddr, *pVal);
331 
332  return BS_OK;
333 }
334 
335 int bsDynaWrite8(BsClient_P pClient,
336  BsVConnHnd_T hndVConn,
337  int nServoId,
338  uint_t uAddr,
339  byte_t byVal,
340  uint_t *pAlarms)
341 {
342  static BsDynaMsgId_T msgIdReq = BsDynaMsgIdReqWrite8;
343  static BsDynaMsgId_T msgIdRsp = BsDynaMsgIdRspWrite8;
344 
345  BsDynaReqWrite8_T msgReq; // response message
346  BsDynaRspWrite8_T msgRsp; // response message
347  byte_t buf[BSPROXY_MSG_MAX_LEN]; // req/rsp buffer
348  bool_t bTrace; // do [not] trace messages
349  int n; // num of bytes/return code
350 
351  //
352  // Parameter checks.
353  //
354  BSCLIENT_TRY_EXPR(pClient, BSCLIENT_HAS_VCONN(pClient, hndVConn),
355  BS_ECODE_BAD_VAL, "VConn=%d", hndVConn);
356 
357  // trace state
358  bTrace = bsClientAttrGetTraceState(pClient, hndVConn);
359 
360  //
361  // Set request message values.
362  //
363  msgReq.m_servo_id = (byte_t)nServoId;
364  msgReq.m_addr = (byte_t)uAddr;
365  msgReq.m_val = byVal;
366 
367  //
368  // Pack request.
369  //
370  n = BsDynaPackReqWrite8(&msgReq, BSPROXY_BUF_BODY(buf), bTrace);
371 
372  // check packing return code
373  BSCLIENT_TRY_NM_ECODE(pClient, n, "MsgId=%u", msgIdReq);
374 
375  //
376  // Execute request-response transaction.
377  //
378  n = bsClientTrans(pClient, hndVConn,
379  msgIdReq, buf, (size_t)n,
380  msgIdRsp, buf, sizeof(buf));
381 
382  // check transaction return code
383  BSCLIENT_TRY_ECODE(pClient, n, "MsgId=%u: Transaction failed.", msgIdReq);
384 
385  //
386  // Unpack response.
387  //
388  n = BsDynaUnpackRspWrite8(buf, (size_t)n, &msgRsp, bTrace);
389 
390  // check unpack return code
391  BSCLIENT_TRY_NM_ECODE(pClient, n, "MsgId=%u", msgIdRsp);
392 
393  //
394  // Set return values from response.
395  //
396  *pAlarms = (uint_t)msgRsp.m_alarms;
397 
398  LOGDIAG3("%s: Write8: 0x%02x <-- 0x%02x.",
399  bsClientAttrGetName(pClient), uAddr, byVal);
400 
401  return BS_OK;
402 }
403 
404 int bsDynaWrite16(BsClient_P pClient,
405  BsVConnHnd_T hndVConn,
406  int nServoId,
407  uint_t uAddr,
408  ushort_t huVal,
409  uint_t *pAlarms)
410 {
411  static BsDynaMsgId_T msgIdReq = BsDynaMsgIdReqWrite16;
412  static BsDynaMsgId_T msgIdRsp = BsDynaMsgIdRspWrite16;
413 
414  BsDynaReqWrite16_T msgReq; // response message
415  BsDynaRspWrite16_T msgRsp; // response message
416  byte_t buf[BSPROXY_MSG_MAX_LEN]; // req/rsp buffer
417  bool_t bTrace; // do [not] trace messages
418  int n; // num of bytes/return code
419 
420  //
421  // Parameter checks.
422  //
423  BSCLIENT_TRY_EXPR(pClient, BSCLIENT_HAS_VCONN(pClient, hndVConn),
424  BS_ECODE_BAD_VAL, "VConn=%d", hndVConn);
425 
426  // trace state
427  bTrace = bsClientAttrGetTraceState(pClient, hndVConn);
428 
429  //
430  // Set request message values.
431  //
432  msgReq.m_servo_id = (byte_t)nServoId;
433  msgReq.m_addr = (byte_t)uAddr;
434  msgReq.m_val = huVal;
435 
436  //
437  // Pack request.
438  //
439  n = BsDynaPackReqWrite16(&msgReq, BSPROXY_BUF_BODY(buf), bTrace);
440 
441  // check packing return code
442  BSCLIENT_TRY_NM_ECODE(pClient, n, "MsgId=%u", msgIdReq);
443 
444  //
445  // Execute request-response transaction.
446  //
447  n = bsClientTrans(pClient, hndVConn,
448  msgIdReq, buf, (size_t)n,
449  msgIdRsp, buf, sizeof(buf));
450 
451  // check transaction return code
452  BSCLIENT_TRY_ECODE(pClient, n, "MsgId=%u: Transaction failed.", msgIdReq);
453 
454  //
455  // Unpack response.
456  //
457  n = BsDynaUnpackRspWrite16(buf, (size_t)n, &msgRsp, bTrace);
458 
459  // check unpack return code
460  BSCLIENT_TRY_NM_ECODE(pClient, n, "MsgId=%u", msgIdRsp);
461 
462  //
463  // Set return values from response.
464  //
465  *pAlarms = (uint_t)msgRsp.m_alarms;
466 
467  LOGDIAG3("%s: Write16: 0x%02x <-- 0x%04x.",
468  bsClientAttrGetName(pClient), uAddr, huVal);
469 
470  return BS_OK;
471 }
472 
473 int bsDynaSyncWrite(BsClient_P pClient,
474  BsVConnHnd_T hndVConn,
475  uint_t uAddr,
476  uint_t uDataSize,
477  DynaSyncWriteTuple_T tuples[],
478  uint_t uCount)
479 {
480  static BsDynaMsgId_T msgIdReq = BsDynaMsgIdReqSyncWrite;
481  static BsProxyMsgId_T msgIdRsp = BsProxyMsgIdRspOk;
482 
483  BsDynaReqSyncWrite_T msgReq; // response message
484  byte_t buf[BSPROXY_MSG_MAX_LEN]; // req/rsp buffer
485  bool_t bTrace; // do [not] trace messages
486  int n; // num of bytes/return code
487 
488  //
489  // Parameter checks.
490  //
491  BSCLIENT_TRY_EXPR(pClient, BSCLIENT_HAS_VCONN(pClient, hndVConn),
492  BS_ECODE_BAD_VAL, "VConn=%d", hndVConn);
493 
494  // trace state
495  bTrace = bsClientAttrGetTraceState(pClient, hndVConn);
496 
497  //
498  // Set request message values.
499  //
500  msgReq.m_addr = (byte_t)uAddr;
501  msgReq.m_data_size = (byte_t)uDataSize;
502 
503  for(n=0; (n<(int)uCount) && (n<DYNA_ID_NUMOF); ++n)
504  {
505  msgReq.m_tuples.u.m_buf[n].m_servo_id = (byte_t)tuples[n].m_nServoId;
506  msgReq.m_tuples.u.m_buf[n].m_val = (ushort_t)tuples[n].m_uVal;
507  }
508  msgReq.m_tuples.m_count = (size_t)n;
509 
510  //
511  // Pack request.
512  //
513  n = BsDynaPackReqSyncWrite(&msgReq, BSPROXY_BUF_BODY(buf), bTrace);
514 
515  // check packing return code
516  BSCLIENT_TRY_NM_ECODE(pClient, n, "MsgId=%u", msgIdReq);
517 
518  //
519  // Execute request-response transaction.
520  //
521  n = bsClientTrans(pClient, hndVConn,
522  msgIdReq, buf, (size_t)n,
523  msgIdRsp, buf, sizeof(buf));
524 
525  // check transaction return code
526  BSCLIENT_TRY_ECODE(pClient, n, "MsgId=%u: Transaction failed.", msgIdReq);
527 
528  LOGDIAG3("%s: SyncWrite: %u tuples to 0x%02x",
529  bsClientAttrGetName(pClient), uCount, uAddr);
530 
531  return BS_OK;
532 }
533 
534 int bsDynaPing(BsClient_P pClient,
535  BsVConnHnd_T hndVConn,
536  int nServoId,
537  bool_t *pPong)
538 {
539  static BsDynaMsgId_T msgIdReq = BsDynaMsgIdReqPing;
540  static BsDynaMsgId_T msgIdRsp = BsDynaMsgIdRspPing;
541 
542  BsDynaReqPing_T msgReq; // response message
543  BsDynaRspPing_T msgRsp; // response message
544  byte_t buf[BSPROXY_MSG_MAX_LEN]; // req/rsp buffer
545  bool_t bTrace; // do [not] trace messages
546  int n; // num of bytes/return code
547 
548  //
549  // Parameter checks.
550  //
551  BSCLIENT_TRY_EXPR(pClient, BSCLIENT_HAS_VCONN(pClient, hndVConn),
552  BS_ECODE_BAD_VAL, "VConn=%d", hndVConn);
553 
554  // trace state
555  bTrace = bsClientAttrGetTraceState(pClient, hndVConn);
556 
557  //
558  // Set request message values.
559  //
560  msgReq.m_servo_id = (byte_t)nServoId;
561 
562  //
563  // Pack request.
564  //
565  n = BsDynaPackReqPing(&msgReq, BSPROXY_BUF_BODY(buf), bTrace);
566 
567  // check packing return code
568  BSCLIENT_TRY_NM_ECODE(pClient, n, "MsgId=%u", msgIdReq);
569 
570  //
571  // Execute request-response transaction.
572  //
573  n = bsClientTrans(pClient, hndVConn,
574  msgIdReq, buf, (size_t)n,
575  msgIdRsp, buf, sizeof(buf));
576 
577  // check transaction return code
578  BSCLIENT_TRY_ECODE(pClient, n, "MsgId=%u: Transaction failed.", msgIdReq);
579 
580  //
581  // Unpack response.
582  //
583  n = BsDynaUnpackRspPing(buf, (size_t)n, &msgRsp, bTrace);
584 
585  // check unpack return code
586  BSCLIENT_TRY_NM_ECODE(pClient, n, "MsgId=%u", msgIdRsp);
587 
588  *pPong = msgRsp.m_pong? true: false;
589 
590  return BS_OK;
591 }
592 
593 int bsDynaReset(BsClient_P pClient,
594  BsVConnHnd_T hndVConn,
595  int nServoId)
596 {
597  static BsDynaMsgId_T msgIdReq = BsDynaMsgIdReqReset;
598  static BsProxyMsgId_T msgIdRsp = BsProxyMsgIdRspOk;
599 
600  BsDynaReqReset_T msgReq; // response message
601  byte_t buf[BSPROXY_MSG_MAX_LEN]; // req/rsp buffer
602  bool_t bTrace; // do [not] trace messages
603  int n; // num of bytes/return code
604 
605  //
606  // Parameter checks.
607  //
608  BSCLIENT_TRY_EXPR(pClient, BSCLIENT_HAS_VCONN(pClient, hndVConn),
609  BS_ECODE_BAD_VAL, "VConn=%d", hndVConn);
610 
611  // trace state
612  bTrace = bsClientAttrGetTraceState(pClient, hndVConn);
613 
614  //
615  // Set request message values.
616  //
617  msgReq.m_servo_id = (byte_t)nServoId;
618 
619  //
620  // Pack request.
621  //
622  n = BsDynaPackReqReset(&msgReq, BSPROXY_BUF_BODY(buf), bTrace);
623 
624  // check packing return code
625  BSCLIENT_TRY_NM_ECODE(pClient, n, "MsgId=%u", msgIdReq);
626 
627  //
628  // Execute request-response transaction.
629  //
630  n = bsClientTrans(pClient, hndVConn,
631  msgIdReq, buf, (size_t)n,
632  msgIdRsp, buf, sizeof(buf));
633 
634  // check transaction return code
635  BSCLIENT_TRY_ECODE(pClient, n, "MsgId=%u: Transaction failed.", msgIdReq);
636 
637  return BS_OK;
638 }
639 
640 int bsDynaSetHalfDuplexCtl(BsClient_P pClient,
641  BsVConnHnd_T hndVConn,
642  int nSignal)
643 {
645  static BsProxyMsgId_T msgIdRsp = BsProxyMsgIdRspOk;
646 
647  BsDynaReqSetHalfDuplexCtl_T msgReq; // response message
648  byte_t buf[BSPROXY_MSG_MAX_LEN]; // req/rsp buffer
649  bool_t bTrace; // do [not] trace messages
650  int n; // num of bytes/return code
651 
652  //
653  // Parameter checks.
654  //
655  BSCLIENT_TRY_EXPR(pClient, BSCLIENT_HAS_VCONN(pClient, hndVConn),
656  BS_ECODE_BAD_VAL, "VConn=%d", hndVConn);
657 
658  // trace state
659  bTrace = bsClientAttrGetTraceState(pClient, hndVConn);
660 
661  //
662  // Set request message values.
663  //
664  msgReq.m_signal = (uint_t)nSignal;
665 
666  //
667  // Pack request.
668  //
669  n = BsDynaPackReqSetHalfDuplexCtl(&msgReq, BSPROXY_BUF_BODY(buf), bTrace);
670 
671  // check packing return code
672  BSCLIENT_TRY_NM_ECODE(pClient, n, "MsgId=%u", msgIdReq);
673 
674  //
675  // Execute request-response transaction.
676  //
677  n = bsClientTrans(pClient, hndVConn,
678  msgIdReq, buf, (size_t)n,
679  msgIdRsp, buf, sizeof(buf));
680 
681  // check transaction return code
682  BSCLIENT_TRY_ECODE(pClient, n, "MsgId=%u: Transaction failed.", msgIdReq);
683 
684  LOGDIAG3("%s: SetHalfDuplexCtl: %d", bsClientAttrGetName(pClient), nSignal);
685 
686  return BS_OK;
687 }
INLINE_IN_H int BsDynaPackReqSyncWrite(BsDynaReqSyncWrite_T *pStruct, byte_t buf[], size_t bufSize, bool_t bTrace)
Pack a BsDynaReqSyncWrite ITV message in big-endian byte order into the output buffer.
Definition: bsDynaMsgs.h:777
byte_t m_addr
addr
Definition: bsDynaMsgs.h:202
bool_t m_pong
pong
Definition: bsDynaMsgs.h:266
bsProxy client library Dynamixel interface.
byte_t m_addr
addr
Definition: bsDynaMsgs.h:118
INLINE_IN_H int BsDynaPackReqSetHalfDuplexCtl(BsDynaReqSetHalfDuplexCtl_T *pStruct, byte_t buf[], size_t bufSize, bool_t bTrace)
Pack a BsDynaReqSetHalfDuplexCtl ITV message in big-endian byte order into the output buffer...
Definition: bsDynaMsgs.h:949
byte_t m_data_size
data_size
Definition: bsDynaMsgs.h:230
INLINE_IN_H int BsDynaPackReqWrite8(BsDynaReqWrite8_T *pStruct, byte_t buf[], size_t bufSize, bool_t bTrace)
Pack a BsDynaReqWrite8 ITV message in big-endian byte order into the output buffer.
Definition: bsDynaMsgs.h:605
ReqSetBaudRate.
Definition: bsDynaMsgs.h:40
INLINE_IN_H int BsDynaUnpackRspWrite8(byte_t buf[], size_t uMsgLen, BsDynaRspWrite8_T *pStruct, bool_t bTrace)
Unpack a BsDynaRspWrite8 ITV message in big-endian byte order from the input buffer.
Definition: bsDynaMsgs.h:669
INLINE_IN_H int BsDynaPackReqReset(BsDynaReqReset_T *pStruct, byte_t buf[], size_t bufSize, bool_t bTrace)
Pack a BsDynaReqReset ITV message in big-endian byte order into the output buffer.
Definition: bsDynaMsgs.h:906
INLINE_IN_H int BsDynaPackReqOpenArgs(BsDynaReqOpenArgs_T *pStruct, byte_t buf[], size_t bufSize, bool_t bTrace)
Pack a BsDynaReqOpenArgs ITV message in big-endian byte order into the output buffer.
Definition: bsDynaMsgs.h:347
byte_t m_servo_id
servo_id
Definition: bsDynaMsgs.h:173
ushort_t m_val
val
Definition: bsDynaMsgs.h:160
uint_t m_baudrate
baudrate
Definition: bsDynaMsgs.h:104
static BsClientAppInfo_T bsDynaAppInfo
client application information.
ReqSetHalfDuplexCtl.
Definition: bsDynaMsgs.h:53
struct BsDynaReqSyncWrite_T::@0 m_tuples
vector
const char * bsDynaGetMsgName(BsClient_P pClient, BsVConnHnd_T hndVConn, uint_t uMsgId)
Get the Dynamixel message name.
RspWrite16.
Definition: bsDynaMsgs.h:48
byte_t m_servo_id
servo_id
Definition: bsDynaMsgs.h:253
byte_t m_servo_id
servo_id
Definition: bsDynaMsgs.h:201
#define DYNA_ID_NUMOF
number of unique servo id&#39;s
Definition: Dynamixel.h:148
int bsDynaRead8(BsClient_P pClient, BsVConnHnd_T hndVConn, int nServoId, uint_t uAddr, byte_t *pVal, uint_t *pAlarms)
Proxied request to read an 8-bit value from a servo&#39;s control table.
byte_t m_addr
addr
Definition: bsDynaMsgs.h:174
ReqOpenArgs.
Definition: bsDynaMsgs.h:39
INLINE_IN_H int BsDynaUnpackRspRead8(byte_t buf[], size_t uMsgLen, BsDynaRspRead8_T *pStruct, bool_t bTrace)
Unpack a BsDynaRspRead8 ITV message in big-endian byte order from the input buffer.
Definition: bsDynaMsgs.h:497
byte_t m_alarms
alarms
Definition: bsDynaMsgs.h:188
byte_t m_val
val
Definition: bsDynaMsgs.h:132
const NMMsgDef_T * BsDynaLookupMsgDef(BsDynaMsgId_T eMsgId)
Look up the message definition associated with the message id.
Definition: bsDynaMsgs.c:943
INLINE_IN_H int BsDynaPackReqRead8(BsDynaReqRead8_T *pStruct, byte_t buf[], size_t bufSize, bool_t bTrace)
Pack a BsDynaReqRead8 ITV message in big-endian byte order into the output buffer.
Definition: bsDynaMsgs.h:433
byte_t m_addr
addr
Definition: bsDynaMsgs.h:229
INLINE_IN_H int BsDynaPackReqWrite16(BsDynaReqWrite16_T *pStruct, byte_t buf[], size_t bufSize, bool_t bTrace)
Pack a BsDynaReqWrite16 ITV message in big-endian byte order into the output buffer.
Definition: bsDynaMsgs.h:691
ReqSyncWrite.
Definition: bsDynaMsgs.h:49
uint_t m_baudrate
baudrate
Definition: bsDynaMsgs.h:91
int bsDynaWrite16(BsClient_P pClient, BsVConnHnd_T hndVConn, int nServoId, uint_t uAddr, ushort_t huVal, uint_t *pAlarms)
Proxied request to write a 16-bit value to a servo&#39;s control table.
ReqWrite16.
Definition: bsDynaMsgs.h:47
size_t m_count
vector item count
Definition: bsDynaMsgs.h:233
byte_t m_servo_id
servo_id
Definition: bsDynaMsgs.h:117
INLINE_IN_H int BsDynaUnpackRspWrite16(byte_t buf[], size_t uMsgLen, BsDynaRspWrite16_T *pStruct, bool_t bTrace)
Unpack a BsDynaRspWrite16 ITV message in big-endian byte order from the input buffer.
Definition: bsDynaMsgs.h:755
int bsDynaClose(BsClient_P pClient, BsVConnHnd_T hndVConn)
Request proxy server to close client&#39;s proxied Dynamixel servo chain vitual connection.
INLINE_IN_H int BsDynaPackReqPing(BsDynaReqPing_T *pStruct, byte_t buf[], size_t bufSize, bool_t bTrace)
Pack a BsDynaReqPing ITV message in big-endian byte order into the output buffer. ...
Definition: bsDynaMsgs.h:820
BsDynaMsgId_T
Definition: bsDynaMsgs.h:36
byte_t m_alarms
alarms
Definition: bsDynaMsgs.h:159
INLINE_IN_H int BsDynaUnpackRspRead16(byte_t buf[], size_t uMsgLen, BsDynaRspRead16_T *pStruct, bool_t bTrace)
Unpack a BsDynaRspRead16 ITV message in big-endian byte order from the input buffer.
Definition: bsDynaMsgs.h:583
int bsDynaOpen(BsClient_P pClient, const char *sDevName, int nBaudRate, bool_t bInitTrace)
Request proxy server to establish a virtual connection to the Dynamixel servo chain using the USB2Dyn...
byte_t m_servo_id
servo_id
Definition: bsDynaMsgs.h:279
INLINE_IN_H int BsDynaUnpackRspPing(byte_t buf[], size_t uMsgLen, BsDynaRspPing_T *pStruct, bool_t bTrace)
Unpack a BsDynaRspPing ITV message in big-endian byte order from the input buffer.
Definition: bsDynaMsgs.h:884
int bsDynaWrite8(BsClient_P pClient, BsVConnHnd_T hndVConn, int nServoId, uint_t uAddr, byte_t byVal, uint_t *pAlarms)
Proxied request to write an 8-bit value to a servo&#39;s control table.
INLINE_IN_H int BsDynaPackReqRead16(BsDynaReqRead16_T *pStruct, byte_t buf[], size_t bufSize, bool_t bTrace)
Pack a BsDynaReqRead16 ITV message in big-endian byte order into the output buffer.
Definition: bsDynaMsgs.h:519
byte_t m_addr
addr
Definition: bsDynaMsgs.h:146
byte_t m_servo_id
servo_id
Definition: bsDynaMsgs.h:145
int bsDynaRead16(BsClient_P pClient, BsVConnHnd_T hndVConn, int nServoId, uint_t uAddr, ushort_t *pVal, uint_t *pAlarms)
Proxied request to read a 16-bit value from a servo&#39;s control table.
Server/Client Dynamixel NetMsgs XML Definitions.
#define BS_DYNA_SERVER_MOD
server plugin dll module
Definition: bsDyna.h:64
INLINE_IN_H int BsDynaPackReqSetBaudRate(BsDynaReqSetBaudRate_T *pStruct, byte_t buf[], size_t bufSize, bool_t bTrace)
Pack a BsDynaReqSetBaudRate ITV message in big-endian byte order into the output buffer.
Definition: bsDynaMsgs.h:390
int bsDynaSetBaudRate(BsClient_P pClient, BsVConnHnd_T hndVConn, int nBaudRate)
Proxied request to set the Dynamixel Bus baud rate.
int bsDynaSetHalfDuplexCtl(BsClient_P pClient, BsVConnHnd_T hndVConn, int nSignal)
Proxied request to set the half-duplex control signal.
int bsDynaSyncWrite(BsClient_P pClient, BsVConnHnd_T hndVConn, uint_t uAddr, uint_t uDataSize, DynaSyncWriteTuple_T tuples[], uint_t uCount)
Proxied request to synchronously write values to servos.
byte_t m_val
val
Definition: bsDynaMsgs.h:175
int bsDynaPing(BsClient_P pClient, BsVConnHnd_T hndVConn, int nServoId, bool_t *pPong)
Proxied request to ping a servo.
byte_t m_alarms
alarms
Definition: bsDynaMsgs.h:216
byte_t m_alarms
alarms
Definition: bsDynaMsgs.h:131
union BsDynaReqSyncWrite_T::@0::@1 u
aligned vector items
ushort_t m_val
val
Definition: bsDynaMsgs.h:203
int bsDynaReset(BsClient_P pClient, BsVConnHnd_T hndVConn, int nServoId)
Proxied request to reset a servo to defaults.