changeset 2:ac35bd1c3a8c draft default tip

Avoid reading the registers
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Sat, 22 Apr 2017 16:41:37 +0200
parents ce55d0a85b30
children
files is31fl3728.py
diffstat 1 files changed, 38 insertions(+), 26 deletions(-) [+]
line wrap: on
line diff
--- a/is31fl3728.py	Thu Apr 20 01:43:31 2017 +0200
+++ b/is31fl3728.py	Sat Apr 22 16:41:37 2017 +0200
@@ -6,11 +6,14 @@
         self.i2c = i2c
         self.address = address
         self.buffer = bytearray(8)
+        self._i2c_buffer = bytearray(1)
+        self._effect_register = 0
+        self._config_register = 0
+        self._equalizer_register = 0
 
-    def _register(self, register, value=None):
-        if value is None:
-            return self.i2c.readfrom_mem(self.address, register, 1)[0]
-        self.i2c.writeto_mem(self.address, register, bytearray([value]))
+    def _register(self, register, value):
+        self._i2c_buffer[0] = value
+        self.i2c.writeto_mem(self.address, register, self._i2c_buffer)
 
     def fill(self, color=1):
         color = 0xff if color else 0x00
@@ -33,46 +36,55 @@
         self._register(0x0c, 0xff)
 
     def brightness(self, value):
-        register = self._register(0x0d)
         if value is None:
-            value = register & 0x0f
+            value = self._effect_register & 0x0f
             if value & 0b1000:
                 value &= 0b0111
             else:
                 value += 7
             return value
         elif (0 <= value <= 6):
-            register = register & ~0x0f | (0b1000 | value) & 0x0f
+            self._effect_register = (
+                self._effect_register & ~0x0f | (0b1000 | value) & 0x0f)
         elif (7 <= value <= 14):
-            register = register & ~0x0f | (value - 7) & 0x0f
+            self._effect_register = (
+                self._effect_register & ~0x0f | (value - 7) & 0x0f)
         else:
             raise ValueError("out of range")
-        self._register(0x0d, register)
-
-    def _flag(self, register, mask, value=None):
-        flag = self._register(register)
-        if value is None:
-            return bool(flag & mask)
-        elif value:
-            flag |= mask
-        else:
-            flag &= ~mask
-        self._register(register, flag)
+        self._register(0x0d, self._effect_register)
 
     def active(self, value=None):
-        return self._flag(0x00, 0x80, value)
+        if value is None:
+            return bool(self._config_register & 0x80)
+        if value:
+            self._config_register |= 0x80
+        else:
+            self._config_register &= ~0x80
+        self._register(0x00, self._config_register)
 
     def equalizer_enabled(self, value=None):
-        return self._flag(0x0f, 0x40, value)
+        if value is None:
+            return bool(self._equalizer_register & 0x40)
+        if value:
+            self._equalizer_register |= 0x40
+        else:
+            self._equalizer_register &= ~0x40
+        self._register(0x0f, self._equalizer_register)
 
     def audio_enabled(self, value=None):
-        return self._flag(0x00, 0x04, value)
+        if value is None:
+            return bool(self._config_register & 0x04)
+        if value:
+            self._config_register |= 0x04
+        else:
+            self._config_register &= ~0x04
+        self._register(0x00, self._config_register)
 
     def audio_gain(self, value=None):
-        register = self._register(0x0d)
         if value is None:
-            return (register & 0x70) >> 4
+            return (self._effect_register & 0x70) >> 4
         elif not (0 <= value <= 7):
             raise ValueError("out of range")
-        register = register & ~0x70 | (value << 4) & 0x70
-        self._register(0x0d, register)
+        self._effect_register = (
+            self._effect_register & ~0x70 | (value << 4) & 0x70)
+        self._register(0x0d, self._effect_register)