WS2812
Dependents: pelion-example-common
Revision 1:aadbf08c62a2, committed 2015-02-12
- Comitter:
- bridadan
- Date:
- Thu Feb 12 20:20:10 2015 +0000
- Parent:
- 0:0b79cafcb387
- Child:
- 2:6e647820f587
- Commit message:
- Updated documentation and cleaned up code
Changed in this revision
WS2812.cpp | Show annotated file Show diff for this revision Revisions of this file |
WS2812.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/WS2812.cpp Thu Feb 12 19:17:10 2015 +0000 +++ b/WS2812.cpp Thu Feb 12 20:20:10 2015 +0000 @@ -1,15 +1,15 @@ #include "WS2812.h" -WS2812::WS2812(PinName d, int size) : __gpo(d) +WS2812::WS2812(PinName pin, int size, int zeroHigh, int zeroLow, int oneHigh, int oneLow) : __gpo(pin) { __size = size; __transmitBuf = new bool[size * FRAME_SIZE]; - __use_II = 0; // 0=off,1=use global,2=per pixel + __use_II = OFF; __II = 0xFF; // set global intensity to full - __outPin = d; + __outPin = pin; // Default values designed for K64f. Assumes GPIO toggle takes ~0.4us - setDelays(0, 5, 5, 0); + setDelays(zeroHigh, zeroLow, oneHigh, oneLow); } @@ -47,10 +47,10 @@ agrb[2] = color & 0x000000FF; agrb[3] = (color & 0xFF000000) >> 24; - // set and intensity scaling factor (global, per pixel, none) - if (__use_II == 1) { + // set the intensity scaling factor (global, per pixel, none) + if (__use_II == GLOBAL) { sf = __II; - } else if (__use_II == 2) { + } else if (__use_II == PER_PIXEL) { sf = agrb[3]; } else { sf = 0xFF; @@ -80,8 +80,13 @@ void WS2812::write_offsets (int buf[],int r_offset, int g_offset, int b_offset) { int i, j; + // Load the transmit buffer __loadBuf(buf, r_offset, g_offset, b_offset); + // Entering timing critical section, so disabling interrupts + __disable_irq(); + + // Begin bit-banging for (i = 0; i < FRAME_SIZE * __size; i++) { j = 0; if (__transmitBuf[i]){ @@ -104,15 +109,18 @@ } } } + + // Exiting timing critical section, so enabling interrutps + __enable_irq(); } -void WS2812::useII(int d) +void WS2812::useII(BrightnessControl bc) { - if (d > 0) { - __use_II = d; + if (bc > OFF) { + __use_II = bc; } else { - __use_II = 0; + __use_II = OFF; } }
--- a/WS2812.h Thu Feb 12 19:17:10 2015 +0000 +++ b/WS2812.h Thu Feb 12 20:20:10 2015 +0000 @@ -21,12 +21,8 @@ #include "mbed.h" -#define WS1 0x38 -#define WS0 0x30 -#define SPICLK 5000000 #define FRAME_SIZE 24 - //!Library for the WS2812 RGB LED with integrated controller /*! The WS2812 is controller that is built into a range of LEDs @@ -34,23 +30,71 @@ class WS2812 { public: - //!Creates an instance of the class. - /*! - Connect WS2812 address addr using digital pins + enum BrightnessControl { OFF, GLOBAL, PER_PIXEL }; + + /** + * Constructor + * + * @param pin Output pin. Connect to "Din" on the first WS2812 in the strip + * @param size Number of LEDs in your strip + * @param zeroHigh How many NOPs to insert to ensure TOH is properly generated. See library description for more information. + * @param zeroLow How many NOPs to insert to ensure TOL is properly generated. See library description for more information. + * @param oneHigh How many NOPs to insert to ensure T1H is properly generated. See library description for more information. + * @param oneLow How many NOPs to insert to ensure T1L is properly generated. See library description for more information. + * */ - WS2812(PinName d, int size); + WS2812(PinName pin, int size, int zeroHigh, int zeroLow, int oneHigh, int oneLow); /*! Destroys instance. */ ~WS2812(); + /** + * Sets the timing parameters for the bit-banged signal + * + * @param zeroHigh How many NOPs to insert to ensure TOH is properly generated. See library description for more information. + * @param zeroLow How many NOPs to insert to ensure TOL is properly generated. See library description for more information. + * @param oneHigh How many NOPs to insert to ensure T1H is properly generated. See library description for more information. + * @param oneLow How many NOPs to insert to ensure T1L is properly generated. See library description for more information. + * + */ void setDelays(int zeroHigh, int zeroLow, int oneHigh, int oneLow); + /** + * Sets the timing parameters for the bit-banged signal + * + * @param buf Pointer to the PixelArray buffer + * @param r_offset The offset where each each pixel pulls its red component. Wraps to beginning if end is reached. + * @param g_offset The offset where each each pixel pulls its green component. Wraps to beginning if end is reached. + * @param b_offset The offset where each each pixel pulls its blue component. Wraps to beginning if end is reached. + * + */ + void write_offsets(int buf[], int r_offset = 0, int g_offset = 0, int b_offset = 0); + + + /** + * Write the given buffer to the LED strip + * + * @param buf Pointer to the PixelArray buffer + * + */ void write(int buf[]); - void write_offsets(int buf[],int r_offset=0, int g_offset=0, int b_offset=0); - - void useII(int d); + + /** + * Sets the brightness mode + * + * @param bc The brightness control. Defaults to OFF. Possible values include OFF, GLOBAL, and PER_PIXEL + * + */ + void useII(BrightnessControl bc); + + /** + * Sets the global brightness level. + * + * @param II The brightness level. Possible values include 0 - 255 (0x00 - 0xFF). + * + */ void setII(unsigned char II); @@ -60,7 +104,7 @@ int __size; int __zeroHigh, __zeroLow, __oneHigh, __oneLow; unsigned char __II; - int __use_II; + BrightnessControl __use_II; bool *__transmitBuf; void __loadBuf(int buf[],int r_offset=0, int g_offset=0, int b_offset=0); PinName __outPin;