Cubic Hand project for EECS 249A course.

Dependencies:   MMA8451Q TSI cc3000_hostdriver_mbedsocket NVIC_set_all_priorities mbed Multi_WS2811

Committer:
joseoyola
Date:
Mon Dec 08 03:28:50 2014 +0000
Revision:
16:a3de0c0dbe33
Parent:
led.cpp@12:df94d17b5bee
Child:
20:c2bc970bbff8
Tested and fixed bugs in ledCube.cpp. ; ; Tested using 60 LEDs (3 strips of 20) for the bottom of Panels 1 and 2, and moving the square between these two. Also tested changing size as well as color. More tests to follow once cube is built.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
joseoyola 2:45b90e8d7d82 1 /*
joseoyola 16:a3de0c0dbe33 2 * Neopixel LED Cube library
joseoyola 5:41f28ce7f5a9 3 * by Robert Bui and Jose Oyola
joseoyola 2:45b90e8d7d82 4 * UC Berkeley 2014
joseoyola 2:45b90e8d7d82 5 */
joseoyola 2:45b90e8d7d82 6
joseoyola 2:45b90e8d7d82 7 #include "main.h"
joseoyola 2:45b90e8d7d82 8 #include "mbed.h"
joseoyola 5:41f28ce7f5a9 9 #include "WS2811.h"
joseoyola 5:41f28ce7f5a9 10 #include "Colors.h"
joseoyola 5:41f28ce7f5a9 11 #include "TSISensor.h"
joseoyola 5:41f28ce7f5a9 12 #include "MMA8451Q.h"
joseoyola 16:a3de0c0dbe33 13 #include "ledCube.h"
joseoyola 5:41f28ce7f5a9 14
joseoyola 5:41f28ce7f5a9 15
joseoyola 5:41f28ce7f5a9 16 #define MMA8451_I2C_ADDRESS (0x1d<<1)
joseoyola 5:41f28ce7f5a9 17
joseoyola 5:41f28ce7f5a9 18 #define PANEL1 0
joseoyola 5:41f28ce7f5a9 19 #define PANEL2 1
joseoyola 5:41f28ce7f5a9 20 #define PANEL3 2
joseoyola 16:a3de0c0dbe33 21 #define nLEDs 60//MAX_LEDS_PER_STRIP;
joseoyola 16:a3de0c0dbe33 22 #define nROWs 10
joseoyola 16:a3de0c0dbe33 23 #define nCOLs 10
joseoyola 16:a3de0c0dbe33 24 #define DATA_OUT_PIN1 2 // PTD2
joseoyola 16:a3de0c0dbe33 25 #define DATA_OUT_PIN2 3 // PTD3
joseoyola 16:a3de0c0dbe33 26 #define DATA_OUT_PIN3 4 // PTD3
joseoyola 5:41f28ce7f5a9 27
joseoyola 5:41f28ce7f5a9 28
joseoyola 16:a3de0c0dbe33 29 LedCube::LedCube():X(0),Y(1),Z(2),ledStrip1(nLEDs, DATA_OUT_PIN1),ledStrip2(nLEDs, DATA_OUT_PIN2),ledStrip3(nLEDs, DATA_OUT_PIN3)
joseoyola 16:a3de0c0dbe33 30 {
joseoyola 16:a3de0c0dbe33 31 }
joseoyola 5:41f28ce7f5a9 32
joseoyola 16:a3de0c0dbe33 33 LedCube::~LedCube()
joseoyola 16:a3de0c0dbe33 34 {
joseoyola 16:a3de0c0dbe33 35 }
joseoyola 5:41f28ce7f5a9 36
joseoyola 16:a3de0c0dbe33 37 void LedCube::Init(int x, int y, int z)
joseoyola 16:a3de0c0dbe33 38 {
joseoyola 16:a3de0c0dbe33 39 size = 2;
joseoyola 16:a3de0c0dbe33 40 prevSize = size;
joseoyola 16:a3de0c0dbe33 41 pos[X] = prevPos[X] = x;
joseoyola 16:a3de0c0dbe33 42 pos[Y] = prevPos[Y] = y;
joseoyola 16:a3de0c0dbe33 43 pos[Z] = prevPos[Z] = z;
joseoyola 16:a3de0c0dbe33 44 r = 255*0.1;
joseoyola 16:a3de0c0dbe33 45 g = 255*0.1;
joseoyola 16:a3de0c0dbe33 46 b = 255*0.1;
joseoyola 5:41f28ce7f5a9 47
joseoyola 16:a3de0c0dbe33 48 brightness = 0.05;
joseoyola 16:a3de0c0dbe33 49 saturation = 1.0;
joseoyola 16:a3de0c0dbe33 50
joseoyola 16:a3de0c0dbe33 51 ledStrip1.begin();
joseoyola 16:a3de0c0dbe33 52 ledStrip2.begin();
joseoyola 16:a3de0c0dbe33 53 ledStrip3.begin();
joseoyola 16:a3de0c0dbe33 54 }
joseoyola 5:41f28ce7f5a9 55
joseoyola 16:a3de0c0dbe33 56 int LedCube::getLedIndex(int panel, int x, int y) {
joseoyola 8:c06f5046c9f7 57 if (panel == PANEL1) {
joseoyola 8:c06f5046c9f7 58 if (y % 2 == 0) {
joseoyola 8:c06f5046c9f7 59 return nCOLs*2 * y + x;
joseoyola 8:c06f5046c9f7 60 }
joseoyola 8:c06f5046c9f7 61 else {
joseoyola 8:c06f5046c9f7 62 return nCOLs*2 * y + nCOLs + ((nCOLs - 1) - x);
joseoyola 8:c06f5046c9f7 63 }
joseoyola 5:41f28ce7f5a9 64 }
joseoyola 8:c06f5046c9f7 65
joseoyola 8:c06f5046c9f7 66 if (panel == PANEL2) {
joseoyola 8:c06f5046c9f7 67 if (y % 2 == 0) {
joseoyola 8:c06f5046c9f7 68 return nCOLs*2 * y + nCOLs + x;
joseoyola 8:c06f5046c9f7 69 }
joseoyola 8:c06f5046c9f7 70 else {
joseoyola 8:c06f5046c9f7 71 return nCOLs*2 * y + ((nCOLs - 1) - x);
joseoyola 8:c06f5046c9f7 72 }
joseoyola 5:41f28ce7f5a9 73 }
joseoyola 8:c06f5046c9f7 74
joseoyola 8:c06f5046c9f7 75 if (panel == PANEL3) {
joseoyola 8:c06f5046c9f7 76 if (y % 2 == 0) {
joseoyola 8:c06f5046c9f7 77 return nCOLs * y + x;
joseoyola 8:c06f5046c9f7 78 }
joseoyola 8:c06f5046c9f7 79 else {
joseoyola 8:c06f5046c9f7 80 return nCOLs * y + ((nCOLs - 1) - x);
joseoyola 8:c06f5046c9f7 81 }
joseoyola 8:c06f5046c9f7 82 }
joseoyola 8:c06f5046c9f7 83
joseoyola 8:c06f5046c9f7 84 else return -1;
joseoyola 5:41f28ce7f5a9 85 }
joseoyola 5:41f28ce7f5a9 86
joseoyola 16:a3de0c0dbe33 87 void LedCube::updateLEDs(bool on, int size, int x, int y, int z) {
joseoyola 10:9d87a886f066 88 //Panel 1
joseoyola 16:a3de0c0dbe33 89 if(y == 0) {
joseoyola 16:a3de0c0dbe33 90 for(int i = x; i < x + size; i++) {
joseoyola 16:a3de0c0dbe33 91 for(int j = z; j < z + size; j++) {
joseoyola 10:9d87a886f066 92 int led = getLedIndex(PANEL1, i, j);
joseoyola 10:9d87a886f066 93 if(on) {
joseoyola 10:9d87a886f066 94 ledStrip1.setPixelColor(led, r, g, b);
joseoyola 10:9d87a886f066 95 } else {
joseoyola 10:9d87a886f066 96 ledStrip1.setPixelColor(led, 0, 0, 0);
joseoyola 10:9d87a886f066 97 }
joseoyola 10:9d87a886f066 98 }
joseoyola 10:9d87a886f066 99 }
joseoyola 10:9d87a886f066 100 }
joseoyola 10:9d87a886f066 101
joseoyola 10:9d87a886f066 102 //Panel 2
joseoyola 16:a3de0c0dbe33 103 if(x + size - 1 == (nCOLs - 1)) {
joseoyola 16:a3de0c0dbe33 104 for(int i = y; i < y + size; i++) {
joseoyola 16:a3de0c0dbe33 105 for(int j = z; j < z + size; j++) {
joseoyola 10:9d87a886f066 106 int led = getLedIndex(PANEL2, i, j);
joseoyola 10:9d87a886f066 107 if(on) {
joseoyola 16:a3de0c0dbe33 108 if(z < 3) ledStrip1.setPixelColor(led, r, g, b);
joseoyola 16:a3de0c0dbe33 109 else ledStrip2.setPixelColor(led, r, g, b);
joseoyola 10:9d87a886f066 110 } else {
joseoyola 16:a3de0c0dbe33 111 if (z < 3) ledStrip1.setPixelColor(led, 0, 0, 0);
joseoyola 10:9d87a886f066 112 ledStrip2.setPixelColor(led, 0, 0, 0);
joseoyola 10:9d87a886f066 113 }
joseoyola 10:9d87a886f066 114 }
joseoyola 10:9d87a886f066 115 }
joseoyola 10:9d87a886f066 116 }
joseoyola 10:9d87a886f066 117
joseoyola 10:9d87a886f066 118 //Panel 3
joseoyola 16:a3de0c0dbe33 119 if(z + size - 1 == (nCOLs - 1)) {
joseoyola 16:a3de0c0dbe33 120 for(int i = x; i < x + size; i++) {
joseoyola 16:a3de0c0dbe33 121 for(int j = y; j < y + size; j++) {
joseoyola 10:9d87a886f066 122 int led = getLedIndex(PANEL3, i, j);
joseoyola 10:9d87a886f066 123 if(on) {
joseoyola 10:9d87a886f066 124 ledStrip3.setPixelColor(led, r, g, b);
joseoyola 10:9d87a886f066 125 } else {
joseoyola 10:9d87a886f066 126 ledStrip3.setPixelColor(led, 0, 0, 0);
joseoyola 10:9d87a886f066 127 }
joseoyola 10:9d87a886f066 128 }
joseoyola 10:9d87a886f066 129 }
joseoyola 10:9d87a886f066 130 }
joseoyola 10:9d87a886f066 131 }
joseoyola 10:9d87a886f066 132
joseoyola 10:9d87a886f066 133
joseoyola 16:a3de0c0dbe33 134 void LedCube::cubeUpdate() {
joseoyola 16:a3de0c0dbe33 135 updateLEDs(false, prevSize, prevPos[X], prevPos[Y], prevPos[Z]); //Turn off LEDs from previous state
joseoyola 16:a3de0c0dbe33 136 updateLEDs(true, size, pos[X], pos[Y], pos[Z]); //Turn on new LEDs for new state
joseoyola 16:a3de0c0dbe33 137 prevSize = size;
joseoyola 16:a3de0c0dbe33 138 prevPos[X] = pos[X];
joseoyola 16:a3de0c0dbe33 139 prevPos[Y] = pos[Y];
joseoyola 16:a3de0c0dbe33 140 prevPos[Z] = pos[Z];
joseoyola 16:a3de0c0dbe33 141 ledStrip1.show();
joseoyola 16:a3de0c0dbe33 142 ledStrip2.show();
joseoyola 16:a3de0c0dbe33 143 ledStrip3.show();
joseoyola 16:a3de0c0dbe33 144 ledStrip1.startDMA();
joseoyola 16:a3de0c0dbe33 145 ledStrip2.startDMA();
joseoyola 16:a3de0c0dbe33 146 ledStrip3.startDMA();
joseoyola 16:a3de0c0dbe33 147 printf("Position: %d, %d, %d \t Size: %d\r\n", pos[X], pos[Y], pos[Z], size);
joseoyola 10:9d87a886f066 148 }
joseoyola 10:9d87a886f066 149
joseoyola 16:a3de0c0dbe33 150 int LedCube::move(int deltaX, int deltaY, int deltaZ) {
joseoyola 16:a3de0c0dbe33 151 int retVal = -1;
joseoyola 10:9d87a886f066 152 //Moving in X direction
joseoyola 16:a3de0c0dbe33 153 if(pos[Y] == 0 || pos[Z] + size - 1 == (nCOLs - 1)) { //Making sure square is "stuck" to panel 1 or 3
joseoyola 16:a3de0c0dbe33 154 if((pos[X] + size + deltaX - 1) < nCOLs && (pos[X] + deltaX) >= 0) {
joseoyola 10:9d87a886f066 155 pos[X] += deltaX;
joseoyola 16:a3de0c0dbe33 156 if (deltaX != 0) retVal = 1;
joseoyola 16:a3de0c0dbe33 157 printf("Here1, %d\r\n",retVal);
joseoyola 10:9d87a886f066 158 }
joseoyola 10:9d87a886f066 159 }
joseoyola 10:9d87a886f066 160
joseoyola 10:9d87a886f066 161 //Moving in Y direction
joseoyola 16:a3de0c0dbe33 162 if(pos[X] + size - 1 == (nCOLs - 1) || pos[Z] + size - 1 == (nCOLs - 1)) {//Making sure square is "stuck" to panel 2 or 3
joseoyola 16:a3de0c0dbe33 163 if((pos[Y] + size + deltaY - 1) < nCOLs && (pos[Y] + deltaY) >= 0) {
joseoyola 10:9d87a886f066 164 pos[Y] += deltaY;
joseoyola 16:a3de0c0dbe33 165 if (deltaY != 0) retVal = 1;
joseoyola 16:a3de0c0dbe33 166 printf("Here2, %d\r\n",retVal);
joseoyola 10:9d87a886f066 167 }
joseoyola 10:9d87a886f066 168 }
joseoyola 10:9d87a886f066 169
joseoyola 10:9d87a886f066 170 //Moving in Z direction
joseoyola 16:a3de0c0dbe33 171 if(pos[X] + size - 1 == (nCOLs - 1) || pos[Y] == 0) {//Making sure square is "stuck" to panel 1 or 2
joseoyola 16:a3de0c0dbe33 172 if((pos[Z] + size + deltaZ - 1) < nCOLs && (pos[Z] + deltaZ) >= 0) {
joseoyola 10:9d87a886f066 173 pos[Z] += deltaZ;
joseoyola 16:a3de0c0dbe33 174 if (deltaZ != 0) retVal = 1;
joseoyola 16:a3de0c0dbe33 175 printf("Here3, %d\r\n",retVal);
joseoyola 10:9d87a886f066 176 }
joseoyola 10:9d87a886f066 177 }
joseoyola 16:a3de0c0dbe33 178 return retVal;
joseoyola 16:a3de0c0dbe33 179 //cubeUpdate();
joseoyola 16:a3de0c0dbe33 180 }
joseoyola 16:a3de0c0dbe33 181
joseoyola 16:a3de0c0dbe33 182 void LedCube::changeColor(float hue){
joseoyola 16:a3de0c0dbe33 183 HSBtoRGB(hue, saturation, brightness, &r, &g, &b);
joseoyola 16:a3de0c0dbe33 184 }
joseoyola 16:a3de0c0dbe33 185
joseoyola 16:a3de0c0dbe33 186 void LedCube::changeSize(int newSize) {
joseoyola 16:a3de0c0dbe33 187 if((pos[X] + newSize) < nCOLs && (pos[Y] + newSize) < nCOLs && (pos[Z] + newSize) < nCOLs) {
joseoyola 16:a3de0c0dbe33 188 size = newSize;
joseoyola 16:a3de0c0dbe33 189 }
joseoyola 10:9d87a886f066 190 }
joseoyola 10:9d87a886f066 191
joseoyola 10:9d87a886f066 192
joseoyola 10:9d87a886f066 193
joseoyola 10:9d87a886f066 194
joseoyola 10:9d87a886f066 195
joseoyola 10:9d87a886f066 196
joseoyola 10:9d87a886f066 197
joseoyola 8:c06f5046c9f7 198 /*
joseoyola 5:41f28ce7f5a9 199 static void move( int delta_x, int delta_y, int old_size, int new_size)
joseoyola 5:41f28ce7f5a9 200 {
joseoyola 5:41f28ce7f5a9 201 for( int i = pos_y; i < pos_y + old_size; i++){
joseoyola 5:41f28ce7f5a9 202 for( int j= pos_x; j < pos_x + old_size; j++){
joseoyola 5:41f28ce7f5a9 203 int pos_off = matrixtolinear(i,j);
joseoyola 5:41f28ce7f5a9 204 if( pos_off >= nLEDs){lightStrip2.setPixelColor(pos_off-nLEDs, 0, 0, 0);}
joseoyola 5:41f28ce7f5a9 205 else
joseoyola 5:41f28ce7f5a9 206 {lightStrip1.setPixelColor(pos_off, 0, 0, 0);}
joseoyola 5:41f28ce7f5a9 207
joseoyola 5:41f28ce7f5a9 208 }
joseoyola 5:41f28ce7f5a9 209 }
joseoyola 5:41f28ce7f5a9 210 if ( (pos_y + (new_size-1) + delta_y < nROWs) && (pos_y + delta_y ) >= 0 ) {
joseoyola 5:41f28ce7f5a9 211 pos_y = pos_y + delta_y;}
joseoyola 5:41f28ce7f5a9 212 if ( (pos_x + (new_size-1) + delta_x < nCOLs ) && (pos_x + delta_x ) >= 0) {
joseoyola 5:41f28ce7f5a9 213 pos_x = pos_x + delta_x;}
joseoyola 5:41f28ce7f5a9 214
joseoyola 5:41f28ce7f5a9 215 for( int i = pos_y; i < pos_y + new_size; i++){
joseoyola 5:41f28ce7f5a9 216 for( int j= pos_x; j < pos_x + new_size; j++){
joseoyola 5:41f28ce7f5a9 217 int pos_on = matrixtolinear(i,j);
joseoyola 5:41f28ce7f5a9 218 if( pos_on >= nLEDs){lightStrip2.setPixelColor(pos_on-nLEDs, 0, g, 0);}
joseoyola 5:41f28ce7f5a9 219 else
joseoyola 5:41f28ce7f5a9 220 {lightStrip1.setPixelColor(pos_on, 0, g, 0);}
joseoyola 5:41f28ce7f5a9 221 }
joseoyola 5:41f28ce7f5a9 222 }
joseoyola 5:41f28ce7f5a9 223
joseoyola 5:41f28ce7f5a9 224 lightStrip1.show();
joseoyola 5:41f28ce7f5a9 225 lightStrip2.show();
joseoyola 5:41f28ce7f5a9 226 lightStrip1.startDMA();
joseoyola 5:41f28ce7f5a9 227 lightStrip2.startDMA();
joseoyola 5:41f28ce7f5a9 228 }
joseoyola 8:c06f5046c9f7 229 */