Suzu Tomo / Mbed OS 2020_ChristmasLED

Dependencies:   WS2812B_SPI

Revision:
0:943dfa56009a
diff -r 000000000000 -r 943dfa56009a LED.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LED.h	Sat Nov 07 13:40:03 2020 +0000
@@ -0,0 +1,242 @@
+#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;
+
+}
\ No newline at end of file