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

Dependents:   WS2812_out_of_specification_demo

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?

UserRevisionLine numberNew 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 }