Reconsidered input pin and NC pin for SPI. Modified several functions interface and its contents.

Dependents:   WS2812_out_of_specification_demo

Revision:
6:583738208b96
Parent:
5:a07522fe36d4
--- a/WS2812.cpp	Mon Aug 18 13:25:57 2014 +0000
+++ b/WS2812.cpp	Fri Mar 20 06:46:11 2020 +0000
@@ -1,20 +1,21 @@
+/*
+    Modified by Kenji Arai / JH1PJL
+        March 20th, 2020
+ */
+
 #include "WS2812.h"
 
-WS2812::WS2812(PinName d, int size) : __spi(d, NC, NC)
+WS2812::WS2812(PinName mosi, PinName miso, PinName sclk, int size)
+    : __spi(mosi, miso, sclk)
 {
     __size = size;
     __spi.format(SPIBPF,0);
     __spi.frequency(SPICLK);
-    __use_II = 0; // 0=off,1=use global,2=per pixel
-    __II = 0xFF; // set global intensity to full
+     __mode = OFF;      // 0=off,1=use global,2=per pixel
+     __br = 0xFF;       // set global Brightness to full
 }
 
-
-WS2812::~WS2812()
-{
-
-}
-
+WS2812::~WS2812() {;}
 
 void WS2812::write(int buf[])
 {
@@ -24,100 +25,80 @@
     }
 }
 
-
 void WS2812::write_offsets(int buf[], int r_offset, int g_offset, int b_offset)
 {
     // for each of the data points in the buffer
     for (int i = 0; i < __size ; i++) {
-
-        unsigned int argb = 0x0;
-        // index and extract colour fields from IIRRGGBB buf[]
+        int color_one = 0x0;
+        // index and extract color fields from IIRRGGBB buf[]
         // 0 = blue, 1 = green, 2 = red, 3 = brightness
-        argb |=  (buf[(i+b_offset)%__size] & 0x000000FF);
-        argb |= ((buf[(i+g_offset)%__size] & 0x0000FF00));
-        argb |= ((buf[(i+r_offset)%__size] & 0x00FF0000));
-        argb |= (buf[i] & 0xFF000000);
-        __write(argb);
+        color_one |= (buf[(i+b_offset)%__size] & 0x000000ff);
+        color_one |= (buf[(i+g_offset)%__size] & 0x0000ff00);
+        color_one |= (buf[(i+r_offset)%__size] & 0x00ff0000);
+        color_one |= (buf[i] & 0xff000000);
+        __write(color_one);
     }
 }
 
-
-
-
-void WS2812::setAll(int colour)
+void WS2812::setAll(int color)
 {
+    int color_one = ( __br << 24) | color;
     // for each of the data points in the buffer
     for (int i = 0; i < __size ; i++) {
-        __write(colour);
-    }
-}
-
-
-void WS2812::useII(int d)
-{
-    if (d > 0) {
-        __use_II = d;
-    } else {
-        __use_II = 0;
+        __write(color_one);
     }
 }
 
-
-void WS2812::setII(unsigned char II)
+void WS2812::set_brightness_mode(BrightnessControl mode)
 {
-    __II = II;
+     __mode = mode;
 }
 
-
+void WS2812::set_brightness(unsigned char br)
+{
+     __br = br;
+}
 
 void WS2812::__write(int color)
 {
-
-    // Outut format : GGRRBB
-    // Inout format : IIRRGGBB
-    unsigned char agrb[4] = {0x0, 0x0, 0x0, 0x0};
-
-    unsigned char sf; // scaling factor for  II
-
-    // extract colour fields from incoming
+    // Input format(color)  :   GGRRBB
+    // Output format(agrb)  : IIRRGGBB
+    unsigned char agrb[4];
+    unsigned char sf;           // scaling factor for  II
+    // extract color fields from incoming
     // 0 = blue, 1 = red, 2 = green, 3 = brightness
-    agrb[0] = color & 0x000000FF;
-    agrb[1] = (color & 0x00FF0000) >> 16;
-    agrb[2] = (color & 0x0000FF00) >> 8;
-    agrb[3] = (color & 0xFF000000) >> 24;
-
-    // set and intensity scaling factor (global, per pixel, none)
-    if (__use_II == 1) {
-        sf = __II;
-    } else if (__use_II == 2) {
+    agrb[0] = (unsigned char)color;
+    agrb[1] = (unsigned char)((color & 0x00ff0000) >> 16);
+    agrb[2] = (unsigned char)((color & 0x0000ff00) >>  8);
+    agrb[3] = (unsigned char)((color & 0xff000000) >> 24);
+    // set and intensity scaling factor (global, per pixel, none = Max)
+    if ( __mode == GLOBAL) {
+        sf =  __br;
+    } else if ( __mode == PER_PIXEL) {
         sf = agrb[3];
     } else {
-        sf = 0xFF;
+        sf = 0xff;
     }
-
-    // Apply the scaling factor to each othe colour components
+    // Input format(agrb[4])  : IIRRGGBB
+    // Output format(agrb[3]) : RR*II, GG*II, BB*II
+    // Apply the scaling factor to each on the color components
     for (int clr = 2; clr >= 0; clr--) {
-        agrb[clr] = ((agrb[clr] * sf) >> 8);
+        agrb[clr] = (agrb[clr] * sf) >> 8;
     }
-
-    // For each colour component G,R,B
+    // For each color component G,R,B
     // shift out the data 7..0, writing a SPI frame per bit
     // green=2,red=1,blue=0,
-    for (int clr = 2; clr >= 0; clr--) {
-        for (int bit = 7 ; bit >= 0 ; bit--) {
-            if (agrb[clr] & (0x1 << bit)) {
+    char bit_ptn[8] = {1, 2, 4, 8, 16, 32, 64, 128};
+    for (int32_t clr = 2; clr >= 0; clr--) {
+        unsigned char dt = agrb[clr];
+        for (int32_t bit = 7 ; bit >= 0 ; bit--) {
+            if (dt & bit_ptn[bit]) {
                 __spi.write(WS1);
             } else {
                 __spi.write(WS0);
             }
+            // debug purpose
+            //wait_us(30);
         }
     }
 }
-
-
-
-
-
-
-
-