From 042183c31d57807fecce6af795e8335a2a3434e6 Mon Sep 17 00:00:00 2001
From: Sergi Hernandez Juan <shernand@iri.upc.edu>
Date: Wed, 2 Sep 2020 13:00:21 +0200
Subject: [PATCH] Improved the dyn_master_relay function with internal protocol
 version conversion.

---
 dynamixel_base/include/dynamixel_master.h |  2 +-
 dynamixel_base/src/dynamixel_master.c     | 34 ++++++++++++++++++++---
 2 files changed, 31 insertions(+), 5 deletions(-)

diff --git a/dynamixel_base/include/dynamixel_master.h b/dynamixel_base/include/dynamixel_master.h
index 70fd70d..64df2a8 100644
--- a/dynamixel_base/include/dynamixel_master.h
+++ b/dynamixel_base/include/dynamixel_master.h
@@ -214,7 +214,7 @@ unsigned char dyn_master_bulk_write(TDynamixelMaster *master,unsigned char num,u
  * \brief
  *
  */
-unsigned char dyn_master_relay(TDynamixelMaster *master,unsigned char *inst_pkt,unsigned char *status_pkt);
+unsigned char dyn_master_relay(TDynamixelMaster *master,TDynVersion inst_ver,unsigned char *inst_pkt,unsigned char *status_pkt);
 
 #ifdef __cplusplus
 }
diff --git a/dynamixel_base/src/dynamixel_master.c b/dynamixel_base/src/dynamixel_master.c
index a91820b..0fb6a96 100644
--- a/dynamixel_base/src/dynamixel_master.c
+++ b/dynamixel_base/src/dynamixel_master.c
@@ -1297,13 +1297,26 @@ unsigned char dyn_master_bulk_write(TDynamixelMaster *master,unsigned char num,u
   return error;
 }
 
-unsigned char dyn_master_relay(TDynamixelMaster *master,unsigned char *inst_pkt,unsigned char *status_pkt)
+unsigned char dyn_master_relay(TDynamixelMaster *master,TDynVersion inst_ver,unsigned char *inst_pkt,unsigned char *status_pkt)
 {
-  unsigned char error=DYN_COMM_ERROR;
+  unsigned char error=DYN_COMM_ERROR,i;
 
   if(master!=0x00000000)
   {
-    dyn2_copy_packet(inst_pkt,master->tx_buffer);
+    if(inst_ver==DYN_VER1)
+    {
+      if(master->version==DYN_VER1)
+        dyn_copy_packet(inst_pkt,master->tx_buffer);
+      else
+        dyn2_convert_v1_inst_packet(inst_pkt,master->tx_buffer);
+    }
+    else
+    {
+      if(master->version==DYN_VER1)
+        dyn_convert_v2_inst_packet(inst_pkt,master->tx_buffer);
+      else
+        dyn2_copy_packet(inst_pkt,master->tx_buffer);
+    }
     master->rx_num_packets=0x01;
     master->rx_no_answer=0x00;
     // enable transmission
@@ -1322,7 +1335,20 @@ unsigned char dyn_master_relay(TDynamixelMaster *master,unsigned char *inst_pkt,
     }
     // wait for the replay within the given timeout
     error=dyn_master_wait_reception(master);
-    dyn2_copy_packet(master->rx_buffer,status_pkt);
+    if(inst_ver==DYN_VER1)
+    {
+      if(master->version==DYN_VER1)
+        dyn_copy_packet(master->rx_buffer,status_pkt);
+      else
+        dyn_convert_v2_status_packet(master->rx_buffer,status_pkt);
+    }
+    else
+    {
+      if(master->version==DYN_VER1)
+        dyn2_convert_v1_status_packet((TDynInstruction)inst_pkt[DYN2_INST_OFF],master->rx_buffer,status_pkt);
+      else
+        dyn2_copy_packet(master->rx_buffer,status_pkt);
+    }
   }
 
   return error;
-- 
GitLab