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:
21:a554229e884b
Parent:
20:a63273c11af0
Child:
22:a7619f315c0e
--- a/main.cpp	Mon Aug 26 14:20:32 2013 +0000
+++ b/main.cpp	Tue Aug 27 18:54:15 2013 +0000
@@ -1,12 +1,13 @@
 #include "mbed.h"
 #include "MODSERIAL.h"
+#include "paddle.h"
+#include "GameButton.h"
 #define NUMBER_OF_PIXELS 50
 #define PADDLE_LENGTH    5
 #define STARTING_SPEED   20
 #define LEFT false
 #define RIGHT true
 
-#define MAX_PADDLE_SIZE 10
 void Randomblinks(float seconds, bool colored = false);
 void PaddleDemo(float seconds, uint8_t red, uint8_t green, uint8_t blue);
 void WinLoose(float seconds, bool side);
@@ -21,146 +22,6 @@
 SPI ledstrip(PTD2,NC,PTD1);
 MODSERIAL pc(USBTX,USBRX);
 
-class Paddle
-{
-    public:
-    Paddle();//constructor
-//    ~Paddle();//deconstructor
-    int16_t position;
-    uint8_t direction;
-    void setSpeed(float speed); //pixels per second
-    void setColor(uint8_t red, uint8_t green, uint8_t blue);
-    uint8_t getSize(void);
-    uint8_t getSpeed(void){return m_speed;};
-    void setSize(uint8_t size);
-    uint8_t getColor(uint8_t pixel, uint8_t color);
-    private:
-    uint8_t m_red ,m_green ,m_blue;
-    uint8_t m_size;
-    uint8_t m_paddle[MAX_PADDLE_SIZE][3];
-    float   m_speed;
-    Ticker UpdatePosition;
-    void PositionUpdater(void);
-};
-
-Paddle::Paddle()
-{
-    setColor(255,255,255);
-    setSize(4);
-    position = -getSize();
-    direction = 1;
-    setSpeed(50);
-}
-
-void Paddle::setSpeed(float speed)
-{
-//truncate
-    float time;
-    if(speed > 100000)
-        speed = 100000;
-    if(speed <= 0)
-        speed = 0.001;
-    m_speed = speed;
-    time = 1/m_speed;
-    UpdatePosition.detach();
-    UpdatePosition.attach(this,&Paddle::PositionUpdater, time);
-}
-
-void Paddle::PositionUpdater(void)
-{
-    if(direction == 1)
-        position++;
-    else
-        position--;
-}
-
-uint8_t Paddle::getColor(uint8_t pixel, uint8_t color)
-{
-    if(pixel<MAX_PADDLE_SIZE && color < 3)
-        return m_paddle[pixel][color];
-    else
-        return 0;
-}
-
-uint8_t Paddle::getSize(void)
-{
-    return m_size;
-}
-
-void Paddle::setSize(uint8_t size)
-{
-    if(size > MAX_PADDLE_SIZE)
-        size = MAX_PADDLE_SIZE;
-    m_size = size;
-    setColor(m_red, m_green, m_blue);
-}
-
-void Paddle::setColor(uint8_t red, uint8_t green, uint8_t blue)
-{
-    uint8_t paddlepixel;
-    m_red = red;
-    m_green = green;
-    m_blue = blue;
-    for(paddlepixel = 0 ; paddlepixel < MAX_PADDLE_SIZE ; paddlepixel++)
-    {
-        float factor;
-        factor = 1.0*paddlepixel/(m_size*1.0);
-        if (factor > 1)
-            factor = 1;
-        factor = factor*factor*factor;// make the effect more dramatic
-        m_paddle[paddlepixel][0] = (float)m_red * factor; 
-        m_paddle[paddlepixel][1] = (float)m_green * factor;
-        m_paddle[paddlepixel][2] = (float)m_blue * factor;
-    }
-}
-
-class GameButton
-{
-    public:
-    GameButton(){};
-    GameButton(PinName pin, float time);
-    bool pushflag;
-    bool getTimeoutActive(void);
-    protected:
-    virtual void pushhandlercallback(void){};
-    private:
-    InterruptIn *intpin;
-    Timeout     timeout;
-    float m_time;
-    bool    m_timeoutactive;
-    void TimeOutHandler(void);
-    virtual void PushHandler(void);
-};
-
-GameButton::GameButton(PinName pin, float time=0.5)
-{
-    pushflag = false;
-    intpin = new InterruptIn(pin);
-    (*intpin).mode(PullUp);
-    (*intpin).fall(this, &GameButton::PushHandler);
-    m_time = time;
-    m_timeoutactive = false;
-    //timeout = new Timeout(m_time);
-}
-
-void GameButton::PushHandler(void)
-{
-    pushflag = true;
-    m_timeoutactive = true;
-    timeout.attach(this, &GameButton::TimeOutHandler, m_time);
-    pushhandlercallback();
-}
-
-void GameButton::TimeOutHandler(void)
-{
-    m_timeoutactive = false;
-}
-
-bool GameButton::getTimeoutActive(void)
-{
-    return m_timeoutactive;
-}
-
 Paddle paddle;
 
 class PongGameButton : public GameButton
@@ -171,7 +32,7 @@
     int16_t paddlepos;
 };
 
-PongGameButton::PongGameButton(PinName name, float time) : GameButton(name)
+PongGameButton::PongGameButton(PinName name, float time) : GameButton(name, time)
 {
     paddlepos = 0;
 }
@@ -224,10 +85,6 @@
     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, .03);
     //demopaddlepos.attach(UpdateDemoPaddle, .03);
     ledstrip.format(8,0);        //15 bits, mode '0'
@@ -261,7 +118,7 @@
                     if(buttonright.paddlepos >= NUMBER_OF_PIXELS-1  ) //also count when hit at last pixel = NUMBER_OF_PIXELS-1
                     {
                         paddle.direction = 0;
-                        paddle.setSpeed(20+(buttonright.paddlepos-(NUMBER_OF_PIXELS-1))*2);
+                        paddle.setSpeed(25+(buttonright.paddlepos-(NUMBER_OF_PIXELS-1))*8);
                         paddle.position = NUMBER_OF_PIXELS-2;
                     }
                     pc.printf("\n\rright pushed. Paddle position: %d, registered: %d, speed: %", paddle.position, buttonright.paddlepos,paddle.getSpeed());
@@ -277,7 +134,7 @@
                     if(buttonleft.paddlepos <= 0  )
                     {
                         paddle.direction = 1;
-                        paddle.setSpeed(20+(-buttonleft.paddlepos)*2);
+                        paddle.setSpeed(25+(-buttonleft.paddlepos)*8);
                         paddle.position  = 0;
                     }
                     pc.printf("\n\rleft pushed. Paddle position: %d, registered: %d, speed %d", paddle.position, buttonleft.paddlepos, paddle.getSpeed());
@@ -321,7 +178,7 @@
         if(gametimer.read()>15 && !naglevel2)
         {
             naglevel2 = 1;
-            paddle.setSize(2);
+            paddle.setSize(10);
             //paddle.setSpeed(70);
         }   
         wait(0.05);