From c0970c039f75b6689080dd013d9c19efbd3f603b Mon Sep 17 00:00:00 2001
From: Sergi Hernandez Juan <shernand@iri.upc.edu>
Date: Wed, 19 May 2021 17:51:28 +0200
Subject: [PATCH] Used the specific new data event for the rx can ID. Checked
 that the number of data available if not 0 before reading to avoid an
 exception.

---
 src/dynamixel_can.cpp       | 36 +++++++++++++++++++-----------------
 src/dynamixelserver_can.cpp | 20 ++++++++++----------
 2 files changed, 29 insertions(+), 27 deletions(-)

diff --git a/src/dynamixel_can.cpp b/src/dynamixel_can.cpp
index 2fd46f5..f512a82 100644
--- a/src/dynamixel_can.cpp
+++ b/src/dynamixel_can.cpp
@@ -117,23 +117,23 @@ unsigned char CDynamixelCAN::receive_status_packet_v1(unsigned char **data,unsig
   if(this->comm_dev!=NULL)
   {
     try{
-      events.push_back(((CCAN *)this->comm_dev)->get_new_frame_event_id());
+      events.push_back(((CCAN *)this->comm_dev)->get_new_frame_event_id(this->rx_frame_id));
       // read up to the length field
       do{
-        if((num=((CCAN *)this->comm_dev)->get_num_bytes(this->rx_frame_id))==0)
+        if((num=((CCAN *)this->comm_dev)->get_num_data(this->rx_frame_id))==0)
         {
           this->event_server->wait_all(events,500);
-          num=((CCAN *)this->comm_dev)->get_num_bytes(rx_frame_id);
+          num=((CCAN *)this->comm_dev)->get_num_data(this->rx_frame_id);
         }
         if((read+num)>1024)
         {
-          ((CCAN *)this->comm_dev)->read(rx_frame_id,&data_int[read],1024-read);
+          ((CCAN *)this->comm_dev)->read(this->rx_frame_id,&data_int[read],1024-read);
           read=1024;
         }
         else
         {
           if(num != 0)
-            ((CCAN *)this->comm_dev)->read(rx_frame_id,&data_int[read],num);
+            ((CCAN *)this->comm_dev)->read(this->rx_frame_id,&data_int[read],num);
           read+=num;
         }
         this->sync_packet_v1(data_int,read,&start);  
@@ -142,19 +142,20 @@ unsigned char CDynamixelCAN::receive_status_packet_v1(unsigned char **data,unsig
       // read the remaining of the packet
       while((read-start)<length)
       {
-        if((num=((CCAN *)this->comm_dev)->get_num_bytes(this->rx_frame_id))==0)
+        if((num=((CCAN *)this->comm_dev)->get_num_data(this->rx_frame_id))==0)
         {
           this->event_server->wait_all(events,500);
-          num=((CCAN *)this->comm_dev)->get_num_bytes(this->rx_frame_id);
+          num=((CCAN *)this->comm_dev)->get_num_data(this->rx_frame_id);
         }
         if((read-start+num)>length)
         {
-          ((CCAN *)this->comm_dev)->read(rx_frame_id,&data_int[read],length-read);
+          ((CCAN *)this->comm_dev)->read(this->rx_frame_id,&data_int[read],length-read);
           read=length;
         }
         else
         {
-          ((CCAN *)this->comm_dev)->read(rx_frame_id,&data_int[read],num);
+          if(num != 0)
+            ((CCAN *)this->comm_dev)->read(this->rx_frame_id,&data_int[read],num);
           read+=num;
         }
       }
@@ -201,22 +202,22 @@ unsigned char CDynamixelCAN::receive_status_packet_v2(unsigned char **data,unsig
   if(this->comm_dev!=NULL)
   {
     try{
-      events.push_back(((CCAN *)this->comm_dev)->get_new_frame_event_id());
+      events.push_back(((CCAN *)this->comm_dev)->get_new_frame_event_id(this->rx_frame_id));
       // read up to the length field
       do{
-        if((num=((CCAN *)this->comm_dev)->get_num_bytes(this->rx_frame_id))==0)
+        if((num=((CCAN *)this->comm_dev)->get_num_data(this->rx_frame_id))==0)
         {
           this->event_server->wait_all(events,100);
-          num=((CCAN *)this->comm_dev)->get_num_bytes(rx_frame_id);
+          num=((CCAN *)this->comm_dev)->get_num_data(this->rx_frame_id);
         }
         if((read+num)>1024)
         {
-          ((CCAN *)this->comm_dev)->read(rx_frame_id,&data_int[read],1024-read);
+          ((CCAN *)this->comm_dev)->read(this->rx_frame_id,&data_int[read],1024-read);
           read=1024;
         }
         else
         {
-          ((CCAN *)this->comm_dev)->read(rx_frame_id,&data_int[read],num);
+          ((CCAN *)this->comm_dev)->read(this->rx_frame_id,&data_int[read],num);
           read+=num;
         }
         this->sync_packet_v2(data_int,read,&start);
@@ -225,19 +226,20 @@ unsigned char CDynamixelCAN::receive_status_packet_v2(unsigned char **data,unsig
       // read the remaining of the packet
       while((read-start)<length)
       {
-        if((num=((CCAN *)this->comm_dev)->get_num_bytes(this->rx_frame_id))==0)
+        if((num=((CCAN *)this->comm_dev)->get_num_data(this->rx_frame_id))==0)
         {
           this->event_server->wait_all(events,100);
           num=this->comm_dev->get_num_data();
         }
         if((read-start+num)>1024)
         {
-          ((CCAN *)this->comm_dev)->read(rx_frame_id,&data_int[read],1024-read);
+          ((CCAN *)this->comm_dev)->read(this->rx_frame_id,&data_int[read],1024-read);
           read=1024;
         }
         else
         {
-          ((CCAN *)this->comm_dev)->read(rx_frame_id,&data_int[read],num);
+          if(num != 0)
+            ((CCAN *)this->comm_dev)->read(this->rx_frame_id,&data_int[read],num);
           read+=num;
         }
       }
diff --git a/src/dynamixelserver_can.cpp b/src/dynamixelserver_can.cpp
index 64259c1..26dcd56 100644
--- a/src/dynamixelserver_can.cpp
+++ b/src/dynamixelserver_can.cpp
@@ -155,13 +155,13 @@ unsigned char CDynamixelServerCAN::receive_status_packet_v1(unsigned char **data
   if(this->comm_dev!=NULL)
   {
     try{
-      events.push_back(((CCAN *)this->comm_dev)->get_new_frame_event_id());
+      events.push_back(((CCAN *)this->comm_dev)->get_new_frame_event_id(this->bus_info.rx_frame_id));
       // read up to the length field
       do{
-        if((num=((CCAN *)this->comm_dev)->get_num_bytes(this->bus_info.rx_frame_id))==0)
+        if((num=((CCAN *)this->comm_dev)->get_num_data(this->bus_info.rx_frame_id))==0)
         {
           this->event_server->wait_all(events,200);
-          num=((CCAN *)this->comm_dev)->get_num_bytes(this->bus_info.rx_frame_id);
+          num=((CCAN *)this->comm_dev)->get_num_data(this->bus_info.rx_frame_id);
         }
         if((read+num)>1024)
         {
@@ -179,10 +179,10 @@ unsigned char CDynamixelServerCAN::receive_status_packet_v1(unsigned char **data
       // read the remaining of the packet
       while((read-start)<length)
       {
-        if((num=((CCAN *)this->comm_dev)->get_num_bytes(this->bus_info.rx_frame_id))==0)
+        if((num=((CCAN *)this->comm_dev)->get_num_data(this->bus_info.rx_frame_id))==0)
         {
           this->event_server->wait_all(events,200);
-          num=((CCAN *)this->comm_dev)->get_num_bytes(this->bus_info.rx_frame_id);
+          num=((CCAN *)this->comm_dev)->get_num_data(this->bus_info.rx_frame_id);
         }
         if((read-start+num)>length)
         {
@@ -238,13 +238,13 @@ unsigned char CDynamixelServerCAN::receive_status_packet_v2(unsigned char **data
   if(this->comm_dev!=NULL)
   {
     try{
-      events.push_back(((CCAN *)this->comm_dev)->get_new_frame_event_id());
+      events.push_back(((CCAN *)this->comm_dev)->get_new_frame_event_id(this->bus_info.rx_frame_id));
       // read up to the length field
       do{
-        if((num=((CCAN *)this->comm_dev)->get_num_bytes(this->bus_info.rx_frame_id))==0)
+        if((num=((CCAN *)this->comm_dev)->get_num_data(this->bus_info.rx_frame_id))==0)
         {
           this->event_server->wait_all(events,200);
-          num=((CCAN *)this->comm_dev)->get_num_bytes(this->bus_info.rx_frame_id);
+          num=((CCAN *)this->comm_dev)->get_num_data(this->bus_info.rx_frame_id);
         }
         if((read+num)>1024)
         {
@@ -262,10 +262,10 @@ unsigned char CDynamixelServerCAN::receive_status_packet_v2(unsigned char **data
       // read the remaining of the packet
       while((read-start)<length)
       {
-        if((num=((CCAN *)this->comm_dev)->get_num_bytes(this->bus_info.rx_frame_id))==0)
+        if((num=((CCAN *)this->comm_dev)->get_num_data(this->bus_info.rx_frame_id))==0)
         {
           this->event_server->wait_all(events,200);
-          num=((CCAN *)this->comm_dev)->get_num_bytes(this->bus_info.rx_frame_id);
+          num=((CCAN *)this->comm_dev)->get_num_data(this->bus_info.rx_frame_id);
         }
         if((read-start+num)>length)
         {
-- 
GitLab