usbio.py: add AD5242 GP outputs setting
authorDan White <dan@whiteaudio.com>
Sun, 8 Apr 2012 23:50:31 +0000 (18:50 -0500)
committerDan White <dan@whiteaudio.com>
Sun, 8 Apr 2012 23:50:31 +0000 (18:50 -0500)
python-lib/usbio.py

index f5971f2e5603cea673b3fe5ea4b2a2d52de9b81c..a4a2174731679dee23a79411e00a99fdbe40984f 100644 (file)
@@ -356,13 +356,18 @@ class AD524x(object):
     O1_POS = 4
     O2_POS = 3
     # instruction bits 2..0 are unused
+
     READ = 1
     WRITE = 0
+
+    # cache for lazy updating
     lastA = None
     lastB = None
     lastSel = None
+    lastO1 = None
+    lastO2 = None
 
-    def __init__(self, i2cbus, addr=0):
+    def __init__(self, i2cbus, addr):
         self.bus = i2cbus
         self.addr = intbv(ADDR_BASE + intbv(addr, max=2**2), max=2**7)
         self._sel = intbv(0, max=1)
@@ -438,6 +443,7 @@ class AD524x(object):
         else:
             v = intbv(0)[0]
         self._gpo1 = v
+        self.updateGPO()
 
     @property
     def gpo2(self): return self.gpo2
@@ -449,6 +455,7 @@ class AD524x(object):
         else:
             v = intbv(0)[0]
         self._gpo2 = v
+        self.updateGPO()
 
     @property
     def instruction(self):
@@ -475,6 +482,11 @@ class AD524x(object):
         if force or (self.posB != self.lastB):
             self.send(1)
 
+    def updateGPO(self, force=False):
+        if force or (self.gpo1 != self.lastO1) or
+                    (self.gpo2 != self.lastO2):
+            self.sendGPO()
+
     def send(self, sel):
         self.sel = sel
         cmd = ((self.addr << 1) + self.WRITE,
@@ -489,6 +501,14 @@ class AD524x(object):
 
         self.bus.write(cmd)
 
+    def sendGPO(self):
+        cmd = ((self.addr << 1) + self.WRITE,
+               self.instruction)
+        self.lastSel = self.sel
+        self.lastO1 = self.gpo1
+        self.lastO2 = self.gpo2
+        self.bus.write(cmd)
+
     def read(self, sel):
         if sel != self.lastSel:
             self.send(sel)