Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed C12832 MMA7660
Revision 4:be4ba8a111ce, committed 2014-02-26
- Comitter:
- jlaqua
- Date:
- Wed Feb 26 03:39:10 2014 +0000
- Parent:
- 3:c385027fcc0b
- Commit message:
- pong party faileth..no acks yo
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
diff -r c385027fcc0b -r be4ba8a111ce main.cpp
--- a/main.cpp Tue Feb 25 20:52:24 2014 +0000
+++ b/main.cpp Wed Feb 26 03:39:10 2014 +0000
@@ -6,43 +6,30 @@
AnalogIn potY(p19);
MMA7660 acc(p28, p27);
C12832 lcd(p5, p7, p6, p8, p11);
+Serial term(USBTX, USBRX);
-DigitalIn play(p14);
-DigitalIn up(p15);
-DigitalIn down(p12);
+char addr = 0x42;
+
+void pongMasta(void)
+{
+ DigitalIn play(p14);
-static const int DOWN = 0;
-static const int UP = 1;
-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 badGuyState = DOWN;
-int goodGuy;
-int ballX;
-int ballY;
-int ballState = START;
+ 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;
-
-void pong(void)
-{
+ I2C masta(p9,p10);
+
while(1) {
DigitalIn up(p15);
DigitalIn down(p12);
- switch(badGuyState) {
- case DOWN:
- badGuy++;
- if (badGuy+5 >= lcd.height()-1)
- badGuyState = UP;
- break;
- case UP:
- badGuy--;
- if (badGuy <= 0)
- badGuyState = DOWN;
- break;
- }
if (up)
goodGuy--;
@@ -53,6 +40,20 @@
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:
@@ -107,8 +108,15 @@
ballX = lcd.width()/2;
ballY = 0;
goodGuy = 12;
- if (play)
+ 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;
}
@@ -122,6 +130,122 @@
}
}
+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;
@@ -142,27 +266,44 @@
int main()
{
+ DigitalIn up(p15);
+ DigitalIn down(p12);
+ DigitalIn play(p14);
+
int choice = 0;
- lcd.printf("\n Etch-A-Sketch\n");
- lcd.printf(" Pong");
+ lcd.printf(" Etch-A-Sketch\n");
+ lcd.printf(" PongMaster\n");
+ lcd.printf(" PongSlave\n");
while(1) {
- if (up)
- choice = 0;
- if (down)
- choice = 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:
- pong();
+ pongMasta();
+ break;
+ case 2:
+ pongSlave();
break;
}
}
- lcd.fillcircle(12,13+!choice*8,2,0);
- lcd.fillcircle(12,13+choice*8,2,1);
+ 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();
}
}