diff --git a/dstat-interface/dstat-interface/interface/acv.py b/dstat-interface/dstat-interface/interface/acv.py deleted file mode 100644 index 214af8345b8acbc345fc3bd2eb67be0a4e946565..0000000000000000000000000000000000000000 --- a/dstat-interface/dstat-interface/interface/acv.py +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env python - -import gtk - -class acv: - def __init__(self): - self.builder = gtk.Builder() - self.builder.add_from_file('interface/acv.glade') - self.builder.connect_signals(self) - - self.start_entry = self.builder.get_object('start_entry') - self.stop_entry = self.builder.get_object('stop_entry') - self.slope_entry = self.builder.get_object('slope_entry') - self.amplitude_entry = self.builder.get_object('amplitude_entry') - self.freq_entry = self.builder.get_object('freq_entry') \ No newline at end of file diff --git a/dstat-interface/dstat-interface/interface/chronoamp.py b/dstat-interface/dstat-interface/interface/chronoamp.py deleted file mode 100644 index 39e9136874b82493a4cc5d5e05638df3a3984c00..0000000000000000000000000000000000000000 --- a/dstat-interface/dstat-interface/interface/chronoamp.py +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/env python - -import gtk - -class Chronoamp: - def __init__(self): - self.builder = gtk.Builder() - self.builder.add_from_file('interface/chronoamp.glade') - self.builder.connect_signals(self) - - self.statusbar = self.builder.get_object('statusbar') - self.model = self.builder.get_object('ca_list') - self.treeview = self.builder.get_object('treeview') - self.cell_renderer = gtk.CellRendererText() - - self.treeview.insert_column_with_attributes(-1, "Time", - self.cell_renderer, text=1).set_expand(True) - self.treeview.insert_column_with_attributes(-1, "Potential", - self.cell_renderer, text=0).set_expand(True) - - self.selection = self.treeview.get_selection() - self.selection.set_mode(gtk.SELECTION_MULTIPLE) - - def on_add_button_clicked(self, widget): - """Add current values in potential_entry and time_entry to model.""" - - self.statusbar.remove_all(0) - - try: - potential = int( - self.builder.get_object('potential_entry').get_text()) - time = int(self.builder.get_object('time_entry').get_text()) - - if (potential > 1499 or potential < -1500): - raise ValueError("Potential out of range") - if (time < 1 or time > 65535): - raise ValueError("Time out of range") - - self.model.append([potential, time]) - - except ValueError as err: - self.statusbar.push(0, str(err)) - except TypeError as err: - self.statusbar.push(0, str(err)) - - def on_remove_button_clicked(self, widget): - """Remove currently selected items from model.""" - # returns 2-tuple: treemodel, list of paths of selected rows - selected_rows = list(self.selection.get_selected_rows()[1]) - referencelist = [] - - for i in selected_rows: - referencelist.append(gtk.TreeRowReference(self.model, i)) - - for i in referencelist: - self.model.remove(self.model.get_iter(i.get_path())) - - def get_params(self): - """Returns a dict of parameters for experiment.""" - parameters = {} - parameters['potential'] = [int(r[0]) for r in self.model] - parameters['time'] = [int(r[1]) for r in self.model] - - return parameters \ No newline at end of file diff --git a/dstat-interface/dstat-interface/interface/cv.py b/dstat-interface/dstat-interface/interface/cv.py deleted file mode 100644 index 0aadf29d6e6f46e12793d5916514600dc9448da7..0000000000000000000000000000000000000000 --- a/dstat-interface/dstat-interface/interface/cv.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env python - -import gtk - -class cv: - def __init__(self): - self.builder = gtk.Builder() - self.builder.add_from_file('interface/cv.glade') - self.builder.connect_signals(self) - - self.clean_mV = self.builder.get_object('clean_mV') - self.clean_s = self.builder.get_object('clean_s') - self.dep_mV = self.builder.get_object('dep_mV') - self.dep_s = self.builder.get_object('dep_s') - self.start_entry = self.builder.get_object('start_entry') - self.v1_entry = self.builder.get_object('v1_entry') - self.v2_entry = self.builder.get_object('v2_entry') - self.slope_entry = self.builder.get_object('slope_entry') - self.scans_entry = self.builder.get_object('scans_entry') \ No newline at end of file diff --git a/dstat-interface/dstat-interface/interface/dpv.py b/dstat-interface/dstat-interface/interface/dpv.py deleted file mode 100644 index deb81bf8c73c2f45f02a9264c3088fbcec6c069a..0000000000000000000000000000000000000000 --- a/dstat-interface/dstat-interface/interface/dpv.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env python - -import gtk - -class dpv: - def __init__(self): - self.builder = gtk.Builder() - self.builder.add_from_file('interface/dpv.glade') - self.builder.connect_signals(self) - - self.clean_mV = self.builder.get_object('clean_mV') - self.clean_s = self.builder.get_object('clean_s') - self.dep_mV = self.builder.get_object('dep_mV') - self.dep_s = self.builder.get_object('dep_s') - self.start_entry = self.builder.get_object('start_entry') - self.stop_entry = self.builder.get_object('stop_entry') - self.step_entry = self.builder.get_object('step_entry') - self.pulse_entry = self.builder.get_object('pulse_entry') - self.period_entry = self.builder.get_object('period_entry') - self.width_entry = self.builder.get_object('width_entry') \ No newline at end of file diff --git a/dstat-interface/dstat-interface/interface/exp_int.py b/dstat-interface/dstat-interface/interface/exp_int.py new file mode 100644 index 0000000000000000000000000000000000000000..8208eeb7d7cba6127dc71e8daac54065aaf25c4a --- /dev/null +++ b/dstat-interface/dstat-interface/interface/exp_int.py @@ -0,0 +1,187 @@ +#!/usr/bin/env python + +import gtk + +class ExpInterface(object): + """Generic experiment interface class. Should be subclassed to implement + experiment interfaces by populating self.entry. + + Public methods: + get_params(self) + """ + def __init__(self, glade_path): + self.builder = gtk.Builder() + self.builder.add_from_file(glade_path) + self.builder.connect_signals(self) + self.entry = {} + + def get_params(self): + """Returns a dict of parameters for experiment.""" + parameters = {} + for key, value in self.entry.iteritems(): + parameters[key] = int(value.get_text()) + return parameters + +class Chronoamp(ExpInterface): + """Experiment class for chronoamperometry. Extends ExpInterface class to + support treeview neeeded for CA. + + Public methods: + on_add_button_clicked(self, widget) + on_remove_button_clicked(self, widget) + get_params(self) + """ + def __init__(self): + """Extends superclass method to support treeview.""" + super(Chronoamp, self).__init__('interface/chronoamp.glade') + + self.statusbar = self.builder.get_object('statusbar') + self.model = self.builder.get_object('ca_list') + self.treeview = self.builder.get_object('treeview') + self.cell_renderer = gtk.CellRendererText() + + self.treeview.insert_column_with_attributes(-1, "Time", + self.cell_renderer, text=1).set_expand(True) + self.treeview.insert_column_with_attributes(-1, "Potential", + self.cell_renderer, text=0).set_expand(True) + + self.selection = self.treeview.get_selection() + self.selection.set_mode(gtk.SELECTION_MULTIPLE) + + def on_add_button_clicked(self, widget): + """Add current values in potential_entry and time_entry to model.""" + + self.statusbar.remove_all(0) + + try: + potential = int( + self.builder.get_object('potential_entry').get_text()) + time = int(self.builder.get_object('time_entry').get_text()) + + if (potential > 1499 or potential < -1500): + raise ValueError("Potential out of range") + if (time < 1 or time > 65535): + raise ValueError("Time out of range") + + self.model.append([potential, time]) + + except ValueError as err: + self.statusbar.push(0, str(err)) + except TypeError as err: + self.statusbar.push(0, str(err)) + + def on_remove_button_clicked(self, widget): + """Remove currently selected items from model.""" + # returns 2-tuple: treemodel, list of paths of selected rows + selected_rows = list(self.selection.get_selected_rows()[1]) + referencelist = [] + + for i in selected_rows: + referencelist.append(gtk.TreeRowReference(self.model, i)) + + for i in referencelist: + self.model.remove(self.model.get_iter(i.get_path())) + + def get_params(self): + """Returns a dict of parameters for experiment. Overrides superclass + method. + """ + parameters = {} + parameters['potential'] = [int(r[0]) for r in self.model] + parameters['time'] = [int(r[1]) for r in self.model] + + return parameters + +class LSV(ExpInterface): + """Experiment class for LSV.""" + def __init__(self): + """Adds entry listings to superclass's self.entry dict""" + super(LSV, self).__init__('interface/lsv.glade') + + self.entry['clean_mV'] = self.builder.get_object('clean_mV') + self.entry['clean_s'] = self.builder.get_object('clean_s') + self.entry['dep_mV'] = self.builder.get_object('dep_mV') + self.entry['dep_s'] = self.builder.get_object('dep_s') + self.entry['start'] = self.builder.get_object('start_entry') + self.entry['stop'] = self.builder.get_object('stop_entry') + self.entry['slope'] = self.builder.get_object('slope_entry') + +class CV(ExpInterface): + """Experiment class for CV.""" + def __init__(self): + """Adds entry listings to superclass's self.entry dict""" + super(CV, self).__init__('interface/cv.glade') + + self.entry['clean_mV'] = self.builder.get_object('clean_mV') + self.entry['clean_s'] = self.builder.get_object('clean_s') + self.entry['dep_mV'] = self.builder.get_object('dep_mV') + self.entry['dep_s'] = self.builder.get_object('dep_s') + self.entry['start'] = self.builder.get_object('start_entry') + self.entry['v1'] = self.builder.get_object('v1_entry') + self.entry['v2'] = self.builder.get_object('v2_entry') + self.entry['slope'] = self.builder.get_object('slope_entry') + self.entry['scans'] = self.builder.get_object('scans_entry') + +class SWV(ExpInterface): + """Experiment class for SWV.""" + def __init__(self): + """Adds entry listings to superclass's self.entry dict""" + super(SWV, self).__init__('interface/swv.glade') + + self.entry['clean_mV'] = self.builder.get_object('clean_mV') + self.entry['clean_s'] = self.builder.get_object('clean_s') + self.entry['dep_mV'] = self.builder.get_object('dep_mV') + self.entry['dep_s'] = self.builder.get_object('dep_s') + self.entry['start'] = self.builder.get_object('start_entry') + self.entry['stop'] = self.builder.get_object('stop_entry') + self.entry['step'] = self.builder.get_object('step_entry') + self.entry['pulse'] = self.builder.get_object('pulse_entry') + self.entry['freq'] = self.builder.get_object('freq_entry') + self.entry['scans'] = self.builder.get_object('scans_entry') + + def get_params(self): + """Extends superclass method to pass status of cyclic_checkbutton""" + parameters = {} + parameters['cyclic_checkbutton'] = self.builder.get_object( + 'cyclic_checkbutton').get_active() + parameters.update(super(SWV, self).get_params()) + + return parameters + +class DPV(ExpInterface): + """Experiment class for DPV.""" + def __init__(self): + """Adds entry listings to superclass's self.entry dict""" + super(DPV, self).__init__('interface/dpv.glade') + + self.entry['clean_mV'] = self.builder.get_object('clean_mV') + self.entry['clean_s'] = self.builder.get_object('clean_s') + self.entry['dep_mV'] = self.builder.get_object('dep_mV') + self.entry['dep_s'] = self.builder.get_object('dep_s') + self.entry['start'] = self.builder.get_object('start_entry') + self.entry['stop'] = self.builder.get_object('stop_entry') + self.entry['step'] = self.builder.get_object('step_entry') + self.entry['pulse'] = self.builder.get_object('pulse_entry') + self.entry['period'] = self.builder.get_object('period_entry') + self.entry['width'] = self.builder.get_object('width_entry') + +class ACV(ExpInterface): + """Experiment class for ACV.""" + def __init__(self): + """Adds entry listings to superclass's self.entry dict""" + super(ACV, self).__init__('interface/acv.glade') + + self.entry['start'] = self.builder.get_object('start_entry') + self.entry['stop'] = self.builder.get_object('stop_entry') + self.entry['slope'] = self.builder.get_object('slope_entry') + self.entry['amplitude'] = self.builder.get_object('amplitude_entry') + self.entry['freq'] = self.builder.get_object('freq_entry') + +class PD(ExpInterface): + """Experiment class for PD.""" + def __init__(self): + """Adds entry listings to superclass's self.entry dict""" + super(PD, self).__init__('interface/pd.glade') + + self.entry['voltage'] = self.builder.get_object('voltage_entry') + self.entry['time'] = self.builder.get_object('time_entry') \ No newline at end of file diff --git a/dstat-interface/dstat-interface/interface/exp_window.py b/dstat-interface/dstat-interface/interface/exp_window.py index 34e3ca9b1319a8421e73cf49adee3d46acaaf3db..6038229e29453b7e3352317ba3621d15c8ad21bd 100644 --- a/dstat-interface/dstat-interface/interface/exp_window.py +++ b/dstat-interface/dstat-interface/interface/exp_window.py @@ -1,23 +1,17 @@ -import chronoamp -import lsv -import cv -import swv -import dpv -import acv -import pd +import interface.exp_int as exp class Experiments: def __init__(self, builder): self.builder = builder self.classes = {} - self.classes['cae'] = chronoamp.Chronoamp() - self.classes['lsv'] = lsv.lsv() - self.classes['cve'] = cv.cv() - self.classes['swv'] = swv.swv() - self.classes['dpv'] = dpv.dpv() - self.classes['acv'] = acv.acv() - self.classes['pde'] = pd.pd() + self.classes['cae'] = exp.Chronoamp() + self.classes['lsv'] = exp.LSV() + self.classes['cve'] = exp.CV() + self.classes['swv'] = exp.SWV() + self.classes['dpv'] = exp.DPV() + self.classes['acv'] = exp.ACV() + self.classes['pde'] = exp.PD() #fill exp_section exp_section = self.builder.get_object('exp_section_box') diff --git a/dstat-interface/dstat-interface/interface/lsv.py b/dstat-interface/dstat-interface/interface/lsv.py deleted file mode 100644 index 990ca640c8c4471d4bae47205d79302bb72c7000..0000000000000000000000000000000000000000 --- a/dstat-interface/dstat-interface/interface/lsv.py +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env python - -import gtk - -class lsv: - def __init__(self): - self.builder = gtk.Builder() - self.builder.add_from_file('interface/lsv.glade') - self.builder.connect_signals(self) - - - self.clean_mV = self.builder.get_object('clean_mV') - self.clean_s = self.builder.get_object('clean_s') - self.dep_mV = self.builder.get_object('dep_mV') - self.dep_s = self.builder.get_object('dep_s') - self.start_entry = self.builder.get_object('start_entry') - self.stop_entry = self.builder.get_object('stop_entry') - self.slope_entry = self.builder.get_object('slope_entry') \ No newline at end of file diff --git a/dstat-interface/dstat-interface/interface/pd.py b/dstat-interface/dstat-interface/interface/pd.py deleted file mode 100644 index bd6652d821b15e513ef6eafb9ddf6c1fabd91d2b..0000000000000000000000000000000000000000 --- a/dstat-interface/dstat-interface/interface/pd.py +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env python - -import gtk - -class pd: - def __init__(self): - self.builder = gtk.Builder() - self.builder.add_from_file('interface/pd.glade') - self.builder.connect_signals(self) - - self.voltage_entry = self.builder.get_object('voltage_entry') - self.time_entry = self.builder.get_object('time_entry') \ No newline at end of file diff --git a/dstat-interface/dstat-interface/interface/swv.py b/dstat-interface/dstat-interface/interface/swv.py deleted file mode 100644 index a78c44b9ec1cd518c23a5b9c14417a68d492daec..0000000000000000000000000000000000000000 --- a/dstat-interface/dstat-interface/interface/swv.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env python - -import gtk - -class swv: - def __init__(self): - self.builder = gtk.Builder() - self.builder.add_from_file('interface/swv.glade') - self.builder.connect_signals(self) - - self.clean_mV = self.builder.get_object('clean_mV') - self.clean_s = self.builder.get_object('clean_s') - self.dep_mV = self.builder.get_object('dep_mV') - self.dep_s = self.builder.get_object('dep_s') - self.start_entry = self.builder.get_object('start_entry') - self.stop_entry = self.builder.get_object('stop_entry') - self.step_entry = self.builder.get_object('step_entry') - self.pulse_entry = self.builder.get_object('pulse_entry') - self.freq_entry = self.builder.get_object('freq_entry') - self.cyclic_checkbutton = self.builder.get_object('cyclic_checkbutton') - self.scans_entry = self.builder.get_object('scans_entry') \ No newline at end of file diff --git a/dstat-interface/dstat-interface/main.py b/dstat-interface/dstat-interface/main.py index c8c98429974a1d058446516b8d68ade1b6d8831d..f54dbf8e4cefe9f9bd37811155954a53a37c435c 100644 --- a/dstat-interface/dstat-interface/main.py +++ b/dstat-interface/dstat-interface/main.py @@ -226,13 +226,7 @@ class Main(object): return 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()) - parameters['dep_s'] = int(self.lsv.dep_s.get_text()) - parameters['start'] = int(self.lsv.start_entry.get_text()) - parameters['stop'] = int(self.lsv.stop_entry.get_text()) - parameters['slope'] = int(self.lsv.slope_entry.get_text()) + parameters.update(self.exp_window.get_params('lsv')) #check parameters are within hardware limits if (parameters['clean_mV'] > 1499 or @@ -285,15 +279,7 @@ class Main(object): return 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()) + parameters.update(self.exp_window.get_params('cve')) # check parameters are within hardware limits if (parameters['clean_mV'] > 1499 or @@ -352,18 +338,9 @@ class Main(object): return 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()) - parameters['dep_s'] = int(self.swv.dep_s.get_text()) - parameters['start'] = int(self.swv.start_entry.get_text()) - parameters['stop'] = int(self.swv.stop_entry.get_text()) - parameters['step'] = int(self.swv.step_entry.get_text()) - parameters['pulse'] = int(self.swv.pulse_entry.get_text()) - parameters['freq'] = int(self.swv.freq_entry.get_text()) + parameters.update(self.exp_window.get_params('swv')) - if self.swv.cyclic_checkbutton.get_active(): - parameters['scans'] = int(self.swv.scans_entry.get_text()) + if parameters['cyclic_checkbutton'] : if parameters['scans'] < 1: raise InputError(parameters['scans'], "Must have at least one scan.") @@ -429,16 +406,7 @@ class Main(object): return 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()) - parameters['dep_s'] = int(self.dpv.dep_s.get_text()) - parameters['start'] = int(self.dpv.start_entry.get_text()) - parameters['stop'] = int(self.dpv.stop_entry.get_text()) - parameters['step'] = int(self.dpv.step_entry.get_text()) - parameters['pulse'] = int(self.dpv.pulse_entry.get_text()) - parameters['period'] = int(self.dpv.period_entry.get_text()) - parameters['width'] = int(self.dpv.width_entry.get_text()) + parameters.update(self.exp_window.get_params('dpv')) if (parameters['clean_mV'] > 1499 or parameters['clean_mV'] < -1500):