diff --git a/abb_egm_client/egm_client.py b/abb_egm_client/egm_client.py index d24c2930182275f153677d6d8f3a9eb6800c3f85..295fd0e9fd347ec26e7a951d2c83d14e0ce682cb 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 1ba02cdb3cf086c353c1deb26a34fab50b1f203b..b076a6157c7c5d5bbe2587ea8874639af3966185 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")