Various applications using the LCD. Cycle through the applications by pressing down on the joystick

Dependencies:   C12832 MMA7660 mbed

Revision:
0:b8fc40cb537b
Child:
1:ff7ee2c32cd1
diff -r 000000000000 -r b8fc40cb537b main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Feb 21 22:12:31 2014 +0000
@@ -0,0 +1,303 @@
+#include "mbed.h"
+#include "C12832.h"
+#include "MMA7660.h"
+
+BusIn joy(p15,p12,p13,p16);
+DigitalIn fire(p14);
+C12832 lcd(p5, p7, p6, p8, p11);
+AnalogIn pot1(p19);
+AnalogIn pot2(p20);
+DigitalIn joyUp(p15); 
+DigitalIn joyDown(p12);
+DigitalIn joyLeft(p13);
+DigitalIn joyRight(p16);
+MMA7660 MMA(p28, p27); //I2C Accelerometer
+Serial pc(USBTX, USBRX); // tx, rx
+
+BusOut leds(LED1,LED2,LED3,LED4);
+int appIndex = 0;
+const int NUM_APPS = 4;
+bool appSwitch = true;
+enum SnakeDirection{RIGHT,LEFT,UP,DOWN};
+const int SCREEN_WIDTH = 128;
+const int SCREEN_HEIGHT = 32;
+struct Point {int x; int y;};
+/*
+Index   App
+0       Etch a sketch
+1       Flat Level
+2       Snake
+3       ?
+*/
+
+int main()
+{
+    //potentiometer variables
+    float etchX = 0;
+    float etchY = 0;
+    //accelerometer variables
+    int x=0,y=0;
+    //snake variables
+    const int SNAKE_MAX = 256;
+    Point snake[SNAKE_MAX];
+    int snakeHead = 4;//the front filled square in the snake
+    int snakeTail = 0;
+    SnakeDirection snakeGo = RIGHT;
+    bool gameOver = false;
+    int points = 0;
+    Point goalLoc;
+    
+    lcd.cls();
+    lcd.printf("hello world");
+    
+    while(1) {
+        if (fire) {
+            appIndex = (appIndex+1)%NUM_APPS;
+            leds=0xf;
+            appSwitch = true;
+        }
+        else {
+            leds=joy;
+        }
+        
+        switch(appIndex) {
+            case 0: {
+                if(appSwitch){
+                    lcd.cls();
+                    lcd.locate(0,0);
+                    lcd.printf("Etch-a-Sketch");
+                    wait(2);
+                    lcd.cls();
+                    lcd.locate(0,0);
+                    appSwitch=false;
+                }
+                //read potentiometers in scaled volatge
+                etchY = 32-pot1.read()*32;
+                etchX = 128-pot2.read()*128;
+                lcd.pixel((int)etchX, (int)etchY, 1);
+                lcd.copy_to_lcd();
+                x = MMA.x();
+                y = MMA.y();
+                if(x > .9 || x < -.9 || y > .9 || y < -.9){
+                    lcd.cls();
+                }
+                break;}
+            case 1: {
+                if(appSwitch){
+                    lcd.cls();
+                    lcd.locate(0,0);
+                    lcd.printf("Flat Level");
+                    wait(2);
+                    lcd.cls();
+                    lcd.locate(0,0);
+                    appSwitch=false;
+                }
+                //read X,Y +/-Gs and scale for #display pixels
+                x = (x + MMA.x() * 32.0)/2.0;
+                y = (y -(MMA.y() * 16.0))/2.0;
+                lcd.fillcircle(x+63, y+15, 3, 1); //draw bubble
+                lcd.line(0, 11, 127, 11, 1);
+                lcd.line(0, 20, 127, 20, 1);
+                lcd.line(59, 0, 59, 31, 1);
+                lcd.line(68, 0, 68, 31, 1);
+                //lcd.circle(63, 15, 8, 1);
+                wait(.2); //time delay
+                lcd.fillcircle(x+63, y+15, 3, 0); //erase bubble
+                break;}
+            case 2: {//snake
+                if(appSwitch || gameOver){
+                    lcd.cls();
+                    lcd.locate(0,0);
+                    lcd.printf("Snake");
+                    
+                    //setup new snake
+                    snakeTail = 0;
+                    snakeHead = 4;
+                    snakeGo = RIGHT;
+                    snake[0].x = 0;
+                    snake[0].y = 14;
+                    snake[1].x = 2;
+                    snake[1].y = 14;
+                    snake[2].x = 4;
+                    snake[2].y = 14;
+                    snake[3].x = 6;
+                    snake[3].y = 14;
+                    snake[4].x = 8;
+                    snake[4].y = 14;
+                    gameOver = false;
+                    points = 0;
+                    float seed = pot1.read()*pot2.read()*100000;
+                    srand((int)seed);
+                    goalLoc.x = (rand()%64)*2;
+                    goalLoc.y = (rand()%16)*2;
+                    
+                    wait(2);
+                    lcd.cls();
+                    lcd.locate(0,0);
+                    appSwitch=false;
+                    
+                    //draw initial snake
+                    for(int i = 0; i<=snakeHead; i++){
+                        lcd.fillrect(snake[i].x, snake[i].y, snake[i].x+1, snake[i].y+1, 1);
+                    }
+                    //draw initial goal location
+                    lcd.fillrect(goalLoc.x, goalLoc.y, goalLoc.x+1, goalLoc.y+1, 1);
+                    lcd.copy_to_lcd();
+                    
+                    //wait for user to see snake before moving
+                    wait(1);
+                }
+                
+                //read joystick to get new direction
+                if(joyUp && DOWN != snakeGo)
+                {snakeGo = UP;}
+                if(joyDown && UP != snakeGo)
+                {snakeGo = DOWN;}
+                if(joyLeft && RIGHT != snakeGo)
+                {snakeGo = LEFT;}
+                if(joyRight && LEFT != snakeGo)
+                {snakeGo = RIGHT;}
+                
+                //move snake
+                switch(snakeGo){
+                    case RIGHT:
+                        //clear tail
+                        lcd.fillrect(snake[snakeTail].x, snake[snakeTail].y, snake[snakeTail].x+1, snake[snakeTail].y+1, 0);
+                        snakeTail = (snakeTail+1)%SNAKE_MAX;
+                        //draw new front
+                        snake[snakeHead+1].x = snake[snakeHead].x + 2;
+                        snake[snakeHead+1].y = snake[snakeHead].y;
+                        snakeHead = (snakeHead+1)%SNAKE_MAX;
+                        lcd.fillrect(snake[snakeHead].x, snake[snakeHead].y, snake[snakeHead].x+1, snake[snakeHead].y+1, 1);
+                        //copy to lcd
+                        lcd.copy_to_lcd();
+                        //check if we went off the screen
+                        if(snake[snakeHead].x >= SCREEN_WIDTH){
+                            gameOver = true;
+                            pc.printf("Off screen to right\n");
+                        }
+                        break;
+                    case LEFT:
+                        //clear tail
+                        lcd.fillrect(snake[snakeTail].x, snake[snakeTail].y, snake[snakeTail].x+1, snake[snakeTail].y+1, 0);
+                        snakeTail = (snakeTail+1)%SNAKE_MAX;
+                        //draw new front
+                        snake[snakeHead+1].x = snake[snakeHead].x - 2;
+                        snake[snakeHead+1].y = snake[snakeHead].y;
+                        snakeHead = (snakeHead+1)%SNAKE_MAX;
+                        lcd.fillrect(snake[snakeHead].x, snake[snakeHead].y, snake[snakeHead].x+1, snake[snakeHead].y+1, 1);
+                        //copy to lcd
+                        lcd.copy_to_lcd();
+                        //check if we went off the screen
+                        if(snake[snakeHead].x < 0){
+                            gameOver = true;
+                            pc.printf("Off screen to left\n");
+                        }
+                        break;
+                    case UP:
+                        //clear tail
+                        lcd.fillrect(snake[snakeTail].x, snake[snakeTail].y, snake[snakeTail].x+1, snake[snakeTail].y+1, 0);
+                        snakeTail = (snakeTail+1)%SNAKE_MAX;
+                        //draw new front
+                        snake[snakeHead+1].x = snake[snakeHead].x;
+                        snake[snakeHead+1].y = snake[snakeHead].y - 2;
+                        snakeHead = (snakeHead+1)%SNAKE_MAX;
+                        lcd.fillrect(snake[snakeHead].x, snake[snakeHead].y, snake[snakeHead].x+1, snake[snakeHead].y+1, 1);
+                        //copy to lcd
+                        lcd.copy_to_lcd();
+                        //check if we went off the screen
+                        if(snake[snakeHead].y < 0){
+                            gameOver = true;
+                            pc.printf("Off screen top\n");
+                        }
+                        //wait?
+                        break;
+                    case DOWN:
+                        //clear tail
+                        lcd.fillrect(snake[snakeTail].x, snake[snakeTail].y, snake[snakeTail].x+1, snake[snakeTail].y+1, 0);
+                        snakeTail = (snakeTail+1)%SNAKE_MAX;
+                        //draw new front
+                        snake[snakeHead+1].x = snake[snakeHead].x;
+                        snake[snakeHead+1].y = snake[snakeHead].y + 2;
+                        snakeHead = (snakeHead+1)%SNAKE_MAX;
+                        lcd.fillrect(snake[snakeHead].x, snake[snakeHead].y, snake[snakeHead].x+1, snake[snakeHead].y+1, 1);
+                        //copy to lcd
+                        lcd.copy_to_lcd();
+                        //check if we went off the screen
+                        if(snake[snakeHead].y >= SCREEN_HEIGHT){
+                            gameOver = true;
+                            pc.printf("Off screen bottom\n");
+                        }
+                        //wait?
+                        break;
+                }
+                //check if we scored a point
+                if(snake[snakeHead].x == goalLoc.x && snake[snakeHead].y == goalLoc.y){
+                    points++;
+                    //clear old goal and set new goal
+                    lcd.fillrect(goalLoc.x, goalLoc.y, goalLoc.x+1, goalLoc.y+1, 0);
+                    goalLoc.x = (rand()%64)*2;
+                    goalLoc.y = (rand()%16)*2;
+                    lcd.fillrect(goalLoc.x, goalLoc.y, goalLoc.x+1, goalLoc.y+1, 1);
+                    
+                    //add on to the tail
+                    int newTail = (snakeTail-1+SNAKE_MAX)%SNAKE_MAX;
+                    snake[newTail].x = snake[snakeTail].x;
+                    snake[newTail].y = snake[snakeTail].y;
+                    snakeTail = newTail;
+                    
+                    //copy everything to the lcd
+                    lcd.copy_to_lcd();
+                    if(points > SNAKE_MAX-5)
+                    {
+                        gameOver = true;
+                        pc.printf("Game Winner!\n");
+                    }
+                }
+                //check if we hit ourself
+                int testLimit = snakeHead;
+                if(snakeTail > snakeHead){
+                    testLimit = snakeHead+SNAKE_MAX;
+                }
+                for(int i = snakeTail; i < testLimit; i++){
+                    int iMod = i%SNAKE_MAX;
+                    if(snake[snakeHead].x == snake[iMod].x && snake[snakeHead].y == snake[iMod].y){
+                        gameOver = true;
+                        pc.printf("Hit Self\n");
+                    }
+                }
+                
+                if(gameOver){
+                    //lcd.cls();
+                    lcd.locate(0,0);
+                    lcd.printf("Game Over, Press Joystick to start over\nPoints Scored: %d",points);
+                    pc.printf("Game Over\n");
+                    while(!fire){
+                        //infinite loop to wait for user to press joystick to restart
+                    }
+                    wait(.5);
+                }
+                
+                break;}
+            case 3: {
+                if(appSwitch){
+                    lcd.cls();
+                    lcd.locate(0,0);
+                    lcd.printf("Horizontal Level");
+                    wait(2);
+                    lcd.cls();
+                    lcd.locate(0,0);
+                    appSwitch=false;
+                }
+                break;}
+            default: {
+                lcd.cls();
+                lcd.locate(0,0);
+                lcd.printf("Error: appIndex out of range - appIndes=%d",appIndex);
+                break;}
+        }
+        
+        
+        wait(0.1);
+    }
+}
\ No newline at end of file