diff --git a/control_seekat_demo.py b/control_seekat_demo.py index 0c180c2..dd3a7a0 100644 --- a/control_seekat_demo.py +++ b/control_seekat_demo.py @@ -1,12 +1,11 @@ import gi gi.require_version("Gtk", "3.0") -from gi.repository import Gtk +gi.require_version("GLib", "2.0") +from gi.repository import Gtk, GLib import serial import serial.tools.list_ports import re -CHANGE_BUTTONS = ["SET_do", "RAMP_do", "sel_ref", "sel_do"] - def error_popup(parent, msg): box = Gtk.MessageDialog( parent=parent, @@ -20,6 +19,12 @@ def error_popup(parent, msg): box.show_all() class SerComm: + + def switch_buttons(self, b): + CHANGE_BUTTONS = ["SET_do", "RAMP_do", "sel_ref", "sel_do"] + for x in CHANGE_BUTTONS: + self.getobj(x).set_sensitive(b) + def error_popup(self, x): error_popup(self.getobj("win"), x) @@ -29,12 +34,25 @@ class SerComm: self.getobj("debug_win").scroll_to_mark( o.get_insert(), 0.1, False, 0, 1) + def get(self): + s = self.ser.read_until() + + if s is None: + return None + s = s.decode() + self.buf = self.buf + s.rstrip("\r\n") + + if not s.endswith("\n"): + return None + s = self.buf + self.buf = "" + self.append(s + "\n") + return s + def get_or_to(self): - s = self.ser.read_until().decode() - if not s: + s = self.get() + if s is None: raise Exception(f"DAC timeout: '{s}'") - s = s.rstrip("\r\n") - self.append(f'{s}\n') return s def send(self, s): @@ -43,16 +61,12 @@ class SerComm: self.append(f'{s}\n') def make_dac_conn(self, f): - for x in CHANGE_BUTTONS: - self.getobj(x).set_sensitive(False) - + self.switch_buttons(False) try: f() except Exception as e: self.error_popup(str(e)) - - for x in CHANGE_BUTTONS: - self.getobj(x).set_sensitive(True) + self.switch_buttons(True) """ make connection (*IDN?) """ def connect(self): @@ -101,6 +115,50 @@ class SerComm: def on_SET(self, _): self.make_dac_conn(self.do_SET) + """ RAMP """ + def RAMP_callback(self, _): + s = self.get() + if s is None: + return GLib.SOURCE_CONTINUE + self.switch_buttons(True) + + if s != "RAMP_FINISHED": + self.error_popup(f'DAC reported an error during ramping: {s}') + return GLib.SOURCE_REMOVE + + + def do_RAMP(self, _): + self.switch_buttons(False) + if not self.ser.is_open: + return None + + ch1 = int(self.getobj("RAMP_ch1").get_active_id()) - 1 + ch1_st = float(self.getobj("RAMP_st1").get_text()) + ch1_ed = float(self.getobj("RAMP_ed1").get_text()) + + ch2 = self.getobj("RAMP_ch2").get_active_id() + if ch2 is not None: + ch2 = int(ch2) - 1 + ch2_st = float(self.getobj("RAMP_st2").get_text()) + ch2_ed = float(self.getobj("RAMP_ed2").get_text()) + + cmd = f"RAMP2,{ch1},{ch2},{ch1_st},{ch2_st},{ch1_ed},{ch2_ed}" + else: + cmd = f"RAMP1,{ch1},{ch1_st},{ch1_ed}" + + steps = int(self.getobj("RAMP_step").get_text()) + msec = int(self.getobj("RAMP_t").get_text()) + cmd = cmd + f",{steps},{msec}" + + self.send(cmd) + s = self.get_or_to() + if s != "RAMPING": + raise Exception(f"DAC reported an error: {s}") +"""TODO: +two timeouts? one for the time, and another every 200msec +""" + GLib.timeout_add(200, self.RAMP_callback, None) + def refresh(self, _): # Does this cause a memory error? This is a GTK interned string curid = self.sel_box.get_active_id() @@ -123,6 +181,7 @@ class SerComm: self.getobj = getobj self.ser = serial.Serial(timeout=3) self.ser.baudrate = 115200 + self.buf = "" self.sel_box = getobj("sel_box") @@ -130,6 +189,7 @@ class SerComm: self.refresh(None) getobj("sel_do").connect("clicked", self.on_connect) getobj("SET_do").connect("clicked", self.on_SET) + getobj("RAMP_do").connect("clicked", self.do_RAMP) if __name__ == "__main__": builder = Gtk.Builder() diff --git a/gui.glade b/gui.glade index c402785..0cc2587 100644 --- a/gui.glade +++ b/gui.glade @@ -17,7 +17,7 @@ True False - Seekat Control (Demo) + Seekat Control (prototype) True @@ -498,7 +498,7 @@ True True - 4 + 7 time number @@ -512,7 +512,7 @@ True False - milliseconds between each + microsconds between each False