fixes for flamesample

- fixes in SwitchDrive
- increase range when reading is zero in autorange
- add debugging log msgs
This commit is contained in:
l_samenv 2023-10-25 10:14:53 +02:00
parent 8cb9154bb5
commit c80b4ac5fb
2 changed files with 39 additions and 26 deletions

View File

@ -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

View File

@ -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