From 5a1d3e4dc56b8c6769094e242c41bfc571fedd23 Mon Sep 17 00:00:00 2001 From: "Michael D. M. Dryden" <mdryden@chem.utoronto.ca> Date: Tue, 12 Aug 2014 18:47:11 -0400 Subject: [PATCH] Code cleanup for interface_test.py. Documented all functions, added hard line breaks, and renamed a few things. Mostly cosmetic. --- .gitignore | 1 + .../dstat-interface/interface_test.py | 401 +++++++++++------- 2 files changed, 260 insertions(+), 142 deletions(-) diff --git a/.gitignore b/.gitignore index 8df98e2..bc74534 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ Breakpoints_v2.xcbkptlist *.c *.so *.pyc +*.pyo *~ /dstatInterface/dist/ /dstatInterface/build/ diff --git a/dstat-interface/dstat-interface/interface_test.py b/dstat-interface/dstat-interface/interface_test.py index abca328..01cb8bb 100644 --- a/dstat-interface/dstat-interface/interface_test.py +++ b/dstat-interface/dstat-interface/interface_test.py @@ -1,22 +1,22 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- +""" GUI Interface for Wheeler Lab DStat """ import sys try: import pygtk pygtk.require('2.0') -except: - pass +except ImportError: + print('PyGTK 2.0 not available') + sys.exit(1) try: import gtk - import gobject -except: +except ImportError: print('GTK not available') sys.exit(1) - try: import gobject -except: +except ImportError: print('gobject not available') sys.exit(1) @@ -30,30 +30,31 @@ import interface.acv as acv import interface.pd as pd import interface.save as save import dstat_comm as comm +import mpltest +import microdrop + from serial import SerialException import multiprocessing import time -import mpltest -import microdrop - class Error(Exception): + """Copies Exception class""" pass class InputError(Error): - """Exception raised for errors in the input. + """Exception raised for errors in the input. Extends Error class. - Attributes: + Attributes: expr -- input expression in which the error occurred msg -- error message - """ + """ def __init__(self, expr, msg): self.expr = expr self.msg = msg -class main: - +class Main: + """Main program """ def __init__(self): self.builder = gtk.Builder() self.builder.add_from_file('interface/dstatinterface.glade') @@ -71,11 +72,11 @@ class main: self.adc_pot = adc_pot.adc_pot() self.chronoamp = chronoamp.chronoamp() self.lsv = lsv.lsv() - self.cv = cv.cv() + self.cve = cv.cv() self.swv = swv.swv() self.dpv = dpv.dpv() self.acv = acv.acv() - self.pd = pd.pd() + self.pde = pd.pd() self.error_context_id = self.statusbar.get_context_id("error") self.message_context_id = self.statusbar.get_context_id("message") @@ -91,20 +92,21 @@ class main: #fill exp_section self.exp_section = self.builder.get_object('exp_section_box') - self.chronoamp_container = self.chronoamp.builder.get_object('scrolledwindow1') + self.chronoamp_container = self.chronoamp.builder.get_object( + 'scrolledwindow1') self.chronoamp_container.reparent(self.exp_section) self.lsv_container = self.lsv.builder.get_object('scrolledwindow1') self.lsv_container.reparent(self.exp_section) - self.cv_container = self.cv.builder.get_object('scrolledwindow1') - self.cv_container.reparent(self.exp_section) + self.cve_container = self.cve.builder.get_object('scrolledwindow1') + self.cve_container.reparent(self.exp_section) self.swv_container = self.swv.builder.get_object('scrolledwindow1') self.swv_container.reparent(self.exp_section) self.dpv_container = self.dpv.builder.get_object('scrolledwindow1') self.dpv_container.reparent(self.exp_section) self.acv_container = self.acv.builder.get_object('scrolledwindow1') self.acv_container.reparent(self.exp_section) - self.pd_container = self.pd.builder.get_object('scrolledwindow1') - self.pd_container.reparent(self.exp_section) + self.pde_container = self.pde.builder.get_object('scrolledwindow1') + self.pde_container.reparent(self.exp_section) #fill adc_pot_box self.adc_pot_box = self.builder.get_object('gain_adc_box') @@ -136,30 +138,37 @@ class main: self.mainwindow.set_title("Dstat Interface 0.1") self.mainwindow.show_all() - ##hide unused experiment controls + # hide unused experiment controls #self.chronoamp_container.hide() self.lsv_container.hide() - self.cv_container.hide() + self.cve_container.hide() self.swv_container.hide() self.dpv_container.hide() self.acv_container.hide() - self.pd_container.hide() + self.pde_container.hide() self.expnumber = 0 - self.menu_dropbot_connect = self.builder.get_object('menu_dropbot_connect') - self.menu_dropbot_disconnect = self.builder.get_object('menu_dropbot_disconnect') + self.menu_dropbot_connect = self.builder.get_object( + 'menu_dropbot_connect') + self.menu_dropbot_disconnect = self.builder.get_object( + 'menu_dropbot_disconnect') self.dropbot_enabled = False self.dropbot_triggered = False def exp_param_show(self, selection): + """Changes parameter tab to selected experiment. + + Arguments: + selection -- integer index of experiment type + """ self.chronoamp_container.hide() self.lsv_container.hide() - self.cv_container.hide() + self.cve_container.hide() self.swv_container.hide() self.dpv_container.hide() self.acv_container.hide() - self.pd_container.hide() + self.pde_container.hide() self.statusbar.remove_all(self.error_context_id) @@ -168,7 +177,7 @@ class main: elif selection == 1: self.lsv_container.show() elif selection == 2: - self.cv_container.show() + self.cve_container.show() elif selection == 3: self.swv_container.show() elif selection == 4: @@ -176,27 +185,33 @@ class main: elif selection == 5: self.acv_container.show() elif selection == 6: - self.pd_container.show() + self.pde_container.show() else: - self.statusbar.push(self.error_context_id, "Experiment not yet implemented") + self.statusbar.push( + self.error_context_id, "Experiment not yet implemented") def on_window1_destroy(self, object, data=None): + """ Quit when main window closed.""" print "quit with cancel" gtk.main_quit() def on_gtk_quit_activate(self, menuitem, data=None): + """Quit when Quit selected from menu.""" print "quit from menu" gtk.main_quit() def on_gtk_about_activate(self, menuitem, data=None): + """Display the about window.""" print "help about selected" - self.response = self.aboutdialog.run() #waits for user to click close + self.response = self.aboutdialog.run() # waits for user to click close self.aboutdialog.hide() def on_expcombobox_changed(self, data=None): - self.exp_param_show(self.expcombobox.get_active()) + """Change the experiment window when experiment box changed.""" + self.exp_param_show(self.expcombobox.get_active) def on_serial_refresh_clicked(self, data=None): + """Refresh list of serial devices.""" self.serial_devices.refresh() self.serial_liststore.clear() @@ -204,21 +219,22 @@ class main: self.serial_liststore.append([i]) def on_pot_start_clicked(self, data=None): - - def exceptions(): #cleans up after errors + """Run currently visible experiment.""" + def exceptions(): + """ Cleans up after errors """ if self.dropbot_enabled == True: if self.dropbot_triggered == True: self.dropbot_triggered = False print "finallydone" self.microdrop.reply(microdrop.EXPFINISHED) - self.microdrop_proc = gobject.timeout_add(500, self.microdrop_listen) + self.microdrop_proc = gobject.timeout_add(500, + self.microdrop_listen) self.spinner.stop() self.startbutton.set_sensitive(True) self.stopbutton.set_sensitive(False) selection = self.expcombobox.get_active() parameters = {} - view_parameters = {} if self.adc_pot.buffer_toggle.get_active(): #True if box checked parameters['adc_buffer'] = "2" @@ -229,9 +245,12 @@ class main: pga_model = self.adc_pot.pga_combobox.get_model() gain_model = self.adc_pot.gain_combobox.get_model() - parameters['adc_rate'] = srate_model.get_value(self.adc_pot.srate_combobox.get_active_iter(), 2) #third column - parameters['adc_pga'] = pga_model.get_value(self.adc_pot.pga_combobox.get_active_iter(), 2) - parameters['gain'] = gain_model.get_value(self.adc_pot.gain_combobox.get_active_iter(), 2) + parameters['adc_rate'] = srate_model.get_value( + self.adc_pot.srate_combobox.get_active_iter(), 2) # third column + parameters['adc_pga'] = pga_model.get_value( + self.adc_pot.pga_combobox.get_active_iter(), 2) + parameters['gain'] = gain_model.get_value( + self.adc_pot.gain_combobox.get_active_iter(), 2) self.line = 0 self.lastline = 0 @@ -243,12 +262,15 @@ class main: self.statusbar.remove_all(self.error_context_id) try: - if selection == 0: #CA - parameters['potential'] = [int(r[0]) for r in self.chronoamp.model] - parameters['time'] = [int(r[1]) for r in self.chronoamp.model] + if selection == 0: # CA + parameters['potential'] = [int(r[0]) for r + in self.chronoamp.model] + parameters['time'] = [int(r[1]) for r + in self.chronoamp.model] if not parameters['potential']: - raise InputError(parameters['potential'],"Step table is empty") + raise InputError(parameters['potential'], + "Step table is empty") self.recv_p, self.send_p = multiprocessing.Pipe(duplex=True) self.current_exp = comm.chronoamp(parameters, self.send_p) @@ -261,15 +283,17 @@ class main: 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.send_p.close() #need to close this copy of connection object for EOF signal to work + self.current_exp.run_wrapper(self.serial_liststore.get_value( + self.serial_combobox.get_active_iter(), 0)) + + self.send_p.close() # need for EOF signal to work - self.plot_proc = gobject.timeout_add(200, self.experiment_running_plot) + self.plot_proc = gobject.timeout_add(200, + self.experiment_running_plot) gobject.idle_add(self.experiment_running) return - elif selection == 1: #LSV + elif selection == 1: # LSV parameters['clean_mV'] = int(self.lsv.clean_mV.get_text()) parameters['clean_s'] = int(self.lsv.clean_s.get_text()) parameters['dep_mV'] = int(self.lsv.dep_mV.get_text()) @@ -279,22 +303,32 @@ class main: parameters['slope'] = int(self.lsv.slope_entry.get_text()) #check parameters are within hardware limits - if (parameters['clean_mV'] > 1499 or parameters['clean_mV'] < -1500): - raise InputError(parameters['clean_mV'],"Clean potential exceeds hardware limits.") - if (parameters['dep_mV'] > 1499 or parameters['dep_mV'] < -1500): - raise InputError(parameters['dep_mV'],"Deposition potential exceeds hardware limits.") + if (parameters['clean_mV'] > 1499 or + parameters['clean_mV'] < -1500): + raise InputError(parameters['clean_mV'], + "Clean potential exceeds hardware limits.") + if (parameters['dep_mV'] > 1499 or + parameters['dep_mV'] < -1500): + raise InputError(parameters['dep_mV'], + "Deposition potential exceeds hardware limits.") if (parameters['clean_s'] < 0): - raise InputError(parameters['clean_s'],"Clean time cannot be negative.") + raise InputError(parameters['clean_s'], + "Clean time cannot be negative.") if (parameters['dep_s'] < 0): - raise InputError(parameters['dep_s'],"Deposition time cannot be negative.") + raise InputError(parameters['dep_s'], + "Deposition time cannot be negative.") if (parameters['start'] > 1499 or parameters['start'] < -1500): - raise InputError(parameters['start'],"Start parameter exceeds hardware limits.") + raise InputError(parameters['start'], + "Start parameter exceeds hardware limits.") if (parameters['stop'] > 1499 or parameters['stop'] < -1500): - raise InputError(parameters['stop'],"Stop parameter exceeds hardware limits.") + raise InputError(parameters['stop'], + "Stop parameter exceeds hardware limits.") if (parameters['slope'] > 2000 or parameters['slope'] < 1): - raise InputError(parameters['slope'],"Slope parameter exceeds hardware limits.") + raise InputError(parameters['slope'], + "Slope parameter exceeds hardware limits.") if parameters['start'] == parameters['stop']: - raise InputError(parameters['start'],"Start cannot equal Stop.") + raise InputError(parameters['start'], + "Start cannot equal Stop.") self.recv_p, self.send_p = multiprocessing.Pipe(duplex=True) self.current_exp = comm.lsv_exp(parameters, self.send_p) @@ -307,46 +341,61 @@ class main: 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_liststore.get_value( + self.serial_combobox.get_active_iter(), 0)) self.send_p.close() - self.plot_proc = gobject.timeout_add(200, self.experiment_running_plot) + self.plot_proc = gobject.timeout_add(200, + self.experiment_running_plot) gobject.idle_add(self.experiment_running) return - elif selection == 2: #CV - parameters['clean_mV'] = int(self.cv.clean_mV.get_text()) - parameters['clean_s'] = int(self.cv.clean_s.get_text()) - parameters['dep_mV'] = int(self.cv.dep_mV.get_text()) - parameters['dep_s'] = int(self.cv.dep_s.get_text()) - parameters['start'] = int(self.cv.start_entry.get_text()) - parameters['slope'] = int(self.cv.slope_entry.get_text()) - parameters['v1'] = int(self.cv.v1_entry.get_text()) - parameters['v2'] = int(self.cv.v2_entry.get_text()) - parameters['scans'] = int(self.cv.scans_entry.get_text()) + elif selection == 2: # CV + parameters['clean_mV'] = int(self.cve.clean_mV.get_text()) + parameters['clean_s'] = int(self.cve.clean_s.get_text()) + parameters['dep_mV'] = int(self.cve.dep_mV.get_text()) + parameters['dep_s'] = int(self.cve.dep_s.get_text()) + parameters['start'] = int(self.cve.start_entry.get_text()) + parameters['slope'] = int(self.cve.slope_entry.get_text()) + parameters['v1'] = int(self.cve.v1_entry.get_text()) + parameters['v2'] = int(self.cve.v2_entry.get_text()) + parameters['scans'] = int(self.cve.scans_entry.get_text()) - #check parameters are within hardware limits - if (parameters['clean_mV'] > 1499 or parameters['clean_mV'] < -1500): - raise InputError(parameters['clean_mV'],"Clean potential exceeds hardware limits.") - if (parameters['dep_mV'] > 1499 or parameters['dep_mV'] < -1500): - raise InputError(parameters['dep_mV'],"Deposition potential exceeds hardware limits.") + # check parameters are within hardware limits + if (parameters['clean_mV'] > 1499 or + parameters['clean_mV'] < -1500): + raise InputError(parameters['clean_mV'], + "Clean potential exceeds hardware limits.") + if (parameters['dep_mV'] > 1499 or + parameters['dep_mV'] < -1500): + raise InputError(parameters['dep_mV'], + "Deposition potential exceeds hardware limits.") if (parameters['clean_s'] < 0): - raise InputError(parameters['clean_s'],"Clean time cannot be negative.") + raise InputError(parameters['clean_s'], + "Clean time cannot be negative.") if (parameters['dep_s'] < 0): - raise InputError(parameters['dep_s'],"Deposition time cannot be negative.") + raise InputError(parameters['dep_s'], + "Deposition time cannot be negative.") if (parameters['start'] > 1499 or parameters['start'] < -1500): - raise InputError(parameters['start'],"Start parameter exceeds hardware limits.") + raise InputError(parameters['start'], + "Start parameter exceeds hardware limits.") if (parameters['slope'] > 2000 or parameters['slope'] < 1): - raise InputError(parameters['slope'],"Slope parameter exceeds hardware limits.") + raise InputError(parameters['slope'], + "Slope parameter exceeds hardware limits.") if (parameters['v1'] > 1499 or parameters['v1'] < -1500): - raise InputError(parameters['v1'],"Vertex 1 parameter exceeds hardware limits.") + raise InputError(parameters['v1'], + "Vertex 1 parameter exceeds hardware limits.") if (parameters['v2'] > 1499 or parameters['v2'] < -1500): - raise InputError(parameters['v2'],"Vertex 2 parameter exceeds hardware limits.") + raise InputError(parameters['v2'], + "Vertex 2 parameter exceeds hardware limits.") if (parameters['scans'] < 1 or parameters['scans'] > 255): - raise InputError(parameters['scans'], "Scans parameter outside limits.") + raise InputError(parameters['scans'], + "Scans parameter outside limits.") if parameters['v1'] == parameters['v2']: - raise InputError(parameters['v1'],"Vertex 1 cannot equal Vertex 2.") + raise InputError(parameters['v1'], + "Vertex 1 cannot equal Vertex 2.") self.recv_p, self.send_p = multiprocessing.Pipe(duplex=True) self.current_exp = comm.cv_exp(parameters, self.send_p) @@ -359,15 +408,18 @@ class main: 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_liststore.get_value( + self.serial_combobox.get_active_iter(), 0)) self.send_p.close() - self.plot_proc = gobject.timeout_add(200, self.experiment_running_plot) + self.plot_proc = gobject.timeout_add(200, + self.experiment_running_plot) gobject.idle_add(self.experiment_running) return - elif selection == 3: #SWV + elif selection == 3: # SWV parameters['clean_mV'] = int(self.swv.clean_mV.get_text()) parameters['clean_s'] = int(self.swv.clean_s.get_text()) parameters['dep_mV'] = int(self.swv.dep_mV.get_text()) @@ -381,31 +433,46 @@ class main: if self.swv.cyclic_checkbutton.get_active(): parameters['scans'] = int(self.swv.scans_entry.get_text()) if parameters['scans'] < 1: - raise InputError(parameters['scans'],"Must have at least one scan.") + raise InputError(parameters['scans'], + "Must have at least one scan.") else: parameters['scans'] = 0 - #check parameters are within hardware limits (doesn't check if pulse will go out of bounds, but instrument checks this (I think)) - if (parameters['clean_mV'] > 1499 or parameters['clean_mV'] < -1500): - raise InputError(parameters['clean_mV'],"Clean potential exceeds hardware limits.") - if (parameters['dep_mV'] > 1499 or parameters['dep_mV'] < -1500): - raise InputError(parameters['dep_mV'],"Deposition potential exceeds hardware limits.") + # check parameters are within hardware limits (doesn't + # check if pulse will go out of bounds, but instrument + # checks this (I think)) + if (parameters['clean_mV'] > 1499 or + parameters['clean_mV'] < -1500): + raise InputError(parameters['clean_mV'], + "Clean potential exceeds hardware limits.") + if (parameters['dep_mV'] > 1499 or + parameters['dep_mV'] < -1500): + raise InputError(parameters['dep_mV'], + "Deposition potential exceeds hardware limits.") if (parameters['clean_s'] < 0): - raise InputError(parameters['clean_s'],"Clean time cannot be negative.") + raise InputError(parameters['clean_s'], + "Clean time cannot be negative.") if (parameters['dep_s'] < 0): - raise InputError(parameters['dep_s'],"Deposition time cannot be negative.") + raise InputError(parameters['dep_s'], + "Deposition time cannot be negative.") if (parameters['start'] > 1499 or parameters['start'] < -1500): - raise InputError(parameters['start'],"Start parameter exceeds hardware limits.") + raise InputError(parameters['start'], + "Start parameter exceeds hardware limits.") if (parameters['step'] > 200 or parameters['step'] < 1): - raise InputError(parameters['step'],"Step height parameter exceeds hardware limits.") + raise InputError(parameters['step'], + "Step height parameter exceeds hardware limits.") if (parameters['stop'] > 1499 or parameters['stop'] < -1500): - raise InputError(parameters['stop'],"Stop parameter exceeds hardware limits.") + raise InputError(parameters['stop'], + "Stop parameter exceeds hardware limits.") if (parameters['pulse'] > 150 or parameters['pulse'] < 1): - raise InputError(parameters['pulse'],"Pulse height parameter exceeds hardware limits.") + raise InputError(parameters['pulse'], + "Pulse height parameter exceeds hardware limits.") if (parameters['freq'] < 1 or parameters['freq'] > 1000): - raise InputError(parameters['freq'], "Frequency parameter outside limits.") + raise InputError(parameters['freq'], + "Frequency parameter outside limits.") if parameters['start'] == parameters['stop']: - raise InputError(parameters['start'],"Start cannot equal Stop.") + raise InputError(parameters['start'], + "Start cannot equal Stop.") self.recv_p, self.send_p = multiprocessing.Pipe(duplex=True) self.current_exp = comm.swv_exp(parameters, self.send_p) @@ -418,15 +485,18 @@ class main: 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_liststore.get_value( + self.serial_combobox.get_active_iter(), 0)) self.send_p.close() - self.plot_proc = gobject.timeout_add(200, self.experiment_running_plot) + self.plot_proc = gobject.timeout_add(200, + self.experiment_running_plot) gobject.idle_add(self.experiment_running) return - elif selection == 4: #DPV + elif selection == 4: # DPV parameters['clean_mV'] = int(self.dpv.clean_mV.get_text()) parameters['clean_s'] = int(self.dpv.clean_s.get_text()) parameters['dep_mV'] = int(self.dpv.dep_mV.get_text()) @@ -438,31 +508,44 @@ class main: parameters['period'] = int(self.dpv.period_entry.get_text()) parameters['width'] = int(self.dpv.width_entry.get_text()) - #check parameters are within hardware limits (doesn't check if pulse will go out of bounds, but instrument checks this (I think)) - if (parameters['clean_mV'] > 1499 or parameters['clean_mV'] < -1500): - raise InputError(parameters['clean_mV'],"Clean potential exceeds hardware limits.") - if (parameters['dep_mV'] > 1499 or parameters['dep_mV'] < -1500): - raise InputError(parameters['dep_mV'],"Deposition potential exceeds hardware limits.") + if (parameters['clean_mV'] > 1499 or + parameters['clean_mV'] < -1500): + raise InputError(parameters['clean_mV'], + "Clean potential exceeds hardware limits.") + if (parameters['dep_mV'] > 1499 or + parameters['dep_mV'] < -1500): + raise InputError(parameters['dep_mV'], + "Deposition potential exceeds hardware limits.") if (parameters['clean_s'] < 0): - raise InputError(parameters['clean_s'],"Clean time cannot be negative.") + raise InputError(parameters['clean_s'], + "Clean time cannot be negative.") if (parameters['dep_s'] < 0): - raise InputError(parameters['dep_s'],"Deposition time cannot be negative.") + raise InputError(parameters['dep_s'], + "Deposition time cannot be negative.") if (parameters['start'] > 1499 or parameters['start'] < -1500): - raise InputError(parameters['start'],"Start parameter exceeds hardware limits.") + raise InputError(parameters['start'], + "Start parameter exceeds hardware limits.") if (parameters['step'] > 200 or parameters['step'] < 1): - raise InputError(parameters['step'],"Step height parameter exceeds hardware limits.") + raise InputError(parameters['step'], + "Step height parameter exceeds hardware limits.") if (parameters['stop'] > 1499 or parameters['stop'] < -1500): - raise InputError(parameters['stop'],"Stop parameter exceeds hardware limits.") + raise InputError(parameters['stop'], + "Stop parameter exceeds hardware limits.") if (parameters['pulse'] > 150 or parameters['pulse'] < 1): - raise InputError(parameters['pulse'],"Pulse height parameter exceeds hardware limits.") + raise InputError(parameters['pulse'], + "Pulse height parameter exceeds hardware limits.") if (parameters['period'] < 1 or parameters['period'] > 1000): - raise InputError(parameters['period'], "Period parameter outside limits.") + raise InputError(parameters['period'], + "Period parameter outside limits.") if (parameters['width'] < 1 or parameters['width'] > 1000): - raise InputError(parameters['width'], "Width parameter outside limits.") + raise InputError(parameters['width'], + "Width parameter outside limits.") if parameters['period'] <= parameters['width']: - raise InputError(parameters['width'],"Width must be less than period.") + raise InputError(parameters['width'], + "Width must be less than period.") if parameters['start'] == parameters['stop']: - raise InputError(parameters['start'],"Start cannot equal Stop.") + raise InputError(parameters['start'], + "Start cannot equal Stop.") self.recv_p, self.send_p = multiprocessing.Pipe(duplex=True) self.current_exp = comm.dpv_exp(parameters, self.send_p) @@ -475,47 +558,62 @@ class main: 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_liststore.get_value( + self.serial_combobox.get_active_iter(), 0)) self.send_p.close() - self.plot_proc = gobject.timeout_add(200, self.experiment_running_plot) + self.plot_proc = gobject.timeout_add(200, + self.experiment_running_plot) gobject.idle_add(self.experiment_running) return else: - self.statusbar.push(self.error_context_id, "Experiment not yet implemented.") + self.statusbar.push(self.error_context_id, + "Experiment not yet implemented.") exceptions() except ValueError: - self.statusbar.push(self.error_context_id, "Experiment parameters must be integers.") + self.statusbar.push(self.error_context_id, + "Experiment parameters must be integers.") exceptions() - except InputError as e: - self.statusbar.push(self.error_context_id, e.msg) + except InputError as err: + self.statusbar.push(self.error_context_id, err.msg) exceptions() except SerialException: - self.statusbar.push(self.error_context_id, "Could not establish serial connection.") + self.statusbar.push(self.error_context_id, + "Could not establish serial connection.") exceptions() - except AssertionError as e: - self.statusbar.push(self.error_context_id, str(e)) + except AssertionError as err: + self.statusbar.push(self.error_context_id, str(err)) exceptions() def experiment_running(self): + """Receive data from experiment process and add to current_exp.data. + Run in GTK main loop. + + Returns: + True -- when experiment is continuing to keep function in GTK's queue. + False -- when experiment process signals EOFError or IOError to remove + function from GTK's queue. + """ try: if self.recv_p.poll(): self.line, data = self.recv_p.recv() if self.line > self.lastdataline: - self.current_exp.data += [[],[]] + self.current_exp.data += [[], []] if len(data) > 2: - self.current_exp.data_extra += [[],[]] + self.current_exp.data_extra += [[], []] self.lastdataline = self.line for i in range(2): self.current_exp.data[2*self.line+i].append(data[i]) - if len(data) > 2: - self.current_exp.data_extra[2*self.line+i].append(data[i]) + if len(data) > 2: + self.current_exp.data_extra[2*self.line+i].append( + data[i]) else: time.sleep(.001) return True @@ -527,17 +625,25 @@ class main: return False def experiment_running_plot(self): + """Plot all data in current_exp.data. + Run in GTK main loop. Always returns True so must be manually + removed from GTK's queue. + """ if self.line > self.lastline: self.plot.addline() - self.plot.updateline(self.current_exp, self.lastline) #make sure all of last line is added + # make sure all of last line is added + self.plot.updateline(self.current_exp, self.lastline) self.lastline = self.line self.plot.updateline(self.current_exp, self.line) self.plot.redraw() return True def experiment_done(self): - gobject.source_remove(self.plot_proc) #stop automatic plot update - self.experiment_running_plot() #make sure all data updated on plot + """Clean up after data acquisition is complete. Update plot and + copy data to raw data tab. Saves data if autosave enabled. + """ + gobject.source_remove(self.plot_proc) # stop automatic plot update + self.experiment_running_plot() # make sure all data updated on plot self.databuffer.set_text("") self.databuffer.place_cursor(self.databuffer.get_start_iter()) @@ -557,8 +663,10 @@ class main: self.databuffer.insert_at_cursor("\n") if self.autosave_checkbox.get_active(): - save.autoSave(self.current_exp, self.autosavedir_button, self.autosavename.get_text(), self.expnumber) - save.autoPlot(self.plot, self.autosavedir_button, self.autosavename.get_text(), self.expnumber) + save.autoSave(self.current_exp, self.autosavedir_button, + self.autosavename.get_text(), self.expnumber) + save.autoPlot(self.plot, self.autosavedir_button, + self.autosavename.get_text(), self.expnumber) self.expnumber += 1 if self.dropbot_enabled == True: @@ -566,33 +674,40 @@ class main: self.dropbot_triggered = False print "expdone" self.microdrop.reply(microdrop.EXPFINISHED) - self.microdrop_proc = gobject.timeout_add(500, self.microdrop_listen) + self.microdrop_proc = gobject.timeout_add(500, + self.microdrop_listen) self.spinner.stop() self.startbutton.set_sensitive(True) self.stopbutton.set_sensitive(False) def on_pot_stop_clicked(self, data=None): + """Stop current experiment. Signals experiment process to stop.""" if self.recv_p: print "stop" self.recv_p.send('a') def on_file_save_exp_activate(self, menuitem, data=None): + """Activate dialogue to save current experiment data. """ if self.current_exp: save_inst = save.manSave(self.current_exp) def on_file_save_plot_activate(self, menuitem, data=None): + """Activate dialogue to save current plot.""" save_inst = save.plotSave(self.plot) def on_menu_dropbot_connect_activate(self, menuitem, data=None): + """Listen for remote control connection from µDrop.""" self.microdrop = microdrop.microdropConnection() self.dropbot_enabled = True self.menu_dropbot_connect.set_sensitive(False) self.menu_dropbot_disconnect.set_sensitive(True) - self.statusbar.push(self.message_context_id, "Waiting for µDrop to connect…") + self.statusbar.push(self.message_context_id, + "Waiting for µDrop to connect…") self.microdrop_proc = gobject.timeout_add(500, self.microdrop_listen) def on_menu_dropbot_disconnect_activate(self, menuitem, data= None): + """Disconnect µDrop connection and stop listening.""" gobject.source_remove(self.microdrop_proc) self.microdrop.reset() del self.microdrop @@ -601,6 +716,10 @@ class main: self.menu_dropbot_disconnect.set_sensitive(False) def microdrop_listen(self): + """Manage signals from µDrop. Handles initial handshake and + subsequent commands. Must be added to GTK's main loop to + run periodically. + """ drdy, data = self.microdrop.listen() if drdy == False: return True @@ -623,10 +742,8 @@ class main: return True - - if __name__ == "__main__": multiprocessing.freeze_support() gobject.threads_init() - main = main() + MAIN = Main() gtk.main() \ No newline at end of file -- GitLab