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

Dependents:   WS2812_out_of_specification_demo

WS2812.cpp

Committer:
kenjiArai
Date:
2020-03-20
Revision:
6:583738208b96
Parent:
5:a07522fe36d4

File content as of revision 6:583738208b96:

/*
    Modified by Kenji Arai / JH1PJL
        March 20th, 2020
 */

#include "WS2812.h"

WS2812::WS2812(PinName mosi, PinName miso, PinName sclk, int size)
    : __spi(mosi, miso, sclk)
{
    __size = size;
    __spi.format(SPIBPF,0);
    __spi.frequency(SPICLK);
     __mode = OFF;      // 0=off,1=use global,2=per pixel
     __br = 0xFF;       // set global Brightness to full
}

WS2812::~WS2812() {;}

void WS2812::write(int buf[])
{
    // for each of the data points in the buffer
    for (int i = 0; i < __size ; i++) {
        __write(buf[i]);
    }
}

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++) {
        int color_one = 0x0;
        // index and extract color fields from IIRRGGBB buf[]
        // 0 = blue, 1 = green, 2 = red, 3 = brightness
        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 color)
{
    int color_one = ( __br << 24) | color;
    // for each of the data points in the buffer
    for (int i = 0; i < __size ; i++) {
        __write(color_one);
    }
}

void WS2812::set_brightness_mode(BrightnessControl mode)
{
     __mode = mode;
}

void WS2812::set_brightness(unsigned char br)
{
     __br = br;
}

void WS2812::__write(int color)
{
    // 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] = (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;
    }
    // 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;
    }
    // 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,
    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);
        }
    }
}