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