diff --git a/labgrid/driver/sigrokdriver.py b/labgrid/driver/sigrokdriver.py index 874a33302..747f3ac66 100644 --- a/labgrid/driver/sigrokdriver.py +++ b/labgrid/driver/sigrokdriver.py @@ -2,7 +2,6 @@ import re import subprocess import shutil -import signal import tempfile import time import uuid @@ -149,6 +148,16 @@ def capture(self, filename, samplerate="200k"): args = self.sigrok.command_prefix + ['test', '-e', filename] while subprocess.call(args): + # in case the sigrok-cli call fails, this would wait forever. + # to avoid this, we also check the spawned sigrok process + if self._process.poll() is not None: + ret = self._process.returncode + if ret != 0: + stdout, stderr = self._process.communicate() + self.logger.debug("sigrok-cli call terminated prematurely with non-zero return-code") + self.logger.debug("stdout: %s", stdout) + self.logger.debug("stderr: %s", stderr) + raise ExecutionError(f"sigrok-cli call terminated prematurely with return-code '{ret}'.") sleep(0.1) self._running = True @@ -161,15 +170,15 @@ def stop(self): fnames.extend(self.sigrok.channels.split(',')) csv_filename = f'{os.path.splitext(self._basename)[0]}.csv' - self._process.send_signal(signal.SIGINT) - stdout, stderr = self._process.communicate() + # sigrok-cli can be quit through any keypress + stdout, stderr = self._process.communicate(input="q") self.logger.debug("stdout: %s", stdout) self.logger.debug("stderr: %s", stderr) # Convert from .sr to .csv cmd = [ '-i', - os.path.join(self._tmpdir, self._basename), '-O', 'csv', '-o', + os.path.join(self._tmpdir, self._basename), '-O', 'csv:time=true', '-o', os.path.join(self._tmpdir, csv_filename) ] self._call(*cmd) @@ -179,7 +188,7 @@ def stop(self): if isinstance(self.sigrok, NetworkSigrokUSBDevice): subprocess.call([ 'scp', f'{self.sigrok.host}:{os.path.join(self._tmpdir, self._basename)}', - os.path.join(self._local_tmpdir, self._filename) + os.path.abspath(self._filename) ], stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL, @@ -212,7 +221,7 @@ def stop(self): def analyze(self, args, filename=None): annotation_regex = re.compile(r'(?P\d+)-(?P\d+) (?P[\w\-]+): (?P[\w\-]+): (?P".*)') # pylint: disable=line-too-long if not filename and self._filename: - filename = self._filename + filename = os.path.join(self._tmpdir, self._basename) else: filename = os.path.abspath(filename) check_file(filename, command_prefix=self.sigrok.command_prefix)