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()