Reconsidered input pin and NC pin for SPI. Modified several functions interface and its contents.
Dependents: WS2812_out_of_specification_demo
WS2812.cpp@6:583738208b96, 2020-03-20 (annotated)
- Committer:
- kenjiArai
- Date:
- Fri Mar 20 06:46:11 2020 +0000
- Revision:
- 6:583738208b96
- Parent:
- 5:a07522fe36d4
Reconsidered input pin and NC pin for SPI. Modified several functions interface and its contents.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kenjiArai | 6:583738208b96 | 1 | /* |
kenjiArai | 6:583738208b96 | 2 | Modified by Kenji Arai / JH1PJL |
kenjiArai | 6:583738208b96 | 3 | March 20th, 2020 |
kenjiArai | 6:583738208b96 | 4 | */ |
kenjiArai | 6:583738208b96 | 5 | |
chris | 0:be22a9d4df5f | 6 | #include "WS2812.h" |
chris | 0:be22a9d4df5f | 7 | |
kenjiArai | 6:583738208b96 | 8 | WS2812::WS2812(PinName mosi, PinName miso, PinName sclk, int size) |
kenjiArai | 6:583738208b96 | 9 | : __spi(mosi, miso, sclk) |
chris | 0:be22a9d4df5f | 10 | { |
chris | 0:be22a9d4df5f | 11 | __size = size; |
chris | 0:be22a9d4df5f | 12 | __spi.format(SPIBPF,0); |
chris | 0:be22a9d4df5f | 13 | __spi.frequency(SPICLK); |
kenjiArai | 6:583738208b96 | 14 | __mode = OFF; // 0=off,1=use global,2=per pixel |
kenjiArai | 6:583738208b96 | 15 | __br = 0xFF; // set global Brightness to full |
chris | 0:be22a9d4df5f | 16 | } |
chris | 0:be22a9d4df5f | 17 | |
kenjiArai | 6:583738208b96 | 18 | WS2812::~WS2812() {;} |
chris | 4:b230e85fc5e7 | 19 | |
chris | 4:b230e85fc5e7 | 20 | void WS2812::write(int buf[]) |
chris | 0:be22a9d4df5f | 21 | { |
chris | 0:be22a9d4df5f | 22 | // for each of the data points in the buffer |
chris | 0:be22a9d4df5f | 23 | for (int i = 0; i < __size ; i++) { |
chris | 4:b230e85fc5e7 | 24 | __write(buf[i]); |
chris | 0:be22a9d4df5f | 25 | } |
chris | 0:be22a9d4df5f | 26 | } |
chris | 0:be22a9d4df5f | 27 | |
chris | 5:a07522fe36d4 | 28 | void WS2812::write_offsets(int buf[], int r_offset, int g_offset, int b_offset) |
chris | 5:a07522fe36d4 | 29 | { |
chris | 5:a07522fe36d4 | 30 | // for each of the data points in the buffer |
chris | 5:a07522fe36d4 | 31 | for (int i = 0; i < __size ; i++) { |
kenjiArai | 6:583738208b96 | 32 | int color_one = 0x0; |
kenjiArai | 6:583738208b96 | 33 | // index and extract color fields from IIRRGGBB buf[] |
chris | 5:a07522fe36d4 | 34 | // 0 = blue, 1 = green, 2 = red, 3 = brightness |
kenjiArai | 6:583738208b96 | 35 | color_one |= (buf[(i+b_offset)%__size] & 0x000000ff); |
kenjiArai | 6:583738208b96 | 36 | color_one |= (buf[(i+g_offset)%__size] & 0x0000ff00); |
kenjiArai | 6:583738208b96 | 37 | color_one |= (buf[(i+r_offset)%__size] & 0x00ff0000); |
kenjiArai | 6:583738208b96 | 38 | color_one |= (buf[i] & 0xff000000); |
kenjiArai | 6:583738208b96 | 39 | __write(color_one); |
chris | 5:a07522fe36d4 | 40 | } |
chris | 5:a07522fe36d4 | 41 | } |
chris | 5:a07522fe36d4 | 42 | |
kenjiArai | 6:583738208b96 | 43 | void WS2812::setAll(int color) |
chris | 0:be22a9d4df5f | 44 | { |
kenjiArai | 6:583738208b96 | 45 | int color_one = ( __br << 24) | color; |
chris | 0:be22a9d4df5f | 46 | // for each of the data points in the buffer |
chris | 0:be22a9d4df5f | 47 | for (int i = 0; i < __size ; i++) { |
kenjiArai | 6:583738208b96 | 48 | __write(color_one); |
chris | 0:be22a9d4df5f | 49 | } |
chris | 0:be22a9d4df5f | 50 | } |
chris | 0:be22a9d4df5f | 51 | |
kenjiArai | 6:583738208b96 | 52 | void WS2812::set_brightness_mode(BrightnessControl mode) |
chris | 0:be22a9d4df5f | 53 | { |
kenjiArai | 6:583738208b96 | 54 | __mode = mode; |
chris | 0:be22a9d4df5f | 55 | } |
chris | 0:be22a9d4df5f | 56 | |
kenjiArai | 6:583738208b96 | 57 | void WS2812::set_brightness(unsigned char br) |
kenjiArai | 6:583738208b96 | 58 | { |
kenjiArai | 6:583738208b96 | 59 | __br = br; |
kenjiArai | 6:583738208b96 | 60 | } |
chris | 0:be22a9d4df5f | 61 | |
chris | 0:be22a9d4df5f | 62 | void WS2812::__write(int color) |
chris | 0:be22a9d4df5f | 63 | { |
kenjiArai | 6:583738208b96 | 64 | // Input format(color) : GGRRBB |
kenjiArai | 6:583738208b96 | 65 | // Output format(agrb) : IIRRGGBB |
kenjiArai | 6:583738208b96 | 66 | unsigned char agrb[4]; |
kenjiArai | 6:583738208b96 | 67 | unsigned char sf; // scaling factor for II |
kenjiArai | 6:583738208b96 | 68 | // extract color fields from incoming |
chris | 0:be22a9d4df5f | 69 | // 0 = blue, 1 = red, 2 = green, 3 = brightness |
kenjiArai | 6:583738208b96 | 70 | agrb[0] = (unsigned char)color; |
kenjiArai | 6:583738208b96 | 71 | agrb[1] = (unsigned char)((color & 0x00ff0000) >> 16); |
kenjiArai | 6:583738208b96 | 72 | agrb[2] = (unsigned char)((color & 0x0000ff00) >> 8); |
kenjiArai | 6:583738208b96 | 73 | agrb[3] = (unsigned char)((color & 0xff000000) >> 24); |
kenjiArai | 6:583738208b96 | 74 | // set and intensity scaling factor (global, per pixel, none = Max) |
kenjiArai | 6:583738208b96 | 75 | if ( __mode == GLOBAL) { |
kenjiArai | 6:583738208b96 | 76 | sf = __br; |
kenjiArai | 6:583738208b96 | 77 | } else if ( __mode == PER_PIXEL) { |
chris | 4:b230e85fc5e7 | 78 | sf = agrb[3]; |
chris | 4:b230e85fc5e7 | 79 | } else { |
kenjiArai | 6:583738208b96 | 80 | sf = 0xff; |
chris | 0:be22a9d4df5f | 81 | } |
kenjiArai | 6:583738208b96 | 82 | // Input format(agrb[4]) : IIRRGGBB |
kenjiArai | 6:583738208b96 | 83 | // Output format(agrb[3]) : RR*II, GG*II, BB*II |
kenjiArai | 6:583738208b96 | 84 | // Apply the scaling factor to each on the color components |
chris | 4:b230e85fc5e7 | 85 | for (int clr = 2; clr >= 0; clr--) { |
kenjiArai | 6:583738208b96 | 86 | agrb[clr] = (agrb[clr] * sf) >> 8; |
chris | 4:b230e85fc5e7 | 87 | } |
kenjiArai | 6:583738208b96 | 88 | // For each color component G,R,B |
chris | 4:b230e85fc5e7 | 89 | // shift out the data 7..0, writing a SPI frame per bit |
chris | 0:be22a9d4df5f | 90 | // green=2,red=1,blue=0, |
kenjiArai | 6:583738208b96 | 91 | char bit_ptn[8] = {1, 2, 4, 8, 16, 32, 64, 128}; |
kenjiArai | 6:583738208b96 | 92 | for (int32_t clr = 2; clr >= 0; clr--) { |
kenjiArai | 6:583738208b96 | 93 | unsigned char dt = agrb[clr]; |
kenjiArai | 6:583738208b96 | 94 | for (int32_t bit = 7 ; bit >= 0 ; bit--) { |
kenjiArai | 6:583738208b96 | 95 | if (dt & bit_ptn[bit]) { |
chris | 0:be22a9d4df5f | 96 | __spi.write(WS1); |
chris | 0:be22a9d4df5f | 97 | } else { |
chris | 0:be22a9d4df5f | 98 | __spi.write(WS0); |
chris | 0:be22a9d4df5f | 99 | } |
kenjiArai | 6:583738208b96 | 100 | // debug purpose |
kenjiArai | 6:583738208b96 | 101 | //wait_us(30); |
chris | 0:be22a9d4df5f | 102 | } |
chris | 0:be22a9d4df5f | 103 | } |
chris | 0:be22a9d4df5f | 104 | } |