The world's greatest etch a sketch
Dependencies: mbed C12832 MMA7660
main.cpp
- Committer:
- jlaqua
- Date:
- 2014-02-26
- Revision:
- 4:be4ba8a111ce
- Parent:
- 3:c385027fcc0b
File content as of revision 4:be4ba8a111ce:
#include "mbed.h" #include "C12832.h" #include "MMA7660.h" AnalogIn potX(p20); AnalogIn potY(p19); MMA7660 acc(p28, p27); C12832 lcd(p5, p7, p6, p8, p11); Serial term(USBTX, USBRX); char addr = 0x42; void pongMasta(void) { DigitalIn play(p14); static const int LEFTUP = 0; static const int LEFTDOWN = 1; static const int RIGHTUP = 2; static const int RIGHTDOWN = 3; static const int START = 4; int badGuy = 12; int goodGuy = 12; int ballX = 64; int ballY = 0; int ballState = START; I2C masta(p9,p10); while(1) { DigitalIn up(p15); DigitalIn down(p12); if (up) goodGuy--; if (down) goodGuy++; if (goodGuy < 0) goodGuy = 0; if (goodGuy + 5 > lcd.height()-1) goodGuy = lcd.height()-6; if (ballState != START) { // Send good guy yo masta.start(); masta.write(addr); masta.write((char)goodGuy); masta.stop(); // Read bad guy bro masta.start(); masta.write(addr|0x01); badGuy = (int)masta.read(addr); masta.stop(); } switch(ballState) { case LEFTUP: ballX--; ballY--; if (ballX <= 0) { if ((ballY >= badGuy) && (ballY <= badGuy+5)) ballState = RIGHTUP; else ballState = START; } if (ballY <= 0) ballState = LEFTDOWN; break; case LEFTDOWN: ballX--; ballY++; if (ballX <= 0) { if ((ballY >= badGuy) && (ballY <= badGuy+5)) ballState = RIGHTDOWN; else ballState = START; } if (ballY >= lcd.height()-1) ballState = LEFTUP; break; case RIGHTUP: ballX++; ballY--; if (ballX >= lcd.width()-1) { if ((ballY >= goodGuy) && (ballY <= goodGuy+5)) ballState = LEFTUP; else ballState = START; } if (ballY <= 0) ballState = RIGHTDOWN; break; case RIGHTDOWN: ballX++; ballY++; if (ballX >= lcd.width()-1) { if ((ballY >= goodGuy) && (ballY <= goodGuy+5)) ballState = LEFTDOWN; else ballState = START; } if (ballY >= lcd.height()-1) ballState = RIGHTUP; break; case START: ballX = lcd.width()/2; ballY = 0; goodGuy = 12; badGuy = 12; //while(!play); if (play) { masta.start(); term.printf("ack = %d\n\r", masta.write(addr)); term.printf("ack = %d\n\r", masta.write(0xFF)); masta.stop(); ballState = RIGHTDOWN; } break; } // Draw stuff lcd.cls(); // clear screen lcd.circle(ballX, ballY, 2, 1); lcd.line(0, badGuy, 0, badGuy+5, 1); lcd.line(lcd.width()-1, goodGuy, lcd.width()-1, goodGuy+5, 1); lcd.copy_to_lcd(); wait(0.03); } } void pongSlave(void) { static const int LEFTUP = 0; static const int LEFTDOWN = 1; static const int RIGHTUP = 2; static const int RIGHTDOWN = 3; static const int START = 4; int badGuy = 12; int goodGuy = 12; int ballX = 0; int ballY = 64; int ballState = START; I2CSlave slave(p9,p10); slave.address(addr); while(1) { if (ballState != START) { DigitalIn up(p15); DigitalIn down(p12); if (up) goodGuy--; if (down) goodGuy++; if (goodGuy < 0) goodGuy = 0; if (goodGuy + 5 > lcd.height()-1) goodGuy = lcd.height()-6; char foo = slave.receive(); char futureBadGuy = slave.read(); switch (foo) { case I2CSlave::WriteAddressed: badGuy = (int)futureBadGuy; break; case I2CSlave::ReadAddressed: // Send good guy yo slave.write((char)goodGuy); break; } } switch(ballState) { case LEFTUP: ballX--; ballY--; if (ballX <= 0) { if ((ballY >= goodGuy) && (ballY <= goodGuy+5)) ballState = RIGHTUP; else ballState = START; } if (ballY <= 0) ballState = LEFTDOWN; break; case LEFTDOWN: ballX--; ballY++; if (ballX <= 0) { if ((ballY >= goodGuy) && (ballY <= goodGuy+5)) ballState = RIGHTDOWN; else ballState = START; } if (ballY >= lcd.height()-1) ballState = LEFTUP; break; case RIGHTUP: ballX++; ballY--; if (ballX >= lcd.width()-1) { if ((ballY >= badGuy) && (ballY <= badGuy+5)) ballState = LEFTUP; else ballState = START; } if (ballY <= 0) ballState = RIGHTDOWN; break; case RIGHTDOWN: ballX++; ballY++; if (ballX >= lcd.width()-1) { if ((ballY >= badGuy) && (ballY <= badGuy+5)) ballState = LEFTDOWN; else ballState = START; } if (ballY >= lcd.height()-1) ballState = RIGHTUP; break; case START: ballX = lcd.width()/2; ballY = 0; goodGuy = 12; badGuy = 12; int bar = slave.receive(); unsigned char play = slave.read(); term.printf("bar = %d\tplay = 0x%02X\n\r", bar, play); if (bar == I2CSlave::WriteAddressed && play == 0xFF) { ballState = RIGHTDOWN; } break; } // Draw stuff lcd.cls(); // clear screen lcd.circle(ballX, ballY, 2, 1); lcd.line(0, goodGuy, 0, goodGuy+5, 1); lcd.line(lcd.width()-1, badGuy, lcd.width()-1, badGuy+5, 1); lcd.copy_to_lcd(); wait(0.03); } } void etchASketch() { int counter = 0; acc.setSampleRate(120); while(1) { int x = (int)((1-potX) * lcd.width()); int y = (int)((1-potY) * lcd.height()); lcd.pixel(x, y, 1); lcd.copy_to_lcd(); if (counter > 100) { if (acc.x() > 1.3) lcd.cls(); counter = 0; } counter++; } } int main() { DigitalIn up(p15); DigitalIn down(p12); DigitalIn play(p14); int choice = 0; lcd.printf(" Etch-A-Sketch\n"); lcd.printf(" PongMaster\n"); lcd.printf(" PongSlave\n"); while(1) { if (up) { while(up); choice--; } if (down) { while(down); choice++; } choice = (choice + 3) % 3; if (play) { while(play); lcd.cls(); switch (choice) { case 0: etchASketch(); break; case 1: pongMasta(); break; case 2: pongSlave(); break; } } for (int i = 0; i < 3; i++) { if (choice != i) lcd.fillcircle(12,5+i*8,2,0); } lcd.fillcircle(12,5+choice*8,2,1); lcd.copy_to_lcd(); } }