Skip to content

Commit

Permalink
Merge pull request #134 from danielhrisca/master
Browse files Browse the repository at this point in the history
allow only one thread to send/receive XCP commands
  • Loading branch information
christoph2 committed Jul 5, 2023
2 parents 708b4f6 + cd10c9b commit 80adf46
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 24 deletions.
2 changes: 1 addition & 1 deletion pyxcp/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,4 @@
from .transport import Usb

# if you update this manually, do not forget to update .bumpversion.cfg
__version__ = "0.20.3"
__version__ = "0.20.4"
49 changes: 26 additions & 23 deletions pyxcp/transport/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@ def __init__(self, config=None):
self.parent = None
self.config = Configuration(BaseTransport.PARAMETER_MAP or {}, config or {})
self.closeEvent = threading.Event()

self.command_lock = threading.Lock()
loglevel = self.config.get("LOGLEVEL")
self._debug = loglevel == "DEBUG"

Expand Down Expand Up @@ -121,30 +123,31 @@ def finishListener(self):
self.closeEvent.set()

def _request_internal(self, cmd, ignore_timeout=False, *data):
frame = self._prepare_request(cmd, *data)
self.timing.start()
self.send(frame)

try:
xcpPDU = get(
self.resQueue,
timeout=self.timeout,
restart_event=self.timer_restart_event,
)
except Empty:
if not ignore_timeout:
raise types.XcpTimeoutError("Response timed out (timeout={}s)".format(self.timeout)) from None
with self.command_lock:
frame = self._prepare_request(cmd, *data)
self.timing.start()
self.send(frame)

try:
xcpPDU = get(
self.resQueue,
timeout=self.timeout,
restart_event=self.timer_restart_event,
)
except Empty:
if not ignore_timeout:
raise types.XcpTimeoutError("Response timed out (timeout={}s)".format(self.timeout)) from None
else:
self.timing.stop()
return
self.timing.stop()
pid = types.Response.parse(xcpPDU).type
if pid == "ERR" and cmd.name != "SYNCH":
err = types.XcpError.parse(xcpPDU[1:])
raise types.XcpResponseError(err)
else:
self.timing.stop()
return
self.timing.stop()
pid = types.Response.parse(xcpPDU).type
if pid == "ERR" and cmd.name != "SYNCH":
err = types.XcpError.parse(xcpPDU[1:])
raise types.XcpResponseError(err)
else:
pass # Und nu??
return xcpPDU[1:]
pass # Und nu??
return xcpPDU[1:]

def request(self, cmd, *data):
return self._request_internal(cmd, False, *data)
Expand Down

0 comments on commit 80adf46

Please sign in to comment.