Source code for adafruit_seesaw.neopixel

# SPDX-FileCopyrightText: 2017 Dean Miller for Adafruit Industries
#
# SPDX-License-Identifier: MIT

# pylint: disable=missing-docstring,invalid-name,too-many-public-methods

"""
`adafruit_seesaw.neopixel`
====================================================
"""

try:
    import struct
except ImportError:
    import ustruct as struct
try:
    from micropython import const
except ImportError:

    def const(x):
        return x


__version__ = "0.0.0-auto.0"
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_seesaw.git"

_NEOPIXEL_BASE = const(0x0E)

_NEOPIXEL_STATUS = const(0x00)
_NEOPIXEL_PIN = const(0x01)
_NEOPIXEL_SPEED = const(0x02)
_NEOPIXEL_BUF_LENGTH = const(0x03)
_NEOPIXEL_BUF = const(0x04)
_NEOPIXEL_SHOW = const(0x05)

# Pixel color order constants
RGB = (0, 1, 2)
"""Red Green Blue"""
GRB = (1, 0, 2)
"""Green Red Blue"""
RGBW = (0, 1, 2, 3)
"""Red Green Blue White"""
GRBW = (1, 0, 2, 3)
"""Green Red Blue White"""


[docs]class NeoPixel: """Control NeoPixels connected to a seesaw :param ~adafruit_seesaw.seesaw.Seesaw seesaw: The device :param int pin: The pin number on the device :param int n: The number of pixels :param int bpp: The number of bytes per pixel :param float brightness: The brightness, from 0.0 to 1.0 :param bool auto_write: Automatically update the pixels when changed :param tuple pixel_order: The layout of the pixels. Use one of the order constants such as RGBW.""" def __init__( self, seesaw, pin, n, *, bpp=3, brightness=1.0, auto_write=True, pixel_order=None ): # TODO: brightness not yet implemented. self._seesaw = seesaw self._pin = pin self._bpp = bpp self.auto_write = auto_write self._n = n self._brightness = min(max(brightness, 0.0), 1.0) self._pixel_order = GRBW if pixel_order is None else pixel_order cmd = bytearray([pin]) self._seesaw.write(_NEOPIXEL_BASE, _NEOPIXEL_PIN, cmd) cmd = struct.pack(">H", n * self._bpp) self._seesaw.write(_NEOPIXEL_BASE, _NEOPIXEL_BUF_LENGTH, cmd) self._pre_brightness_color = [None] * n @property def brightness(self): """Overall brightness of the pixel""" return self._brightness @brightness.setter def brightness(self, brightness): # pylint: disable=attribute-defined-outside-init self._brightness = min(max(brightness, 0.0), 1.0) # Suppress auto_write while updating brightness. current_auto_write = self.auto_write self.auto_write = False for i in range(self._n): if self._pre_brightness_color[i] is not None: self[i] = self._pre_brightness_color[i] if current_auto_write: self.show() self.auto_write = current_auto_write def deinit(self): pass def __len__(self): return self._n
[docs] def __setitem__(self, key, color): """Set one pixel to a new value""" cmd = bytearray(2 + self._bpp) struct.pack_into(">H", cmd, 0, key * self._bpp) if isinstance(color, int): w = color >> 24 r = (color >> 16) & 0xFF g = (color >> 8) & 0xFF b = color & 0xFF else: if self._bpp == 3: r, g, b = color else: r, g, b, w = color self._pre_brightness_color[key] = color # If all components are the same and we have a white pixel then use it # instead of the individual components. if self._bpp == 4 and r == g == b and w == 0: w = r r = 0 g = 0 b = 0 if self.brightness < 0.99: r = int(r * self.brightness) g = int(g * self.brightness) b = int(b * self.brightness) if self._bpp == 4: w = int(w * self.brightness) # Store colors in correct slots cmd[2 + self._pixel_order[0]] = r cmd[2 + self._pixel_order[1]] = g cmd[2 + self._pixel_order[2]] = b if self._bpp == 4: cmd[2 + self._pixel_order[3]] = w self._seesaw.write(_NEOPIXEL_BASE, _NEOPIXEL_BUF, cmd) if self.auto_write: self.show()
def __getitem__(self, key): pass
[docs] def fill(self, color): """Set all pixels to the same value""" # Suppress auto_write while filling. current_auto_write = self.auto_write self.auto_write = False for i in range(self._n): self[i] = color if current_auto_write: self.show() self.auto_write = current_auto_write
[docs] def show(self): """Update the pixels even if auto_write is False""" self._seesaw.write(_NEOPIXEL_BASE, _NEOPIXEL_SHOW)