Cubic Hand project for EECS 249A course.

Dependencies:   MMA8451Q TSI cc3000_hostdriver_mbedsocket NVIC_set_all_priorities mbed Multi_WS2811

Revision:
16:a3de0c0dbe33
Parent:
12:df94d17b5bee
Child:
20:c2bc970bbff8
diff -r c701f1122797 -r a3de0c0dbe33 ledCube.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ledCube.cpp	Mon Dec 08 03:28:50 2014 +0000
@@ -0,0 +1,229 @@
+/*
+ * Neopixel LED Cube library
+ * by Robert Bui and Jose Oyola
+ * UC Berkeley 2014
+ */
+
+#include "main.h"
+#include "mbed.h"
+#include "WS2811.h"
+#include "Colors.h"
+#include "TSISensor.h"
+#include "MMA8451Q.h"
+#include "ledCube.h"
+
+
+#define MMA8451_I2C_ADDRESS (0x1d<<1)
+
+#define PANEL1             0
+#define PANEL2             1
+#define PANEL3             2
+#define nLEDs              60//MAX_LEDS_PER_STRIP;
+#define nROWs              10
+#define nCOLs              10  
+#define DATA_OUT_PIN1      2 // PTD2
+#define DATA_OUT_PIN2      3 // PTD3
+#define DATA_OUT_PIN3      4 // PTD3  
+
+
+LedCube::LedCube():X(0),Y(1),Z(2),ledStrip1(nLEDs, DATA_OUT_PIN1),ledStrip2(nLEDs, DATA_OUT_PIN2),ledStrip3(nLEDs, DATA_OUT_PIN3)
+{
+}
+
+LedCube::~LedCube()
+{
+}
+
+void LedCube::Init(int x, int y, int z)
+{
+    size = 2;
+    prevSize = size;
+    pos[X] = prevPos[X] = x;
+    pos[Y] = prevPos[Y] = y;
+    pos[Z] = prevPos[Z] = z;
+    r = 255*0.1;
+    g = 255*0.1;
+    b = 255*0.1;
+
+    brightness = 0.05;
+    saturation = 1.0;
+    
+    ledStrip1.begin();
+    ledStrip2.begin();
+    ledStrip3.begin();
+}
+
+int LedCube::getLedIndex(int panel, int x, int y) {
+    if (panel == PANEL1) {
+        if (y % 2 == 0) {
+            return nCOLs*2 * y + x;
+        }
+        else {
+            return nCOLs*2 * y + nCOLs + ((nCOLs - 1) - x);
+        }
+    }
+
+    if (panel == PANEL2) {
+        if (y % 2 == 0) {
+            return nCOLs*2 * y + nCOLs + x;
+        }
+        else {
+            return nCOLs*2 * y + ((nCOLs - 1) - x);
+        }
+    }
+    
+    if (panel == PANEL3) {
+        if (y % 2 == 0) {
+            return nCOLs * y + x;
+        }
+        else {
+            return nCOLs * y + ((nCOLs - 1) - x);
+        }
+    }
+    
+    else return -1;
+} 
+
+void LedCube::updateLEDs(bool on, int size, int x, int y, int z) {
+    //Panel 1
+    if(y == 0) {
+        for(int i = x; i < x + size; i++) {
+            for(int j = z; j < z + size; j++) {
+                int led = getLedIndex(PANEL1, i, j);
+                if(on) {
+                    ledStrip1.setPixelColor(led, r, g, b);
+                } else {
+                    ledStrip1.setPixelColor(led, 0, 0, 0);
+                }
+            }
+        }
+    }
+    
+    //Panel 2
+    if(x + size - 1 == (nCOLs - 1)) {
+        for(int i = y; i < y + size; i++) {
+            for(int j = z; j < z + size; j++) {
+                int led = getLedIndex(PANEL2, i, j);
+                if(on) {
+                    if(z < 3) ledStrip1.setPixelColor(led, r, g, b);
+                    else ledStrip2.setPixelColor(led, r, g, b);
+                } else {
+                    if (z < 3) ledStrip1.setPixelColor(led, 0, 0, 0);
+                    ledStrip2.setPixelColor(led, 0, 0, 0);
+                }
+            }
+        }
+    }
+    
+    //Panel 3
+    if(z + size - 1 == (nCOLs - 1)) {
+        for(int i = x; i < x + size; i++) {
+            for(int j = y; j < y + size; j++) {
+                int led = getLedIndex(PANEL3, i, j);
+                if(on) {
+                    ledStrip3.setPixelColor(led, r, g, b);
+                } else {
+                    ledStrip3.setPixelColor(led, 0, 0, 0);
+                }
+            }
+        }
+    }
+}
+
+
+void LedCube::cubeUpdate() {
+    updateLEDs(false, prevSize, prevPos[X], prevPos[Y], prevPos[Z]); //Turn off LEDs from previous state
+    updateLEDs(true, size, pos[X], pos[Y], pos[Z]); //Turn on new LEDs for new state
+    prevSize = size;
+    prevPos[X] = pos[X];
+    prevPos[Y] = pos[Y];
+    prevPos[Z] = pos[Z];
+    ledStrip1.show();
+    ledStrip2.show();
+    ledStrip3.show();
+    ledStrip1.startDMA();
+    ledStrip2.startDMA();
+    ledStrip3.startDMA();
+    printf("Position: %d, %d, %d \t Size: %d\r\n", pos[X], pos[Y], pos[Z], size);
+}
+
+int LedCube::move(int deltaX, int deltaY, int deltaZ) {
+    int retVal = -1;
+    //Moving in X direction
+    if(pos[Y] == 0 || pos[Z] + size - 1 == (nCOLs - 1)) { //Making sure square is "stuck" to panel 1 or 3
+        if((pos[X] + size + deltaX - 1) < nCOLs && (pos[X] + deltaX) >= 0) {
+            pos[X] += deltaX;
+            if (deltaX != 0) retVal = 1;
+            printf("Here1, %d\r\n",retVal);
+        }
+    }
+    
+    //Moving in Y direction
+    if(pos[X] + size - 1 == (nCOLs - 1) || pos[Z] + size - 1 == (nCOLs - 1)) {//Making sure square is "stuck" to panel 2 or 3
+        if((pos[Y] + size + deltaY - 1) < nCOLs && (pos[Y] + deltaY) >= 0) {
+            pos[Y] += deltaY;
+            if (deltaY != 0) retVal = 1;
+            printf("Here2, %d\r\n",retVal);
+        }
+    }
+    
+    //Moving in Z direction
+    if(pos[X] + size - 1 == (nCOLs - 1) || pos[Y] == 0) {//Making sure square is "stuck" to panel 1 or 2
+        if((pos[Z] + size + deltaZ - 1) < nCOLs && (pos[Z] + deltaZ) >= 0) {
+            pos[Z] += deltaZ;
+            if (deltaZ != 0) retVal = 1;
+            printf("Here3, %d\r\n",retVal);
+        }
+    }
+    return retVal;
+    //cubeUpdate();
+}
+
+void LedCube::changeColor(float hue){
+    HSBtoRGB(hue, saturation, brightness, &r, &g, &b);
+}
+
+void LedCube::changeSize(int newSize) {
+    if((pos[X] + newSize) < nCOLs && (pos[Y] + newSize) < nCOLs && (pos[Z] + newSize) < nCOLs) {
+        size = newSize;
+    }
+}
+
+
+
+
+
+
+
+/*
+static void move( int delta_x, int delta_y, int old_size, int new_size)
+{
+    for( int i = pos_y; i < pos_y + old_size; i++){
+        for( int j= pos_x; j < pos_x + old_size; j++){
+            int pos_off = matrixtolinear(i,j);
+            if( pos_off >= nLEDs){lightStrip2.setPixelColor(pos_off-nLEDs, 0, 0, 0);}
+            else 
+            {lightStrip1.setPixelColor(pos_off, 0, 0, 0);}
+            
+            }
+        }
+        if ( (pos_y + (new_size-1) + delta_y < nROWs) && (pos_y + delta_y ) >= 0 ) {
+        pos_y = pos_y + delta_y;}
+        if ( (pos_x + (new_size-1) + delta_x < nCOLs ) && (pos_x + delta_x ) >= 0) {
+        pos_x = pos_x + delta_x;}
+         
+    for( int i = pos_y; i < pos_y + new_size; i++){
+        for( int j= pos_x; j < pos_x + new_size; j++){
+            int pos_on = matrixtolinear(i,j);
+            if( pos_on >= nLEDs){lightStrip2.setPixelColor(pos_on-nLEDs, 0, g, 0);}
+            else
+            {lightStrip1.setPixelColor(pos_on, 0, g, 0);}
+            }
+        }
+    
+    lightStrip1.show();
+    lightStrip2.show();
+    lightStrip1.startDMA();
+    lightStrip2.startDMA();
+}
+*/
\ No newline at end of file