From 5a17aade109e4539d3476647fc4d92eda10ee58e Mon Sep 17 00:00:00 2001
From: "Michael D. M. Dryden" <mdryden@chem.utoronto.ca>
Date: Fri, 20 Nov 2015 12:01:07 -0500
Subject: [PATCH] Add current offset trimming.

---
 dstat-interface/dstat_comm.py                 | 20 +++++--
 .../interface/dstatinterface.glade            |  5 ++
 dstat-interface/interface/exp_int.py          | 54 ++++++++++++++++++-
 dstat-interface/interface/exp_window.py       |  1 +
 4 files changed, 74 insertions(+), 6 deletions(-)

diff --git a/dstat-interface/dstat_comm.py b/dstat-interface/dstat_comm.py
index 2b83bd9..e4fc8f6 100644
--- a/dstat-interface/dstat_comm.py
+++ b/dstat-interface/dstat_comm.py
@@ -207,10 +207,15 @@ class Experiment(object):
                 self.__gaintable = [1e2, 3e2, 3e3, 3e4, 3e5, 3e6, 3e7, 5e8]
             elif minor >= 2:
                 self.__gaintable = [1, 1e2, 3e3, 3e4, 3e5, 3e6, 3e7, 1e8]
+                self.__gain_trim_table = [None, 'r100_trim', 'r3k_trim',
+                                        'r30k_trim', 'r300k_trim', 'r3M_trim',
+                                        'r30M_trim', 'r100M_trim']
         else:
             raise VarError(parameters['version'], "Invalid version parameter.")
             
         self.gain = self.__gaintable[int(self.parameters['gain'])]
+        self.gain_trim = int(
+            settings[self.__gain_trim_table[int(self.parameters['gain'])]][1])
 
         self.commands = ["EA", "EG"]
     
@@ -299,7 +304,8 @@ class Experiment(object):
         scan, data = data_input
         voltage, current = struct.unpack('<Hl', data) #uint16 + int32
         return (scan,
-                [(voltage-32768)*3000./65536, current*(1.5/self.gain/8388607)])
+                [(voltage-32768)*3000./65536,
+                (current+self.gain_trim)*(1.5/self.gain/8388607)])
     
     def data_postprocessing(self):
         """No data postprocessing done by default, can be overridden
@@ -342,7 +348,8 @@ class Chronoamp(Experiment):
         # 2*uint16 + int32
         seconds, milliseconds, current = struct.unpack('<HHl', data)
         return (scan,
-                [seconds+milliseconds/1000., current*(1.5/self.gain/8388607)])
+                [seconds+milliseconds/1000.,
+                (current+self.gain_trim)*(1.5/self.gain/8388607)])
 
 class PDExp(Chronoamp):
     """Photodiode/PMT experiment"""
@@ -521,10 +528,13 @@ class SWVExp(Experiment):
         scan, data = input_data
         # uint16 + int32
         voltage, forward, reverse = struct.unpack('<Hll', data)
+        f_trim = forward+self.gain_trim
+        r_trim = reverse+self.gain_trim
+        
         return (scan, [(voltage-32768)*3000./65536,
-                       (forward-reverse)*(1.5/self.gain/8388607),
-                       forward*(1.5/self.gain/8388607),
-                       reverse*(1.5/self.gain/8388607)])
+                       (f_trim-r_trim)*(1.5/self.gain/8388607),
+                       f_trim*(1.5/self.gain/8388607),
+                       r_trim*(1.5/self.gain/8388607)])
 
 
 class DPVExp(SWVExp):
diff --git a/dstat-interface/interface/dstatinterface.glade b/dstat-interface/interface/dstatinterface.glade
index e3cb0d6..9a3b47c 100644
--- a/dstat-interface/interface/dstatinterface.glade
+++ b/dstat-interface/interface/dstatinterface.glade
@@ -52,6 +52,11 @@
         <col id="1" translatable="yes">pot</col>
         <col id="2" translatable="yes">Potentiometry</col>
       </row>
+      <row>
+        <col id="0">8</col>
+        <col id="1" translatable="yes">cal</col>
+        <col id="2" translatable="yes">Offset Calibration</col>
+      </row>
     </data>
   </object>
   <object class="GtkAboutDialog" id="aboutdialog1">
diff --git a/dstat-interface/interface/exp_int.py b/dstat-interface/interface/exp_int.py
index 0450462..b6410b2 100644
--- a/dstat-interface/interface/exp_int.py
+++ b/dstat-interface/interface/exp_int.py
@@ -244,4 +244,56 @@ class POT(ExpInterface):
         """Adds entry listings to superclass's self.entry dict"""
         super(POT, self).__init__('interface/potexp.glade')
         
-        self.entry['time'] = self.builder.get_object('time_entry')
\ No newline at end of file
+        self.entry['time'] = self.builder.get_object('time_entry')
+        
+class CAL(ExpInterface):
+    """Experiment class for Calibrating gain."""
+    def __init__(self):
+        """Adds entry listings to superclass's self.entry dict"""
+        super(CAL, self).__init__('interface/calib.glade')
+        
+        self.entry['time'] = self.builder.get_object('time_entry')
+        self.entry['R100'] = self.builder.get_object('100_entry')
+        self.entry['R3k'] = self.builder.get_object('3k_entry')
+        self.entry['R30k'] = self.builder.get_object('30k_entry')
+        self.entry['R300k'] = self.builder.get_object('300k_entry')
+        self.entry['R3M'] = self.builder.get_object('3M_entry')
+        self.entry['R30M'] = self.builder.get_object('30M_entry')
+        self.entry['R100M'] = self.builder.get_object('100M_entry')
+        
+    def on_read_button_clicked(self, data=None):
+        __main__.MAIN.on_pot_stop_clicked()
+        
+        gobject.source_remove(__main__.MAIN.ocp_proc)
+        dstat_comm.read_settings()
+        self.entry['R100'].set_text(str(
+            dstat_comm.settings['r100_trim'][1]))
+        self.entry['R3k'].set_text(str(
+            dstat_comm.settings['r3k_trim'][1]))
+        self.entry['R30k'].set_text(str(
+            dstat_comm.settings['r30k_trim'][1]))
+        self.entry['R300k'].set_text(str(
+            dstat_comm.settings['r300k_trim'][1]))
+        self.entry['R3M'].set_text(str(
+            dstat_comm.settings['r3M_trim'][1]))
+        self.entry['R30M'].set_text(str(
+            dstat_comm.settings['r30M_trim'][1]))
+        self.entry['R100M'].set_text(str(
+            dstat_comm.settings['r100M_trim'][1]))
+   
+        __main__.MAIN.start_ocp()
+        
+    def on_write_button_clicked(self, data=None):
+        __main__.MAIN.on_pot_stop_clicked()
+        gobject.source_remove(__main__.MAIN.ocp_proc)
+        
+        dstat_comm.settings['r100_trim'][1] = self.entry['R100'].get_text()
+        dstat_comm.settings['r3k_trim'][1] = self.entry['R3k'].get_text()
+        dstat_comm.settings['r30k_trim'][1] = self.entry['R30k'].get_text()
+        dstat_comm.settings['r300k_trim'][1] = self.entry['R300k'].get_text()
+        dstat_comm.settings['r3M_trim'][1] = self.entry['R3M'].get_text()
+        dstat_comm.settings['r30M_trim'][1] = self.entry['R30M'].get_text()
+        dstat_comm.settings['r100M_trim'][1] = self.entry['R100M'].get_text()
+        dstat_comm.write_settings()        
+                            
+        __main__.MAIN.start_ocp()
\ No newline at end of file
diff --git a/dstat-interface/interface/exp_window.py b/dstat-interface/interface/exp_window.py
index f5bf561..0aebdb5 100644
--- a/dstat-interface/interface/exp_window.py
+++ b/dstat-interface/interface/exp_window.py
@@ -32,6 +32,7 @@ class Experiments:
         self.classes['acv'] = exp.ACV()
         self.classes['pde'] = exp.PD()
         self.classes['pot'] = exp.POT()
+        self.classes['cal'] = exp.CAL()
  
         #fill exp_section
         exp_section = self.builder.get_object('exp_section_box')
-- 
GitLab