From 5141b191090b12ac7bcacd6f0d24df65ae638c6a Mon Sep 17 00:00:00 2001 From: Tzvi Ronen Date: Tue, 7 Sep 2021 00:48:57 +0300 Subject: [PATCH 01/11] test if callback exist before removing it --- canopen/network.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/canopen/network.py b/canopen/network.py index 70f5c361..c86a5d9a 100644 --- a/canopen/network.py +++ b/canopen/network.py @@ -79,7 +79,8 @@ def unsubscribe(self, can_id, callback=None): if callback is None: del self.subscribers[can_id] else: - self.subscribers[can_id].remove(callback) + if callback in self.subscribers[can_id]: + self.subscribers[can_id].remove(callback) def connect(self, *args, **kwargs): """Connect to CAN bus using python-can. From 3ce8ab425d2066408eb1fa836791d2bc790b0e4b Mon Sep 17 00:00:00 2001 From: Tzvi Ronen Date: Tue, 7 Sep 2021 00:58:58 +0300 Subject: [PATCH 02/11] Added send message debug log --- canopen/sdo/server.py | 1 + 1 file changed, 1 insertion(+) diff --git a/canopen/sdo/server.py b/canopen/sdo/server.py index 746f43a3..a106c146 100644 --- a/canopen/sdo/server.py +++ b/canopen/sdo/server.py @@ -172,6 +172,7 @@ def segmented_download(self, command, request): self.send_response(response) def send_response(self, response): + logger.debug(f"Sending to {self.tx_cobid} data {response}.") self.network.send_message(self.tx_cobid, response) def abort(self, abort_code=0x08000000): From bc06df48254d066145e48d14f4b0d77bb2417003 Mon Sep 17 00:00:00 2001 From: Tzvi Ronen Date: Tue, 7 Sep 2021 01:11:08 +0300 Subject: [PATCH 03/11] Added debug logs and pause before read --- canopen/sdo/client.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/canopen/sdo/client.py b/canopen/sdo/client.py index 86a36365..11ae9d99 100644 --- a/canopen/sdo/client.py +++ b/canopen/sdo/client.py @@ -29,6 +29,9 @@ class SdoClient(SdoBase): #: Seconds to wait before sending a request, for rate limiting PAUSE_BEFORE_SEND = 0.0 + # Seconds to wait before next read attempt for response in queue. For delayed responses. + PAUSE_BEFORE_READ = 0.2 + def __init__(self, rx_cobid, tx_cobid, od): """ :param int rx_cobid: @@ -42,6 +45,7 @@ def __init__(self, rx_cobid, tx_cobid, od): self.responses = queue.Queue() def on_response(self, can_id, data, timestamp): + logger.debug(f"received response in {can_id} data {data}.") self.responses.put(bytes(data)) def send_request(self, request): @@ -50,6 +54,7 @@ def send_request(self, request): try: if self.PAUSE_BEFORE_SEND: time.sleep(self.PAUSE_BEFORE_SEND) + logger.debug(f"sending to {self.rx_cobid} data {request} ") self.network.send_message(self.rx_cobid, request) except CanError as e: # Could be a buffer overflow. Wait some time before trying again @@ -88,6 +93,7 @@ def request_response(self, sdo_request): if not retries_left: self.abort(0x5040000) raise + time.sleep(self.PAUSE_BEFORE_READ) logger.warning(str(e)) def abort(self, abort_code=0x08000000): From 3fb146e1c01791c19bfe91c4c484fbcc38f95374 Mon Sep 17 00:00:00 2001 From: Tzvi Ronen Date: Tue, 7 Sep 2021 01:21:13 +0300 Subject: [PATCH 04/11] fixed get_data var len calc --- canopen/pdo/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/canopen/pdo/base.py b/canopen/pdo/base.py index 63a0053e..dfd356c2 100644 --- a/canopen/pdo/base.py +++ b/canopen/pdo/base.py @@ -562,7 +562,7 @@ def get_data(self): data = data | (~((1 << self.length) - 1)) data = od_struct.pack(data) else: - data = self.pdo_parent.data[byte_offset:byte_offset + len(self.od) // 8] + data = self.pdo_parent.data[byte_offset:byte_offset + self.length // 8] return data From 659899de5fece198852581e7d9473478e766e9c1 Mon Sep 17 00:00:00 2001 From: Tzvi Ronen Date: Tue, 7 Sep 2021 01:27:12 +0300 Subject: [PATCH 05/11] Added Unsigned24 data type --- canopen/objectdictionary/__init__.py | 12 ++++++++++++ canopen/objectdictionary/datatypes.py | 3 ++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/canopen/objectdictionary/__init__.py b/canopen/objectdictionary/__init__.py index 25a2f37a..ca75c31b 100644 --- a/canopen/objectdictionary/__init__.py +++ b/canopen/objectdictionary/__init__.py @@ -219,6 +219,17 @@ def add_member(self, variable): self.subindices[variable.subindex] = variable self.names[variable.name] = variable +class Unsigned24(struct.Struct): + def __init__(self, *args, **kwargs): + super(Unsigned24, self).__init__(" Date: Tue, 7 Sep 2021 02:31:31 +0300 Subject: [PATCH 06/11] Added PyCharm to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index fddae0e9..e4f13f6f 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ __pycache__/ *.py[cod] *$py.class +.idea/ # C extensions *.so From a8fcd87effd7ed5f0545432ba35be661f769384d Mon Sep 17 00:00:00 2001 From: Tzvi Ronen Date: Wed, 8 Sep 2021 23:18:45 +0300 Subject: [PATCH 07/11] request_response RETRY_DELAY --- canopen/sdo/client.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/canopen/sdo/client.py b/canopen/sdo/client.py index 11ae9d99..2ad22d38 100644 --- a/canopen/sdo/client.py +++ b/canopen/sdo/client.py @@ -30,7 +30,7 @@ class SdoClient(SdoBase): PAUSE_BEFORE_SEND = 0.0 # Seconds to wait before next read attempt for response in queue. For delayed responses. - PAUSE_BEFORE_READ = 0.2 + RETRY_DELAY = 0.2 def __init__(self, rx_cobid, tx_cobid, od): """ @@ -93,8 +93,8 @@ def request_response(self, sdo_request): if not retries_left: self.abort(0x5040000) raise - time.sleep(self.PAUSE_BEFORE_READ) logger.warning(str(e)) + time.sleep(self.RETRY_DELAY) def abort(self, abort_code=0x08000000): """Abort current transfer.""" From d0d9bba03ca4839de267138c8ad9c81e413ac912 Mon Sep 17 00:00:00 2001 From: Tzvi Ronen Date: Wed, 8 Sep 2021 23:25:41 +0300 Subject: [PATCH 08/11] made RETRY_DELAY default zero --- canopen/sdo/client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/canopen/sdo/client.py b/canopen/sdo/client.py index 2ad22d38..bab0ba50 100644 --- a/canopen/sdo/client.py +++ b/canopen/sdo/client.py @@ -30,7 +30,7 @@ class SdoClient(SdoBase): PAUSE_BEFORE_SEND = 0.0 # Seconds to wait before next read attempt for response in queue. For delayed responses. - RETRY_DELAY = 0.2 + RETRY_DELAY = 0.0 def __init__(self, rx_cobid, tx_cobid, od): """ From b14f43eda448b53077e51031eb7bdb10764d14c9 Mon Sep 17 00:00:00 2001 From: Tzvi Ronen Date: Wed, 8 Sep 2021 23:45:11 +0300 Subject: [PATCH 09/11] removed callback test --- canopen/network.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/canopen/network.py b/canopen/network.py index c86a5d9a..70f5c361 100644 --- a/canopen/network.py +++ b/canopen/network.py @@ -79,8 +79,7 @@ def unsubscribe(self, can_id, callback=None): if callback is None: del self.subscribers[can_id] else: - if callback in self.subscribers[can_id]: - self.subscribers[can_id].remove(callback) + self.subscribers[can_id].remove(callback) def connect(self, *args, **kwargs): """Connect to CAN bus using python-can. From 56b206a619d1ab6b14619a6f45f26ee41420b60d Mon Sep 17 00:00:00 2001 From: Tzvi Ronen Date: Thu, 9 Sep 2021 00:02:42 +0300 Subject: [PATCH 10/11] fixed uint24 support comments --- canopen/objectdictionary/__init__.py | 4 ++-- canopen/sdo/client.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/canopen/objectdictionary/__init__.py b/canopen/objectdictionary/__init__.py index ca75c31b..5044225a 100644 --- a/canopen/objectdictionary/__init__.py +++ b/canopen/objectdictionary/__init__.py @@ -221,7 +221,7 @@ def add_member(self, variable): class Unsigned24(struct.Struct): def __init__(self, *args, **kwargs): - super(Unsigned24, self).__init__(" Date: Thu, 9 Sep 2021 00:43:51 +0300 Subject: [PATCH 11/11] t removed from on_response and send_request the debug log's to not spam the logs --- canopen/sdo/client.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/canopen/sdo/client.py b/canopen/sdo/client.py index cff3de58..c52605a8 100644 --- a/canopen/sdo/client.py +++ b/canopen/sdo/client.py @@ -45,7 +45,6 @@ def __init__(self, rx_cobid, tx_cobid, od): self.responses = queue.Queue() def on_response(self, can_id, data, timestamp): - logger.debug("received response in %s data %s.", can_id, data) self.responses.put(bytes(data)) def send_request(self, request): @@ -54,7 +53,6 @@ def send_request(self, request): try: if self.PAUSE_BEFORE_SEND: time.sleep(self.PAUSE_BEFORE_SEND) - logger.debug(f"sending to {self.rx_cobid} data {request} ") self.network.send_message(self.rx_cobid, request) except CanError as e: # Could be a buffer overflow. Wait some time before trying again