Source code for bibliopixel.drivers.SPI.APA102

from ... colors import gamma
from .. channel_order import ChannelOrder
from . base import SPIBase


[docs]class APA102(SPIBase): """Driver for APA102/SK9822 based LED strips on devices like the Raspberry Pi and BeagleBone Provides the same parameters as :py:class:`bibliopixel.drivers.SPI.SPIBase` """ def __init__(self, num, gamma=gamma.APA102, **kwargs): super().__init__(num, gamma=gamma, **kwargs) # APA102/SK9822 requires latch bytes at the end) # Many thanks to this article for combined APA102/SK9822 protocol # https://cpldcpu.com/2016/12/13/sk9822-a-clone-of-the-apa102/ self._start_frame = 4 # start frame is [0, 0, 0, 0] self._pixel_bytes = self.numLEDs * 4 # 4 byte frames [bright, r, g, b] self._pixel_stop = self._start_frame + self._pixel_bytes self._reset_frame = 4 # for SK9822 [0, 0, 0, 0] self._end_frame = (num // 2) + 1 self._packet = self.maker.bytes(self._start_frame + self._pixel_bytes + self._reset_frame + self._end_frame) self.set_device_brightness(0xFF) # required to setup _packet
[docs] def set_device_brightness(self, val): """ APA102 & SK9822 support on-chip brightness control, allowing greater color depth. APA102 superimposes a 440Hz PWM on the 19kHz base PWM to control brightness. SK9822 uses a base 4.7kHz PWM but controls brightness with a variable current source. Because of this SK9822 will have much less flicker at lower levels. Either way, this option is better and faster than scaling in BiblioPixel. """ # bitshift to scale from 8 bit to 5 self._chipset_brightness = (val >> 3) self._brightness_list = [0xE0 + self._chipset_brightness] * self.numLEDs self._packet[self._start_frame:self._pixel_stop:4] = ( self._brightness_list)
def _compute_packet(self): self._render() self._packet[self._start_frame + 1:self._pixel_stop:4] = self._buf[0::3] self._packet[self._start_frame + 2:self._pixel_stop:4] = self._buf[1::3] self._packet[self._start_frame + 3:self._pixel_stop:4] = self._buf[2::3]