From c80b4ac5fbf6591b9ec84a04ff17d9f640a57453 Mon Sep 17 00:00:00 2001 From: l_samenv Date: Wed, 25 Oct 2023 10:14:53 +0200 Subject: [PATCH] fixes for flamesample - fixes in SwitchDrive - increase range when reading is zero in autorange - add debugging log msgs --- frappy_psi/ls372.py | 5 ++++ frappy_psi/parmod.py | 60 +++++++++++++++++++++++++------------------- 2 files changed, 39 insertions(+), 26 deletions(-) diff --git a/frappy_psi/ls372.py b/frappy_psi/ls372.py index a18ab1d..ad22fbb 100644 --- a/frappy_psi/ls372.py +++ b/frappy_psi/ls372.py @@ -235,6 +235,9 @@ class ResChannel(Channel): return None result = float(self.communicate('RDGR?%d' % self.channel)) if result == 0: + if self.autorange: + rng = int(max(self.minrange, self.range)) # convert from enum to int + self.write_range(min(self.MAX_RNG, rng + 1)) return None if self.autorange: self.fix_autorange() @@ -251,8 +254,10 @@ class ResChannel(Channel): lim -= 0.05 # not more than 4 steps at once # effectively: <0.16 %: 4 steps, <1%: 3 steps, <5%: 2 steps, <20%: 1 step elif rng < self.MAX_RNG: + self.log.debug('increase range due to error %d', rng) rng = min(self.MAX_RNG, rng + 1) if rng != self.range: + self.log.debug('range change to %d', rng) self.write_range(rng) self._last_range_change = now return result diff --git a/frappy_psi/parmod.py b/frappy_psi/parmod.py index 9c35a68..205d2da 100644 --- a/frappy_psi/parmod.py +++ b/frappy_psi/parmod.py @@ -155,44 +155,52 @@ class SwitchDriv(HasConvergence, Drivable): def doPoll(self): super().doPoll() - if self.isBusy(): - if self._switch_target is not None: - mid = (self.min_high + self.max_low) * 0.5 - if self._switch_target == HIGH: - low = get_value(self.low, mid) # returns mid when low is invalid - if low > mid: - self.value = self.low.value - self._switch_target = None - self.write_target(self.target) - return - else: - high = get_value(self.high, mid) # return mid then high is invalid - if high < mid: - self.value = self.high.value - self._switch_target = None - self.write_target(self.target) - return - else: + if self._switch_target is not None: + mid = (self.min_high + self.max_low) * 0.5 + if self._switch_target == HIGH: + low = get_value(self.low, mid) # returns mid when low is invalid + if low > mid: + self.value = self.low.value + self._switch_target = None + self.write_target(self.target) + return + else: + high = get_value(self.high, mid) # return mid then high is invalid + if high < mid: + self.value = self.high.value + self._switch_target = None + self.write_target(self.target) + return + if not self.isBusy(): low = get_value(self.low, self.max_low) high = get_value(self.high, self.min_high) low_valid = low < self.max_low high_valid = high > self.min_high if high_valid and high > self.max_low: - if not low_valid: + if not low_valid and not self.low.control_active: set_enabled(self.low, False) return if low_valid and low < self.min_high: - if not high_valid: + if not high_valid and not self.high.control_active: set_enabled(self.high, False) return set_enabled(self.low, True) set_enabled(self.high, True) + def get_selected(self): + low = get_value(self.low, self.max_low) + high = get_value(self.high, self.min_high) + if low < self.min_high: + return 0 + if high > self.max_low: + return 1 + return self.selected + def read_value(self): - return self.low.value if self.selected == LOW else self.high.value + return self.low.value if self.get_selected() == LOW else self.high.value def read_status(self): - status = self.low.status if self.selected == LOW else self.high.status + status = self.low.status if self.get_selected() == LOW else self.high.status if status[0] >= ERROR: return status return super().read_status() # convergence status @@ -202,17 +210,17 @@ class SwitchDriv(HasConvergence, Drivable): selected = self.selected target1 = target self._switch_target = None - if target > self.max_low: + if target > self.max_low * 0.75 + self.min_high * 0.25: if self.value < self.min_high: - target1 = self.max_low + target1 = min(target, self.max_low) self._switch_target = HIGH selected = LOW else: this, other = other, this selected = HIGH - elif target < self.min_high: + elif target < self.min_high * 0.75 + self.max_low * 0.25: if self.value > self.max_low: - target1 = self.min_high + target1 = max(self.min_high, target) self._switch_target = LOW this, other = other, this selected = HIGH