demo, add text and string

Dependencies:   NeoStrip mbed

Fork of Led_demo by ze chen

Revision:
3:eecf2e4bf4f1
Parent:
0:4c7b2475af40
--- a/main.cpp	Fri Apr 25 14:32:24 2014 +0000
+++ b/main.cpp	Mon Apr 28 02:17:00 2014 +0000
@@ -1,135 +1,158 @@
-/*
- * Adafruit NeoPixel 8x8 matrix example
- *
- * This program displays a couple simple patterns on an 8x8 NeoPixel matrix.
- *
- * 3 buttons are used for DigitalIns, 2 control the brightness up and down,
- * and the third switches patterns
- */
-
 #include "mbed.h"
 #include "NeoStrip.h"
 #include "text.h"
 #define N 128
 #define PATTERNS 4
 #include <string>
-int hueToRGB(float h);
-void pattern0();
-void pattern1();
-void pattern2();
+#include "helper.h"
+
+
+NeoStrip strip(p18, N);
+
+//callback function for incoming serial communication
+void callback();
+//necessary functions for distanceDemo and bikeDemo
+void blinkOn();
+void blinkOff();
+void patternLeft();
+void patternRight();
+void patternStop();
+void patternNone();
+void distanceDemo();
+void rainBow();
+void emojiDemo();
+//necessary functions for Animation Demo
 void fillBlue();
 void progressBar(bool);
-int getIndex(int, int);
 void putChar(int row, int col, char ch, int color);
 void putString(std::string);
-void loopAscii(int count);
+void loopAscii();
 void MarioBox();
 void drawBox(int row);void emptyBox(int row);
 void putCharV(int row, int col, char ch, int color);
-// array of function pointers to the various patterns
-//void (*patterns[])(void) = {&pattern0, &pattern1, &pattern2};
+int getIndex(int r, int c);
+
+
 
-NeoStrip strip(p18, N);
-DigitalIn b1(p20); // brightness up
-DigitalIn b2(p19); // brightness down
-DigitalIn b3(p21); // next pattern
+//hardware initilization
+Serial device(p13,p14);
+AnalogIn ir(p20);
+Serial pc(USBTX,USBRX);
 
-// timer used for debugging
-Timer timer;
+//variable initilization
+Timer t;
 int chars[128];
+std::string emoji[9] = {"*_*", "^_^", "$_$", ">_<", "=_=", "+_=", ":)", ":(", ":3"};
+void (*patterns[])(void) = {&patternLeft, &patternRight, &patternStop, &patternNone};
+int bikeDir;
 char ch = 'A';
 
 int main()
-{
-    
-    std::string emoji[9] = {"*_*", "^_^", "$_$", ">_<", "=_=", "+_=", ":)", ":(", ":3"};
+{    
+//    std::string emoji[9] = {"*_*", "^_^", "$_$", ">_<", "=_=", "+_=", ":)", ":(", ":3"};
     float bright = 0.2; // 20% is plenty for indoor use
     strip.setBrightness(bright);    // set default brightness
-    int count = 0;
-    while (true)
-    {
-        timer.reset(); // use a timer to measure loop execution time for debugging purposes
-        timer.start(); // for this application, the main loop takes approximately 3ms to run
-progressBar(true);
-wait(5);
-progressBar(false);
+
+    //setup serial device
+    device.baud(57600);    
+    device.attach(&callback);
 
-//  fillBlue();
+    //wait until phone is connected
+    while(1){
+        if(device.readable()) break; 
+    }
+    pc.printf("Device connected\n");
 
-    // write character
-//  MarioBox();
-//  displayEmoji();
-//  loopAscii(count);
-//  ch+=2;
-//  putString(emoji[count%9]);
-//  count++;
-    wait(2);
-        timer.stop();
-        // print loop time if b3 is pressed     
-        wait_ms(10);
+    //ready for commands, clear serael buffer
+    while(device.readable()) device.getc();
+    pc.printf("Device ready for commands;\n");
+    //phone is disconnected, flash red light warning
+    while(1){
+        if(t.read_ms()>3000){
+            pc.printf("time passed i %d\n",t.read_ms());
+            blinkOn();
+        //progressBar(true);
+            wait_ms(200);
+            blinkOff();
+      //  wait_ms(200);
+        }
+        wait(5);
     }
+
+
+
 }
 
-// pattern0 displays a static image
-void pattern0()
-{
-    fillBlue();
-    // write character
-    int color = 0xffff00;   
-    putChar(0,0,'G',color);
-    putChar(0,6,'O',color);     
-    strip.setPixels(0, N, chars);
+
+void callback(){   
+    pc.printf("new commands arrive \n");
+    t.reset();
+    switch(device.getc()){
+
+     case PhoneDemo:
+     pc.printf("Lost Phone Demo\n");
+     while(device.readable()) device.getc();
+       //reply ack
+     device.putc('P');
+     t.start();
+     break;
+
+     case MusicDemo:
+     pc.printf("Music Demo\n");
+     rainBow();
+     //progressBar(true);
+     //progressBar(false);
+     break;
+
+     case DistanceDemo:
+     pc.printf("Distance Demo\n");
+     device.putc('D');
+     distanceDemo();  
+     break;
+
+     case AnimationOneDemo:
+     MarioBox();
+     break;
+
+     case AnimationTwoDemo:
+     pc.printf("Emoji Demo\n");
+     emojiDemo();
+     break;
+
+    case AnimationThreeDemo:
+    pc.printf("ascii demo\n");
+    loopAscii();
+     break;
+
+ case LEFT:
+ pc.printf("left arrow\n");
+ patternLeft();
+ break;
+
+ case RIGHT:
+ pc.printf("right arrow\n");
+
+ patternRight();
+ break;       
+
+ case STOP:
+ pc.printf("stop\n");
+
+ patternStop();
+ break;
+
+ default:
+ break;
 }
 
-// display a shifting rainbow, all colors have maximum
-// saturation and value, with evenly spaced hue
-void pattern1()
-{
-    static float dh = 360.0 / N;
-    static float x = 0;
 
-    for (int i = 0; i < N; i++)
-        strip.setPixel(i, hueToRGB((dh * i) - x));
-    
-    x += 1;
-    if (x > 360)
-        x = 0;
 }
 
 
 
-// Converts HSV to RGB with the given hue, assuming
-// maximum saturation and value
-int hueToRGB(float h)
-{
-    // lots of floating point magic from the internet and scratching my head
-    float r, g, b;
-    if (h > 360)
-        h -= 360;
-    if (h < 0)
-        h += 360;
-    int i = (int)(h / 60.0);
-    float f = (h / 60.0) - i;
-    float q = 1 - f;
-    
-    switch (i % 6)
-    {
-        case 0: r = 1; g = f; b = 0; break;
-        case 1: r = q; g = 1; b = 0; break;
-        case 2: r = 0; g = 1; b = f; break;
-        case 3: r = 0; g = q; b = 1; break;
-        case 4: r = f; g = 0; b = 1; break;
-        case 5: r = 1; g = 0; b = q; break;
-        default: r = 0; g = 0; b = 0; break;
-    }
-    
-    // scale to integers and return the packed value
-    uint8_t R = (uint8_t)(r * 255);
-    uint8_t G = (uint8_t)(g * 255);
-    uint8_t B = (uint8_t)(b * 255);
+
 
-    return (R << 16) | (G << 8) | B;
-}
+
 
 void fillBlue(){
     for(int i = 0; i < N; i++){
@@ -137,87 +160,85 @@
     }   
 }
 
-int getIndex(int r, int c){
-    if(c < 8){
-        return (r * 8 + c);
-    }else if(c > 15){
-        return -1;      
-    }
-    else{
-        return (64 + r * 8 + (c-8));
-    }
-}
-
-
 void putChar(int row, int col, char ch, int color){
-        for(int r = 0; r < 8; r++){
-            for(int c = 0; c < 6; c++){
-                if(fontdata_6x8[ch * 48 + r * 6 +c]){
-                    int idx = getIndex(row+r, col+c);
-                    if(idx != -1)
-                        chars[idx] = color; 
-                }
+    for(int r = 0; r < 8; r++){
+        for(int c = 0; c < 6; c++){
+            if(fontdata_6x8[ch * 48 + r * 6 +c]){
+                int idx = getIndex(row+r, col+c);
+                if(idx != -1)
+                    chars[idx] = color; 
             }
+        }
     }
 }
 void putCharV(int row, int col, char ch, int color){
-        for(int r = 0; r < 8; r++){
-            for(int c = 0; c < 6; c++){
-                if(fontdata_6x8[ch * 48 + r * 6 +c]){
-                    int idx = (row + r) *8 +( col +c);
-                    if(idx != -1)
-                        chars[idx] = color; 
-                }
+    for(int r = 0; r < 8; r++){
+        for(int c = 0; c < 6; c++){
+            if(fontdata_6x8[ch * 48 + r * 6 +c]){
+                int idx = (row + r) *8 +( col +c);
+                if(idx != -1)
+                    chars[idx] = color; 
             }
+        }
     }
 }
 
 void MarioBox(){
-        int color = 0xffff00;
-        int red = 0xff0000;
-        
-        drawBox(8);
+    int color = 0xffff00;
+    //    int red = 0xff0000;
+
+    drawBox(8);
+    strip.setPixels(0, N, chars);
+    strip.write();      
+    wait(5);
+
+    for(int i = 1; i < 3; i++){
+        fillBlue();
+        drawBox(8-i);
         strip.setPixels(0, N, chars);
         strip.write();      
-        wait(5);
+        wait(0.3);
+    }       
+    for(int i = 0; i < 3; i++){
+        fillBlue();
+        drawBox(6 + i);
+        strip.setPixels(0, N, chars);
+        strip.write();      
+        wait(0.3);
+    }
+    fillBlue();
+    emptyBox(8);
+    putChar(0,0,'0',color);
+    strip.setPixels(0, N, chars);
+    strip.write();
+    wait(5);    
+    strip.clear();
+    strip.write();
 
-        for(int i = 1; i < 3; i++){
-            fillBlue();
-            drawBox(8-i);
-            strip.setPixels(0, N, chars);
-            strip.write();      
-            wait(0.3);
-        }       
-        for(int i = 0; i < 3; i++){
-            fillBlue();
-            drawBox(6 + i);
-            strip.setPixels(0, N, chars);
-            strip.write();      
-            wait(0.3);
-        }
-        fillBlue();
-        emptyBox(8);
-        putChar(0,0,'0',color);
-        strip.setPixels(0, N, chars);
-        strip.write();
-        wait(30);       
 }
 void putString(std::string str){
     int color = 0xffff00;
     for(int i = 0; i < str.length(); ++i){
-        putChar(0,5*i,str[i], color);       
+        putChar(0,5*i,str[i], color); 
+        strip.setPixels(0, N, chars);
     }   
-    strip.setPixels(0, N, chars);
     strip.write();
-
+    wait_ms(100);
 }
 
-void loopAscii(int count){
+void loopAscii(){
     int color = 0xffff00;
-    putChar(0,0,ch+count,color);
-    putChar(0,6,ch+count+1,color);
-    strip.setPixels(0, N, chars);
-    strip.write();
+    char ch = 'A';
+    int count = 50;
+    
+    for(int i = 0; i < count; i+=2) {
+        putChar(0,0,ch+i,color);
+        putChar(0,7,ch+i+1,color);
+        strip.setPixels(0, N, chars);
+        strip.write();    
+        wait_ms(200);
+    }       
+
 }
 
 void drawBox(int row){
@@ -235,24 +256,190 @@
     int increment;
     int color;
     if(up == true){
-         init = 0;
-         increment = 1;
-         color = 0x122446;
-    }else {
-         init = 15;
-         increment = -1;
-        fillBlue();
-         color = 0x000000;
+       init = 0;
+       increment = 1;
+       color = 0x122446;
+   }else {
+       init = 15;
+       increment = -1;
+       fillBlue();
+       color = 0x000000;
+   }
+
+   for(int x = 0; x < 16 ; x++){
+
+    for (int j = 0; j < 8; j++){
+        index = getIndex(j,init + increment * x);
+        chars[index] = color;
     }
-    
+    strip.setPixels(0, N, chars);
+    strip.write();
+    wait_ms(200);
+}
+}
+
+
+void rainBow(){
+    int index;
+    unsigned int black = 0x000000;
+    unsigned int color[7] = {0x5b00ff,0xff0d19, 0xf0ff03, 0x17ff29, 0x1fffee,0x0d65ff, 0xfb12ff};
+    int init = 0;
+    int increment = 1;
+
     for(int x = 0; x < 16 ; x++){
-        
+        for (int j = 0; j < 8; j++){
+            index = getIndex(j,init + increment * x);
+            chars[index] = color[index%7];            
+        }
+        strip.setPixels(0, N, chars);
+        strip.write();
+        wait_ms(200);
+    }
+
+    for(int x = 15; x >= 0 ; x--){
         for (int j = 0; j < 8; j++){
             index = getIndex(j,init + increment * x);
-            chars[index] = color;
+            chars[index] = black;            
+        }
+
+        strip.setPixels(0, N, chars);
+        strip.write();
+        wait_ms(200);
+    }
+
+}   
+
+
+
+void patternLeft()
+{
+    for(int j=0;j<3;j++){
+        for (int i = 0; i < N; i++)
+        {
+            if (maskLeft128[i] == 1)
+                chars[i]=0x00FF00;
+            else
+                chars[i]=0x000000;
+        }
+    
+        strip.setPixels(0, N, chars);
+        strip.write();
+        wait_ms(200);
+        strip.clear();
+        strip.write();
+        wait_ms(200);
+
+    }
+}
+
+void patternRight()
+{
+    for(int j=0;j<3;j++){
+        for (int i = 0; i < N; i++)
+        {
+            if (maskRight128[i] == 1)
+                chars[i]=0x00FF00;
+            else
+                chars[i]=0x000000;
         }
+        strip.setPixels(0, N, chars);
+        strip.write();
+        wait_ms(200);
+        strip.clear();
+        strip.write();
+        wait_ms(200);
+
+    }
+
+}
+
+void patternStop()
+{
+    for(int j=0;j<3;j++){
+        for (int i = 0; i < N; i++)
+        {
+            if (maskStop128[i] == 1)
+                chars[i]=0xFF0000;
+            else
+                chars[i]=0x000000;
+        }
+        strip.setPixels(0, N, chars);
+        strip.write();
+        wait_ms(200);
+        strip.clear();
+        strip.write();
+        wait_ms(200);
+
+    }
+
+}
+
+void patternNone()
+{
+    strip.clear();
+}
+
+
+
+void blinkOn()
+{
+    strip.clear();
+    for (int i = 0; i < N; i++)
+    {
+        chars[i]=0xFF0000;
+    }
+
     strip.setPixels(0, N, chars);
     strip.write();
-        wait(1);
+    wait_ms(200);
+}
+
+void blinkOff()
+{
+    strip.clear();
+    for (int i = 0; i < N; i++)
+    {
+        chars[i]=0x000000;
+    }
+    strip.setPixels(0, N, chars);
+    strip.write();
+    wait_ms(200);
+}
+
+
+
+void distanceDemo(){
+    float val = 21/ir;  
+    pc.printf("dist avg=%f\n",val);       
+    
+    if(val<70) {
+        blinkOn();
+        wait_ms(200);
+        blinkOff();
+    }
+
+}
+
+void emojiDemo(){
+     for(int i=0;i<8;i++){
+        putString(emoji[i]);
+        wait_ms(200);
+        strip.write();
+        wait_ms(200);
+        strip.clear();
+        strip.write();
+        wait_ms(200);
+    }    
+}
+
+
+int getIndex(int r, int c){
+    if(c < 8){
+        return (r * 8 + c);
+    }else if(c > 15){
+        return -1;      
+    }
+    else{
+        return (64 + r * 8 + (c-8));
     }
 }
\ No newline at end of file