1D-Pong game based on a LED strip with 150 LPD6803-controlled pixels. Game keeps score for 'best-of-21' game. Written for KL25Z
Diff: main.cpp
- 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)