From 5413c106f2bba0548f31e9dec02692dc8f204462 Mon Sep 17 00:00:00 2001 From: Michael Dryden <mdryden@chem.utoronto.ca> Date: Mon, 21 Apr 2014 19:04:28 -0400 Subject: [PATCH] Implemented LSV and global dstat/ADC settings. Separated interfaces into different files. Experiment outputs appropriate instrument commands. --- dstatInterface/dstatInterface.glade | 409 ----------------- .../dstatInterface.xcodeproj/project.pbxproj | 8 +- .../UserInterfaceState.xcuserstate | Bin 17648 -> 22959 bytes dstatInterface/dstat_comm.py | 19 + dstatInterface/interface/__init__.py | 0 dstatInterface/interface/adc_pot.glade | 389 ++++++++++++++++ dstatInterface/interface/adc_pot.py | 28 ++ dstatInterface/interface/chronoamp.glade | 170 +++++++ dstatInterface/interface/chronoamp.py | 10 + dstatInterface/interface/cv.glade | 434 ++++++++++++++++++ dstatInterface/interface/cv.py | 9 + dstatInterface/interface/lsv.glade | 362 +++++++++++++++ dstatInterface/interface/lsv.py | 13 + dstatInterface/interface_test.py | 164 +++++++ 14 files changed, 1604 insertions(+), 411 deletions(-) delete mode 100644 dstatInterface/dstatInterface.glade create mode 100644 dstatInterface/dstat_comm.py create mode 100644 dstatInterface/interface/__init__.py create mode 100644 dstatInterface/interface/adc_pot.glade create mode 100644 dstatInterface/interface/adc_pot.py create mode 100644 dstatInterface/interface/chronoamp.glade create mode 100644 dstatInterface/interface/chronoamp.py create mode 100644 dstatInterface/interface/cv.glade create mode 100644 dstatInterface/interface/cv.py create mode 100644 dstatInterface/interface/lsv.glade create mode 100644 dstatInterface/interface/lsv.py create mode 100644 dstatInterface/interface_test.py diff --git a/dstatInterface/dstatInterface.glade b/dstatInterface/dstatInterface.glade deleted file mode 100644 index 1f44d93..0000000 --- a/dstatInterface/dstatInterface.glade +++ /dev/null @@ -1,409 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<interface> - <requires lib="gtk+" version="2.24"/> - <!-- interface-naming-policy project-wide --> - <object class="GtkListStore" id="ExpComboListStore"> - <columns> - <!-- column-name index --> - <column type="guint"/> - <!-- column-name name --> - <column type="gchararray"/> - </columns> - <data> - <row> - <col id="0">0</col> - <col id="1" translatable="yes">Chronoamperometry</col> - </row> - <row> - <col id="0">1</col> - <col id="1" translatable="yes">Linear Sweep Voltammetry</col> - </row> - <row> - <col id="0">2</col> - <col id="1" translatable="yes">Cyclic Voltammetry</col> - </row> - <row> - <col id="0">3</col> - <col id="1" translatable="yes">Square Wave Voltammetry</col> - </row> - <row> - <col id="0">4</col> - <col id="1" translatable="yes">AC Voltammetry</col> - </row> - <row> - <col id="0">5</col> - <col id="1" translatable="yes">Photodiode</col> - </row> - </data> - </object> - <object class="GtkAboutDialog" id="aboutdialog1"> - <property name="can_focus">False</property> - <property name="border_width">5</property> - <property name="type_hint">dialog</property> - <property name="program_name">Dstat Interface</property> - <property name="version">0.1</property> - <property name="copyright" translatable="yes">© Michael Dryden 2014</property> - <property name="license" translatable="yes">GNU</property> - <property name="authors">Michael Dryden</property> - <child internal-child="vbox"> - <object class="GtkVBox" id="dialog-vbox1"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="spacing">2</property> - <child internal-child="action_area"> - <object class="GtkHButtonBox" id="dialog-action_area1"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="layout_style">end</property> - </object> - <packing> - <property name="expand">True</property> - <property name="fill">True</property> - <property name="position">0</property> - </packing> - </child> - <child> - <placeholder/> - </child> - </object> - </child> - </object> - <object class="GtkTextBuffer" id="databuffer1"/> - <object class="GtkImage" id="image1"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="yalign">0.47999998927116394</property> - <property name="stock">gtk-missing-image</property> - </object> - <object class="GtkWindow" id="window1"> - <property name="can_focus">False</property> - <property name="border_width">6</property> - <property name="title" translatable="yes">Main</property> - <property name="default_width">800</property> - <property name="default_height">500</property> - <signal name="destroy" handler="on_window1_destroy" swapped="no"/> - <child> - <object class="GtkVBox" id="vbox1"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <child> - <object class="GtkMenuBar" id="menubar1"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <child> - <object class="GtkMenuItem" id="menuitem1"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="label" translatable="yes">_File</property> - <property name="use_underline">True</property> - <child type="submenu"> - <object class="GtkMenu" id="menu1"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <child> - <object class="GtkImageMenuItem" id="gtk_new"> - <property name="label">gtk-new</property> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="use_underline">True</property> - <property name="use_stock">True</property> - <signal name="activate" handler="on_gtk_new_activate" swapped="no"/> - </object> - </child> - <child> - <object class="GtkImageMenuItem" id="gtk-open"> - <property name="label">gtk-open</property> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="use_underline">True</property> - <property name="use_stock">True</property> - </object> - </child> - <child> - <object class="GtkImageMenuItem" id="gtk-save"> - <property name="label">gtk-save</property> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="use_underline">True</property> - <property name="use_stock">True</property> - </object> - </child> - <child> - <object class="GtkImageMenuItem" id="gtk-save-as"> - <property name="label">gtk-save-as</property> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="use_underline">True</property> - <property name="use_stock">True</property> - </object> - </child> - <child> - <object class="GtkImageMenuItem" id="gtk_quit"> - <property name="label">gtk-quit</property> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="use_underline">True</property> - <property name="use_stock">True</property> - <signal name="activate" handler="on_gtk_quit_activate" swapped="no"/> - </object> - </child> - </object> - </child> - </object> - </child> - <child> - <object class="GtkMenuItem" id="menuitem2"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="label" translatable="yes">_Edit</property> - <property name="use_underline">True</property> - <child type="submenu"> - <object class="GtkMenu" id="menu2"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <child> - <object class="GtkImageMenuItem" id="imagemenuitem7"> - <property name="label">gtk-copy</property> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="use_underline">True</property> - <property name="use_stock">True</property> - </object> - </child> - <child> - <object class="GtkImageMenuItem" id="imagemenuitem8"> - <property name="label">gtk-paste</property> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="use_underline">True</property> - <property name="use_stock">True</property> - </object> - </child> - </object> - </child> - </object> - </child> - <child> - <object class="GtkMenuItem" id="gtk_view"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="label" translatable="yes">_View</property> - <property name="use_underline">True</property> - <child type="submenu"> - <object class="GtkMenu" id="menu5"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <child> - <object class="GtkImageMenuItem" id="push_status"> - <property name="label">Push Status</property> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="use_stock">False</property> - <signal name="activate" handler="on_push_status_activate" swapped="no"/> - </object> - </child> - <child> - <object class="GtkImageMenuItem" id="pop_status"> - <property name="label">Pop Status</property> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="use_stock">False</property> - <signal name="activate" handler="on_pop_status_activate" swapped="no"/> - </object> - </child> - <child> - <object class="GtkImageMenuItem" id="clear_status"> - <property name="label">Clear Status</property> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="use_stock">False</property> - <signal name="activate" handler="on_clear_status_activate" swapped="no"/> - </object> - </child> - </object> - </child> - </object> - </child> - <child> - <object class="GtkMenuItem" id="menuitem4"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="label" translatable="yes">_Help</property> - <property name="use_underline">True</property> - <child type="submenu"> - <object class="GtkMenu" id="menu3"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <child> - <object class="GtkImageMenuItem" id="gtk_about"> - <property name="label">gtk-about</property> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="use_underline">True</property> - <property name="use_stock">True</property> - <signal name="activate" handler="on_gtk_about_activate" swapped="no"/> - </object> - </child> - </object> - </child> - </object> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkHPaned" id="hpaned1"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <child> - <object class="GtkVBox" id="vbox2"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <child> - <object class="GtkVBox" id="vbox3"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <child> - <object class="GtkLabel" id="label7"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="label" translatable="yes">Experiment</property> - </object> - <packing> - <property name="expand">True</property> - <property name="fill">True</property> - <property name="padding">10</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkComboBox" id="expcombobox"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="model">ExpComboListStore</property> - </object> - <packing> - <property name="expand">True</property> - <property name="fill">True</property> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkScrolledWindow" id="scrolledwindow2"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="hscrollbar_policy">never</property> - <property name="vscrollbar_policy">automatic</property> - <child> - <placeholder/> - </child> - </object> - <packing> - <property name="expand">True</property> - <property name="fill">True</property> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="resize">False</property> - <property name="shrink">True</property> - </packing> - </child> - <child> - <object class="GtkNotebook" id="notebook1"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <child> - <object class="GtkLabel" id="label4"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="label" translatable="yes">label</property> - </object> - </child> - <child type="tab"> - <object class="GtkLabel" id="label2"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="label" translatable="yes">page 1</property> - </object> - <packing> - <property name="tab_fill">False</property> - </packing> - </child> - <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="GtkTextView" id="datatextview1"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">False</property> - <property name="buffer">databuffer1</property> - </object> - </child> - </object> - <packing> - <property name="position">1</property> - </packing> - </child> - <child type="tab"> - <object class="GtkLabel" id="label3"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="label" translatable="yes">page 2</property> - </object> - <packing> - <property name="position">1</property> - <property name="tab_fill">False</property> - </packing> - </child> - <child> - <placeholder/> - </child> - <child type="tab"> - <placeholder/> - </child> - </object> - <packing> - <property name="resize">True</property> - <property name="shrink">True</property> - </packing> - </child> - </object> - <packing> - <property name="expand">True</property> - <property name="fill">True</property> - <property name="position">1</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> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">2</property> - </packing> - </child> - </object> - </child> - </object> -</interface> diff --git a/dstatInterface/dstatInterface.xcodeproj/project.pbxproj b/dstatInterface/dstatInterface.xcodeproj/project.pbxproj index f497925..cba776c 100644 --- a/dstatInterface/dstatInterface.xcodeproj/project.pbxproj +++ b/dstatInterface/dstatInterface.xcodeproj/project.pbxproj @@ -7,8 +7,10 @@ objects = { /* Begin PBXFileReference section */ - 5FAED9CD1900FBDA00A9DDD4 /* dstatInterface.glade */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = dstatInterface.glade; sourceTree = "<group>"; }; 5FAED9CE1900FE6B00A9DDD4 /* test2.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = test2.py; sourceTree = "<group>"; }; + 5FCB541B190591CD00CEB148 /* interface */ = {isa = PBXFileReference; lastKnownFileType = folder; path = interface; sourceTree = "<group>"; }; + 5FCB541D1905923800CEB148 /* interface_test.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = interface_test.py; sourceTree = "<group>"; }; + 5FCB54231905B6EE00CEB148 /* dstat_comm.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = dstat_comm.py; sourceTree = "<group>"; }; 5FDC0DFD18FDAD79003F857A /* main.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = main.py; sourceTree = "<group>"; }; 5FDC1E4218FF9572007AD04D /* glade1.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = glade1.py; sourceTree = "<group>"; }; 5FDC1E4318FF9A95007AD04D /* test1.glade */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = test1.glade; sourceTree = "<group>"; }; @@ -18,8 +20,10 @@ 5FDC0DF218FDACDA003F857A = { isa = PBXGroup; children = ( + 5FCB541D1905923800CEB148 /* interface_test.py */, + 5FCB54231905B6EE00CEB148 /* dstat_comm.py */, + 5FCB541B190591CD00CEB148 /* interface */, 5FAED9CE1900FE6B00A9DDD4 /* test2.py */, - 5FAED9CD1900FBDA00A9DDD4 /* dstatInterface.glade */, 5FDC1E4318FF9A95007AD04D /* test1.glade */, 5FDC0DFD18FDAD79003F857A /* main.py */, 5FDC1E4218FF9572007AD04D /* glade1.py */, diff --git a/dstatInterface/dstatInterface.xcodeproj/project.xcworkspace/xcuserdata/mdryden.xcuserdatad/UserInterfaceState.xcuserstate b/dstatInterface/dstatInterface.xcodeproj/project.xcworkspace/xcuserdata/mdryden.xcuserdatad/UserInterfaceState.xcuserstate index fe0af0358b47f2512401f9914dc1138dfb5ba042..084b68d140c72301f4199b5c640ca7a0d35e2c56 100644 GIT binary patch literal 22959 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 O`pfV3Nmil38UF{ud8wNK delta 10660 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 Q)WIL}vhuy^wdR@s2f8!E2mk;8 diff --git a/dstatInterface/dstat_comm.py b/dstatInterface/dstat_comm.py new file mode 100644 index 0000000..e1163a3 --- /dev/null +++ b/dstatInterface/dstat_comm.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python + +def lsv_exp(adc_buffer, adc_rate, adc_pga, gain, start, stop, slope): + s = "L " + s += (adc_buffer) + s += " " + s += (adc_rate) + s += " " + s += (adc_pga) + s += " " + s += (gain) + s += " " + 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 diff --git a/dstatInterface/interface/__init__.py b/dstatInterface/interface/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/dstatInterface/interface/adc_pot.glade b/dstatInterface/interface/adc_pot.glade new file mode 100644 index 0000000..18dbe2e --- /dev/null +++ b/dstatInterface/interface/adc_pot.glade @@ -0,0 +1,389 @@ +<?xml version="1.0" encoding="UTF-8"?> +<interface> + <requires lib="gtk+" version="2.24"/> + <!-- interface-naming-policy project-wide --> + <object class="GtkListStore" id="gain_liststore"> + <columns> + <!-- column-name index --> + <column type="guint"/> + <!-- column-name label --> + <column type="gchararray"/> + <!-- column-name command --> + <column type="gchararray"/> + </columns> + <data> + <row> + <col id="0">0</col> + <col id="1" translatable="yes">100 Ω (15 mA FS)</col> + <col id="2" translatable="yes">0</col> + </row> + <row> + <col id="0">1</col> + <col id="1" translatable="yes">300 Ω (5 mA FS)</col> + <col id="2" translatable="yes">1</col> + </row> + <row> + <col id="0">2</col> + <col id="1" translatable="yes">3 kΩ (500 µA FS)</col> + <col id="2" translatable="yes">2</col> + </row> + <row> + <col id="0">3</col> + <col id="1" translatable="yes">30 kΩ (50 µA FS)</col> + <col id="2" translatable="yes">3</col> + </row> + <row> + <col id="0">4</col> + <col id="1" translatable="yes">300 kΩ (5 µA FS)</col> + <col id="2" translatable="yes">4</col> + </row> + <row> + <col id="0">5</col> + <col id="1" translatable="yes">3 MΩ (500 nA FS)</col> + <col id="2" translatable="yes">5</col> + </row> + <row> + <col id="0">6</col> + <col id="1" translatable="yes">30 MΩ (50 nA FS)</col> + <col id="2" translatable="yes">6</col> + </row> + <row> + <col id="0">7</col> + <col id="1" translatable="yes">500 MΩ (3 nA FS)</col> + <col id="2" translatable="yes">7</col> + </row> + </data> + </object> + <object class="GtkListStore" id="pga_liststore"> + <columns> + <!-- column-name index --> + <column type="guint"/> + <!-- column-name label --> + <column type="gchararray"/> + <!-- column-name command --> + <column type="gchararray"/> + </columns> + <data> + <row> + <col id="0">0</col> + <col id="1" translatable="yes">1x</col> + <col id="2" translatable="yes">0x0</col> + </row> + <row> + <col id="0">1</col> + <col id="1" translatable="yes">2x</col> + <col id="2" translatable="yes">0x1</col> + </row> + <row> + <col id="0">2</col> + <col id="1" translatable="yes">4x</col> + <col id="2" translatable="yes">0x2</col> + </row> + <row> + <col id="0">3</col> + <col id="1" translatable="yes">8x</col> + <col id="2" translatable="yes">0x3</col> + </row> + <row> + <col id="0">4</col> + <col id="1" translatable="yes">16x</col> + <col id="2" translatable="yes">0x4</col> + </row> + <row> + <col id="0">5</col> + <col id="1" translatable="yes">32x</col> + <col id="2" translatable="yes">0x5</col> + </row> + <row> + <col id="0">6</col> + <col id="1" translatable="yes">64x</col> + <col id="2" translatable="yes">0x6</col> + </row> + </data> + </object> + <object class="GtkListStore" id="srate_liststore"> + <columns> + <!-- column-name index --> + <column type="guint"/> + <!-- column-name label --> + <column type="gchararray"/> + <!-- column-name command --> + <column type="gchararray"/> + </columns> + <data> + <row> + <col id="0">0</col> + <col id="1" translatable="yes">2.5 Hz</col> + <col id="2" translatable="yes">0x03</col> + </row> + <row> + <col id="0">1</col> + <col id="1" translatable="yes">5 Hz</col> + <col id="2" translatable="yes">0x13</col> + </row> + <row> + <col id="0">2</col> + <col id="1" translatable="yes">10 Hz</col> + <col id="2" translatable="yes">0x23</col> + </row> + <row> + <col id="0">3</col> + <col id="1" translatable="yes">15 Hz</col> + <col id="2" translatable="yes">0x33</col> + </row> + <row> + <col id="0">4</col> + <col id="1" translatable="yes">25 Hz</col> + <col id="2" translatable="yes">0x43</col> + </row> + <row> + <col id="0">5</col> + <col id="1" translatable="yes">30 Hz</col> + <col id="2" translatable="yes">0x53</col> + </row> + <row> + <col id="0">6</col> + <col id="1" translatable="yes">50 Hz</col> + <col id="2" translatable="yes">0x63</col> + </row> + <row> + <col id="0">7</col> + <col id="1" translatable="yes">60 Hz</col> + <col id="2" translatable="yes">0x72</col> + </row> + <row> + <col id="0">8</col> + <col id="1" translatable="yes">100 Hz</col> + <col id="2" translatable="yes">0x82</col> + </row> + <row> + <col id="0">9</col> + <col id="1" translatable="yes">500 Hz</col> + <col id="2" translatable="yes">0x92</col> + </row> + <row> + <col id="0">10</col> + <col id="1" translatable="yes">1 kHz</col> + <col id="2" translatable="yes">0xA1</col> + </row> + <row> + <col id="0">11</col> + <col id="1" translatable="yes">2 kHz</col> + <col id="2" translatable="yes">0xB0</col> + </row> + <row> + <col id="0">12</col> + <col id="1" translatable="yes">3.75 kHz</col> + <col id="2" translatable="yes">0xC0</col> + </row> + <row> + <col id="0">13</col> + <col id="1" translatable="yes">7.5 kHz</col> + <col id="2" translatable="yes">0xD0</col> + </row> + <row> + <col id="0">14</col> + <col id="1" translatable="yes">15 kHz</col> + <col id="2" translatable="yes">0xE0</col> + </row> + <row> + <col id="0">15</col> + <col id="1" translatable="yes">30 kHz</col> + <col id="2" translatable="yes">0xF0</col> + </row> + </data> + </object> + <object class="GtkWindow" id="window1"> + <property name="can_focus">False</property> + <child> + <object class="GtkVBox" id="vbox1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkVBox" id="vbox2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkFrame" id="adc_frame"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label_xalign">0</property> + <property name="shadow_type">out</property> + <child> + <object class="GtkAlignment" id="alignment1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="bottom_padding">5</property> + <property name="left_padding">5</property> + <property name="right_padding">5</property> + <child> + <object class="GtkTable" id="table1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="n_rows">3</property> + <property name="n_columns">2</property> + <property name="row_spacing">2</property> + <child> + <object class="GtkLabel" id="label2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="tooltip_text" translatable="yes">Gain of the ADC's programmable gain amplifier. Default is 2 - gives full scale input.</property> + <property name="label" translatable="yes">PGA Setting</property> + </object> + </child> + <child> + <object class="GtkLabel" id="label3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Sample Rate</property> + </object> + <packing> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="buffer_checkbutton"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="active">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="x_options">GTK_EXPAND</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="tooltip_text" translatable="yes">The ADC's input buffer greatly increases input impedance. Should generally be enabled.</property> + <property name="label" translatable="yes">Input Buffer</property> + </object> + <packing> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + </packing> + </child> + <child> + <object class="GtkComboBox" id="pga_combobox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="model">pga_liststore</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + </packing> + </child> + <child> + <object class="GtkComboBox" id="srate_combobox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="model">srate_liststore</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> + </packing> + </child> + </object> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">ADC Settings</property> + <property name="use_markup">True</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">2</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="pstat_frame"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label_xalign">0</property> + <property name="shadow_type">out</property> + <child> + <object class="GtkAlignment" id="alignment2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="bottom_padding">5</property> + <property name="left_padding">5</property> + <property name="right_padding">5</property> + <child> + <object class="GtkHBox" id="hbox1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkLabel" id="label6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="tooltip_text" translatable="yes">Gain of the I-V converter. Increasing this improves S/N, unlike the ADC's PGA.</property> + <property name="label" translatable="yes">Gain</property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkComboBox" id="gain_combobox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="model">gain_liststore</property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Potentiostat Settings</property> + <property name="use_markup">True</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">2</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + </child> + </object> +</interface> diff --git a/dstatInterface/interface/adc_pot.py b/dstatInterface/interface/adc_pot.py new file mode 100644 index 0000000..c534bad --- /dev/null +++ b/dstatInterface/interface/adc_pot.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python + +import gtk + +class adc_pot: + def __init__(self): + self.builder = gtk.Builder() + self.builder.add_from_file('interface/adc_pot.glade') + self.builder.connect_signals(self) + self.cell = gtk.CellRendererText() + + self.buffer_toggle = self.builder.get_object('buffer_checkbutton') + + #initialize comboboxes + self.pga_combobox = self.builder.get_object('pga_combobox') + self.pga_combobox.pack_start(self.cell, True) + self.pga_combobox.add_attribute(self.cell, 'text', 1) + self.pga_combobox.set_active(1) + + self.srate_combobox = self.builder.get_object('srate_combobox') + self.srate_combobox.pack_start(self.cell, True) + self.srate_combobox.add_attribute(self.cell, 'text', 1) + self.srate_combobox.set_active(7) + + self.gain_combobox = self.builder.get_object('gain_combobox') + self.gain_combobox.pack_start(self.cell, True) + self.gain_combobox.add_attribute(self.cell, 'text', 1) + self.gain_combobox.set_active(1) \ No newline at end of file diff --git a/dstatInterface/interface/chronoamp.glade b/dstatInterface/interface/chronoamp.glade new file mode 100644 index 0000000..3458127 --- /dev/null +++ b/dstatInterface/interface/chronoamp.glade @@ -0,0 +1,170 @@ +<?xml version="1.0" encoding="UTF-8"?> +<interface> + <requires lib="gtk+" version="2.24"/> + <!-- interface-naming-policy project-wide --> + <object class="GtkListStore" id="ca list"> + <columns> + <!-- column-name index --> + <column type="guint"/> + <!-- column-name millivolts --> + <column type="gint"/> + <!-- column-name seconds --> + <column type="guint"/> + </columns> + </object> + <object class="GtkWindow" id="window1"> + <property name="can_focus">False</property> + <property name="default_width">300</property> + <property name="default_height">500</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">3</property> + <property name="n_columns">2</property> + <child> + <object class="GtkLabel" id="label1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Potential (mV)</property> + </object> + </child> + <child> + <object class="GtkEntry" id="potential_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="invisible_char">â—</property> + <property name="width_chars">5</property> + <property name="text" translatable="yes">0</property> + <property name="xalign">1</property> + <property name="truncate_multiline">True</property> + <property name="invisible_char_set">True</property> + <property name="caps_lock_warning">False</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_SHRINK</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Time (s)</property> + </object> + <packing> + <property name="top_attach">1</property> + <property name="bottom_attach">2</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">5</property> + <property name="text" translatable="yes">0</property> + <property name="xalign">1</property> + <property name="truncate_multiline">True</property> + <property name="invisible_char_set">True</property> + <property name="caps_lock_warning">False</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_SHRINK</property> + </packing> + </child> + <child> + <object class="GtkButton" id="add_button"> + <property name="label">gtk-add</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use_stock">True</property> + </object> + <packing> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + </packing> + </child> + <child> + <object class="GtkButton" id="remove_button"> + <property name="label">gtk-remove</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use_stock">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="padding">5</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkScrolledWindow" id="scrolledwindow2"> + <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="GtkTreeView" id="treeview1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="model">ca list</property> + <property name="search_column">0</property> + </object> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + </child> + </object> +</interface> diff --git a/dstatInterface/interface/chronoamp.py b/dstatInterface/interface/chronoamp.py new file mode 100644 index 0000000..9bb398f --- /dev/null +++ b/dstatInterface/interface/chronoamp.py @@ -0,0 +1,10 @@ +#!/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.cell = gtk.CellRendererText() \ No newline at end of file diff --git a/dstatInterface/interface/cv.glade b/dstatInterface/interface/cv.glade new file mode 100644 index 0000000..ab547ac --- /dev/null +++ b/dstatInterface/interface/cv.glade @@ -0,0 +1,434 @@ +<?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="GtkFrame" id="frame1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label_xalign">0</property> + <property name="shadow_type">out</property> + <child> + <object class="GtkAlignment" id="alignment1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="bottom_padding">5</property> + <property name="left_padding">5</property> + <property name="right_padding">5</property> + <child> + <object class="GtkTable" id="table1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="n_rows">3</property> + <property name="n_columns">3</property> + <child> + <object class="GtkLabel" id="label3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Potential (mV)</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="y_options">GTK_FILL</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Time (s)</property> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="y_options">GTK_FILL</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + <packing> + <property name="y_options">GTK_FILL</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Cleaning</property> + </object> + <packing> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="y_options">GTK_FILL</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Deposition</property> + </object> + <packing> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="y_options">GTK_FILL</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="clean_mV"> + <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> + </packing> + </child> + <child> + <object class="GtkEntry" id="dep_mV"> + <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">2</property> + <property name="bottom_attach">3</property> + <property name="x_options"/> + <property name="y_options">GTK_FILL</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="dep_s"> + <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">2</property> + <property name="right_attach">3</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="x_options"/> + <property name="y_options">GTK_FILL</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="clean_s"> + <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">2</property> + <property name="right_attach">3</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options"/> + <property name="y_options">GTK_FILL</property> + </packing> + </child> + </object> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Preconditioning</property> + <property name="use_markup">True</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">2</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="frame2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label_xalign">0</property> + <property name="shadow_type">out</property> + <child> + <object class="GtkAlignment" id="alignment2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="bottom_padding">5</property> + <property name="left_padding">5</property> + <property name="right_padding">5</property> + <child> + <object class="GtkTable" id="table2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="n_rows">5</property> + <property name="n_columns">2</property> + <property name="column_spacing">10</property> + <property name="homogeneous">True</property> + <child> + <object class="GtkLabel" id="label8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Start (mV)</property> + </object> + <packing> + <property name="y_options">GTK_FILL</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Vertex 1 (mV)</property> + </object> + <packing> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="y_options">GTK_FILL</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Vertex 2 (mV)</property> + </object> + <packing> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="y_options">GTK_FILL</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="start_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="v1_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="GtkEntry" id="v2_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">2</property> + <property name="bottom_attach">3</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="label11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Slope (mV/s)</property> + </object> + <packing> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + <property name="y_options">GTK_FILL</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Scans</property> + </object> + <packing> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + <property name="y_options">GTK_FILL</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="slope_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">3</property> + <property name="bottom_attach">4</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="scans_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">4</property> + <property name="bottom_attach">5</property> + <property name="x_options"/> + <property name="y_options">GTK_FILL</property> + <property name="y_padding">3</property> + </packing> + </child> + </object> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Experiment</property> + <property name="use_markup">True</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">2</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + </child> + </object> +</interface> diff --git a/dstatInterface/interface/cv.py b/dstatInterface/interface/cv.py new file mode 100644 index 0000000..102352d --- /dev/null +++ b/dstatInterface/interface/cv.py @@ -0,0 +1,9 @@ +#!/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) diff --git a/dstatInterface/interface/lsv.glade b/dstatInterface/interface/lsv.glade new file mode 100644 index 0000000..63c4468 --- /dev/null +++ b/dstatInterface/interface/lsv.glade @@ -0,0 +1,362 @@ +<?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="GtkFrame" id="frame1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label_xalign">0</property> + <property name="shadow_type">out</property> + <child> + <object class="GtkAlignment" id="alignment1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="bottom_padding">5</property> + <property name="left_padding">5</property> + <property name="right_padding">5</property> + <child> + <object class="GtkTable" id="table1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="n_rows">3</property> + <property name="n_columns">3</property> + <child> + <object class="GtkLabel" id="label3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Potential (mV)</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="y_options">GTK_FILL</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Time (s)</property> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="y_options">GTK_FILL</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + <packing> + <property name="y_options">GTK_FILL</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Cleaning</property> + </object> + <packing> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="y_options">GTK_FILL</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Deposition</property> + </object> + <packing> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="y_options">GTK_FILL</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="clean_mV"> + <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> + </packing> + </child> + <child> + <object class="GtkEntry" id="dep_mV"> + <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">2</property> + <property name="bottom_attach">3</property> + <property name="x_options"/> + <property name="y_options">GTK_FILL</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="dep_s"> + <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">2</property> + <property name="right_attach">3</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="x_options"/> + <property name="y_options">GTK_FILL</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="clean_s"> + <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">2</property> + <property name="right_attach">3</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options"/> + <property name="y_options">GTK_FILL</property> + </packing> + </child> + </object> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Preconditioning</property> + <property name="use_markup">True</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">2</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="frame2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label_xalign">0</property> + <property name="shadow_type">out</property> + <child> + <object class="GtkAlignment" id="alignment2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="bottom_padding">5</property> + <property name="left_padding">5</property> + <property name="right_padding">5</property> + <child> + <object class="GtkTable" id="table2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="n_rows">3</property> + <property name="n_columns">2</property> + <property name="column_spacing">10</property> + <property name="homogeneous">True</property> + <child> + <object class="GtkLabel" id="label8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Start (mV)</property> + </object> + <packing> + <property name="y_options">GTK_FILL</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Stop (mV)</property> + </object> + <packing> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="y_options">GTK_FILL</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label10"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Slope (mV/s)</property> + </object> + <packing> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="y_options">GTK_FILL</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="start_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="stop_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="GtkEntry" id="slope_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">2</property> + <property name="bottom_attach">3</property> + <property name="x_options"/> + <property name="y_options">GTK_FILL</property> + <property name="y_padding">3</property> + </packing> + </child> + </object> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Experiment</property> + <property name="use_markup">True</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="padding">2</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + </child> + </object> +</interface> diff --git a/dstatInterface/interface/lsv.py b/dstatInterface/interface/lsv.py new file mode 100644 index 0000000..e1941f3 --- /dev/null +++ b/dstatInterface/interface/lsv.py @@ -0,0 +1,13 @@ +#!/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.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/dstatInterface/interface_test.py b/dstatInterface/interface_test.py new file mode 100644 index 0000000..f7e13fa --- /dev/null +++ b/dstatInterface/interface_test.py @@ -0,0 +1,164 @@ +#!/usr/bin/env python + +import sys +try: + import pygtk + pygtk.require('2.0') +except: + pass +try: + import gtk +except: + print('GTK not available') + sys.exit(1) + +import interface.adc_pot as adc_pot +import interface.chronoamp as chronoamp +import interface.lsv as lsv +import interface.cv as cv +import dstat_comm as comm + +class Error(Exception): + pass + +class InputError(Error): + """Exception raised for errors in the input. + + 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: + def __init__(self): + self.builder = gtk.Builder() + self.builder.add_from_file('interface/dstatinterface.glade') + self.builder.connect_signals(self) + self.cell = gtk.CellRendererText() + + #create instance of interface components + self.statusbar = self.builder.get_object('statusbar') + self.window = self.builder.get_object('window1') + self.aboutdialog = self.builder.get_object('aboutdialog1') + self.adc_pot = adc_pot.adc_pot() + self.chronoamp = chronoamp.chronoamp() + self.lsv = lsv.lsv() + self.cv = cv.cv() + + self.error_context_id = self.statusbar.get_context_id("error") + + #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.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) + + #fill adc_pot_box + self.adc_pot_box = self.builder.get_object('gain_adc_box') + self.adc_pot_container = self.adc_pot.builder.get_object('vbox1') + self.adc_pot_container.reparent(self.adc_pot_box) + + #initialize experiment selection combobox + self.expcombobox = self.builder.get_object('expcombobox') + self.expcombobox.pack_start(self.cell, True) + self.expcombobox.add_attribute(self.cell, 'text', 1) + self.expcombobox.set_active(0) + + self.mainwindow = self.builder.get_object('window1') + self.mainwindow.set_title("Dstat Interface 0.1") + self.mainwindow.show_all() +# self.chronoamp_container.hide() + self.lsv_container.hide() + self.cv_container.hide() + + def exp_param_show(self, selection): + self.chronoamp_container.hide() + self.lsv_container.hide() + self.cv_container.hide() + + self.statusbar.remove_all(self.error_context_id) + + if selection == 0: + self.chronoamp_container.show() + elif selection == 1: + self.lsv_container.show() + elif selection == 2: + self.cv_container.show() + else: + self.statusbar.push(self.error_context_id, "Experiment not yet implemented") + + def on_window1_destroy(self, object, data=None): + print "quit with cancel" + gtk.main_quit() + + # This is the same as above but for our menu item. + def on_gtk_quit_activate(self, menuitem, data=None): + print "quit from menu" + gtk.main_quit() + + def on_gtk_about_activate(self, menuitem, data=None): + print "help about selected" + self.response = self.aboutdialog.run() #waits for user to click close - could test response with if + self.aboutdialog.hide() + + def on_expcombobox_changed(self, data=None): + self.exp_param_show(self.expcombobox.get_active()) + + def on_pot_start_clicked(self, data=None): + selection = self.expcombobox.get_active() + + if selection == 0: #CA + pass + elif selection == 1: #LSV + 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: + self.statusbar.remove_all(self.error_context_id) + start = int(self.lsv.start_entry.get_text()) + stop = int(self.lsv.stop_entry.get_text()) + slope = int(self.lsv.slope_entry.get_text()) + + #check parameters are within hardware limits + if (start > 1499 or start < -1500): + raise InputError(start,"Start parameter exceeds hardware limits.") + if (stop > 1499 or stop < -1500): + raise InputError(stop,"Stop parameter exceeds hardware limits.") + if (slope > 2000 or slope < 1): + raise InputError(slope,"Slope parameter exceeds hardware limits.") + if start == stop: + raise InputError(start,"Start cannot equal Stop.") + + comm.lsv_exp(adc_buffer, adc_rate, adc_pga, gain, start, stop, 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 == 2: #CV + pass + else: + pass + +if __name__ == "__main__": + main = main() + gtk.main() \ No newline at end of file -- GitLab