changeset 2:5f42778239b8

Add audio_play
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Wed, 29 Jun 2016 02:05:53 +0200
parents 88e1e6b73a24
children 8e509d3b74e0
files is31fl3731.py
diffstat 1 files changed, 27 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/is31fl3731.py	Wed Jun 29 01:36:37 2016 +0200
+++ b/is31fl3731.py	Wed Jun 29 02:05:53 2016 +0200
@@ -9,6 +9,8 @@
 _BREATH2_REGISTER = const(0x09)
 _AUDIOSYNC_REGISTER = const(0x06)
 _SHUTDOWN_REGISTER = const(0x0a)
+_GAIN_REGISTER = const(0x0b)
+_ADC_REGISTER = const(0x0c)
 
 _CONFIG_BANK = const(0x0b)
 _BANK_ADDRESS = const(0xfd)
@@ -47,6 +49,9 @@
             return self.i2c.readfrom_mem(self.address, register, 1)[0]
         self.i2c.writeto_mem(self.address, register, bytearray([value]))
 
+    def _mode(self, mode=None):
+        return self._register(_CONFIG_BANK, _MODE_REGISTER, mode)
+
     def init(self):
         """Initialize the display."""
         self._mode(_PICTURE_MODE)
@@ -57,9 +62,6 @@
                 self._register(frame, col, 0xff)
         self.audio_sync(False)
 
-    def _mode(self, mode=None):
-        return self._register(_CONFIG_BANK, _MODE_REGISTER, mode)
-
     def sleep(self, value):
         """Enables, disables or gets the sleep mode."""
         return self._register(_CONFIG_BANK, _SHUTDOWN_REGISTER, value)
@@ -76,7 +78,7 @@
         if delay == 0:
             self._mode(_PICTURE_MODE)
             return
-        delay /= 11
+        delay //= 11
         if not 0 <= loops <= 7:
             raise ValueError("Loops out of range")
         if not 0 <= frames <= 7:
@@ -133,14 +135,28 @@
         """Enable, disable or get sync of brightness with audio input."""
         return self._register(_CONFIG_BANK, _AUDIOSYNC_REGISTER, value)
 
-    def audio_play(self, value=None):
-        """Enable, disable or get frame display according to the audio input."""
-        if value is None:
-            return self._mode() == _AUDIOPLAY_MODE
-        elif value:
-            self._mode(_AUDIOPLAY_MODE)
-        else:
+    def audio_play(self, sample_rate, audio_gain=0,
+                   agc_enable=False, agc_fast=False):
+        """
+        Enable or disable frame display according to the audio input.
+
+        The ``sample_rate`` specifies sample rate in microseconds. If it is 0,
+        disable the audio play. The ``audio_gain`` specifies amplification
+        between 0dB and 21dB.
+        """
+        if sample_rate == 0:
             self._mode(_PICTURE_MODE)
+            return
+        sample_rate /= 46
+        if not 1 <= sample_rate <= 256:
+            raise ValueError("Sample rate out of range")
+        self._register(_CONFIG_BANK, _ADC_REGISTER, sample_rate % 256)
+        audio_gain //= 3
+        if not 0 <= audio_gain <= 7:
+            raise ValueError("Audio gain out of range")
+        self._register(_CONFIG_BANK, _GAIN_REGISTER,
+                       bool(agc_enable) << 3 | bool(agc_fast) << 4 | audio_gain)
+        self._mode(_AUDIOPLAY_MODE)
 
     def fill(self, color=0, frame=None):
         """Fill the display with specified color."""