diff --git a/dstat_interface/dstat_comm.py b/dstat_interface/dstat_comm.py index 9f4d35358638d4ac1a06657fa540326225aecfb8..0e8469b73f40ec0539de0da8e45b9f40c0a36cb1 100755 --- a/dstat_interface/dstat_comm.py +++ b/dstat_interface/dstat_comm.py @@ -355,7 +355,7 @@ class Experiment(object): self.__gaintable = [1e2, 3e2, 3e3, 3e4, 3e5, 3e6, 3e7, 5e8] elif minor >= 2: self.__gaintable = [1, 1e2, 3e3, 3e4, 3e5, 3e6, 3e7, 1e8] - self.__gain_trim_table = [None, 'r100_trim', 'r3k_trim', + self.__gain_trim_table = ['r100_trim', 'r100_trim', 'r3k_trim', 'r30k_trim', 'r300k_trim', 'r3M_trim', 'r30M_trim', 'r100M_trim'] else: @@ -366,8 +366,11 @@ class Experiment(object): settings[self.__gain_trim_table[int(self.parameters['gain'])]][1]) self.commands = ["EA", "EG"] - - self.commands[0] += (self.parameters['adc_buffer']) + + if self.parameters['buffer_true']: + self.commands[0] += "2" + else: + self.commands[0] += "0" self.commands[0] += " " self.commands[0] += (self.parameters['adc_rate']) self.commands[0] += " " @@ -375,7 +378,7 @@ class Experiment(object): self.commands[0] += " " self.commands[1] += (self.parameters['gain']) self.commands[1] += " " - self.commands[1] += (self.parameters['re_short']) + self.commands[1] += (str(int(self.parameters['short_true']))) self.commands[1] += " " def run(self, ser, ctrl_pipe, data_pipe): diff --git a/dstat_interface/interface/adc_pot.py b/dstat_interface/interface/adc_pot.py index 904a61d718a3921c04c766b21b9c9f0dffbf1bf4..a48138deaac115475df3b96e7b7f30527cbdb246 100755 --- a/dstat_interface/interface/adc_pot.py +++ b/dstat_interface/interface/adc_pot.py @@ -20,6 +20,9 @@ import gtk +from errors import InputError, VarError, ErrorLogger +_logger = ErrorLogger(sender="dstat_adc_pot") + v1_1_gain = [(0, "100 Ω (15 mA FS)", 0), (1, "300 Ω (5 mA FS)", 1), (2, "3 kΩ (500 µA FS)", 2), @@ -75,7 +78,7 @@ class adc_pot(object): self.ui['gain_index'].add_attribute(self.cell, 'text', 1) self.ui['gain_index'].set_active(2) - self._params = None + self._params = {} @property def params(self): @@ -87,7 +90,27 @@ class adc_pot(object): """Updates self._params from UI.""" for i in self.ui: self._params[i] = self.ui[i].get_active() - + + srate_model = self.ui['srate_index'].get_model() + self._params['adc_rate'] = srate_model[self._params['srate_index']][2] + srate = srate_model[self._params['srate_index']][1] + + if srate.endswith("kHz"): + sample_rate = float(srate.rstrip(" kHz"))*1000 + else: + sample_rate = float(srate.rstrip(" Hz")) + + self._params['adc_rate_hz'] = sample_rate + + pga_model = self.ui['srate_index'].get_model() + self._params['adc_pga'] = pga_model[self._params['pga_index']][2] + + gain_model = self.ui['gain_index'].get_model() + self._params['gain'] = gain_model[self._params['gain_index']][2] + if self._params['gain_index'] not in range(len(gain_model)): + raise InputError(self._params['gain_index'], + "Select a potentiostat gain.") + @params.setter def params(self, params): if self._params is None: diff --git a/dstat_interface/interface/exp_window.py b/dstat_interface/interface/exp_window.py index 526c837c82f8aa456234206439d07ad810fd1c95..10fa69c5c9ba08ad73ea33022c597265bf3674cb 100755 --- a/dstat_interface/interface/exp_window.py +++ b/dstat_interface/interface/exp_window.py @@ -23,28 +23,33 @@ class Experiments: def __init__(self, builder): self.builder = builder + # (experiment index in UI, experiment) self.classes = {} - 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() - self.classes['pot'] = exp.POT() - self.classes['cal'] = exp.CAL() + self.classes['cae'] = (0, exp.Chronoamp()) + self.classes['lsv'] = (1, exp.LSV()) + self.classes['cve'] = (2, exp.CV()) + self.classes['swv'] = (3, exp.SWV()) + self.classes['dpv'] = (4, exp.DPV()) + self.classes['acv'] = (5, exp.ACV()) + self.classes['pde'] = (6, exp.PD()) + self.classes['pot'] = (7, exp.POT()) + self.classes['cal'] = (8, exp.CAL()) + + # Create reverse lookup + self.select_to_key = {} + for key, value in self.classes.iteritems(): + self.select_to_key[value[0]] = key #fill exp_section exp_section = self.builder.get_object('exp_section_box') self.containers = {} for key, cls in self.classes.iteritems(): - self.containers[key] = cls.builder.get_object('scrolledwindow1') + self.containers[key] = cls[1].builder.get_object('scrolledwindow1') for key in self.containers: self.containers[key].reparent(exp_section) self.containers[key].hide() - def set_exp(self, selection): """Changes parameter tab to selected experiment. Returns True if @@ -57,11 +62,12 @@ class Experiments: self.containers[key].hide() self.containers[selection].show() + self.selected_exp = selection return True def get_params(self, experiment): - return self.classes[experiment].params + return self.classes[experiment][1].params def set_params(self, experiment, parameters): - self.classes[experiment].params = parameters \ No newline at end of file + self.classes[experiment][1].params = parameters \ No newline at end of file diff --git a/dstat_interface/main.py b/dstat_interface/main.py index 5644083aeafcf85a5f54bedc9e1034d022dcefca..930fdc28e7176436be463911b191f3f94365c8c9 100755 --- a/dstat_interface/main.py +++ b/dstat_interface/main.py @@ -161,11 +161,14 @@ class Main(object): def on_window1_destroy(self, object, data=None): """ Quit when main window closed.""" - self.on_serial_disconnect_clicked() - gtk.main_quit() + self.quit() def on_gtk_quit_activate(self, menuitem, data=None): """Quit when Quit selected from menu.""" + self.quit() + + def quit(self): + """Disconnect and save parameters on quit.""" self.on_serial_disconnect_clicked() gtk.main_quit() @@ -429,58 +432,18 @@ class Main(object): # Make sure these are defined parameters['sync_true'] = False parameters['shutter_true'] = False - - if self.adc_pot.ui['buffer_true'].get_active(): # True if box checked - parameters['adc_buffer'] = "2" - else: - parameters['adc_buffer'] = "0" - - if self.adc_pot.ui['short_true'].get_active(): - parameters['re_short'] = "1" - else: - parameters['re_short'] = "0" - - srate_model = self.adc_pot.ui['srate_index'].get_model() - pga_model = self.adc_pot.ui['pga_index'].get_model() - gain_model = self.adc_pot.ui['gain_index'].get_model() - - parameters['adc_rate'] = srate_model.get_value( - self.adc_pot.ui['srate_index'].get_active_iter(), 2) # third column - - srate = srate_model.get_value( - self.adc_pot.ui['srate_index'].get_active_iter(), 1) - - if srate.endswith("kHz"): - sample_rate = float(srate.rstrip(" kHz"))*1000 - else: - sample_rate = float(srate.rstrip(" Hz")) - - parameters['adc_rate_hz'] = sample_rate - parameters['adc_pga'] = pga_model.get_value( - self.adc_pot.ui['pga_index'].get_active_iter(), 2) - try: - parameters['gain'] = gain_model.get_value( - self.adc_pot.ui['gain_index'].get_active_iter(), 2) - except TypeError as err: - print "TypeError" - _logger.error(err, "INFO") - self.statusbar.push(self.error_context_id, - "Select a potentiostat gain.") - exceptions() - return - - - self.line = 0 - self.lastline = 0 - self.lastdataline = 0 - - self.spinner.start() - self.startbutton.set_sensitive(False) - self.stopbutton.set_sensitive(True) - self.statusbar.remove_all(self.error_context_id) + parameters.update(self.adc_pot.params) + + self.line = 0 + self.lastline = 0 + self.lastdataline = 0 - try: + self.spinner.start() + self.startbutton.set_sensitive(False) + self.stopbutton.set_sensitive(True) + self.statusbar.remove_all(self.error_context_id) + if selection == 0: # CA # Add experiment parameters to existing parameters.update(self.exp_window.get_params('cae')) @@ -574,7 +537,7 @@ class Main(object): except KeyError as i: _logger.error("KeyError: %s" % i, "INFO") - self.statusbar.push(self.error_context_id, + self.statusbar.push(self.error_context_id, "Experiment parameters must be integers.") exceptions()