Fork of WS2812 library for experimenting with Nucleo board
Fork of WS2812 by
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;
