Reconsidered input pin and NC pin for SPI. Modified several functions interface and its contents.
Dependents: WS2812_out_of_specification_demo
Diff: WS2812.cpp
- 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); } } } - - - - - - - -