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:
16:f0176e9e4a9d
Parent:
15:72c494e934c8
Child:
17:c5a38d01dfbe
--- a/main.cpp	Fri Aug 23 08:03:51 2013 +0000
+++ b/main.cpp	Fri Aug 23 13:29:11 2013 +0000
@@ -14,6 +14,7 @@
 void Score(uint8_t left, uint8_t right);
 void DrawGamePaddle(void);
 void HandleScore(uint8_t *, uint8_t *, bool, Timer *);
+void DrawLine(uint8_t start, uint8_t end, uint8_t red, uint8_t green, uint8_t blue);
 uint16_t totalstrip[NUMBER_OF_PIXELS];
 volatile int8_t paddlestart= 0;
 SPI ledstrip(PTD2,NC,PTD1);
@@ -111,6 +112,49 @@
     }
 }
 
+class GameButton
+{
+    public:
+    GameButton(PinName pin, float time);
+    bool pushflag;
+    bool getTimeoutActive(void);
+ //   void SetTimeout(float time);
+    private:
+    InterruptIn *intpin;
+    Timeout     timeout;
+    float m_time;
+    bool    m_timeoutactive;
+    void TimeOutHandler(void);
+    void PushHandler(void);
+};
+
+GameButton::GameButton(PinName pin, float time)
+{
+    pushflag = false;
+    intpin = new InterruptIn(pin);
+    (*intpin).mode(PullUp);
+    (*intpin).fall(this, &GameButton::PushHandler);
+    m_time = time;
+    //timeout = new Timeout(m_time);
+}
+
+void GameButton::PushHandler(void)
+{
+    pushflag = true;
+    m_timeoutactive = true;
+    timeout.attach(this, &GameButton::TimeOutHandler, m_time);
+}
+
+void GameButton::TimeOutHandler(void)
+{
+    m_timeoutactive = false;
+}
+
+bool GameButton::getTimeoutActive(void)
+{
+    return m_timeoutactive;
+}
+
 void UpdateLEDstrip(void)
 {
     uint8_t pixelcounter;
@@ -176,6 +220,7 @@
         static uint8_t naglevel1 = 0, naglevel2 = 0;
         //paddle.position = 48;
         //while(1);
+        DrawGamePaddle();
         if(leftpushed || rightpushed)
         {
             if(paddle.direction == 1)
@@ -189,6 +234,7 @@
                         paddle.direction = 0;
                         paddle.setSpeed(25+(rightpushpos-(NUMBER_OF_PIXELS-1))*4);
                         paddle.position = NUMBER_OF_PIXELS-1;
+                        DrawLine(NUMBER_OF_PIXELS-10, NUMBER_OF_PIXELS-1, 255,255,255);
                     }
                     pc.printf("\n\rright pushed. Paddle position: %d, registered: %d", paddle.position, rightpushpos);
                 }
@@ -204,6 +250,7 @@
                         paddle.direction = 1;
                         paddle.setSpeed(25+(-leftpushpos)*4);
                         paddle.position  = 0;
+                        DrawLine(0,9, 255,255,255);
                     }
                     pc.printf("\n\rleft pushed. Paddle position: %d, registered: %d", paddle.position, leftpushpos);
                 }
@@ -242,7 +289,6 @@
             paddle.setSize(2);
             //paddle.setSpeed(70);
         }   
-        DrawGamePaddle();
     }
 }
 
@@ -302,24 +348,31 @@
         uint8_t blue;
     }ledcolor_t;
     ledcolor_t rightled={0,0,0}, leftled={0,0,0};
-    if(left >= right)
-    {
-        maxscore = left;
-        leftled.green = 255;
-        rightled.red  = 255;
-    }
-    if(right >= left)
-    {
-        maxscore = right;
-        leftled.red = 255;
-        rightled.green = 255;
-    }
+    left>=right?maxscore = left: maxscore = right;
     for(scorecounter = 0 ; scorecounter <= maxscore ; scorecounter++)
     {
         uint8_t templeft,tempright;
         templeft = left>scorecounter?scorecounter:left;
         tempright = right>scorecounter?scorecounter:right;
         uint8_t sidecounter;
+        if(scorecounter == maxscore)
+        {
+            if(left >= right)
+            {
+                leftled.green = 255;
+                rightled.red = 255;
+            }
+            if(right >= left)
+            {
+                leftled.red = 255;
+                rightled.green = 255;
+            }
+        }
+        else
+        {
+            leftled.green = leftled.red = leftled.blue = rightled.green = rightled.red = rightled.blue = 255;
+        }    
+  
         for(ledcounter = 0; ledcounter < NUMBER_OF_PIXELS; ledcounter++)
         {
             write_led(&totalstrip[ledcounter], 0, 0 ,0);
@@ -332,9 +385,20 @@
         {
             write_led(&totalstrip[(NUMBER_OF_PIXELS-1)-(sidecounter*2)],rightled.red,rightled.green,rightled.blue);
         }
-        wait(0.4); 
+        wait(0.2); 
     }
-    wait(0.5);
+    wait(0.7);
+}
+
+
+//Only writes pixels that are in 'line'. Does not clear, only overwrites.
+void DrawLine(uint8_t start, uint8_t end, uint8_t red, uint8_t green, uint8_t blue)
+{
+    uint8_t ledcounter;
+    for(ledcounter = start; ledcounter < end ; ledcounter++);
+    {
+        write_led(&totalstrip[ledcounter], red, green, blue);
+    }
 }
 
 void WinLoose(float seconds, bool side)