From 707593a60f7f079b6be88c1fb3f62663af9dc85f Mon Sep 17 00:00:00 2001 From: Knitt Date: Thu, 18 Feb 2021 15:34:16 -0600 Subject: [PATCH 1/7] Add support for Kvaser and NeoVI hardware interfaces Signed-off-by: Knitt --- .../TransportProtocols/Can/CanConnectionFactory.py | 14 ++++++++++++++ .../TransportProtocols/Can/config.ini | 6 ++++++ 2 files changed, 20 insertions(+) diff --git a/uds/uds_communications/TransportProtocols/Can/CanConnectionFactory.py b/uds/uds_communications/TransportProtocols/Can/CanConnectionFactory.py index aee217d..97239ab 100644 --- a/uds/uds_communications/TransportProtocols/Can/CanConnectionFactory.py +++ b/uds/uds_communications/TransportProtocols/Can/CanConnectionFactory.py @@ -76,6 +76,20 @@ def __call__(callback=None, filter=None, configPath=None, **kwargs): else: raise Exception("SocketCAN on Pythoncan currently only supported in Linux") + elif connectionType == 'neovi': + channel = int(CanConnectionFactory.config['neovi']['channel']) + baudrate = int(CanConnectionFactory.config['can']['baudrate']) + CanConnectionFactory.connections[channel] = CanConnection(callback, filter, + ics_neovi.NeoViBus(channel, + bitrate=baudrate)) + return CanConnectionFactory.connections[channel] + elif connectionType == 'kvaser': + channel = int(CanConnectionFactory.config['kvaser']['channel']) + baudrate = int(CanConnectionFactory.config['can']['baudrate']) + CanConnectionFactory.connections[channel] = CanConnection(callback, filter, + kvaser.canlib.KvaserBus(channel, + bitrate=baudrate)) + return CanConnectionFactory.connections[channel] @staticmethod def loadConfiguration(configPath=None): diff --git a/uds/uds_communications/TransportProtocols/Can/config.ini b/uds/uds_communications/TransportProtocols/Can/config.ini index 30b33f1..c63620a 100644 --- a/uds/uds_communications/TransportProtocols/Can/config.ini +++ b/uds/uds_communications/TransportProtocols/Can/config.ini @@ -24,3 +24,9 @@ channel=0 [socketcan] channel=can0 + +[neovi] +channel=1 + +[kvaser] +channel=0 \ No newline at end of file From 2126d1d9f2f37bac0f94680dd674351e238c992a Mon Sep 17 00:00:00 2001 From: aaknitt Date: Thu, 18 Feb 2021 17:11:27 -0600 Subject: [PATCH 2/7] Signed-off-by: aaknitt --- .../TransportProtocols/Can/CanConnectionFactory.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/uds/uds_communications/TransportProtocols/Can/CanConnectionFactory.py b/uds/uds_communications/TransportProtocols/Can/CanConnectionFactory.py index 97239ab..b668499 100644 --- a/uds/uds_communications/TransportProtocols/Can/CanConnectionFactory.py +++ b/uds/uds_communications/TransportProtocols/Can/CanConnectionFactory.py @@ -1,5 +1,5 @@ import can -from can.interfaces import pcan, vector +from can.interfaces import pcan, vector, kvaser, ics_neovi from uds.uds_configuration.Config import Config from os import path from platform import system @@ -121,4 +121,6 @@ def checkKwargs(**kwargs): if 'channel' in kwargs: CanConnectionFactory.config['vector']['channel'] = kwargs['channel'] + CanConnectionFactory.config['kvaser']['channel'] = kwargs['channel'] + CanConnectionFactory.config['neovi']['channel'] = kwargs['channel'] From ad3ccf8762cdbc38a3b4ffe0d4432b02dad97380 Mon Sep 17 00:00:00 2001 From: aaknitt Date: Tue, 23 Feb 2021 09:11:21 -0600 Subject: [PATCH 3/7] Made ics_neovi import OS dependant Signed-off-by: aaknitt --- .../TransportProtocols/Can/CanConnectionFactory.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/uds/uds_communications/TransportProtocols/Can/CanConnectionFactory.py b/uds/uds_communications/TransportProtocols/Can/CanConnectionFactory.py index b668499..5d986e3 100644 --- a/uds/uds_communications/TransportProtocols/Can/CanConnectionFactory.py +++ b/uds/uds_communications/TransportProtocols/Can/CanConnectionFactory.py @@ -1,5 +1,5 @@ import can -from can.interfaces import pcan, vector, kvaser, ics_neovi +from can.interfaces import pcan, vector, kvaser from uds.uds_configuration.Config import Config from os import path from platform import system @@ -9,6 +9,8 @@ # used to conditionally import socketcan for linux to avoid error messages if system() == "Linux": from can.interfaces import socketcan +else: + from can.interfaces import ics_neovi class CanConnectionFactory(object): From 888845416f537318c5f3741ff3c8e740efefa5e2 Mon Sep 17 00:00:00 2001 From: aaknitt Date: Fri, 5 Mar 2021 13:20:53 -0600 Subject: [PATCH 4/7] Ignore Start Linear Address record when reading in hex files - hackish fix Signed-off-by: aaknitt --- uds/uds_config_tool/IHexFunctions.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/uds/uds_config_tool/IHexFunctions.py b/uds/uds_config_tool/IHexFunctions.py index e4d41b5..63a7ed8 100644 --- a/uds/uds_config_tool/IHexFunctions.py +++ b/uds/uds_config_tool/IHexFunctions.py @@ -210,8 +210,9 @@ def __init__(self, filename=None, padding=0xFF, continuousBlocking=True): raise NotImplemented("Start segment address not implemented") elif recordType == ihexRecordType.StartLinearAddress: - hexFile.close() - raise NotImplemented("Start linear address not implemented") + print("Found a Start Linear Address - Ignoring") + #hexFile.close() + #raise NotImplemented("Start linear address not implemented") hexFile.close() @property From 4e874cc67cbf302f3a19ceea9d4dc5c419af3741 Mon Sep 17 00:00:00 2001 From: aaknitt Date: Wed, 17 Mar 2021 16:43:21 -0500 Subject: [PATCH 5/7] Modified IHexFunctions.py to create a new block and glean starting address from first data record if no ExtendedLinearAddress is present Signed-off-by: aaknitt --- uds/uds_communications/TransportProtocols/Can/CanTp.py | 1 - uds/uds_config_tool/IHexFunctions.py | 6 +++++- uds/uds_configuration/defaultConfig.ini | 4 ++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/uds/uds_communications/TransportProtocols/Can/CanTp.py b/uds/uds_communications/TransportProtocols/Can/CanTp.py index bff4871..a95c210 100644 --- a/uds/uds_communications/TransportProtocols/Can/CanTp.py +++ b/uds/uds_communications/TransportProtocols/Can/CanTp.py @@ -286,7 +286,6 @@ def send(self, payload, functionalReq=False): # @param [in] timeout_ms The timeout to wait before exiting # @return a list def recv(self, timeout_s): - timeoutTimer = ResettableTimer(timeout_s) payload = [] diff --git a/uds/uds_config_tool/IHexFunctions.py b/uds/uds_config_tool/IHexFunctions.py index 63a7ed8..1d9eae8 100644 --- a/uds/uds_config_tool/IHexFunctions.py +++ b/uds/uds_config_tool/IHexFunctions.py @@ -168,7 +168,11 @@ def __init__(self, filename=None, padding=0xFF, continuousBlocking=True): if recordType == ihexRecordType.Data: # ... We match data first as it's the most common record type, so more efficient if nextAddress is None: - currentBlock.startAddress = baseAddress + address + if currentBlock is None: + currentBlock = ihexData() #... start a new block + currentBlock.startAddress = address + else: + currentBlock.startAddress = baseAddress + address # As each line of data is individually addressed, there may be disconuities present in the data. # If so (i.e. a gap in the addressing), and a continuous record is required, then pad the data. diff --git a/uds/uds_configuration/defaultConfig.ini b/uds/uds_configuration/defaultConfig.ini index 1f49172..b1ced58 100644 --- a/uds/uds_configuration/defaultConfig.ini +++ b/uds/uds_configuration/defaultConfig.ini @@ -5,8 +5,8 @@ interface=virtual baudrate=500 defaultReqId=0x600 defaultResId=0x650 -P2_Client=1 -P2_Server=1 +P2_Client=3 +P2_Server=3 P3_Client=1 [virtual] From feedaf33a026a714c342eb03f7a733f29984afa4 Mon Sep 17 00:00:00 2001 From: aaknitt Date: Thu, 20 May 2021 10:42:55 -0500 Subject: [PATCH 6/7] Added optional flag to remove .001 second delay between consecutive frames in CAN transport protocol send loop to speed up download operations with large files. Signed-off-by: aaknitt --- uds/uds_communications/TransportProtocols/Can/CanTp.py | 8 ++++---- uds/uds_communications/Uds/Uds.py | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/uds/uds_communications/TransportProtocols/Can/CanTp.py b/uds/uds_communications/TransportProtocols/Can/CanTp.py index a95c210..58c6f0e 100644 --- a/uds/uds_communications/TransportProtocols/Can/CanTp.py +++ b/uds/uds_communications/TransportProtocols/Can/CanTp.py @@ -176,8 +176,7 @@ def __checkKwargs(self, **kwargs): ## # @brief send method # @param [in] payload the payload to be sent - def send(self, payload, functionalReq=False): - + def send(self, payload, functionalReq=False,nodelay=False): payloadLength = len(payload) payloadPtr = 0 @@ -278,14 +277,15 @@ def send(self, payload, functionalReq=False): # timer / exit condition checks if(timeoutTimer.isExpired()): raise Exception("Timeout waiting for message") - - sleep(0.001) + if state != CanTpState.SEND_CONSECUTIVE_FRAME or nodelay==False: + sleep(.001) ## # @brief recv method # @param [in] timeout_ms The timeout to wait before exiting # @return a list def recv(self, timeout_s): + #print("timeout_s passed to recv is " + str(timeout_s)) timeoutTimer = ResettableTimer(timeout_s) payload = [] diff --git a/uds/uds_communications/Uds/Uds.py b/uds/uds_communications/Uds/Uds.py index 35a3f55..9ff9536 100644 --- a/uds/uds_communications/Uds/Uds.py +++ b/uds/uds_communications/Uds/Uds.py @@ -119,7 +119,7 @@ def transferFile(self,fileName=None,transmitChunkSize=None,compressionMethod=Non ## # @brief - def send(self, msg, responseRequired=True, functionalReq=False): + def send(self, msg, responseRequired=True, functionalReq=False,nodelay=False): # sets a current transmission in progress - tester present (if running) will not send if this flag is set to true self.__transmissionActive_flag = True #print(("__transmissionActive_flag set:",self.__transmissionActive_flag)) @@ -129,7 +129,7 @@ def send(self, msg, responseRequired=True, functionalReq=False): # We're moving to threaded operation, so putting a lock around the send operation. self.sendLock.acquire() try: - a = self.tp.send(msg, functionalReq) + a = self.tp.send(msg, functionalReq,nodelay) finally: self.sendLock.release() From 9d8aaaef333f0982be5bcbc2a3561c52e2161dca Mon Sep 17 00:00:00 2001 From: Andy Knitt Date: Fri, 19 Jan 2024 14:45:48 -0600 Subject: [PATCH 7/7] Update CanConnection.py Remove zero timeout value causing high CPU load --- uds/uds_communications/TransportProtocols/Can/CanConnection.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uds/uds_communications/TransportProtocols/Can/CanConnection.py b/uds/uds_communications/TransportProtocols/Can/CanConnection.py index f1c6bea..69405b4 100644 --- a/uds/uds_communications/TransportProtocols/Can/CanConnection.py +++ b/uds/uds_communications/TransportProtocols/Can/CanConnection.py @@ -20,7 +20,7 @@ def __init__(self, callback, filter, bus): self.__bus = bus listener = can.Listener() listener.on_message_received = callback - self.__notifier = can.Notifier(self.__bus, [listener], 0) + self.__notifier = can.Notifier(self.__bus, [listener]) self.__listeners = [listener] self.addFilter(filter)