Nathan Yonkee / Mbed OS DotStar

Fork of DotStar by Suga koubou

Revision:
6:f16ae7276254
Parent:
3:7d7945d4f224
Child:
9:c13d60680417
--- a/main.cpp	Sun Jul 02 17:37:21 2017 +0000
+++ b/main.cpp	Sun Jul 02 11:58:22 2017 -0600
@@ -4,15 +4,14 @@
 
 #include "mbed.h"
 #include "rtos.h"
+#include "MPR121.h"
 
-#define LED_NUM 146
+#define LED_NUM 145
 #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);
+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);
 
@@ -23,58 +22,132 @@
     /* } */
 }
 
-void dotStar (SPI *const line, int led_buf[]) {
+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) | 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 = 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_buf[LED_NUM] = {};
-    int zero_buf[LED_NUM] = {};
-    int i, blue, green, red;
-    int cI = 0;
-    int pattern[4] = {};
+    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_buf);
-    dotStar(&spiTwo, led_buf);
+    dotStar(&spiOne, led_buf1);
+    dotStar(&spiTwo, led_buf2);
+    Thread::wait(1000);
 
-    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);
+    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 ;
-        for (i = 0; i < LED_NUM; ++i) {
+        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_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; */
+            /* 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 = (-(~cI & ~(cI >> 1))) & 0b11; */
-            led_buf[i] = pattern[3];
-        }
-        if(stripToggle) {
-            dotStar(&spiOne, led_buf);
+            /* ++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(&spiTwo, led_buf);
-        while (!onOff.read()) {
-            dotStar(&spiTwo, zero_buf);
-            dotStar(&spiOne, zero_buf);
+        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);
+                }
+            }
+
         }
+
     }
 }