diff options
author | Jakob Stendahl <jakob.stendahl@outlook.com> | 2018-11-25 18:23:37 +0100 |
---|---|---|
committer | Jakob Stendahl <jakob.stendahl@outlook.com> | 2018-11-25 18:23:37 +0100 |
commit | 2147880e40ee39ae07c8df9d3500080da467475d (patch) | |
tree | 2b5ffba180b3fadd6844b3f9ebf3948b4185fb9a /src/compileAndRun/pythonSupportFiles/LuxcenaNeo/Strip.py | |
parent | 5b6c54d4dbed5cc3725c20f1d0f823aa51f11320 (diff) | |
download | Luxcena-Neo-2147880e40ee39ae07c8df9d3500080da467475d.tar.gz Luxcena-Neo-2147880e40ee39ae07c8df9d3500080da467475d.zip |
:hammer: Change to the already-made neopixel-library
Diffstat (limited to 'src/compileAndRun/pythonSupportFiles/LuxcenaNeo/Strip.py')
-rw-r--r-- | src/compileAndRun/pythonSupportFiles/LuxcenaNeo/Strip.py | 122 |
1 files changed, 20 insertions, 102 deletions
diff --git a/src/compileAndRun/pythonSupportFiles/LuxcenaNeo/Strip.py b/src/compileAndRun/pythonSupportFiles/LuxcenaNeo/Strip.py index f5beaa4..f9c94a0 100644 --- a/src/compileAndRun/pythonSupportFiles/LuxcenaNeo/Strip.py +++ b/src/compileAndRun/pythonSupportFiles/LuxcenaNeo/Strip.py @@ -1,18 +1,8 @@ -#from neopixel import * -import atexit -import _rpi_ws281x as ws +from neopixel import * class Strip: def __init__(self, stripConf): - """Class to represent a NeoPixel/WS281x LED display. Num should be the - number of pixels in the display, and pin should be the GPIO pin connected - to the display signal line (must be a PWM pin like 18!). Optional - parameters are freq, the frequency of the display signal in hertz (default - 800khz), dma, the DMA channel to use (default 10), invert, a boolean - specifying if the signal line should be inverted (default False), and - channel, the PWM channel to use (defaults to 0). - """ self.SEGMENTS = stripConf["segments"] self.SEGMENT_CONFIG = stripConf["segment_config"] @@ -26,95 +16,59 @@ class Strip: self.LED_BRIGHTNESS = 255 - # Create ws2811_t structure and fill in parameters. - self._leds = ws.new_ws2811_t() - - # Initialize the channels to zero - for channum in range(2): - chan = ws.ws2811_channel_get(self._leds, channum) - ws.ws2811_channel_t_count_set(chan, 0) - ws.ws2811_channel_t_gpionum_set(chan, 0) - ws.ws2811_channel_t_invert_set(chan, 0) - ws.ws2811_channel_t_brightness_set(chan, 0) - - # Initialize the channel in use - self._channel = ws.ws2811_channel_get(self._leds, channel) - ws.ws2811_channel_t_count_set(self._channel, num) - ws.ws2811_channel_t_gpionum_set(self._channel, pin) - ws.ws2811_channel_t_invert_set(self._channel, 0 if not invert else 1) - ws.ws2811_channel_t_brightness_set(self._channel, brightness) - ws.ws2811_channel_t_strip_type_set(self._channel, strip_type) - - # Initialize the controller - ws.ws2811_t_freq_set(self._leds, freq_hz) - ws.ws2811_t_dmanum_set(self._leds, dma) - - # Grab the led data array. - self._led_data = _LED_Data(self._channel, num) - - # Substitute for __del__, traps an exit condition and cleans up properly - atexit.register(self._cleanup) - - def _cleanup(self): - # Clean up memory used by the library when not needed anymore. - if self._leds is not None: - ws.delete_ws2811_t(self._leds) - self._leds = None - self._channel = None - - def begin(self): - """Initialize library, must be called once before other functions are - called. - """ - resp = ws.ws2811_init(self._leds) - if resp != ws.WS2811_SUCCESS: - message = ws.ws2811_get_return_t_str(resp) - raise RuntimeError('ws2811_init failed with code {0} ({1})'.format(resp, message)) + self.strip = Adafruit_NeoPixel( + self.LED_COUNT, + self.LED_PIN, + self.LED_FREQ_HZ, + self.LED_DMA, + self.LED_INVERT, + self.LED_BRIGHTNESS, + self.LED_CHANNEL + ) + + self.strip.begin() def show(self): """Update the display with the data from the LED buffer.""" - resp = ws.ws2811_render(self._leds) - if resp != ws.WS2811_SUCCESS: - message = ws.ws2811_get_return_t_str(resp) - raise RuntimeError('ws2811_render failed with code {0} ({1})'.format(resp, message)) + self.strip.show() def setPixelColor(self, n, color): """Set LED at position n to the provided 24-bit color value (in RGB order). """ - self._led_data[n] = color + self.strip.setPixelColor(n, color) def setPixelColorRGB(self, n, red, green, blue, white = 0): """Set LED at position n to the provided red, green, and blue color. Each color component should be a value from 0 to 255 (where 0 is the lowest intensity and 255 is the highest intensity). """ - self.setPixelColor(n, Color(red, green, blue, white)) + self.strip.setPixelColor(n, Color(red, green, blue, white)) def setBrightness(self, brightness): """Scale each LED in the buffer by the provided brightness. A brightness of 0 is the darkest and 255 is the brightest. """ - ws.ws2811_channel_t_brightness_set(self._channel, brightness) + self.strip.setBrightness(brightness) def getBrightness(self): """Get the brightness value for each LED in the buffer. A brightness of 0 is the darkest and 255 is the brightest. """ - return ws.ws2811_channel_t_brightness_get(self._channel) + return self.strip.getBrightness() def getPixels(self): """Return an object which allows access to the LED display data as if it were a sequence of 24-bit RGB values. """ - return self._led_data + return self.strip.getPixels() def numPixels(self): """Return the number of pixels in the display.""" - return ws.ws2811_channel_t_count_get(self._channel) + return self.LED_COUNT def getPixelColor(self, n): """Get the 24-bit RGB color value for the LED at position n.""" - return self._led_data[n] + return self.strip.getPixelColor(n) def Color(red, green, blue, white = 0): @@ -123,39 +77,3 @@ def Color(red, green, blue, white = 0): and 255 is the highest intensity. """ return (white << 24) | (red << 16)| (green << 8) | blue - - -class _LED_Data(object): - """Wrapper class which makes a SWIG LED color data array look and feel like - a Python list of integers. - """ - def __init__(self, channel, size): - self.size = size - self.channel = channel - - def __getitem__(self, pos): - """Return the 24-bit RGB color value at the provided position or slice - of positions. - """ - # Handle if a slice of positions are passed in by grabbing all the values - # and returning them in a list. - if isinstance(pos, slice): - return [ws.ws2811_led_get(self.channel, n) for n in xrange(*pos.indices(self.size))] - # Else assume the passed in value is a number to the position. - else: - return ws.ws2811_led_get(self.channel, pos) - - def __setitem__(self, pos, value): - """Set the 24-bit RGB color value at the provided position or slice of - positions. - """ - # Handle if a slice of positions are passed in by setting the appropriate - # LED data values to the provided values. - if isinstance(pos, slice): - index = 0 - for n in xrange(*pos.indices(self.size)): - ws.ws2811_led_set(self.channel, n, value[index]) - index += 1 - # Else assume the passed in value is a number to the position. - else: - return ws.ws2811_led_set(self.channel, pos, value) |