demo, add text and string

Dependencies:   NeoStrip mbed

Fork of Led_demo by ze chen

Revision:
0:4c7b2475af40
Child:
1:0d37843b8283
Child:
3:eecf2e4bf4f1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Apr 25 14:32:24 2014 +0000
@@ -0,0 +1,258 @@
+/*
+ * 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();
+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 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};
+
+NeoStrip strip(p18, N);
+DigitalIn b1(p20); // brightness up
+DigitalIn b2(p19); // brightness down
+DigitalIn b3(p21); // next pattern
+
+// timer used for debugging
+Timer timer;
+int chars[128];
+char ch = 'A';
+
+int main()
+{
+    
+    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);
+
+//  fillBlue();
+
+    // 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);
+    }
+}
+
+// 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);
+}
+
+// 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++){
+        chars[i] = 0x122446;
+    }   
+}
+
+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; 
+                }
+            }
+    }
+}
+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; 
+                }
+            }
+    }
+}
+
+void MarioBox(){
+        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(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);       
+    }   
+    strip.setPixels(0, N, chars);
+    strip.write();
+
+}
+
+void loopAscii(int count){
+    int color = 0xffff00;
+    putChar(0,0,ch+count,color);
+    putChar(0,6,ch+count+1,color);
+    strip.setPixels(0, N, chars);
+    strip.write();
+}
+
+void drawBox(int row){
+    for(int i = 0; i < 64; ++i)
+        chars[row*8 + i] = 0x000000;
+    putCharV(row,0,'?',0xffff00);   
+}
+void emptyBox(int row){
+    for(int i = 0; i < 64; ++i)
+        chars[row*8 + i] = 0x000000;
+}
+void progressBar(bool up){
+    int index;
+    int init;
+    int increment;
+    int color;
+    if(up == true){
+         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(1);
+    }
+}
\ No newline at end of file