The world's greatest etch a sketch

Dependencies:   mbed C12832 MMA7660

Files at this revision

API Documentation at this revision

Comitter:
jlaqua
Date:
Thu Feb 20 02:01:06 2014 +0000
Parent:
1:65aea95224b8
Child:
3:c385027fcc0b
Commit message:
added pong and menu

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/main.cpp	Wed Feb 19 21:57:44 2014 +0000
+++ b/main.cpp	Thu Feb 20 02:01:06 2014 +0000
@@ -4,18 +4,160 @@
 
 AnalogIn potX(p20);
 AnalogIn potY(p19);
-
 MMA7660 acc(p28, p27);
-
 C12832 lcd(p5, p7, p6, p8, p11);
 
-int main() {
+DigitalIn play(p14);
+DigitalIn up(p15);
+DigitalIn down(p12);
+
+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;
+
+void pong(void)
+{
+    while(1) {
+        switch(badGuyState) {
+            case DOWN:
+                badGuy++;
+                if (badGuy+5 >= lcd.height()-1)
+                    badGuyState = UP;
+                break;
+            case UP:
+                badGuy--;
+                if (badGuy <= 0)
+                    badGuyState = DOWN;
+                break;
+        }
+
+        goodGuy -= up;
+        goodGuy += down;
+        if (goodGuy < 0)
+            goodGuy = 0;
+        if (goodGuy + 5 > lcd.width()-1)
+            goodGuy = lcd.width()-6;
+
+        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;
+                if (play)
+                    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.02);
+    }
+}
+
+void etchASketch()
+{
+    int counter = 0;
     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 ((acc.x() > 1.3) || (acc.y() > 1.3))
-            lcd.cls();
+        if (counter > 100) {
+            if ((acc.x() > 1.3) || (acc.y() > 1.3))
+                lcd.cls();
+            counter = 0;
+        }
+        counter++;
     }
 }
+
+int main()
+{
+    int choice = 0;
+    lcd.printf("\n    Etch-A-Sketch\n");
+    lcd.printf("    Pong");
+    while(1) {
+        if (up)
+            choice = 0;
+        if (down)
+            choice = 1;
+        if (play) {
+            lcd.cls();
+            switch (choice) {
+                case 0:
+                    etchASketch();
+                    break;
+                case 1:
+                    pong();
+                    break;
+            }
+        }
+        lcd.fillcircle(12,13+!choice*8,2,0);
+        lcd.fillcircle(12,13+choice*8,2,1);
+        lcd.copy_to_lcd();
+    }
+    //etchASketch();
+    //pong();
+}