Simple 8x8 LED Matrix controller which interfaces with a Processing GUI over serial to display sketches

Dependencies:   Multi_WS2811 mbed

Fork of Multi_WS2811_test by Ned Konz

Revision:
33:7973b70d4fab
Parent:
32:7b60b9add4b5
Child:
34:0f1968ca238a
--- a/main.cpp	Fri Nov 14 08:18:35 2014 +0000
+++ b/main.cpp	Sat Nov 15 01:23:58 2014 +0000
@@ -1,64 +1,21 @@
 #include "mbed.h"
 #include "WS2811.h"
-#include "Colors.h"
-#include "TSISensor.h"
-#include "MMA8451Q.h"
-
-#define MMA8451_I2C_ADDRESS (0x1d<<1)
 
 // per LED: 3 * 20 mA = 60mA max
 // 60 LEDs: 60 * 60mA = 3600 mA max
 // 120 LEDs: 7200 mA max
 unsigned const nLEDs = MAX_LEDS_PER_STRIP;
 
-// I/O pin usage
-// PTD0 TPM0 CH0 monitor
-// PTD1 TPM0 CH1 monitor
-// PTD2 data output
-// PTD3 debug output
-
-unsigned const DATA_OUT_PIN1 = 2; // PTD2
-unsigned const DATA_OUT_PIN2 = 3; // PTD3
+unsigned const DATA_OUT_PIN1 = 7; 
+unsigned const DATA_OUT_PIN2 = 0; 
+unsigned const DATA_OUT_PIN3 = 3; 
+unsigned const DATA_OUT_PIN4 = 4; 
+unsigned const DATA_OUT_PIN5 = 5; 
+unsigned const DATA_OUT_PIN6 = 6; 
+unsigned const DATA_OUT_PIN7 = 10; 
+unsigned const DATA_OUT_PIN8 = 11; 
 
 Serial pc(USBTX, USBRX);
-Timer timeRunning;
-
-TSISensor touchSensor;
-MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS);
-PwmOut rled(LED_RED);
-PwmOut gled(LED_GREEN);
-// LED_BLUE is on PTD1
-
-float touchPercentage;
-unsigned frames;
-
-float const minBrite = 0.2;
-float const maxBrite = 0.5;
-float brite;
-
-void readTouchSensor()
-{
-    touchPercentage *= 0.9;
-    touchPercentage += touchSensor.readPercentage() * 0.1;
-    brite = minBrite + (maxBrite - minBrite) * touchPercentage;
-}
-
-// @brief sets different colors in each of the LEDs of a strip
-// @param strip the light strip
-// @param sat saturation, 0.0 - 1.0
-// @param brite brightness, 0.0 - 1.0
-// @param hueShift shift, 0.0 - 1.0 is equivalent to 0 - 360 degrees
-static void showRainbow(WS2811 &strip, float sat, float brite, float hueShift)
-{
-    unsigned nLEDs = strip.numPixels();
-    for (unsigned i = 0; i < nLEDs; i++) {
-        uint8_t r, g, b;
-        float hue = ((float)i / (float)nLEDs) + hueShift;
-        HSBtoRGB(hue, sat, brite, &r, &g, &b);
-        strip.setPixelColor(i, r, g, b);
-    }
-    strip.show();
-}
 
 static void clearScreen(WS2811 &strip)
 {
@@ -72,47 +29,94 @@
 int main(void)
 {
     pc.baud(9600);
+    WS2811 *lightStrip;
     WS2811 lightStrip1(nLEDs, DATA_OUT_PIN1);
     WS2811 lightStrip2(nLEDs, DATA_OUT_PIN2);
-
+    WS2811 lightStrip3(nLEDs, DATA_OUT_PIN3);
+    WS2811 lightStrip4(nLEDs, DATA_OUT_PIN4);    
+    WS2811 lightStrip5(nLEDs, DATA_OUT_PIN5);
+    WS2811 lightStrip6(nLEDs, DATA_OUT_PIN6);
+    WS2811 lightStrip7(nLEDs, DATA_OUT_PIN7);
+    WS2811 lightStrip8(nLEDs, DATA_OUT_PIN8);
+    
     lightStrip1.begin();
     lightStrip2.begin();
-    rled = 1.0;
-    gled = 1.0;
-
-    float sat = 1.0;
-
-    timeRunning.start();
-
+    lightStrip3.begin();
+    lightStrip4.begin();
+    lightStrip5.begin();
+    lightStrip6.begin();
+    lightStrip7.begin();
+    lightStrip8.begin();
 
     uint8_t q = 0;
-    char char_buff[6];
+    char char_buff[10];
+    char curr_char = 0;
+    
     for (;;) {
-        if(pc.readable()){
-            if(pc.getc()==255){
-                while(q < 6){
-                    while(!pc.readable());
-                    char_buff[q] = pc.getc();
-                    pc.putc(char_buff[q]);
-                    if(char_buff[q] == 254)
-                        break;
-                    q++;
-                }
+        /* I have defined a custom UART packet protocol
+         * A general packet may look like: 
+         * array[0]     x-coordinate [0, 31]
+         * array[1]     y-coordinate [0, 15]
+         * array[2]     R (5-bit)
+         * array[3]     G (5-bit)
+         * array[4]     B (5-bit)
+         * array[5]     254 (delimiter)
+         */
+        while(curr_char != 255 && q < 7)
+        {
+            /* If there is UART traffic */
+            if(pc.readable())
+            {
+                curr_char = pc.getc();
+                char_buff[q] = curr_char;
+                q++;
+            }
+        }
+        
+        if((char_buff[0] == 254) && (q >= 5)){
+            switch(int(char_buff[2])){
+            case 0:
+                lightStrip = &lightStrip1;
+                break;
+            case 1:
+                lightStrip = &lightStrip2;
+                break;
+            case 2:
+                lightStrip = &lightStrip3;
+                break;
+            case 3:
+                lightStrip = &lightStrip4;
+                break;
+            case 4:
+                lightStrip = &lightStrip5;
+                break;
+            case 5:
+                lightStrip = &lightStrip6;
+                break;
+            case 6:
+                lightStrip = &lightStrip7;
+                break;
+            case 7:
+                lightStrip = &lightStrip8;
+                break;        
+            default:
+                lightStrip = &lightStrip1;
+                q = 0;
+                break;   
+            }
+            
+            (*lightStrip).setPixelColor(int(char_buff[1]), int(char_buff[3]), int(char_buff[4]), int(char_buff[5]));                    
+            
+            (*lightStrip).show();
+            pc.putc(48+int(char_buff[0]));
+        }
+        else{            
+            //clearScreen(*lightStrip);
+        }
+        q = 0;
+        curr_char = 0;
+        WS2811::startDMA();
 
-                if(q >= 4){
-                    lightStrip1.setPixelColor(int(char_buff[0])+8*char_buff[1], int(char_buff[2]), int(char_buff[3]), int(char_buff[4]));                    
-                    lightStrip1.show();
-                }
-                else{
-                    clearScreen(lightStrip1);
-                }
-                q = 0;
-                WS2811::startDMA();
-            }    
-        }
-
-
-        frames ++;
     }
 }