usbio.py: add AD5242 class
authorDan White <dan@whiteaudio.com>
Sun, 8 Apr 2012 23:19:59 +0000 (18:19 -0500)
committerDan White <dan@whiteaudio.com>
Sun, 8 Apr 2012 23:21:13 +0000 (18:21 -0500)
python-lib/usbio.py

index 758e51b4f75f40b7ee3b1b29581a9dc4e7850568..f5971f2e5603cea673b3fe5ea4b2a2d52de9b81c 100644 (file)
@@ -348,6 +348,165 @@ class Mux(object):
         return tuple(b)
 
 
+class AD524x(object):
+    ADDR_BASE = intbv(0b0101100, max=2**7)
+    SEL_POS = 7
+    RS_POS = 6
+    SD_POS = 5
+    O1_POS = 4
+    O2_POS = 3
+    # instruction bits 2..0 are unused
+    READ = 1
+    WRITE = 0
+    lastA = None
+    lastB = None
+    lastSel = None
+
+    def __init__(self, i2cbus, addr=0):
+        self.bus = i2cbus
+        self.addr = intbv(ADDR_BASE + intbv(addr, max=2**2), max=2**7)
+        self._sel = intbv(0, max=1)
+        self._rs = intbv(0, max=1)
+        self._sd = intbv(0, max=1)
+        self._posA = intbv(0x80, max=2**8)
+        self._posB = intbv(0x80, max=2**8)
+        self._gpo1 = intbv(0, max=1)
+        self._gpo2 = intbv(0, max=1)
+        self.gpo = (self._gpo1, self.gpo2)
+
+    @property
+    def sel(self): return self._sel
+
+    @sel.setter
+    def sel(self, value):
+        if value:
+            v = 1
+        else:
+            v = 0
+        self._sel = intbv(v, max=1)
+
+    @property
+    def reset(self): return self._rs
+
+    @reset.setter
+    def reset(self, value):
+        if value:
+            v = 1
+        else:
+            v = 0
+        self._rs = intbv(v, max=1)
+
+    @property
+    def shutdown(self): return self._sd
+
+    @shutdown.setter
+    def shutdown(self, value):
+        if value:
+            v = 1
+        else:
+            v = 0
+        self._sd = intbv(v, max=1)
+
+    @property
+    def posA(self): return self._posA
+
+    @posA.setter
+    def posA(self, value):
+        self._posA = intbv(value, max=2**8)
+
+    @property
+    def posB(self): return self._posB
+
+    @posB.setter
+    def posB(self, value):
+        self._posB = intbv(value, max=2**8)
+
+    @property
+    def pos(self):
+        if self.pos:
+            return self.posB
+        else:
+            return self.posA
+
+    @property
+    def gpo1(self): return self.gpo1
+
+    @gpo1.setter
+    def gpo1(self, value):
+        if value:
+            v = intbv(1)[0]
+        else:
+            v = intbv(0)[0]
+        self._gpo1 = v
+
+    @property
+    def gpo2(self): return self.gpo2
+
+    @gpo2.setter
+    def gpo2(self, value):
+        if value:
+            v = intbv(1)[0]
+        else:
+            v = intbv(0)[0]
+        self._gpo2 = v
+
+    @property
+    def instruction(self):
+        inst = intbv(0)[8:]
+        inst += self.sel << self.SEL_POS
+        inst += self.reset << self.RS_POS
+        inst += self.shutdown << self.SD_POS
+        inst += self.gpo1 << self.O1_POS
+        inst += self.gpo2 << self.O2_POS
+        return inst
+
+    def setpos(self, sel, pos, force=False):
+        self.sel = sel
+        if sel:
+            self.posB = pos
+        else:
+            self.posA = pos
+        self.update(force=force)
+
+    def update(self, force=False):
+        if force or (self.posA != self.lastA):
+            self.send(0)
+
+        if force or (self.posB != self.lastB):
+            self.send(1)
+
+    def send(self, sel):
+        self.sel = sel
+        cmd = ((self.addr << 1) + self.WRITE,
+               self.instruction,
+               self.pos)
+
+        self.lastSel = self.sel
+        if sel:
+            self.lastB = self.pos
+        else:
+            self.lastA = self.pos
+
+        self.bus.write(cmd)
+
+    def read(self, sel):
+        if sel != self.lastSel:
+            self.send(sel)
+
+        cmd = ((self.addr << 1) + self.READ, )
+        val = self.bus.read(cmd, 1)
+        return val[0]
+
+
+
+class I2C(object):
+    def write(self, data):
+        """Send i2c command data to slave."""
+        raise NotImplementedError
+
+    def read(self, cmd, n):
+        """Send i2c command cmd and read n additional bytes from slave."""
+        raise NotImplementedError
 
 
 o = OTA()