Nathan Yonkee / Mbed OS DotStar

Fork of DotStar by Suga koubou

main.cpp

Committer:
Nathan Yonkee
Date:
2017-07-02
Revision:
6:f16ae7276254
Parent:
3:7d7945d4f224
Child:
9:c13d60680417

File content as of revision 6:f16ae7276254:

/*
 * APA102 (Adafruit DotStar LED Strip)
 */

#include "mbed.h"
#include "rtos.h"
#include "MPR121.h"

#define LED_NUM 145
#define LED_FREQ 500000 // spi

I2C i2c(PA_10, PA_9);
MPR121 touch_pad(i2c, MPR121::ADDR_VSS);
AnalogIn colorIn(PA_0);
SPI spiOne(PB_5, PB_4, PB_3);
SPI spiTwo(PA_7, PA_6, PA_5);

Thread heartbeat;
void blink() {
    /* for(DigitalOut led(LED2);; Thread::wait(500) ) { */
    /*     led = !led; */
    /* } */
}

void dotStar (SPI *const line, int led_buf[], int brightness = 31) {
    int i;
    for (i = 4; i --> 0; line->write(0)) { } // start frame
        for (i = 0; i < LED_NUM; ++i) {
            line->write((7<<5) | brightness ); // led frame
            line->write((led_buf[i] >> 16) & 0xff); // B
            line->write((led_buf[i] >> 8) & 0xff); // G
            line->write(led_buf[i] & 0xff); // R
        }
        for (i = 0; i < LED_NUM; ++i) {
            line->write((7<<5) | brightness ); // led frame
            line->write((led_buf[i] >> 16) & 0xff); // B
            line->write((led_buf[i] >> 8) & 0xff); // G
            line->write(led_buf[i] & 0xff); // R
        }
    for (i = 4; i --> 0; line->write(1)) { } // end frame
}

int main() {
    int led_buf1[LED_NUM] = {};
    int led_buf2[LED_NUM] = {};
    int blue = 0x0f << 16;
    int green = 0x0f << 8;
    int red = 0x0f;
    for (int i = 0; i < LED_NUM; ++i) {
        led_buf1[i] = green|blue|red;
        led_buf2[i] = led_buf1[i];
    }
    for (int i = 0; i < LED_NUM; ++i) {
        led_buf1[i] = green|blue|red;
        led_buf2[i] = led_buf1[i];
    }
    spiOne.frequency(LED_FREQ);
    spiTwo.frequency(LED_FREQ);
    dotStar(&spiOne, led_buf1);
    dotStar(&spiTwo, led_buf2);
    Thread::wait(1000);

    int pattern[4] = {};
    int old_pattern[4] = {};
    int which_color = 0;
    const int waitTime = 500;
    bool sleeping = false;
    bool set_one = true;
    int offset = 0;
    int colorIndex = 0;
    int colorInput = 0;
    for (heartbeat.start(callback(blink)); ; Thread::wait(waitTime)) {
        offset++;
        if(touch_pad.buttonPressed() == 1){
            which_color++;
            if(which_color > 2) which_color = 0;
            dotStar(&spiTwo, led_buf2, 16);
            dotStar(&spiOne, led_buf1, 16);
        };
        if(touch_pad.buttonPressed() == 2){
            set_one = !set_one;  
            dotStar(&spiTwo, led_buf2, 16);
            dotStar(&spiOne, led_buf1, 16);
        } 
        if (touch_pad.buttonPressed() == 3){
            Thread::wait(1000);
            if (touch_pad.buttonPressed() == 3){ sleeping = true;
                dotStar(&spiTwo, led_buf2, 0);
                dotStar(&spiOne, led_buf1, 0);
            }
        }
        colorInput = floor(colorIn.read()*0xff);
        if(which_color == 2) blue = colorInput << 16;
        else if(which_color == 1) red = colorInput;
        else if(which_color == 0) green = colorInput << 8;
        else green = 0xff << 8;
        pattern[0] = green | red;
        pattern[1] = green | blue;
        pattern[2] = blue | red;
        pattern[3] = green| blue | red ;
        if(set_one){
            for (int i = 0; i < 4; i++) {
                old_pattern[i] = led_buf2[i];
            }
        }
        else{
            for (int i = 0; i < 4; i++) {
                old_pattern[i] = led_buf1[i];
            }
        };
        /* cI = offset; */
        for (int i = 0; i < LED_NUM; ++i) {
            /* c = ((color + i) % 7) + 1; */
            /* led_buf1[i] = (c & 4 ? 0xff0000 : 0) | (c & 2 ? 0xff00 : 0) | (c & 1 ? 0xff : 0); */
            /* led_buf1[i] = even ? gr : gb; */
            /* led_buf1[i] = rb|green; */
            /* if(!even) led_buf1[i] = 0x0f000 | 0xff; */
            /* else led_buf1[i] = green | 0xff; */
            /* led_buf1[i] = led_buf1[i] | 0x0f0000; */
            /* even = !even; */
            /* ++cI; */
            /* if(cI > 3) cI = 0; */
            colorIndex = (offset + i) % 3;
            colorIndex = 3;
            if(set_one){
                led_buf1[i] = pattern[colorIndex];
                led_buf2[i] = old_pattern[colorIndex];
            } 
            else{

                led_buf1[i] = old_pattern[colorIndex];
                led_buf2[i] = pattern[colorIndex];
            }
        }
        dotStar(&spiOne, led_buf1);
        dotStar(&spiTwo, led_buf2);
        while (sleeping) {
            dotStar(&spiTwo, led_buf2, 0);
            dotStar(&spiOne, led_buf1, 0);
            Thread::wait(100);
            if (touch_pad.buttonPressed() == 2){
                Thread::wait(1000);
                if (touch_pad.buttonPressed() == 2){
                    sleeping = false;
                    dotStar(&spiOne, led_buf1);
                    dotStar(&spiTwo, led_buf2);
                }
            }

        }

    }
}