The world's greatest etch a sketch

Dependencies:   mbed C12832 MMA7660

Committer:
jlaqua
Date:
Wed Feb 26 03:39:10 2014 +0000
Revision:
4:be4ba8a111ce
Parent:
3:c385027fcc0b
pong party faileth..no acks yo

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jlaqua 0:00653d8e42a1 1 #include "mbed.h"
jlaqua 1:65aea95224b8 2 #include "C12832.h"
jlaqua 1:65aea95224b8 3 #include "MMA7660.h"
jlaqua 0:00653d8e42a1 4
jlaqua 1:65aea95224b8 5 AnalogIn potX(p20);
jlaqua 1:65aea95224b8 6 AnalogIn potY(p19);
jlaqua 1:65aea95224b8 7 MMA7660 acc(p28, p27);
jlaqua 1:65aea95224b8 8 C12832 lcd(p5, p7, p6, p8, p11);
jlaqua 4:be4ba8a111ce 9 Serial term(USBTX, USBRX);
jlaqua 0:00653d8e42a1 10
jlaqua 4:be4ba8a111ce 11 char addr = 0x42;
jlaqua 4:be4ba8a111ce 12
jlaqua 4:be4ba8a111ce 13 void pongMasta(void)
jlaqua 4:be4ba8a111ce 14 {
jlaqua 4:be4ba8a111ce 15 DigitalIn play(p14);
jlaqua 2:aed0788e8f96 16
jlaqua 4:be4ba8a111ce 17 static const int LEFTUP = 0;
jlaqua 4:be4ba8a111ce 18 static const int LEFTDOWN = 1;
jlaqua 4:be4ba8a111ce 19 static const int RIGHTUP = 2;
jlaqua 4:be4ba8a111ce 20 static const int RIGHTDOWN = 3;
jlaqua 4:be4ba8a111ce 21 static const int START = 4;
jlaqua 4:be4ba8a111ce 22 int badGuy = 12;
jlaqua 4:be4ba8a111ce 23 int goodGuy = 12;
jlaqua 4:be4ba8a111ce 24 int ballX = 64;
jlaqua 4:be4ba8a111ce 25 int ballY = 0;
jlaqua 4:be4ba8a111ce 26 int ballState = START;
jlaqua 2:aed0788e8f96 27
jlaqua 4:be4ba8a111ce 28 I2C masta(p9,p10);
jlaqua 4:be4ba8a111ce 29
jlaqua 2:aed0788e8f96 30 while(1) {
jlaqua 3:c385027fcc0b 31 DigitalIn up(p15);
jlaqua 3:c385027fcc0b 32 DigitalIn down(p12);
jlaqua 2:aed0788e8f96 33
jlaqua 3:c385027fcc0b 34 if (up)
jlaqua 3:c385027fcc0b 35 goodGuy--;
jlaqua 3:c385027fcc0b 36 if (down)
jlaqua 3:c385027fcc0b 37 goodGuy++;
jlaqua 3:c385027fcc0b 38
jlaqua 2:aed0788e8f96 39 if (goodGuy < 0)
jlaqua 2:aed0788e8f96 40 goodGuy = 0;
jlaqua 3:c385027fcc0b 41 if (goodGuy + 5 > lcd.height()-1)
jlaqua 3:c385027fcc0b 42 goodGuy = lcd.height()-6;
jlaqua 4:be4ba8a111ce 43
jlaqua 4:be4ba8a111ce 44 if (ballState != START) {
jlaqua 4:be4ba8a111ce 45 // Send good guy yo
jlaqua 4:be4ba8a111ce 46 masta.start();
jlaqua 4:be4ba8a111ce 47 masta.write(addr);
jlaqua 4:be4ba8a111ce 48 masta.write((char)goodGuy);
jlaqua 4:be4ba8a111ce 49 masta.stop();
jlaqua 4:be4ba8a111ce 50
jlaqua 4:be4ba8a111ce 51 // Read bad guy bro
jlaqua 4:be4ba8a111ce 52 masta.start();
jlaqua 4:be4ba8a111ce 53 masta.write(addr|0x01);
jlaqua 4:be4ba8a111ce 54 badGuy = (int)masta.read(addr);
jlaqua 4:be4ba8a111ce 55 masta.stop();
jlaqua 4:be4ba8a111ce 56 }
jlaqua 2:aed0788e8f96 57
jlaqua 2:aed0788e8f96 58 switch(ballState) {
jlaqua 2:aed0788e8f96 59 case LEFTUP:
jlaqua 2:aed0788e8f96 60 ballX--;
jlaqua 2:aed0788e8f96 61 ballY--;
jlaqua 2:aed0788e8f96 62 if (ballX <= 0) {
jlaqua 2:aed0788e8f96 63 if ((ballY >= badGuy) && (ballY <= badGuy+5))
jlaqua 2:aed0788e8f96 64 ballState = RIGHTUP;
jlaqua 2:aed0788e8f96 65 else
jlaqua 2:aed0788e8f96 66 ballState = START;
jlaqua 2:aed0788e8f96 67 }
jlaqua 2:aed0788e8f96 68 if (ballY <= 0)
jlaqua 2:aed0788e8f96 69 ballState = LEFTDOWN;
jlaqua 2:aed0788e8f96 70 break;
jlaqua 2:aed0788e8f96 71 case LEFTDOWN:
jlaqua 2:aed0788e8f96 72 ballX--;
jlaqua 2:aed0788e8f96 73 ballY++;
jlaqua 2:aed0788e8f96 74 if (ballX <= 0) {
jlaqua 2:aed0788e8f96 75 if ((ballY >= badGuy) && (ballY <= badGuy+5))
jlaqua 2:aed0788e8f96 76 ballState = RIGHTDOWN;
jlaqua 2:aed0788e8f96 77 else
jlaqua 2:aed0788e8f96 78 ballState = START;
jlaqua 2:aed0788e8f96 79 }
jlaqua 2:aed0788e8f96 80 if (ballY >= lcd.height()-1)
jlaqua 2:aed0788e8f96 81 ballState = LEFTUP;
jlaqua 2:aed0788e8f96 82 break;
jlaqua 2:aed0788e8f96 83 case RIGHTUP:
jlaqua 2:aed0788e8f96 84 ballX++;
jlaqua 2:aed0788e8f96 85 ballY--;
jlaqua 2:aed0788e8f96 86 if (ballX >= lcd.width()-1) {
jlaqua 2:aed0788e8f96 87 if ((ballY >= goodGuy) && (ballY <= goodGuy+5))
jlaqua 2:aed0788e8f96 88 ballState = LEFTUP;
jlaqua 2:aed0788e8f96 89 else
jlaqua 2:aed0788e8f96 90 ballState = START;
jlaqua 2:aed0788e8f96 91 }
jlaqua 2:aed0788e8f96 92 if (ballY <= 0)
jlaqua 2:aed0788e8f96 93 ballState = RIGHTDOWN;
jlaqua 2:aed0788e8f96 94 break;
jlaqua 2:aed0788e8f96 95 case RIGHTDOWN:
jlaqua 2:aed0788e8f96 96 ballX++;
jlaqua 2:aed0788e8f96 97 ballY++;
jlaqua 2:aed0788e8f96 98 if (ballX >= lcd.width()-1) {
jlaqua 2:aed0788e8f96 99 if ((ballY >= goodGuy) && (ballY <= goodGuy+5))
jlaqua 2:aed0788e8f96 100 ballState = LEFTDOWN;
jlaqua 2:aed0788e8f96 101 else
jlaqua 2:aed0788e8f96 102 ballState = START;
jlaqua 2:aed0788e8f96 103 }
jlaqua 2:aed0788e8f96 104 if (ballY >= lcd.height()-1)
jlaqua 2:aed0788e8f96 105 ballState = RIGHTUP;
jlaqua 2:aed0788e8f96 106 break;
jlaqua 2:aed0788e8f96 107 case START:
jlaqua 2:aed0788e8f96 108 ballX = lcd.width()/2;
jlaqua 2:aed0788e8f96 109 ballY = 0;
jlaqua 2:aed0788e8f96 110 goodGuy = 12;
jlaqua 4:be4ba8a111ce 111 badGuy = 12;
jlaqua 4:be4ba8a111ce 112 //while(!play);
jlaqua 4:be4ba8a111ce 113 if (play) {
jlaqua 4:be4ba8a111ce 114 masta.start();
jlaqua 4:be4ba8a111ce 115 term.printf("ack = %d\n\r", masta.write(addr));
jlaqua 4:be4ba8a111ce 116 term.printf("ack = %d\n\r", masta.write(0xFF));
jlaqua 4:be4ba8a111ce 117 masta.stop();
jlaqua 2:aed0788e8f96 118 ballState = RIGHTDOWN;
jlaqua 4:be4ba8a111ce 119 }
jlaqua 2:aed0788e8f96 120 break;
jlaqua 2:aed0788e8f96 121 }
jlaqua 2:aed0788e8f96 122
jlaqua 2:aed0788e8f96 123 // Draw stuff
jlaqua 2:aed0788e8f96 124 lcd.cls(); // clear screen
jlaqua 2:aed0788e8f96 125 lcd.circle(ballX, ballY, 2, 1);
jlaqua 2:aed0788e8f96 126 lcd.line(0, badGuy, 0, badGuy+5, 1);
jlaqua 2:aed0788e8f96 127 lcd.line(lcd.width()-1, goodGuy, lcd.width()-1, goodGuy+5, 1);
jlaqua 2:aed0788e8f96 128 lcd.copy_to_lcd();
jlaqua 3:c385027fcc0b 129 wait(0.03);
jlaqua 2:aed0788e8f96 130 }
jlaqua 2:aed0788e8f96 131 }
jlaqua 2:aed0788e8f96 132
jlaqua 4:be4ba8a111ce 133 void pongSlave(void)
jlaqua 4:be4ba8a111ce 134 {
jlaqua 4:be4ba8a111ce 135 static const int LEFTUP = 0;
jlaqua 4:be4ba8a111ce 136 static const int LEFTDOWN = 1;
jlaqua 4:be4ba8a111ce 137 static const int RIGHTUP = 2;
jlaqua 4:be4ba8a111ce 138 static const int RIGHTDOWN = 3;
jlaqua 4:be4ba8a111ce 139 static const int START = 4;
jlaqua 4:be4ba8a111ce 140 int badGuy = 12;
jlaqua 4:be4ba8a111ce 141 int goodGuy = 12;
jlaqua 4:be4ba8a111ce 142 int ballX = 0;
jlaqua 4:be4ba8a111ce 143 int ballY = 64;
jlaqua 4:be4ba8a111ce 144 int ballState = START;
jlaqua 4:be4ba8a111ce 145
jlaqua 4:be4ba8a111ce 146 I2CSlave slave(p9,p10);
jlaqua 4:be4ba8a111ce 147 slave.address(addr);
jlaqua 4:be4ba8a111ce 148
jlaqua 4:be4ba8a111ce 149 while(1) {
jlaqua 4:be4ba8a111ce 150 if (ballState != START) {
jlaqua 4:be4ba8a111ce 151 DigitalIn up(p15);
jlaqua 4:be4ba8a111ce 152 DigitalIn down(p12);
jlaqua 4:be4ba8a111ce 153 if (up)
jlaqua 4:be4ba8a111ce 154 goodGuy--;
jlaqua 4:be4ba8a111ce 155 if (down)
jlaqua 4:be4ba8a111ce 156 goodGuy++;
jlaqua 4:be4ba8a111ce 157
jlaqua 4:be4ba8a111ce 158 if (goodGuy < 0)
jlaqua 4:be4ba8a111ce 159 goodGuy = 0;
jlaqua 4:be4ba8a111ce 160 if (goodGuy + 5 > lcd.height()-1)
jlaqua 4:be4ba8a111ce 161 goodGuy = lcd.height()-6;
jlaqua 4:be4ba8a111ce 162
jlaqua 4:be4ba8a111ce 163 char foo = slave.receive();
jlaqua 4:be4ba8a111ce 164 char futureBadGuy = slave.read();
jlaqua 4:be4ba8a111ce 165 switch (foo) {
jlaqua 4:be4ba8a111ce 166 case I2CSlave::WriteAddressed:
jlaqua 4:be4ba8a111ce 167 badGuy = (int)futureBadGuy;
jlaqua 4:be4ba8a111ce 168 break;
jlaqua 4:be4ba8a111ce 169 case I2CSlave::ReadAddressed:
jlaqua 4:be4ba8a111ce 170 // Send good guy yo
jlaqua 4:be4ba8a111ce 171 slave.write((char)goodGuy);
jlaqua 4:be4ba8a111ce 172 break;
jlaqua 4:be4ba8a111ce 173 }
jlaqua 4:be4ba8a111ce 174 }
jlaqua 4:be4ba8a111ce 175
jlaqua 4:be4ba8a111ce 176 switch(ballState) {
jlaqua 4:be4ba8a111ce 177 case LEFTUP:
jlaqua 4:be4ba8a111ce 178 ballX--;
jlaqua 4:be4ba8a111ce 179 ballY--;
jlaqua 4:be4ba8a111ce 180 if (ballX <= 0) {
jlaqua 4:be4ba8a111ce 181 if ((ballY >= goodGuy) && (ballY <= goodGuy+5))
jlaqua 4:be4ba8a111ce 182 ballState = RIGHTUP;
jlaqua 4:be4ba8a111ce 183 else
jlaqua 4:be4ba8a111ce 184 ballState = START;
jlaqua 4:be4ba8a111ce 185 }
jlaqua 4:be4ba8a111ce 186 if (ballY <= 0)
jlaqua 4:be4ba8a111ce 187 ballState = LEFTDOWN;
jlaqua 4:be4ba8a111ce 188 break;
jlaqua 4:be4ba8a111ce 189 case LEFTDOWN:
jlaqua 4:be4ba8a111ce 190 ballX--;
jlaqua 4:be4ba8a111ce 191 ballY++;
jlaqua 4:be4ba8a111ce 192 if (ballX <= 0) {
jlaqua 4:be4ba8a111ce 193 if ((ballY >= goodGuy) && (ballY <= goodGuy+5))
jlaqua 4:be4ba8a111ce 194 ballState = RIGHTDOWN;
jlaqua 4:be4ba8a111ce 195 else
jlaqua 4:be4ba8a111ce 196 ballState = START;
jlaqua 4:be4ba8a111ce 197 }
jlaqua 4:be4ba8a111ce 198 if (ballY >= lcd.height()-1)
jlaqua 4:be4ba8a111ce 199 ballState = LEFTUP;
jlaqua 4:be4ba8a111ce 200 break;
jlaqua 4:be4ba8a111ce 201 case RIGHTUP:
jlaqua 4:be4ba8a111ce 202 ballX++;
jlaqua 4:be4ba8a111ce 203 ballY--;
jlaqua 4:be4ba8a111ce 204 if (ballX >= lcd.width()-1) {
jlaqua 4:be4ba8a111ce 205 if ((ballY >= badGuy) && (ballY <= badGuy+5))
jlaqua 4:be4ba8a111ce 206 ballState = LEFTUP;
jlaqua 4:be4ba8a111ce 207 else
jlaqua 4:be4ba8a111ce 208 ballState = START;
jlaqua 4:be4ba8a111ce 209 }
jlaqua 4:be4ba8a111ce 210 if (ballY <= 0)
jlaqua 4:be4ba8a111ce 211 ballState = RIGHTDOWN;
jlaqua 4:be4ba8a111ce 212 break;
jlaqua 4:be4ba8a111ce 213 case RIGHTDOWN:
jlaqua 4:be4ba8a111ce 214 ballX++;
jlaqua 4:be4ba8a111ce 215 ballY++;
jlaqua 4:be4ba8a111ce 216 if (ballX >= lcd.width()-1) {
jlaqua 4:be4ba8a111ce 217 if ((ballY >= badGuy) && (ballY <= badGuy+5))
jlaqua 4:be4ba8a111ce 218 ballState = LEFTDOWN;
jlaqua 4:be4ba8a111ce 219 else
jlaqua 4:be4ba8a111ce 220 ballState = START;
jlaqua 4:be4ba8a111ce 221 }
jlaqua 4:be4ba8a111ce 222 if (ballY >= lcd.height()-1)
jlaqua 4:be4ba8a111ce 223 ballState = RIGHTUP;
jlaqua 4:be4ba8a111ce 224 break;
jlaqua 4:be4ba8a111ce 225 case START:
jlaqua 4:be4ba8a111ce 226 ballX = lcd.width()/2;
jlaqua 4:be4ba8a111ce 227 ballY = 0;
jlaqua 4:be4ba8a111ce 228 goodGuy = 12;
jlaqua 4:be4ba8a111ce 229 badGuy = 12;
jlaqua 4:be4ba8a111ce 230 int bar = slave.receive();
jlaqua 4:be4ba8a111ce 231 unsigned char play = slave.read();
jlaqua 4:be4ba8a111ce 232 term.printf("bar = %d\tplay = 0x%02X\n\r", bar, play);
jlaqua 4:be4ba8a111ce 233 if (bar == I2CSlave::WriteAddressed && play == 0xFF) {
jlaqua 4:be4ba8a111ce 234 ballState = RIGHTDOWN;
jlaqua 4:be4ba8a111ce 235 }
jlaqua 4:be4ba8a111ce 236 break;
jlaqua 4:be4ba8a111ce 237 }
jlaqua 4:be4ba8a111ce 238
jlaqua 4:be4ba8a111ce 239 // Draw stuff
jlaqua 4:be4ba8a111ce 240 lcd.cls(); // clear screen
jlaqua 4:be4ba8a111ce 241 lcd.circle(ballX, ballY, 2, 1);
jlaqua 4:be4ba8a111ce 242 lcd.line(0, goodGuy, 0, goodGuy+5, 1);
jlaqua 4:be4ba8a111ce 243 lcd.line(lcd.width()-1, badGuy, lcd.width()-1, badGuy+5, 1);
jlaqua 4:be4ba8a111ce 244 lcd.copy_to_lcd();
jlaqua 4:be4ba8a111ce 245 wait(0.03);
jlaqua 4:be4ba8a111ce 246 }
jlaqua 4:be4ba8a111ce 247 }
jlaqua 4:be4ba8a111ce 248
jlaqua 2:aed0788e8f96 249 void etchASketch()
jlaqua 2:aed0788e8f96 250 {
jlaqua 2:aed0788e8f96 251 int counter = 0;
jlaqua 3:c385027fcc0b 252 acc.setSampleRate(120);
jlaqua 0:00653d8e42a1 253 while(1) {
jlaqua 1:65aea95224b8 254 int x = (int)((1-potX) * lcd.width());
jlaqua 1:65aea95224b8 255 int y = (int)((1-potY) * lcd.height());
jlaqua 1:65aea95224b8 256 lcd.pixel(x, y, 1);
jlaqua 1:65aea95224b8 257 lcd.copy_to_lcd();
jlaqua 2:aed0788e8f96 258 if (counter > 100) {
jlaqua 3:c385027fcc0b 259 if (acc.x() > 1.3)
jlaqua 2:aed0788e8f96 260 lcd.cls();
jlaqua 2:aed0788e8f96 261 counter = 0;
jlaqua 2:aed0788e8f96 262 }
jlaqua 2:aed0788e8f96 263 counter++;
jlaqua 0:00653d8e42a1 264 }
jlaqua 0:00653d8e42a1 265 }
jlaqua 2:aed0788e8f96 266
jlaqua 2:aed0788e8f96 267 int main()
jlaqua 2:aed0788e8f96 268 {
jlaqua 4:be4ba8a111ce 269 DigitalIn up(p15);
jlaqua 4:be4ba8a111ce 270 DigitalIn down(p12);
jlaqua 4:be4ba8a111ce 271 DigitalIn play(p14);
jlaqua 4:be4ba8a111ce 272
jlaqua 2:aed0788e8f96 273 int choice = 0;
jlaqua 4:be4ba8a111ce 274 lcd.printf(" Etch-A-Sketch\n");
jlaqua 4:be4ba8a111ce 275 lcd.printf(" PongMaster\n");
jlaqua 4:be4ba8a111ce 276 lcd.printf(" PongSlave\n");
jlaqua 2:aed0788e8f96 277 while(1) {
jlaqua 4:be4ba8a111ce 278 if (up) {
jlaqua 4:be4ba8a111ce 279 while(up);
jlaqua 4:be4ba8a111ce 280 choice--;
jlaqua 4:be4ba8a111ce 281 }
jlaqua 4:be4ba8a111ce 282 if (down) {
jlaqua 4:be4ba8a111ce 283 while(down);
jlaqua 4:be4ba8a111ce 284 choice++;
jlaqua 4:be4ba8a111ce 285 }
jlaqua 4:be4ba8a111ce 286 choice = (choice + 3) % 3;
jlaqua 2:aed0788e8f96 287 if (play) {
jlaqua 4:be4ba8a111ce 288 while(play);
jlaqua 2:aed0788e8f96 289 lcd.cls();
jlaqua 2:aed0788e8f96 290 switch (choice) {
jlaqua 2:aed0788e8f96 291 case 0:
jlaqua 2:aed0788e8f96 292 etchASketch();
jlaqua 2:aed0788e8f96 293 break;
jlaqua 2:aed0788e8f96 294 case 1:
jlaqua 4:be4ba8a111ce 295 pongMasta();
jlaqua 4:be4ba8a111ce 296 break;
jlaqua 4:be4ba8a111ce 297 case 2:
jlaqua 4:be4ba8a111ce 298 pongSlave();
jlaqua 2:aed0788e8f96 299 break;
jlaqua 2:aed0788e8f96 300 }
jlaqua 2:aed0788e8f96 301 }
jlaqua 4:be4ba8a111ce 302 for (int i = 0; i < 3; i++) {
jlaqua 4:be4ba8a111ce 303 if (choice != i)
jlaqua 4:be4ba8a111ce 304 lcd.fillcircle(12,5+i*8,2,0);
jlaqua 4:be4ba8a111ce 305 }
jlaqua 4:be4ba8a111ce 306 lcd.fillcircle(12,5+choice*8,2,1);
jlaqua 2:aed0788e8f96 307 lcd.copy_to_lcd();
jlaqua 2:aed0788e8f96 308 }
jlaqua 2:aed0788e8f96 309 }