Temp Fork

Dependencies:   MMA8451Q Multi_WS2811 NVIC_set_all_priorities TSI cc3000_hostdriver_mbedsocket mbed

Fork of CubicHand by Model-Based Team

Committer:
joseoyola
Date:
Fri Dec 05 22:20:34 2014 +0000
Revision:
8:c06f5046c9f7
Parent:
5:41f28ce7f5a9
Child:
10:9d87a886f066
Added more functions to led.cpp

Who changed what in which revision?

UserRevisionLine numberNew contents of line
joseoyola 2:45b90e8d7d82 1 /*
joseoyola 2:45b90e8d7d82 2 * 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 5:41f28ce7f5a9 13
joseoyola 5:41f28ce7f5a9 14
joseoyola 5:41f28ce7f5a9 15 #define MMA8451_I2C_ADDRESS (0x1d<<1)
joseoyola 5:41f28ce7f5a9 16
joseoyola 5:41f28ce7f5a9 17 #define X 0
joseoyola 5:41f28ce7f5a9 18 #define Y 1
joseoyola 5:41f28ce7f5a9 19 #define Z 2
joseoyola 5:41f28ce7f5a9 20
joseoyola 5:41f28ce7f5a9 21 #define PANEL1 0
joseoyola 5:41f28ce7f5a9 22 #define PANEL2 1
joseoyola 5:41f28ce7f5a9 23 #define PANEL3 2
joseoyola 5:41f28ce7f5a9 24
joseoyola 5:41f28ce7f5a9 25 int pos[3];
joseoyola 8:c06f5046c9f7 26 int size = 0;
joseoyola 5:41f28ce7f5a9 27
joseoyola 5:41f28ce7f5a9 28 // per LED: 3 * 20 mA = 60mA max
joseoyola 5:41f28ce7f5a9 29 // 60 LEDs: 60 * 60mA = 3600 mA max
joseoyola 5:41f28ce7f5a9 30 // 120 LEDs: 7200 mA max
joseoyola 5:41f28ce7f5a9 31 unsigned const nLEDs = 60;//MAX_LEDS_PER_STRIP;
joseoyola 8:c06f5046c9f7 32 unsigned const nROWs = 10;
joseoyola 8:c06f5046c9f7 33 unsigned const nCOLs = 10;
joseoyola 5:41f28ce7f5a9 34
joseoyola 5:41f28ce7f5a9 35
joseoyola 5:41f28ce7f5a9 36
joseoyola 5:41f28ce7f5a9 37 // I/O pin usage
joseoyola 5:41f28ce7f5a9 38 // PTD0 TPM0 CH0 monitor
joseoyola 5:41f28ce7f5a9 39 // PTD1 TPM0 CH1 monitor
joseoyola 5:41f28ce7f5a9 40 // PTD2 data output
joseoyola 5:41f28ce7f5a9 41 // PTD3 debug output
joseoyola 5:41f28ce7f5a9 42
joseoyola 5:41f28ce7f5a9 43 unsigned const DATA_OUT_PIN1 = 2; // PTD2
joseoyola 5:41f28ce7f5a9 44 unsigned const DATA_OUT_PIN2 = 3; // PTD3
joseoyola 8:c06f5046c9f7 45 unsigned const DATA_OUT_PIN3 = 4; // PTD3
joseoyola 5:41f28ce7f5a9 46
joseoyola 5:41f28ce7f5a9 47 Serial pc(USBTX, USBRX);
joseoyola 5:41f28ce7f5a9 48 Timer timeRunning;
joseoyola 5:41f28ce7f5a9 49
joseoyola 5:41f28ce7f5a9 50 TSISensor touchSensor;
joseoyola 5:41f28ce7f5a9 51 MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS);
joseoyola 5:41f28ce7f5a9 52 PwmOut rled(LED_RED);
joseoyola 5:41f28ce7f5a9 53 PwmOut gled(LED_GREEN);
joseoyola 5:41f28ce7f5a9 54 // LED_BLUE is on PTD1
joseoyola 5:41f28ce7f5a9 55
joseoyola 5:41f28ce7f5a9 56 float touchPercentage;
joseoyola 5:41f28ce7f5a9 57 unsigned frames;
joseoyola 5:41f28ce7f5a9 58
joseoyola 5:41f28ce7f5a9 59 float const minBrite = 0.2;
joseoyola 5:41f28ce7f5a9 60 float const maxBrite = 0.5;
joseoyola 5:41f28ce7f5a9 61 float brightness;
joseoyola 5:41f28ce7f5a9 62
joseoyola 5:41f28ce7f5a9 63
joseoyola 5:41f28ce7f5a9 64 uint8_t r = 255*0.1;
joseoyola 5:41f28ce7f5a9 65 uint8_t g = 255*0.1;
joseoyola 5:41f28ce7f5a9 66 uint8_t b = 255*0.1;
joseoyola 5:41f28ce7f5a9 67
joseoyola 5:41f28ce7f5a9 68
joseoyola 5:41f28ce7f5a9 69 WS2811 lightStrip1(nLEDs, DATA_OUT_PIN1);
joseoyola 5:41f28ce7f5a9 70 WS2811 lightStrip2(nLEDs, DATA_OUT_PIN2);
joseoyola 8:c06f5046c9f7 71 WS2811 lightStrip3(nLEDs, DATA_OUT_PIN2);
joseoyola 5:41f28ce7f5a9 72
joseoyola 5:41f28ce7f5a9 73 void readTouchSensor()
joseoyola 5:41f28ce7f5a9 74 {
joseoyola 8:c06f5046c9f7 75 touchPercentage *= 0.(nCOLs - 1);
joseoyola 5:41f28ce7f5a9 76 touchPercentage += touchSensor.readPercentage() * 0.1;
joseoyola 5:41f28ce7f5a9 77 brite = minBrite + (maxBrite - minBrite) * touchPercentage;
joseoyola 5:41f28ce7f5a9 78 }
joseoyola 2:45b90e8d7d82 79
joseoyola 2:45b90e8d7d82 80
joseoyola 5:41f28ce7f5a9 81 void move(deltaX, deltaY, deltaZ) {
joseoyola 5:41f28ce7f5a9 82 //Moving in X direction
joseoyola 8:c06f5046c9f7 83 if(pos[Y] == 0 || pos[Z] == (nCOLs - 1)) { //Making sure square is "stuck" to panel 1 or 3
joseoyola 8:c06f5046c9f7 84 if((pos[X] + size + deltaX) < nCOLs && (pos[X] + deltaX) >= 0) {
joseoyola 5:41f28ce7f5a9 85 pos[X] += deltaX;
joseoyola 5:41f28ce7f5a9 86 }
joseoyola 5:41f28ce7f5a9 87 }
joseoyola 5:41f28ce7f5a9 88
joseoyola 5:41f28ce7f5a9 89 //Moving in Y direction
joseoyola 8:c06f5046c9f7 90 if(pos[X] == (nCOLs - 1) || pos[Z] == (nCOLs - 1)) {//Making sure square is "stuck" to panel 2 or 3
joseoyola 8:c06f5046c9f7 91 if((pos[Y] + size + deltaY) < nCOLs && (pos[Y] + deltaY) >= 0) {
joseoyola 5:41f28ce7f5a9 92 pos[Y] += deltaY;
joseoyola 5:41f28ce7f5a9 93 }
joseoyola 5:41f28ce7f5a9 94 }
joseoyola 5:41f28ce7f5a9 95
joseoyola 5:41f28ce7f5a9 96 //Moving in Z direction
joseoyola 8:c06f5046c9f7 97 if(pos[X] == (nCOLs - 1) || pos[Y] == 0) {//Making sure square is "stuck" to panel 1 or 2
joseoyola 8:c06f5046c9f7 98 if((pos[Z] + size + deltaZ) < nCOLs && (pos[Z] + deltaZ) >= 0) {
joseoyola 5:41f28ce7f5a9 99 pos[Z] += deltaZ;
joseoyola 5:41f28ce7f5a9 100 }
joseoyola 5:41f28ce7f5a9 101 }
joseoyola 5:41f28ce7f5a9 102
joseoyola 5:41f28ce7f5a9 103 cubeUpdate();
joseoyola 5:41f28ce7f5a9 104 }
joseoyola 5:41f28ce7f5a9 105
joseoyola 5:41f28ce7f5a9 106 void cubeUpdate() {
joseoyola 5:41f28ce7f5a9 107 updateLEDs(false); //Turn off LEDs from previous state
joseoyola 5:41f28ce7f5a9 108 updateLEDs(true); //Turn on new LEDs for new state
joseoyola 5:41f28ce7f5a9 109 }
joseoyola 5:41f28ce7f5a9 110
joseoyola 5:41f28ce7f5a9 111 void updateLEDs(bool on) {
joseoyola 5:41f28ce7f5a9 112 //Panel 1
joseoyola 5:41f28ce7f5a9 113 if(pos[Y] == 0) {
joseoyola 5:41f28ce7f5a9 114 for(int i = pos[X]; i < pos[X] + size; i++) {
joseoyola 5:41f28ce7f5a9 115 for(int j = pos[Z]; j < pos[Z] + size; j++) {
joseoyola 5:41f28ce7f5a9 116 int led = getLedIndex(PANEL1, i, j);
joseoyola 5:41f28ce7f5a9 117 if(on) {
joseoyola 5:41f28ce7f5a9 118 ledStrip1(led, r, g, b);
joseoyola 5:41f28ce7f5a9 119 } else {
joseoyola 5:41f28ce7f5a9 120 ledStrip1(led, 0, 0, 0);
joseoyola 5:41f28ce7f5a9 121 }
joseoyola 5:41f28ce7f5a9 122 }
joseoyola 5:41f28ce7f5a9 123 }
joseoyola 5:41f28ce7f5a9 124 }
joseoyola 5:41f28ce7f5a9 125
joseoyola 5:41f28ce7f5a9 126 //Panel 2
joseoyola 8:c06f5046c9f7 127 if(pos[X] + size == (nCOLs - 1)) {
joseoyola 8:c06f5046c9f7 128 for(int i = pos[Y]; i < pos[Y] + size; i++) {
joseoyola 5:41f28ce7f5a9 129 for(int j = pos[Z]; j < pos[Z] + size; j++) {
joseoyola 8:c06f5046c9f7 130 int led = getLedIndex(PANEL2, i, j);
joseoyola 5:41f28ce7f5a9 131 if(on) {
joseoyola 8:c06f5046c9f7 132 ledStrip2(led, r, g, b);
joseoyola 5:41f28ce7f5a9 133 } else {
joseoyola 8:c06f5046c9f7 134 ledStrip2(led, 0, 0, 0);
joseoyola 8:c06f5046c9f7 135 }
joseoyola 8:c06f5046c9f7 136 }
joseoyola 8:c06f5046c9f7 137 }
joseoyola 8:c06f5046c9f7 138 }
joseoyola 8:c06f5046c9f7 139
joseoyola 8:c06f5046c9f7 140 //Panel 3
joseoyola 8:c06f5046c9f7 141 if(pos[Z] + size == (nCOLs - 1)) {
joseoyola 8:c06f5046c9f7 142 for(int i = pos[X]; i < pos[X] + size; i++) {
joseoyola 8:c06f5046c9f7 143 for(int j = pos[Y]; j < pos[Y] + size; j++) {
joseoyola 8:c06f5046c9f7 144 int led = getLedIndex(PANEL3, i, j);
joseoyola 8:c06f5046c9f7 145 if(on) {
joseoyola 8:c06f5046c9f7 146 ledStrip3(led, r, g, b);
joseoyola 8:c06f5046c9f7 147 } else {
joseoyola 8:c06f5046c9f7 148 ledStrip3(led, 0, 0, 0);
joseoyola 5:41f28ce7f5a9 149 }
joseoyola 5:41f28ce7f5a9 150 }
joseoyola 5:41f28ce7f5a9 151 }
joseoyola 5:41f28ce7f5a9 152 }
joseoyola 5:41f28ce7f5a9 153 }
joseoyola 5:41f28ce7f5a9 154
joseoyola 5:41f28ce7f5a9 155
joseoyola 5:41f28ce7f5a9 156
joseoyola 5:41f28ce7f5a9 157
joseoyola 8:c06f5046c9f7 158
joseoyola 8:c06f5046c9f7 159
joseoyola 8:c06f5046c9f7 160 static int getLedIndex(int panel, int x, int y) {
joseoyola 8:c06f5046c9f7 161 if (panel == PANEL1) {
joseoyola 8:c06f5046c9f7 162 if (y % 2 == 0) {
joseoyola 8:c06f5046c9f7 163 return nCOLs*2 * y + x;
joseoyola 8:c06f5046c9f7 164 }
joseoyola 8:c06f5046c9f7 165 else {
joseoyola 8:c06f5046c9f7 166 return nCOLs*2 * y + nCOLs + ((nCOLs - 1) - x);
joseoyola 8:c06f5046c9f7 167 }
joseoyola 5:41f28ce7f5a9 168 }
joseoyola 8:c06f5046c9f7 169
joseoyola 8:c06f5046c9f7 170 if (panel == PANEL2) {
joseoyola 8:c06f5046c9f7 171 if (y % 2 == 0) {
joseoyola 8:c06f5046c9f7 172 return nCOLs*2 * y + nCOLs + x;
joseoyola 8:c06f5046c9f7 173 }
joseoyola 8:c06f5046c9f7 174 else {
joseoyola 8:c06f5046c9f7 175 return nCOLs*2 * y + ((nCOLs - 1) - x);
joseoyola 8:c06f5046c9f7 176 }
joseoyola 5:41f28ce7f5a9 177 }
joseoyola 8:c06f5046c9f7 178
joseoyola 8:c06f5046c9f7 179 if (panel == PANEL3) {
joseoyola 8:c06f5046c9f7 180 if (y % 2 == 0) {
joseoyola 8:c06f5046c9f7 181 return nCOLs * y + x;
joseoyola 8:c06f5046c9f7 182 }
joseoyola 8:c06f5046c9f7 183 else {
joseoyola 8:c06f5046c9f7 184 return nCOLs * y + ((nCOLs - 1) - x);
joseoyola 8:c06f5046c9f7 185 }
joseoyola 8:c06f5046c9f7 186 }
joseoyola 8:c06f5046c9f7 187
joseoyola 8:c06f5046c9f7 188 else return -1;
joseoyola 5:41f28ce7f5a9 189 }
joseoyola 5:41f28ce7f5a9 190
joseoyola 8:c06f5046c9f7 191 /*
joseoyola 5:41f28ce7f5a9 192 static void move( int delta_x, int delta_y, int old_size, int new_size)
joseoyola 5:41f28ce7f5a9 193 {
joseoyola 5:41f28ce7f5a9 194 for( int i = pos_y; i < pos_y + old_size; i++){
joseoyola 5:41f28ce7f5a9 195 for( int j= pos_x; j < pos_x + old_size; j++){
joseoyola 5:41f28ce7f5a9 196 int pos_off = matrixtolinear(i,j);
joseoyola 5:41f28ce7f5a9 197 if( pos_off >= nLEDs){lightStrip2.setPixelColor(pos_off-nLEDs, 0, 0, 0);}
joseoyola 5:41f28ce7f5a9 198 else
joseoyola 5:41f28ce7f5a9 199 {lightStrip1.setPixelColor(pos_off, 0, 0, 0);}
joseoyola 5:41f28ce7f5a9 200
joseoyola 5:41f28ce7f5a9 201 }
joseoyola 5:41f28ce7f5a9 202 }
joseoyola 5:41f28ce7f5a9 203 if ( (pos_y + (new_size-1) + delta_y < nROWs) && (pos_y + delta_y ) >= 0 ) {
joseoyola 5:41f28ce7f5a9 204 pos_y = pos_y + delta_y;}
joseoyola 5:41f28ce7f5a9 205 if ( (pos_x + (new_size-1) + delta_x < nCOLs ) && (pos_x + delta_x ) >= 0) {
joseoyola 5:41f28ce7f5a9 206 pos_x = pos_x + delta_x;}
joseoyola 5:41f28ce7f5a9 207
joseoyola 5:41f28ce7f5a9 208 for( int i = pos_y; i < pos_y + new_size; i++){
joseoyola 5:41f28ce7f5a9 209 for( int j= pos_x; j < pos_x + new_size; j++){
joseoyola 5:41f28ce7f5a9 210 int pos_on = matrixtolinear(i,j);
joseoyola 5:41f28ce7f5a9 211 if( pos_on >= nLEDs){lightStrip2.setPixelColor(pos_on-nLEDs, 0, g, 0);}
joseoyola 5:41f28ce7f5a9 212 else
joseoyola 5:41f28ce7f5a9 213 {lightStrip1.setPixelColor(pos_on, 0, g, 0);}
joseoyola 5:41f28ce7f5a9 214 }
joseoyola 5:41f28ce7f5a9 215 }
joseoyola 5:41f28ce7f5a9 216
joseoyola 5:41f28ce7f5a9 217 lightStrip1.show();
joseoyola 5:41f28ce7f5a9 218 lightStrip2.show();
joseoyola 5:41f28ce7f5a9 219 lightStrip1.startDMA();
joseoyola 5:41f28ce7f5a9 220 lightStrip2.startDMA();
joseoyola 5:41f28ce7f5a9 221 }
joseoyola 8:c06f5046c9f7 222 */