From c6924da82799ebdf27a53634c3ffb0b781257d6e Mon Sep 17 00:00:00 2001 From: "Michael D. M. Dryden" <mdryden@chem.utoronto.ca> Date: Mon, 16 Nov 2015 18:39:06 -0500 Subject: [PATCH] Move serial connection to single instance. Add Disconnect button. --- dstat-interface/dstat_comm.py | 18 +++--- .../interface/dstatinterface.glade | 23 +++++-- dstat-interface/main.py | 62 +++++++++++-------- 3 files changed, 63 insertions(+), 40 deletions(-) diff --git a/dstat-interface/dstat_comm.py b/dstat-interface/dstat_comm.py index fab46b6..e17b9b0 100644 --- a/dstat-interface/dstat_comm.py +++ b/dstat-interface/dstat_comm.py @@ -38,14 +38,14 @@ def call_it(instance, name, args=(), kwargs=None): return getattr(instance, name)(*args, **kwargs) def version_check(ser_port): - """Tries to contact DStat and get version. Returns a tuple of - (major, minor). If no response, returns empty tuple. + """Tries to contact DStat and get version. Returns a list of + [(major, minor), serial instance]. If no response, returns empty tuple. Arguments: ser_port -- address of serial port to use """ - ser = delayedSerial(ser_port, 1024000, timeout=1) + ser = delayedSerial(ser_port, baudrate=1000000, timeout=1) ser.write("ck") ser.flushInput() @@ -70,9 +70,7 @@ def version_check(ser_port): parted = input.rstrip().split('.') print parted - ser.close() - - return (int(parted[0]), int(parted[1])) + return [(int(parted[0]), int(parted[1])), ser] @@ -140,17 +138,16 @@ class Experiment(object): self.commands[1] += (self.parameters['gain']) self.commands[1] += " " - def run(self, ser_port): + def run(self, ser): """Execute experiment. Connects and sends handshake signal to DStat then sends self.commands. Don't call directly as a process in Windows, use run_wrapper instead. Arguments: - ser_port -- address of serial port to use + ser -- serial instance to use """ - self.serial = delayedSerial(ser_port, 1024000, timeout=1) + self.serial = ser self.serial.write("ck") - self.serial.flushInput() for i in self.commands: @@ -166,7 +163,6 @@ class Experiment(object): break self.data_postprocessing() - self.serial.close() self.main_pipe.close() def serial_handler(self): diff --git a/dstat-interface/interface/dstatinterface.glade b/dstat-interface/interface/dstatinterface.glade index 8a43fb8..e3cb0d6 100644 --- a/dstat-interface/interface/dstatinterface.glade +++ b/dstat-interface/interface/dstatinterface.glade @@ -1216,13 +1216,13 @@ Thanks to Christian Fobel for help with Dropbot Plugin</property> </packing> </child> <child> - <object class="GtkButton" id="serial_version"> + <object class="GtkButton" id="serial_connect"> <property name="label">gtk-connect</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="use_stock">True</property> - <signal name="clicked" handler="on_serial_version_clicked" swapped="no"/> + <signal name="clicked" handler="on_serial_connect_clicked" swapped="no"/> </object> <packing> <property name="expand">False</property> @@ -1230,6 +1230,21 @@ Thanks to Christian Fobel for help with Dropbot Plugin</property> <property name="position">3</property> </packing> </child> + <child> + <object class="GtkButton" id="serial_disconnect"> + <property name="label">gtk-disconnect</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_serial_disconnect_clicked" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">4</property> + </packing> + </child> <child> <object class="GtkLabel" id="ocp_disp"> <property name="visible">True</property> @@ -1242,7 +1257,7 @@ Thanks to Christian Fobel for help with Dropbot Plugin</property> <packing> <property name="expand">False</property> <property name="fill">False</property> - <property name="position">4</property> + <property name="position">5</property> </packing> </child> <child> @@ -1254,7 +1269,7 @@ Thanks to Christian Fobel for help with Dropbot Plugin</property> <packing> <property name="expand">True</property> <property name="fill">True</property> - <property name="position">5</property> + <property name="position">6</property> </packing> </child> </object> diff --git a/dstat-interface/main.py b/dstat-interface/main.py index 0bf67c7..2e477f9 100755 --- a/dstat-interface/main.py +++ b/dstat-interface/main.py @@ -92,6 +92,9 @@ class Main(object): self.adc_pot_container.reparent(self.adc_pot_box) #fill serial + self.serial_connect = self.builder.get_object('serial_connect') + self.serial_disconnect = self.builder.get_object('serial_disconnect') + self.serial_disconnect.set_sensitive(False) self.serial_combobox = self.builder.get_object('serial_combobox') self.serial_combobox.pack_start(self.cell, True) self.serial_combobox.add_attribute(self.cell, 'text', 0) @@ -132,11 +135,13 @@ class Main(object): def on_window1_destroy(self, object, data=None): """ Quit when main window closed.""" self.on_pot_stop_clicked() + self.on_serial_disconnect_clicked() gtk.main_quit() def on_gtk_quit_activate(self, menuitem, data=None): """Quit when Quit selected from menu.""" self.on_pot_stop_clicked() + self.on_serial_disconnect_clicked() gtk.main_quit() def on_gtk_about_activate(self, menuitem, data=None): @@ -161,15 +166,18 @@ class Main(object): for i in self.serial_devices.ports: self.serial_liststore.append([i]) - def on_serial_version_clicked(self, data=None): - """Retrieve DStat version.""" + def on_serial_connect_clicked(self, data=None): + """Connect and retrieve DStat version.""" try: self.on_pot_stop_clicked() except AttributeError: pass - self.version = comm.version_check(self.serial_liststore.get_value( + version_list = comm.version_check(self.serial_liststore.get_value( self.serial_combobox.get_active_iter(), 0)) + + self.version = version_list[0] + self.serial = version_list[1] self.statusbar.remove_all(self.error_context_id) @@ -185,6 +193,24 @@ class Main(object): ) self.start_ocp() self.connected = True + self.serial_connect.set_sensitive(False) + self.serial_disconnect.set_sensitive(True) + + def on_serial_disconnect_clicked(self, data=None): + """Disconnect from DStat.""" + try: + self.on_pot_stop_clicked() + except AttributeError: + pass + + # Stop OCP measurements + gobject.source_remove(self.ocp_proc) + + self.serial.close() + del(self.serial) + self.connected = False + self.serial_connect.set_sensitive(True) + self.serial_disconnect.set_sensitive(False) def start_ocp(self): """Start OCP measurements.""" @@ -192,8 +218,7 @@ class Main(object): self.recv_p, self.send_p = multiprocessing.Pipe(duplex=True) self.ocp_exp = comm.OCPExp(self.send_p) - self.ocp_exp.run_wrapper(self.serial_liststore.get_value( - self.serial_combobox.get_active_iter(), 0)) + self.ocp_exp.run_wrapper(self.serial) self.send_p.close() # need for EOF signal to work @@ -270,8 +295,7 @@ class Main(object): for i in self.current_exp.commands: self.rawbuffer.insert_at_cursor(i) - self.current_exp.run_wrapper(self.serial_liststore.get_value( - self.serial_combobox.get_active_iter(), 0)) + self.current_exp.run_wrapper(self.serial) self.send_p.close() # need for EOF signal to work @@ -317,9 +341,7 @@ class Main(object): self.plot.clearall() self.plot.changetype(self.current_exp) - self.current_exp.run_wrapper( - self.serial_liststore.get_value( - self.serial_combobox.get_active_iter(), 0)) + self.current_exp.run_wrapper(self.serial) self.send_p.close() @@ -371,9 +393,7 @@ class Main(object): self.plot.clearall() self.plot.changetype(self.current_exp) - self.current_exp.run_wrapper( - self.serial_liststore.get_value( - self.serial_combobox.get_active_iter(), 0)) + self.current_exp.run_wrapper(self.serial) self.send_p.close() @@ -434,9 +454,7 @@ class Main(object): self.plot.clearall() self.plot.changetype(self.current_exp) - self.current_exp.run_wrapper( - self.serial_liststore.get_value( - self.serial_combobox.get_active_iter(), 0)) + self.current_exp.run_wrapper(self.serial) self.send_p.close() @@ -493,9 +511,7 @@ class Main(object): self.plot.clearall() self.plot.changetype(self.current_exp) - self.current_exp.run_wrapper( - self.serial_liststore.get_value( - self.serial_combobox.get_active_iter(), 0)) + self.current_exp.run_wrapper(self.serial) self.send_p.close() @@ -520,9 +536,7 @@ class Main(object): self.plot.clearall() self.plot.changetype(self.current_exp) - self.current_exp.run_wrapper( - self.serial_liststore.get_value( - self.serial_combobox.get_active_iter(), 0)) + self.current_exp.run_wrapper(self.serial) self.send_p.close() @@ -553,9 +567,7 @@ class Main(object): self.plot.clearall() self.plot.changetype(self.current_exp) - self.current_exp.run_wrapper( - self.serial_liststore.get_value( - self.serial_combobox.get_active_iter(), 0)) + self.current_exp.run_wrapper(self.serial) self.send_p.close() -- GitLab