Suzu Tomo / Mbed OS 2020_ChristmasLED

Dependencies:   WS2812B_SPI

LED.h

Committer:
Suzutomo
Date:
2020-11-07
Revision:
0:943dfa56009a

File content as of revision 0:943dfa56009a:

#include "WS2812B.h"

#define BUF 60
#define BUF2 42

double beatTime = 60/60;
bool LR = false;


int buf[3] = {BUF,BUF,BUF2};
WS2812B tape[2] = {
    WS2812B(PB_0,BUF),
    WS2812B(PC_1,BUF)/*,
    WS2812B(PC_0,BUF2)*/
};

Timer ledT;

volatile double calcBar = 0;

void TempoWait(double beat,bool useF8 = 0)
{
    calcBar += beat;
    if (useF8) while (barClock < calcBar * 24);
    else while (ledT.read() < calcBar * beatTime);
}

void FlowLED(double beat,int type,uint32_t color,bool useF8 = 0)
{
    for (int t = 0; t < 2; t++) tape[t].Clear(buf[t]);
    switch (type) {
        case 0 : // 端から端
            for (int i = 0; i<=BUF; i++) {
                for (int t = 0; t < 2; t++) tape[t].Write(i-1,0x0);
                for (int j = 0; j < 3; j++) for (int t = 0; t < 2; t++) tape[t].Write(i + j,color);
                
                if (useF8) while (barClock < calcBar * 24 + i * beat * 24 / BUF);
                else while (ledT.read() < calcBar * beatTime + i * beat * beatTime / BUF);
            }
            break;

        case 1 : // 端から端
            for (int i = 0; i<=BUF; i++) {
                for (int t = 0; t < 2; t++) tape[t].Write(BUF - i + 1,0x0);
                for (int j = 0; j > -3; j--) for (int t = 0; t < 2; t++) tape[t].Write(BUF - i + j,color);
                
                if (useF8) while (barClock < calcBar * 24 + i * beat * 24 / BUF);
                else while (ledT.read() < calcBar * beatTime + i * beat * beatTime / BUF);
            }
            break;

        case 2 : // 外から中央に
            for (int i = 0; i<=(BUF / 2); i++) {
                for (int t = 0; t < 2; t++) tape[t].Write(i - 1,0x0);
                for (int t = 0; t < 2; t++) tape[t].Write(BUF - i + 1,0x0);
                for (int j = 0; j < 3; j++) {
                    for (int t = 0; t < 2; t++) tape[t].Write(i + j,color);
                    for (int t = 0; t < 2; t++) tape[t].Write(BUF - i - j,color);
                }
                
                if (useF8) while (barClock < calcBar * 24 + i * beat * 24 * 2 / BUF);
                else while (ledT.read() < calcBar * beatTime + i * beat * beatTime * 2 / BUF);
            }
            break;

        case 3 : // 中央から外に
            for (int i = 0; i<=(BUF / 2); i++) {
                for (int t = 0; t < 2; t++) tape[t].Write(BUF / 2 - i + 1,0x0);
                for (int t = 0; t < 2; t++) tape[t].Write(BUF / 2 + i - 1,0x0);
                for (int j = 0; j < 3; j++) {
                    for (int t = 0; t < 2; t++) tape[t].Write(BUF / 2 - i - j,color);
                    for (int t = 0; t < 2; t++) tape[t].Write(BUF / 2 + i + j,color);
                }
                
                if (useF8) while (barClock < calcBar * 24 + i * beat * 24 * 2 / BUF);
                else while (ledT.read() < calcBar * beatTime + i * beat * beatTime * 2 / BUF);
            }
            break;

        case 4 : // まとまって流れる
            for (int i = 0; i<=BUF + 40; i++) {
                //printf("%d\r\n",i);
                for (int j = 0; j<20; j++) {
                    for (int t = 0; t < 2; t++) tape[t].Write(i - 20 + j,tape[t].BrightAdjust(color,(double)j * 1/20/*sin(j * (PI / 10))*/));
                }
                for (int j = 0; j < 20; j++) for (int t = 0; t < 2; t++) tape[t].Write(i - 20 + j,0);
                if (useF8) while (barClock < calcBar * 24 + i * beat * 24 / (BUF + 40));
                else while (barClock < calcBar * 24 + i * beat * 24 / (BUF + 40));
                
            }
            break;
    }
    for (int t = 0; t < 2; t++) tape[t].Clear(BUF);
    calcBar += beat;

}

void FlashLED(double beat,int type,uint32_t color,bool useF8 = 0)
{
    calcBar += beat;
    for (int t = 0; t < 2; t++) tape[t].Clear(BUF);
    switch (type) {
        case 0 :
            int rw = (rand() % 5) + 2;
            int rb = (rand() % 5) + 2;
            for (int i = 0; i<=BUF;) {
                for (int j = 0; j < rw; j++) {
                    if (rw % 2) for (int t = 0; t < 2; t++) tape[t].Write(i + j,color);
                    else for (int t = 0; t < 2; t++) tape[t].Write(i + j,0x0);
                }
                for (int j = 0; j < rb; j++) {
                    if (rw % 2)for (int t = 0; t < 2; t++) tape[t].Write(i + rw + j,0x0);
                    else for (int t = 0; t < 2; t++) tape[t].Write(i + rw + j,color);
                }
                i += rw + rb;
            }
            break;
        case 1 :
            int r = (rand() % (BUF / 2 - BUF / 4));
            for (int i = 0; i<=BUF; i++) {
                if (LR) {
                    if ((i - r > 0) && (i - r < (BUF / 4)))for (int t = 0; t < 2; t++) tape[t].Write(i,color);
                    else for (int t = 0; t < 2; t++) tape[t].Write(i,0x0);
                } else {
                    if ((i - (r + BUF / 2) > 0) && (i - (r + BUF / 2) < (BUF / 4))) for (int t = 0; t < 2; t++) tape[t].Write(i,color);
                    else for (int t = 0; t < 2; t++) tape[t].Write(i,0x0);
                }
            }
            LR = !LR;
            break;
    }

    if (useF8) while (barClock < calcBar * 24);
    else while (ledT.read() < calcBar * beatTime);
    //ws.Clear(BUF);

}

void LightLED(double beat,uint32_t color,bool useF8 = 0)
{
    calcBar += beat;
    for (int t = 0; t < 2; t++) tape[t].Write(color);
    if (useF8) while (barClock < calcBar * 24);
    else while (ledT.read() < calcBar * beatTime);
}

void SendLED(double beat,bool useF8 = 0)
{
    calcBar += beat;
    if (useF8) while (calcBar < calcBar * 24);
    else while (ledT.read() < calcBar * beatTime);
}

void FadeLED(double beat,int mode,uint32_t color,bool useF8 = 0)
{
    for (int i = 1; i <= 48; i++) {
        if (mode == 0) for (int t = 0; t < 2; t++) tape[t].Write(color,i / 48.0);
        if (mode == 1) for (int t = 0; t < 2; t++) tape[t].Write(color,(1.0 - i / 48.0));
        if (useF8) while (barClock < calcBar * 24 + i * beat * 24 / 48);
        else while (ledT.read() < calcBar * beatTime + i * beat * beatTime / 48);
    }
    calcBar += beat;
}

void SendingLED()
{
    while (1) {
        for (int t = 0; t < 2; t++) tape[t].Send();
        wait_us((1000 / 60)*1e3);
    }
}


void FlowLED2(double beat,int type,uint32_t color,int num,bool useF8 = 0)
{
    tape[num].Clear(buf[num]);
    switch (type) {
        case 0 : // 端から端
            for (int i = 0; i<=BUF; i++) {
                tape[num].Write(i-1,0x0);
                for (int j = 0; j < 3; j++) tape[num].Write(i + j,color);
                
                if (useF8) while (barClock < calcBar * 24 + i * beat * 24 / BUF);
                else while (ledT.read() < calcBar * beatTime + i * beat * beatTime / BUF);
            }
            break;

        case 1 : // 端から端
            for (int i = 0; i<=BUF; i++) {
                tape[num].Write(BUF - i + 1,0x0);
                for (int j = 0; j > -3; j--) tape[num].Write(BUF - i + j,color);
                
                if (useF8) while (barClock < calcBar * 24 + i * beat * 24 / BUF);
                else while (ledT.read() < calcBar * beatTime + i * beat * beatTime / BUF);
            }
            break;

        case 2 : // 外から中央に
            for (int i = 0; i<=(BUF / 2); i++) {
                tape[num].Write(i - 1,0x0);
                tape[num].Write(BUF - i + 1,0x0);
                for (int j = 0; j < 3; j++) {
                    tape[num].Write(i + j,color);
                    tape[num].Write(BUF - i - j,color);
                }
                
                if (useF8) while (barClock < calcBar * 24 + i * beat * 24 * 2 / BUF);
                else while (ledT.read() < calcBar * beatTime + i * beat * beatTime * 2 / BUF);
            }
            break;

        case 3 : // 中央から外に
            for (int i = 0; i<=(BUF / 2); i++) {
                tape[num].Write(BUF / 2 - i + 1,0x0);
                tape[num].Write(BUF / 2 + i - 1,0x0);
                for (int j = 0; j < 3; j++) {
                    tape[num].Write(BUF / 2 - i - j,color);
                    tape[num].Write(BUF / 2 + i + j,color);
                }
                
                if (useF8) while (barClock < calcBar * 24 + i * beat * 24 * 2 / BUF);
                else while (ledT.read() < calcBar * beatTime + i * beat * beatTime * 2 / BUF);
            }
            break;

        case 4 : // まとまって流れる
            for (int i = 0; i<=BUF + 40; i++) {
                //printf("%d\r\n",i);
                for (int j = 0; j<20; j++) {
                    tape[num].Write(i - 20 + j,tape[num].BrightAdjust(color,(double)j * 1/20));
                }
                for (int j = 0; j < 20; j++) tape[num].Write(i - 20 + j,0);
                if (useF8) while (barClock < calcBar * 24 + i * beat * 24 / (BUF + 40));
                else while (barClock < calcBar * 24 + i * beat * 24 / (BUF + 40));
                
            }
            break;
    }
    tape[num].Clear(BUF);
    calcBar += beat;

}