1D-Pong game based on a LED strip with 150 LPD6803-controlled pixels. Game keeps score for 'best-of-21' game. Written for KL25Z

Dependencies:   MODSERIAL mbed

Revision:
12:97c71b84c984
Parent:
11:fc80c39ba9f0
Child:
13:e96098b6660d
--- a/main.cpp	Thu Aug 22 07:11:27 2013 +0000
+++ b/main.cpp	Thu Aug 22 22:35:36 2013 +0000
@@ -1,7 +1,8 @@
 #include "mbed.h"
-
+#include "MODSERIAL.h"
 #define NUMBER_OF_PIXELS 50
 #define PADDLE_LENGTH    5
+#define STARTING_SPEED   20
 #define LEFT false
 #define RIGHT true
 
@@ -16,6 +17,7 @@
 uint16_t totalstrip[NUMBER_OF_PIXELS];
 volatile int8_t paddlestart= 0;
 SPI ledstrip(PTD2,NC,PTD1);
+MODSERIAL pc(USBTX,USBRX);
 
 class Paddle
 {
@@ -24,7 +26,7 @@
 //    ~Paddle();//deconstructor
     int16_t position;
     uint8_t direction;
-    void setSpeed(float speed);
+    void setSpeed(float speed); //pixels per second
     void setColor(uint8_t red, uint8_t green, uint8_t blue);
     uint8_t getSize(void);
     void setSize(uint8_t size);
@@ -130,15 +132,17 @@
 
 Paddle paddle;
 bool leftpushed = false, rightpushed = false;
-
+int16_t leftpushpos= 0, rightpushpos = 0;
 void left_pushed(void)
 {
+    leftpushpos = paddle.position;
     if(paddle.direction != 1)
         leftpushed = true;
 }
 
 void right_pushed(void)
 {
+    rightpushpos = paddle.position;
     if(paddle.direction == 1)
         rightpushed = true;
 }
@@ -146,49 +150,79 @@
 int main()
 {
     Ticker updater;
-    Ticker demopaddlepos;
+    //Ticker demopaddlepos;
     Timer  gametimer;
     InterruptIn buttonleft(PTD5);
     InterruptIn buttonright(PTD0);
     uint8_t ledcounter;
     uint8_t left_score = 0, right_score = 0;
+    pc.baud(115200);
     buttonleft.mode(PullUp);
     buttonright.mode(PullUp);
     buttonright.fall(right_pushed);
     buttonleft.fall(left_pushed);
-    updater.attach(UpdateLEDstrip, .01);
-    demopaddlepos.attach(UpdateDemoPaddle, .03);
+    updater.attach(UpdateLEDstrip, .03);
+    //demopaddlepos.attach(UpdateDemoPaddle, .03);
     ledstrip.format(8,0);        //15 bits, mode '0'
     ledstrip.frequency(1000000); //1MHz clock
     for(ledcounter = 0; ledcounter < NUMBER_OF_PIXELS; ledcounter++) {//turn off leds
         write_led(&totalstrip[ledcounter], 0,0,0);
     }
     paddle.setSize(6);
-    paddle.setSpeed(30);
+    paddle.setSpeed(STARTING_SPEED);
     paddle.setColor(255,0,255);
     gametimer.start();
     while(1) {
         static uint8_t naglevel1 = 0, naglevel2 = 0;
-        DrawGamePaddle();
+        //paddle.position = 48;
+        //while(1);
         if(paddle.direction == 1)
         {
             if(rightpushed)
             {
+                //printf("\n\rright pushed"); 
                 rightpushed = false;
-                if(paddle.position > (NUMBER_OF_PIXELS - paddle.getSize()) && paddle.position < NUMBER_OF_PIXELS)
+                if(rightpushpos >= NUMBER_OF_PIXELS && rightpushpos < (NUMBER_OF_PIXELS + paddle.getSize()) )
+                {
                     paddle.direction = 0;
+                    paddle.position = NUMBER_OF_PIXELS;
+                }
+                pc.printf("\n\rright pushed. Paddle position: %d, registered: %d", paddle.position, rightpushpos);
             }
         }
         else
         {           
             if(leftpushed)
             {
+                //printf("\n\rleft pushed");
                 leftpushed = false;
-                if(paddle.position > -paddle.getSize() && (paddle.position <= 0 ) )
+                if(leftpushpos > -paddle.getSize() && (paddle.position <= 0 ) )
+                {
                     paddle.direction = 1;
+                    paddle.position  = 0;
+                }
+                pc.printf("\n\rleft pushed. Paddle position: %d, registered: %d", paddle.position, leftpushpos);
             }
         }
-        if(gametimer.read()>6 && !naglevel1)
+        if(paddle.position > ( NUMBER_OF_PIXELS + paddle.getSize() ) && (paddle.direction == 1))
+        {
+            pc.printf("\n\rleft player score. Paddle position: %d", paddle.position);
+            //left player scores!
+            left_score++;
+            HandleScore(&left_score,&right_score,false, &gametimer);
+            paddle.position = -paddle.getSize();
+            naglevel1=naglevel2 = 0;
+        }
+         if(paddle.position < -paddle.getSize() && (paddle.direction == 0))
+         {
+            pc.printf("\n\rleft player score. Paddle position: %d", paddle.position);
+            //right player scores!
+            right_score++;
+            HandleScore(&left_score,&right_score,true, &gametimer);
+            naglevel1=naglevel2 = 0;
+            paddle.position = NUMBER_OF_PIXELS;
+         }
+         if(gametimer.read()>6 && !naglevel1)
         {
             naglevel1 = 1;
             paddle.setSize(4);
@@ -200,22 +234,7 @@
             paddle.setSize(2);
             paddle.setSpeed(70);
         }   
-        if(paddle.position >= NUMBER_OF_PIXELS && (paddle.direction == 1))
-        {
-            //left player scores!
-            left_score++;
-            HandleScore(&left_score,&right_score,false, &gametimer);
-            paddle.position = -paddle.getSize();
-            naglevel1=naglevel2 = 0;
-        }
-         if(paddle.position < -paddle.getSize() && (paddle.direction == 0))
-         {
-            //right player scores!
-            right_score++;
-            HandleScore(&left_score,&right_score,true, &gametimer);
-            naglevel1=naglevel2 = 0;
-            paddle.position = NUMBER_OF_PIXELS;
-         }
+        DrawGamePaddle();
     }
 }
 
@@ -231,30 +250,35 @@
     }
     (*(mbed::Timer *)gametimer).reset();
     paddle.setSize(6);
-    paddle.setSpeed(30);
+    paddle.setSpeed(STARTING_SPEED);
 }
 
 void DrawGamePaddle(void)
 {
     uint8_t ledcounter;
+    uint8_t colorpos;
     for(ledcounter = 0; ledcounter< NUMBER_OF_PIXELS; ledcounter++)
     {
-        if(ledcounter >= paddle.position && ledcounter <= paddle.position+paddle.getSize())
+        if(paddle.direction == 1)
         {
-            uint8_t colorpos;
-            if(paddle.direction ==1)
+           if(ledcounter > paddle.position-paddle.getSize() && ledcounter <= paddle.position)
             {
-                colorpos = ledcounter-paddle.position;
+                colorpos = paddle.getSize()-(paddle.position - ledcounter);//paddle.getSize()-(ledcounter-paddle.position);
                 write_led(&totalstrip[ledcounter],paddle.getColor(colorpos,0),paddle.getColor(colorpos,1),paddle.getColor(colorpos,2));
             }
             else
+                write_led(&totalstrip[ledcounter], 0,0,0);        
+        }
+        else
+        {
+            if(ledcounter >= paddle.position && ledcounter <= paddle.position+paddle.getSize())
             {
                 colorpos = paddle.getSize()-(ledcounter-paddle.position);
                 write_led(&totalstrip[ledcounter],paddle.getColor(colorpos,0),paddle.getColor(colorpos,1),paddle.getColor(colorpos,2));
             }
+            else
+                write_led(&totalstrip[ledcounter], 0,0,0);
         }
-        else
-            write_led(&totalstrip[ledcounter], 0,0,0);
     }
 }