WS2812

Dependents:   pelion-example-common

Files at this revision

API Documentation at this revision

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;