From d0f895ed446f20da0ef53226cb00b22f1a0e8697 Mon Sep 17 00:00:00 2001 From: Markus Zolliker Date: Wed, 3 Mar 2021 11:21:00 +0100 Subject: [PATCH] fix autoscan behaviour in ls370res when in autoscan, and dwell < filter, the channel was never read + do not export pollinterval on both Main and ResChannel Change-Id: I50df9e151b219ab28875ac78107dcdfdede42c51 Reviewed-on: https://forge.frm2.tum.de/review/c/sine2020/secop/playground/+/25087 Tested-by: Jenkins Automated Tests Reviewed-by: Markus Zolliker --- secop_psi/ls370res.py | 21 +++++++++++++++++---- secop_psi/ls370sim.py | 1 + 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/secop_psi/ls370res.py b/secop_psi/ls370res.py index 26786ae..279cc04 100644 --- a/secop_psi/ls370res.py +++ b/secop_psi/ls370res.py @@ -63,7 +63,7 @@ class Main(HasIodev, Drivable): value = Parameter('the current channel', poll=REGULAR, datatype=IntRange(0, 17)) target = Parameter('channel to select', datatype=IntRange(0, 17)) autoscan = Parameter('whether to scan automatically', datatype=BoolType(), readonly=False, default=False) - pollinterval = Parameter('sleeptime between polls', default=1) + pollinterval = Parameter(default=1, export=False) pollerClass = Poller iodevClass = StringIO @@ -120,6 +120,11 @@ class Main(HasIodev, Drivable): self.status = [Status.BUSY, 'switching'] return channel + def write_autoscan(self, value): + scan.send_change(self, self.value, value) + # self.sendRecv('SCAN %d,%d;SCAN?' % (channel, self.autoscan)) + return value + class ResChannel(HasIodev, Readable): """temperature channel on Lakeshore 336""" @@ -144,7 +149,7 @@ class ResChannel(HasIodev, Readable): main = Attached() value = Parameter(datatype=FloatRange(unit='Ohm')) - pollinterval = Parameter(visibility=3) + pollinterval = Parameter(visibility=3, default=1, export=False) range = Parameter('reading range', readonly=False, datatype=EnumType(**RES_RANGE), handler=rdgrng) minrange = Parameter('minimum range for software autorange', readonly=False, default=1, @@ -158,16 +163,24 @@ class ResChannel(HasIodev, Readable): dwell = Parameter('dwell time with autoscan', datatype=FloatRange(1, 200), readonly=False, handler=inset) filter = Parameter('filter time', datatype=FloatRange(1, 200), readonly=False, handler=filterhdl) + _trigger_read = False + def initModule(self): self._main = self.DISPATCHER.get_module(self.main) self._main.register_channel(self) def read_value(self): - if self.channel != self._main.value: - return Done if not self.enabled: self.status = [self.Status.DISABLED, 'disabled'] return Done + if self.channel != self._main.value: + if self.channel == self._main.target: + self._trigger_read = True + return Done + if not self._trigger_read: + return Done + # we got here, when we missed the idle state of self._main + self._trigger_read = False result = self.sendRecv('RDGR?%d' % self.channel) result = float(result) if self.autorange == 'soft': diff --git a/secop_psi/ls370sim.py b/secop_psi/ls370sim.py index 10e7d7d..e0dbf08 100644 --- a/secop_psi/ls370sim.py +++ b/secop_psi/ls370sim.py @@ -35,6 +35,7 @@ class Ls370Sim(Communicator): ('*IDN?', 'LSCI,MODEL370,370184,05302003'), ('SCAN?', '3,1'), ] + def earlyInit(self): self._data = dict(self.OTHER_COMMANDS) for fmt, v in self.CHANNEL_COMMANDS: