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