Skip to content
Snippets Groups Projects
Commit 1a3d2baa authored by Michael DM Dryden's avatar Michael DM Dryden
Browse files

Finished controls and handlers for CA, LSV, CV, and SWV

parent 5413c106
Branches
Tags
No related merge requests found
Showing with 1826 additions and 18 deletions
#!/usr/bin/env python
def lsv_exp(adc_buffer, adc_rate, adc_pga, gain, start, stop, slope):
s = "L "
def chronoamp(adc_buffer, adc_rate, adc_pga, gain, potential, time):
s = "A "
s += (adc_buffer)
s += " "
s += (adc_rate)
s += " "
s += (adc_pga)
s += " "
s += " G "
s += (gain)
s += " R "
s += str(len(potential))
s += " "
for i in potential:
s += str(i)
s += " "
for i in time:
s += str (i)
s += " "
print s
def lsv_exp(adc_buffer, adc_rate, adc_pga, gain, start, stop, slope):
s = "A "
s += (adc_buffer)
s += " "
s += (adc_rate)
s += " "
s += (adc_pga)
s += " G "
s += (gain)
s += " L "
s += str(start)
s += " "
s += str(stop)
s += " "
s += str(slope)
print s
# print ("L ", adc_buffer, adc_rate, adc_pga, gain, start, stop, slope)
\ No newline at end of file
# print ("L ", adc_buffer, adc_rate, adc_pga, gain, start, stop, slope)
def cv_exp(adc_buffer, adc_rate, adc_pga, gain, start, v1, v2, scans, slope):
s = "A "
s += (adc_buffer)
s += " "
s += (adc_rate)
s += " "
s += (adc_pga)
s += " G "
s += (gain)
s += " C "
s += str(start)
s += " "
s += str(v1)
s += " "
s += str(v2)
s += " "
s += str(scans)
s += " "
s += str(slope)
print s
def swv_exp(adc_buffer, adc_rate, adc_pga, gain, start, stop, step, pulse, freq):
s = "A "
s += (adc_buffer)
s += " "
s += (adc_rate)
s += " "
s += (adc_pga)
s += " G "
s += (gain)
s += " S "
s += str(start)
s += " "
s += str(stop)
s += " "
s += str(step)
s += " "
s += str(pulse)
s += " "
s += str(freq)
print s
\ No newline at end of file
This diff is collapsed.
#!/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
......@@ -2,10 +2,8 @@
<interface>
<requires lib="gtk+" version="2.24"/>
<!-- interface-naming-policy project-wide -->
<object class="GtkListStore" id="ca list">
<object class="GtkListStore" id="ca_list">
<columns>
<!-- column-name index -->
<column type="guint"/>
<!-- column-name millivolts -->
<column type="gint"/>
<!-- column-name seconds -->
......@@ -110,6 +108,7 @@
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
<signal name="clicked" handler="on_add_button_clicked" swapped="no"/>
</object>
<packing>
<property name="top_attach">2</property>
......@@ -123,6 +122,7 @@
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
<signal name="clicked" handler="on_remove_button_clicked" swapped="no"/>
</object>
<packing>
<property name="left_attach">1</property>
......@@ -140,18 +140,42 @@
</packing>
</child>
<child>
<object class="GtkScrolledWindow" id="scrolledwindow2">
<object class="GtkVBox" id="vbox2">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<property name="can_focus">False</property>
<child>
<object class="GtkTreeView" id="treeview1">
<object class="GtkTreeView" id="treeview">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="model">ca list</property>
<property name="model">ca_list</property>
<property name="headers_clickable">False</property>
<property name="reorderable">True</property>
<property name="rules_hint">True</property>
<property name="enable_search">False</property>
<property name="search_column">0</property>
<property name="fixed_height_mode">True</property>
<property name="show_expanders">False</property>
<property name="rubber_banding">True</property>
<property name="enable_grid_lines">both</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkStatusbar" id="statusbar">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">2</property>
<property name="has_resize_grip">False</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
......
......@@ -3,8 +3,56 @@
import gtk
class chronoamp:
def label_set_func(self, tree_column, cell, model, iter):
info = model.get_value(iter, 1)
cell.set_property("text", info)
def __init__(self):
self.builder = gtk.Builder()
self.builder.add_from_file('interface/chronoamp.glade')
self.builder.connect_signals(self)
self.cell = gtk.CellRendererText()
\ No newline at end of file
self.statusbar = self.builder.get_object('statusbar')
self.potential = self.builder.get_object('potential_entry')
self.time = self.builder.get_object('time_entry')
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.treeviewselection = self.treeview.get_selection()
self.treeviewselection.set_mode(gtk.SELECTION_MULTIPLE)
def on_add_button_clicked(self, widget):
self.statusbar.remove_all(0)
try:
potential = int(self.potential.get_text())
time = int(self.time.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 e:
self.statusbar.push(0, str(e))
except TypeError as e:
self.statusbar.push(0, str(e))
def on_remove_button_clicked(self, widget):
self.selected_rows = list(self.treeviewselection.get_selected_rows()[1]) #returns 2-tuple: treemodel, list of paths selected rows
self.referencelist = []
for i in self.selected_rows:
x=gtk.TreeRowReference(self.model, i)
self.referencelist.append(x)
for i in self.referencelist:
self.model.remove(self.model.get_iter(i.get_path()))
......@@ -7,3 +7,9 @@ class cv:
self.builder = gtk.Builder()
self.builder.add_from_file('interface/cv.glade')
self.builder.connect_signals(self)
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
This diff is collapsed.
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="2.24"/>
<!-- interface-naming-policy project-wide -->
<object class="GtkWindow" id="window1">
<property name="can_focus">False</property>
<child>
<object class="GtkScrolledWindow" id="scrolledwindow1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">automatic</property>
<property name="vscrollbar_policy">automatic</property>
<child>
<object class="GtkViewport" id="viewport1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkTable" id="table1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="n_rows">2</property>
<property name="n_columns">2</property>
<property name="homogeneous">True</property>
<child>
<object class="GtkEntry" id="voltage_entry">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="invisible_char"></property>
<property name="width_chars">8</property>
<property name="text" translatable="yes">0</property>
<property name="xalign">1</property>
<property name="invisible_char_set">True</property>
<property name="primary_icon_activatable">False</property>
<property name="secondary_icon_activatable">False</property>
<property name="primary_icon_sensitive">True</property>
<property name="secondary_icon_sensitive">True</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="x_options"/>
<property name="y_options">GTK_FILL</property>
<property name="y_padding">3</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="time_entry">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="invisible_char"></property>
<property name="width_chars">8</property>
<property name="text" translatable="yes">0</property>
<property name="xalign">1</property>
<property name="invisible_char_set">True</property>
<property name="primary_icon_activatable">False</property>
<property name="secondary_icon_activatable">False</property>
<property name="primary_icon_sensitive">True</property>
<property name="secondary_icon_sensitive">True</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="x_options"/>
<property name="y_options">GTK_FILL</property>
<property name="y_padding">3</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label8">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Bias Voltage (mV)</property>
</object>
<packing>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Measurement Time (s)</property>
</object>
<packing>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label13">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xpad">20</property>
<property name="ypad">20</property>
<property name="label" translatable="yes">Experiment not yet implemented</property>
<attributes>
<attribute name="weight" value="bold"/>
</attributes>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</interface>
#!/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
This diff is collapsed.
#!/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.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')
\ No newline at end of file
......@@ -16,6 +16,9 @@ import interface.adc_pot as adc_pot
import interface.chronoamp as chronoamp
import interface.lsv as lsv
import interface.cv as cv
import interface.swv as swv
import interface.acv as acv
import interface.pd as pd
import dstat_comm as comm
class Error(Exception):
......@@ -49,6 +52,9 @@ class main:
self.chronoamp = chronoamp.chronoamp()
self.lsv = lsv.lsv()
self.cv = cv.cv()
self.swv = swv.swv()
self.acv = acv.acv()
self.pd = pd.pd()
self.error_context_id = self.statusbar.get_context_id("error")
......@@ -60,6 +66,12 @@ class main:
self.lsv_container.reparent(self.exp_section)
self.cv_container = self.cv.builder.get_object('scrolledwindow1')
self.cv_container.reparent(self.exp_section)
self.swv_container = self.swv.builder.get_object('scrolledwindow1')
self.swv_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)
#fill adc_pot_box
self.adc_pot_box = self.builder.get_object('gain_adc_box')
......@@ -71,18 +83,29 @@ class main:
self.expcombobox.pack_start(self.cell, True)
self.expcombobox.add_attribute(self.cell, 'text', 1)
self.expcombobox.set_active(0)
self.spinner = self.builder.get_object('spinner')
self.mainwindow = self.builder.get_object('window1')
self.mainwindow.set_title("Dstat Interface 0.1")
self.mainwindow.show_all()
# self.chronoamp_container.hide()
#hide unused experiment controls
#self.chronoamp_container.hide()
self.lsv_container.hide()
self.cv_container.hide()
self.swv_container.hide()
self.acv_container.hide()
self.pd_container.hide()
def exp_param_show(self, selection):
self.chronoamp_container.hide()
self.lsv_container.hide()
self.cv_container.hide()
self.swv_container.hide()
self.acv_container.hide()
self.pd_container.hide()
self.statusbar.remove_all(self.error_context_id)
......@@ -92,6 +115,12 @@ class main:
self.lsv_container.show()
elif selection == 2:
self.cv_container.show()
elif selection == 3:
self.swv_container.show()
elif selection == 4:
self.acv_container.show()
elif selection == 5:
self.pd_container.show()
else:
self.statusbar.push(self.error_context_id, "Experiment not yet implemented")
......@@ -116,7 +145,29 @@ class main:
selection = self.expcombobox.get_active()
if selection == 0: #CA
pass
if self.adc_pot.buffer_toggle.get_active(): #True if box checked
adc_buffer = "0x2"
else:
adc_buffer = "0x0"
self.srate_model = self.adc_pot.srate_combobox.get_model()
self.pga_model = self.adc_pot.pga_combobox.get_model()
self.gain_model = self.adc_pot.gain_combobox.get_model()
adc_rate = self.srate_model.get_value(self.adc_pot.srate_combobox.get_active_iter(), 2) #third column
adc_pga = self.pga_model.get_value(self.adc_pot.pga_combobox.get_active_iter(), 2)
gain = self.gain_model.get_value(self.adc_pot.gain_combobox.get_active_iter(), 2)
try:
potential = [int(r[0]) for r in self.chronoamp.model]
time = [int(r[1]) for r in self.chronoamp.model]
except ValueError:
self.statusbar.push(self.error_context_id, "Experiment parameters must be integers.")
except InputError as e:
self.statusbar.push(self.error_context_id, e.msg)
comm.chronoamp(adc_buffer, adc_rate, adc_pga, gain, potential, time)
elif selection == 1: #LSV
if self.adc_pot.buffer_toggle.get_active(): #True if box checked
adc_buffer = "0x2"
......@@ -155,9 +206,95 @@ class main:
self.statusbar.push(self.error_context_id, e.msg)
elif selection == 2: #CV
pass
if self.adc_pot.buffer_toggle.get_active(): #True if box checked
adc_buffer = "0x2"
else:
adc_buffer = "0x0"
#get liststores for comboboxes
self.srate_model = self.adc_pot.srate_combobox.get_model()
self.pga_model = self.adc_pot.pga_combobox.get_model()
self.gain_model = self.adc_pot.gain_combobox.get_model()
adc_rate = self.srate_model.get_value(self.adc_pot.srate_combobox.get_active_iter(), 2) #third column
adc_pga = self.pga_model.get_value(self.adc_pot.pga_combobox.get_active_iter(), 2)
gain = self.gain_model.get_value(self.adc_pot.gain_combobox.get_active_iter(), 2)
try:
self.statusbar.remove_all(self.error_context_id) #clear statusbar
start = int(self.cv.start_entry.get_text())
slope = int(self.cv.slope_entry.get_text())
v1 = int(self.cv.v1_entry.get_text())
v2 = int(self.cv.v2_entry.get_text())
scans = int(self.cv.scans_entry.get_text())
#check parameters are within hardware limits
if (start > 1499 or start < -1500):
raise InputError(start,"Start parameter exceeds hardware limits.")
if (slope > 2000 or slope < 1):
raise InputError(slope,"Slope parameter exceeds hardware limits.")
if (v1 > 1499 or v1 < -1500):
raise InputError(v1,"Vertex 1 parameter exceeds hardware limits.")
if (v2 > 1499 or v2 < -1500):
raise InputError(v2,"Vertex 2 parameter exceeds hardware limits.")
if (scans < 1 or scans > 255):
raise InputError(scans, "Scans parameter outside limits.")
if v1 == v2:
raise InputError(start,"Vertex 1 cannot equal Vertex 2.")
comm.cv_exp(adc_buffer, adc_rate, adc_pga, gain, start, v1, v2, scans, slope)
except ValueError:
self.statusbar.push(self.error_context_id, "Experiment parameters must be integers.")
except InputError as e:
self.statusbar.push(self.error_context_id, e.msg)
elif selection == 3: #SWV
if self.adc_pot.buffer_toggle.get_active(): #True if box checked
adc_buffer = "0x2"
else:
adc_buffer = "0x0"
#get liststores for comboboxes
self.srate_model = self.adc_pot.srate_combobox.get_model()
self.pga_model = self.adc_pot.pga_combobox.get_model()
self.gain_model = self.adc_pot.gain_combobox.get_model()
adc_rate = self.srate_model.get_value(self.adc_pot.srate_combobox.get_active_iter(), 2) #third column
adc_pga = self.pga_model.get_value(self.adc_pot.pga_combobox.get_active_iter(), 2)
gain = self.gain_model.get_value(self.adc_pot.gain_combobox.get_active_iter(), 2)
try:
self.statusbar.remove_all(self.error_context_id) #clear statusbar
start = int(self.swv.start_entry.get_text())
stop = int(self.swv.stop_entry.get_text())
step = int(self.swv.step_entry.get_text())
pulse = int(self.swv.pulse_entry.get_text())
freq = int(self.swv.freq_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 (start > 1499 or start < -1500):
raise InputError(start,"Start parameter exceeds hardware limits.")
if (step > 200 or step < 1):
raise InputError(step,"Step height parameter exceeds hardware limits.")
if (stop > 1499 or stop < -1500):
raise InputError(stop,"Stop parameter exceeds hardware limits.")
if (pulse > 150 or pulse < 1):
raise InputError(pulse,"Pulse height parameter exceeds hardware limits.")
if (freq < 1 or freq > 1000):
raise InputError(freq, "Frequency parameter outside limits.")
if start == stop:
raise InputError(start,"Start cannot equal Stop.")
comm.swv_exp(adc_buffer, adc_rate, adc_pga, gain, start, stop, step, pulse, freq)
except ValueError:
self.statusbar.push(self.error_context_id, "Experiment parameters must be integers.")
except InputError as e:
self.statusbar.push(self.error_context_id, e.msg)
else:
pass
self.statusbar.push(self.error_context_id, "Experiment not yet implemented.")
if __name__ == "__main__":
main = main()
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment