From b05d94673c8f865cdb186a8c980fdb2103a0c9d2 Mon Sep 17 00:00:00 2001 From: "Seemann Jochen (CC-DA/ECU2)" Date: Sun, 14 Jul 2019 21:38:12 +0200 Subject: [PATCH 1/5] add support for query available PCAN channels --- can/interfaces/pcan/pcan.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/can/interfaces/pcan/pcan.py b/can/interfaces/pcan/pcan.py index 80b6054d0..1e19d0e76 100644 --- a/can/interfaces/pcan/pcan.py +++ b/can/interfaces/pcan/pcan.py @@ -477,6 +477,27 @@ def state(self, new_state): ) + @staticmethod + def _detect_available_configs(): + libraryHandle = PCANBasic() + channels = [] + interfaces = [] + for i in range(16): + interfaces.append({'id': TPCANHandle(PCAN_PCIBUS1.value + i), 'name': 'PCAN_PCIBUS'+str(i+1)}) + for i in range(16): + interfaces.append({'id': TPCANHandle(PCAN_USBBUS1.value + i), 'name': 'PCAN_USBBUS'+str(i+1)}) + for i in range(2): + interfaces.append({'id': TPCANHandle(PCAN_PCCBUS1.value + i), 'name': 'PCAN_PCCBUS'+str(i+1)}) + for i in range(16): + interfaces.append({'id': TPCANHandle(PCAN_LANBUS1.value + i), 'name': 'PCAN_LANBUS'+str(i+1)}) + status = TPCANStatus(0) + for i in interfaces: + error, value = libraryHandle.GetValue(i['id'], PCAN_CHANNEL_CONDITION) + if error != PCAN_ERROR_OK or value != PCAN_CHANNEL_AVAILABLE: + continue + channels.append({'interface': 'pcan', 'channel': i['name']}) + return channels + class PcanError(CanError): """ A generic error on a PCAN bus. From 4ecf02e94f5d0af50b93414e5ba527475fd85b8c Mon Sep 17 00:00:00 2001 From: "Seemann Jochen (CC-DA/ECU2)" Date: Sun, 14 Jul 2019 21:49:33 +0200 Subject: [PATCH 2/5] add CAN FD support of channel in config --- can/interfaces/pcan/pcan.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/can/interfaces/pcan/pcan.py b/can/interfaces/pcan/pcan.py index 1e19d0e76..69f5b7214 100644 --- a/can/interfaces/pcan/pcan.py +++ b/can/interfaces/pcan/pcan.py @@ -495,7 +495,11 @@ def _detect_available_configs(): error, value = libraryHandle.GetValue(i['id'], PCAN_CHANNEL_CONDITION) if error != PCAN_ERROR_OK or value != PCAN_CHANNEL_AVAILABLE: continue - channels.append({'interface': 'pcan', 'channel': i['name']}) + hasFd = False + error, value = libraryHandle.GetValue(i['id'], PCAN_CHANNEL_FEATURES) + if error == PCAN_ERROR_OK: + hasFd = bool(value & FEATURE_FD_CAPABLE) + channels.append({'interface': 'pcan', 'channel': i['name'], 'supportsFd': hasFd}) return channels class PcanError(CanError): From 2868b6670ea340bfb6c3d05cb0d720f2161c0265 Mon Sep 17 00:00:00 2001 From: jsee23 Date: Mon, 15 Jul 2019 10:53:01 +0200 Subject: [PATCH 3/5] use consistent naming scheme Co-Authored-By: Felix Divo --- can/interfaces/pcan/pcan.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/can/interfaces/pcan/pcan.py b/can/interfaces/pcan/pcan.py index 69f5b7214..f7da6e21a 100644 --- a/can/interfaces/pcan/pcan.py +++ b/can/interfaces/pcan/pcan.py @@ -499,7 +499,7 @@ def _detect_available_configs(): error, value = libraryHandle.GetValue(i['id'], PCAN_CHANNEL_FEATURES) if error == PCAN_ERROR_OK: hasFd = bool(value & FEATURE_FD_CAPABLE) - channels.append({'interface': 'pcan', 'channel': i['name'], 'supportsFd': hasFd}) + channels.append({'interface': 'pcan', 'channel': i['name'], 'supports_fd': hasFd}) return channels class PcanError(CanError): From a0362145ff6781d11aaa753779808a3bb45b076a Mon Sep 17 00:00:00 2001 From: Jochen Seemann Date: Mon, 15 Jul 2019 20:13:03 +0200 Subject: [PATCH 4/5] handle exception if library cannot be loaded --- can/interfaces/pcan/pcan.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/can/interfaces/pcan/pcan.py b/can/interfaces/pcan/pcan.py index f7da6e21a..bbeba2e9b 100644 --- a/can/interfaces/pcan/pcan.py +++ b/can/interfaces/pcan/pcan.py @@ -479,8 +479,11 @@ def state(self, new_state): @staticmethod def _detect_available_configs(): - libraryHandle = PCANBasic() channels = [] + try: + libraryHandle = PCANBasic() + except: + return channels interfaces = [] for i in range(16): interfaces.append({'id': TPCANHandle(PCAN_PCIBUS1.value + i), 'name': 'PCAN_PCIBUS'+str(i+1)}) From 15264beb47a49c732c55afdbbb60bd2f1717bd59 Mon Sep 17 00:00:00 2001 From: Jochen Seemann Date: Mon, 15 Jul 2019 20:37:41 +0200 Subject: [PATCH 5/5] fix linter and formatting warnings --- can/interfaces/pcan/pcan.py | 47 +++++++++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 13 deletions(-) diff --git a/can/interfaces/pcan/pcan.py b/can/interfaces/pcan/pcan.py index bbeba2e9b..4bddfc3b1 100644 --- a/can/interfaces/pcan/pcan.py +++ b/can/interfaces/pcan/pcan.py @@ -476,35 +476,56 @@ def state(self, new_state): self.m_PcanHandle, PCAN_LISTEN_ONLY, PCAN_PARAMETER_ON ) - @staticmethod def _detect_available_configs(): channels = [] try: - libraryHandle = PCANBasic() - except: + library_handle = PCANBasic() + except OSError: return channels interfaces = [] for i in range(16): - interfaces.append({'id': TPCANHandle(PCAN_PCIBUS1.value + i), 'name': 'PCAN_PCIBUS'+str(i+1)}) + interfaces.append( + { + "id": TPCANHandle(PCAN_PCIBUS1.value + i), + "name": "PCAN_PCIBUS" + str(i + 1), + } + ) for i in range(16): - interfaces.append({'id': TPCANHandle(PCAN_USBBUS1.value + i), 'name': 'PCAN_USBBUS'+str(i+1)}) + interfaces.append( + { + "id": TPCANHandle(PCAN_USBBUS1.value + i), + "name": "PCAN_USBBUS" + str(i + 1), + } + ) for i in range(2): - interfaces.append({'id': TPCANHandle(PCAN_PCCBUS1.value + i), 'name': 'PCAN_PCCBUS'+str(i+1)}) + interfaces.append( + { + "id": TPCANHandle(PCAN_PCCBUS1.value + i), + "name": "PCAN_PCCBUS" + str(i + 1), + } + ) for i in range(16): - interfaces.append({'id': TPCANHandle(PCAN_LANBUS1.value + i), 'name': 'PCAN_LANBUS'+str(i+1)}) - status = TPCANStatus(0) + interfaces.append( + { + "id": TPCANHandle(PCAN_LANBUS1.value + i), + "name": "PCAN_LANBUS" + str(i + 1), + } + ) for i in interfaces: - error, value = libraryHandle.GetValue(i['id'], PCAN_CHANNEL_CONDITION) + error, value = library_handle.GetValue(i["id"], PCAN_CHANNEL_CONDITION) if error != PCAN_ERROR_OK or value != PCAN_CHANNEL_AVAILABLE: continue - hasFd = False - error, value = libraryHandle.GetValue(i['id'], PCAN_CHANNEL_FEATURES) + has_fd = False + error, value = library_handle.GetValue(i["id"], PCAN_CHANNEL_FEATURES) if error == PCAN_ERROR_OK: - hasFd = bool(value & FEATURE_FD_CAPABLE) - channels.append({'interface': 'pcan', 'channel': i['name'], 'supports_fd': hasFd}) + has_fd = bool(value & FEATURE_FD_CAPABLE) + channels.append( + {"interface": "pcan", "channel": i["name"], "supports_fd": has_fd} + ) return channels + class PcanError(CanError): """ A generic error on a PCAN bus.