changeset 0:a7c5e71aa74b

Initial commit
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Tue, 28 Jun 2016 18:51:57 +0200
parents
children 88e1e6b73a24
files .hgignore is31fl3731.py
diffstat 2 files changed, 101 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.hgignore	Tue Jun 28 18:51:57 2016 +0200
@@ -0,0 +1,14 @@
+syntax: glob
+*.pyc
+*~
+.*.swp
+docs/_build/*
+build/*
+dist/*
+bin/*
+lib/*
+include/*
+local
+*.egg-info
+cache/*
+*.DS_Store
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/is31fl3731.py	Tue Jun 28 18:51:57 2016 +0200
@@ -0,0 +1,87 @@
+import time
+
+
+_MODE_REGISTER = _const(0x00)
+_FRAME_REGISTER = _const(0x01)
+_SHUTDOWN_REGISTER = _const(0x0a)
+_AUDIOSYNC_REGISTER = _const(0x06)
+
+_CONFIG_BANK = _const(0x0b)
+_BANK_ADDRESS = _const(0xfd)
+
+_PICTURE_MODE = _const(0x00)
+_AUTOPLAY_MODE = _const(0x08)
+_AUDIOPLAY_MODE = _const(0x18)
+
+
+class IS31FL3731:
+    def __init__(self, width, height, i2c, address=0x74):
+        self.width = width
+        self.height = height
+        self.i2c = i2c
+        self.address = address
+        self.reset()
+        self.init()
+
+    def _bank(self, bank=None):
+        if bank is None:
+            return self.i2c.readfrom_mem(self.address, _BANK_ADDRESS, 1)[0]
+        self.i2c.writeto_mem(self.address, _BANK_ADDRESS, bytearray([bank]))
+
+    def _register(self, bank, register, value=None):
+        self._bank(bank)
+        if value is None:
+            return self.i2c.readfrom_mem(self.address, register, 1)[0]
+        self.i2c.writeto_mem(self.address, register, bytearray([value]))
+
+    def init(self):
+        self._mode(_PICTURE_MODE)
+        self.frame(0)
+        self.fill(0)
+        for frame in range(8):
+            for col in range(18):
+                self._register(frame, col, 0xff)
+        self.audio_sync(False)
+
+    def _mode(self, mode=None):
+        return self._register(_CONFIG_BANK, _MODE_REGISTER, mode)
+
+    def reset(self):
+        self._register(_CONFIG_BANK, _SHUTDOWN_REGISTER, 0x00)
+        time.delay_ms(10)
+        self._register(_CONFIG_BANK, _SHUTDOWN_REGISTER, 0x01)
+
+    def frame(self, frame=None, show=True):
+        if frame is None:
+            return self._frame
+        if not 0 <= frame <= 8:
+            raise ValueError("Frame out of range")
+        self._frame = frame
+        if show:
+            self._register(_CONFIG_BANK, _FRAME_REGISTER, frame);
+
+    def fill(self, color=0, frame=None):
+        if not 0 <= color <= 255:
+            raise ValueError("Color out of range")
+        if frame is None:
+            frame = self._frame
+        self._bank(frame)
+        data = bytearray([color] * 24)
+        for row in range(6):
+            self.i2c.writeto_mem(self.address, 0x24 + row * 24, data)
+
+    def audio_sync(self, value=None):
+        return self._register(_CONFIG_BANK, _AUDIOSYNC_REGISTER, value)
+
+    def pixel(self, x, y, color=None, frame=None):
+        if not 0 <= x <= self.width:
+            return
+        if not 0 <= y <= self.height:
+            return
+        if color is None:
+            return self._register(self._frame, x + y * self.width)
+        if not 0 <= color <= 255:
+            raise ValueError("Color out of range")
+        if frame is None:
+            frame = self._frame
+        self._register(frame, x + y * self.width, color)