From d5a682a3e4649a3780bb32f3fbcc424ffeda4244 Mon Sep 17 00:00:00 2001
From: Anton Tetov <anton@tetov.se>
Date: Wed, 13 Oct 2021 13:10:53 +0200
Subject: [PATCH] working reader

---
 abb_egm_client/egm_client.py   | 28 +++++++++++++++++++---------
 examples/print_egm_feedback.py |  8 +++++---
 2 files changed, 24 insertions(+), 12 deletions(-)

diff --git a/abb_egm_client/egm_client.py b/abb_egm_client/egm_client.py
index d24c293..295fd0e 100644
--- a/abb_egm_client/egm_client.py
+++ b/abb_egm_client/egm_client.py
@@ -29,8 +29,6 @@ class EGMClient:
 
         self.socket.bind(("", port))
 
-        self.socket.setblocking(False)
-
     # def _ensure_socket_ready(self, timeout=1):
     #     # try:
     #     # except select.error as err:
@@ -48,27 +46,39 @@ class EGMClient:
     def _get_last_packet(self):
         last_recieved = (None, None)
 
+        self.socket.setblocking(False)
+
         while True:
             try:
-                data, addr = self.socket.recvfrom(1024)
+                data, addr = self.socket.recvfrom(2048)  # read from socket
                 if data:
-                    last_recieved = (data, addr)
+                    last_recieved = (data, addr)  # store last data and addr
             except socket.error as err:
                 # EWOULDBLOCK: recvfrom would block since socket buffer is empty
                 if err.args[0] == socket.EWOULDBLOCK:
-                    return last_recieved  # return last data recieved
+                    if last_recieved[0]:  # if last data got picked up
+                        break
+                    else:
+                        continue  # else wait for data
                 else:
+                    self.socket.setblocking(True)
                     raise err  # if there is another error, raise exception
 
-    def receive_from_robot(self, timeout=0):
+        self.socket.setblocking(True)
+        return last_recieved
 
-        data, addr = self.socket.recvfrom(1024)
+    def receive_from_robot(self):
 
-        if not self.robot_controller_address:
+        data, addr = self._get_last_packet()
+
+        # the address used for sending to the robot is picked up here
+        if not self.robot_controller_address or self.robot_controller_address != addr:
             self.robot_controller_address = addr
 
+        # use the message description from the proto file to create a python
+        # class from incoming data
         msg = EgmRobot()
-        msg.ParseFromString(data)
+        msg.ParseFromString(data) 
 
         return msg
 
diff --git a/examples/print_egm_feedback.py b/examples/print_egm_feedback.py
index 1ba02cd..b076a61 100644
--- a/examples/print_egm_feedback.py
+++ b/examples/print_egm_feedback.py
@@ -6,10 +6,11 @@ try:
 except ImportError:
     raise ImportWarning("abb_egm not found, have you installed the package?")
 
-UDP_PORT = 6510
+UDP_PORT = 6511
 
 log = logging.getLogger("egm_client")
 
+
 def print_egm_feedback() -> None:
     """Print EGM feedback.
 
@@ -24,8 +25,9 @@ def print_egm_feedback() -> None:
     while True:
         try:
             msg = egm_client.receive_from_robot()
-            print(f"Header:\n{msg.header.seqno}")
-            # print(f"Feedback:\n{msg.feedBack}")
+            print(f"Sequence number: {msg.header.seqno}")
+            print(f"Body: {msg.feedBack}")
+
         except Exception as exc:
             log.error(f"Exception raised {exc}")
             log.info("Retrying")
-- 
GitLab