Nathan Yonkee / Mbed OS DotStar

Fork of DotStar by Suga koubou

Revision:
3:7d7945d4f224
Parent:
2:804574387573
Child:
6:f16ae7276254
diff -r 804574387573 -r 7d7945d4f224 main.cpp
--- a/main.cpp	Thu May 25 01:42:07 2017 +0000
+++ b/main.cpp	Thu Jun 22 12:14:38 2017 -0600
@@ -1,54 +1,80 @@
-/*
- * APA102 (Adafruit DotStar LED Strip)
- */
-
-#include "mbed.h"
-#include "rtos.h"
-
-#define LED_NUM 144
-#define LED_GLOBAL 31 // brightness 0-31
-#define LED_FREQ 500000 // spi
-
-DigitalOut myled(LED1);
-SPI spi(PA_7, PA_6, PA_5);
-
-int led_buf[LED_NUM];
-
-void dotStar () {
-    int i;
-
-    // start frame
-    for (i = 0; i < 4; i ++) {
-        spi.write(0);
-    }
-    // led frame
-    for (i = 0; i < LED_NUM; i ++) {
-        spi.write((7<<5) | LED_GLOBAL);
-        spi.write((led_buf[i] >> 16) & 0xff); // B
-        spi.write((led_buf[i] >> 8) & 0xff); // G
-        spi.write(led_buf[i] & 0xff); // R
-    }
-    // end frame
-    for (i = 0; i < 4; i ++) {
-        spi.write(1);
-    }
-}
-
-int main() {
-    int i, c;
-    int color = 1;
-
-    spi.frequency(LED_FREQ);
-
-    for (;;) {
-        for (i = 0; i < LED_NUM; i ++) {
-            c = ((color + i) % 7) + 1;
-            led_buf[i] = (c & 4 ? 0xff0000 : 0) | (c & 2 ? 0xff00 : 0) | (c & 1 ? 0xff : 0);
-        }
-        dotStar();
-        myled = !myled;
-        color ++;
-        if (color > 7) color = 1;
-        wait(0.2);
-    }
-}
+/*
+ * APA102 (Adafruit DotStar LED Strip)
+ */
+
+#include "mbed.h"
+#include "rtos.h"
+
+#define LED_NUM 146
+#define LED_FREQ 500000 // spi
+
+AnalogIn blueIn(PA_3);
+AnalogIn greenIn(PA_1);
+AnalogIn redIn(PA_0);
+DigitalIn onOff(PA_8);
+DigitalIn stripToggle(PB_1);
+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 i;
+    for (i = 4; i --> 0; line->write(0)) { } // start frame
+    for (i = 0; i < LED_NUM; ++i) {
+        line->write((7<<5) | 31 ); // 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_buf[LED_NUM] = {};
+    int zero_buf[LED_NUM] = {};
+    int i, blue, green, red;
+    int cI = 0;
+    int pattern[4] = {};
+    spiOne.frequency(LED_FREQ);
+    spiTwo.frequency(LED_FREQ);
+    dotStar(&spiOne, led_buf);
+    dotStar(&spiTwo, led_buf);
+
+    const int waitTime = 1000;
+    for (heartbeat.start(callback(blink));; Thread::wait(waitTime)) {
+        blue = static_cast<int>(floor(blueIn.read()*0xff))<< 16;
+        green = static_cast<int>(floor(greenIn.read()*0xff))<< 8;
+        red = floor(redIn.read()*0xff);
+        pattern[0] = green | red;
+        pattern[1] = green | blue;
+        pattern[2] = blue | red;
+        pattern[3] = green| blue | red ;
+        for (i = 0; i < LED_NUM; ++i) {
+            /* c = ((color + i) % 7) + 1; */
+            /* led_buf[i] = (c & 4 ? 0xff0000 : 0) | (c & 2 ? 0xff00 : 0) | (c & 1 ? 0xff : 0); */
+            /* led_buf[i] = even ? gr : gb; */
+            /* led_buf[i] = rb|green; */
+            /* if(!even) led_buf[i] = 0x0f000 | 0xff; */
+            /* else led_buf[i] = green | 0xff; */
+            /* led_buf[i] = led_buf[i] | 0x0f0000; */
+            /* even = !even; */
+            /* cI = (-(~cI & ~(cI >> 1))) & 0b11; */
+            led_buf[i] = pattern[3];
+        }
+        if(stripToggle) {
+            dotStar(&spiOne, led_buf);
+        }
+        dotStar(&spiTwo, led_buf);
+        while (!onOff.read()) {
+            dotStar(&spiTwo, zero_buf);
+            dotStar(&spiOne, zero_buf);
+            Thread::wait(100);
+        }
+    }
+}