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

Committer:
vsluiter
Date:
Wed Aug 21 18:22:29 2013 +0000
Revision:
2:d2f8772a8db5
Parent:
1:7a2ec350cdf5
Child:
3:a2b58da5c03b
Added scoring

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vsluiter 0:cde34c55fa20 1 #include "mbed.h"
vsluiter 0:cde34c55fa20 2
vsluiter 0:cde34c55fa20 3 #define NUMBER_OF_PIXELS 50
vsluiter 0:cde34c55fa20 4 #define PADDLE_LENGTH 5
vsluiter 2:d2f8772a8db5 5 #define LEFT false
vsluiter 2:d2f8772a8db5 6 #define RIGHT true
vsluiter 0:cde34c55fa20 7 void Randomblinks(float seconds, bool colored = false);
vsluiter 0:cde34c55fa20 8 void PaddleDemo(float seconds, uint8_t red, uint8_t green, uint8_t blue);
vsluiter 1:7a2ec350cdf5 9 void WinLoose(float seconds, bool side);
vsluiter 1:7a2ec350cdf5 10 void UpdatePaddle(void);
vsluiter 2:d2f8772a8db5 11 void Score(uint8_t left, uint8_t right);
vsluiter 0:cde34c55fa20 12 uint16_t totalstrip[NUMBER_OF_PIXELS];
vsluiter 0:cde34c55fa20 13 volatile int8_t paddlestart= 0;
vsluiter 0:cde34c55fa20 14 SPI ledstrip(PTD2,NC,PTD1);
vsluiter 0:cde34c55fa20 15
vsluiter 0:cde34c55fa20 16
vsluiter 0:cde34c55fa20 17 void UpdateLEDstrip(void)
vsluiter 0:cde34c55fa20 18 {
vsluiter 0:cde34c55fa20 19 uint8_t pixelcounter;
vsluiter 0:cde34c55fa20 20 /*start by writing 32 zeroes */
vsluiter 0:cde34c55fa20 21 ledstrip.write(0);
vsluiter 0:cde34c55fa20 22 ledstrip.write(0);
vsluiter 0:cde34c55fa20 23 ledstrip.write(0);
vsluiter 0:cde34c55fa20 24 ledstrip.write(0);
vsluiter 0:cde34c55fa20 25 for(pixelcounter = 0 ; pixelcounter < NUMBER_OF_PIXELS; pixelcounter++) {
vsluiter 0:cde34c55fa20 26 ledstrip.write( uint8_t(totalstrip[pixelcounter]>>8));//uint8_t(temp16));//(totalstrip.ledcounter[pixelcounter].red << 2) | (totalstrip.ledcounter[pixelcounter].high << 7) |(totalstrip.ledcounter[pixelcounter].green & 0x << 2) );
vsluiter 0:cde34c55fa20 27 ledstrip.write( uint8_t(totalstrip[pixelcounter]));//(*(uint16_t *)(&totalstrip[pixelcounter]))>>8);
vsluiter 0:cde34c55fa20 28 }
vsluiter 0:cde34c55fa20 29 }
vsluiter 0:cde34c55fa20 30
vsluiter 0:cde34c55fa20 31 void write_led(uint16_t * led, uint8_t red, uint8_t green, uint8_t blue)
vsluiter 0:cde34c55fa20 32 {
vsluiter 0:cde34c55fa20 33 *led = (1<<15) | ((green >> 3)<<10) | ((red >>3)<< 5) | (blue >>3);
vsluiter 0:cde34c55fa20 34 }
vsluiter 0:cde34c55fa20 35 int main()
vsluiter 0:cde34c55fa20 36 {
vsluiter 0:cde34c55fa20 37 Ticker updater;
vsluiter 0:cde34c55fa20 38 Ticker paddlepos;
vsluiter 0:cde34c55fa20 39 uint8_t ledcounter;
vsluiter 0:cde34c55fa20 40 updater.attach(UpdateLEDstrip, .05);
vsluiter 0:cde34c55fa20 41 paddlepos.attach(UpdatePaddle, .03);
vsluiter 0:cde34c55fa20 42 ledstrip.format(8,0); //15 bits, mode '0'
vsluiter 0:cde34c55fa20 43 ledstrip.frequency(100000);
vsluiter 0:cde34c55fa20 44 for(ledcounter = 0; ledcounter < NUMBER_OF_PIXELS; ledcounter++) {
vsluiter 0:cde34c55fa20 45 write_led(&totalstrip[ledcounter], 0,0,0);
vsluiter 0:cde34c55fa20 46 }
vsluiter 0:cde34c55fa20 47 while(1) {
vsluiter 2:d2f8772a8db5 48 //PaddleDemo(2,255,10,100);
vsluiter 2:d2f8772a8db5 49 Score(0,0);
vsluiter 2:d2f8772a8db5 50 Score(1,0);
vsluiter 2:d2f8772a8db5 51 Score(0,1);
vsluiter 2:d2f8772a8db5 52 Score(3,2);
vsluiter 2:d2f8772a8db5 53 WinLoose(2.5, LEFT);
vsluiter 2:d2f8772a8db5 54 Score(3,4);
vsluiter 2:d2f8772a8db5 55 WinLoose(1.5, RIGHT);
vsluiter 2:d2f8772a8db5 56 //Randomblinks(5, true);
vsluiter 2:d2f8772a8db5 57 //WinLoose(3, false);
vsluiter 0:cde34c55fa20 58 }
vsluiter 0:cde34c55fa20 59 }
vsluiter 0:cde34c55fa20 60
vsluiter 2:d2f8772a8db5 61 void Score(uint8_t left, uint8_t right)
vsluiter 2:d2f8772a8db5 62 {
vsluiter 2:d2f8772a8db5 63 uint8_t maxscore;
vsluiter 2:d2f8772a8db5 64 int8_t ledcounter;
vsluiter 2:d2f8772a8db5 65 uint8_t scorecounter;
vsluiter 2:d2f8772a8db5 66 left>right?maxscore=left:maxscore=right;
vsluiter 2:d2f8772a8db5 67 for(scorecounter = 0 ; scorecounter <= maxscore ; scorecounter++)
vsluiter 2:d2f8772a8db5 68 {
vsluiter 2:d2f8772a8db5 69 uint8_t templeft,tempright;
vsluiter 2:d2f8772a8db5 70 templeft = left>scorecounter?scorecounter:left;
vsluiter 2:d2f8772a8db5 71 tempright = right>scorecounter?scorecounter:right;
vsluiter 2:d2f8772a8db5 72 uint8_t sidecounter;
vsluiter 2:d2f8772a8db5 73 for(ledcounter = 0; ledcounter < NUMBER_OF_PIXELS; ledcounter++)
vsluiter 2:d2f8772a8db5 74 {
vsluiter 2:d2f8772a8db5 75 write_led(&totalstrip[ledcounter], 0, 0 ,0);
vsluiter 2:d2f8772a8db5 76 }
vsluiter 2:d2f8772a8db5 77 for(sidecounter = 0 ; sidecounter < templeft; sidecounter++)
vsluiter 2:d2f8772a8db5 78 {
vsluiter 2:d2f8772a8db5 79 write_led(&totalstrip[sidecounter*2],255,255,0);
vsluiter 2:d2f8772a8db5 80 }
vsluiter 2:d2f8772a8db5 81 for(sidecounter = 0 ; sidecounter < tempright ; sidecounter++)
vsluiter 2:d2f8772a8db5 82 {
vsluiter 2:d2f8772a8db5 83 write_led(&totalstrip[(NUMBER_OF_PIXELS-1)-(sidecounter*2)],255,255,0);
vsluiter 2:d2f8772a8db5 84 }
vsluiter 2:d2f8772a8db5 85 wait(0.5);
vsluiter 2:d2f8772a8db5 86 }
vsluiter 2:d2f8772a8db5 87 wait(1);
vsluiter 2:d2f8772a8db5 88 }
vsluiter 2:d2f8772a8db5 89
vsluiter 1:7a2ec350cdf5 90 void WinLoose(float seconds, bool side)
vsluiter 1:7a2ec350cdf5 91 {
vsluiter 1:7a2ec350cdf5 92 uint8_t ledcounter;
vsluiter 1:7a2ec350cdf5 93 Timer timer;
vsluiter 1:7a2ec350cdf5 94 timer.start();
vsluiter 1:7a2ec350cdf5 95 while( timer.read() < seconds)
vsluiter 1:7a2ec350cdf5 96 {
vsluiter 1:7a2ec350cdf5 97 uint8_t redvalue = 255-(255.0*(timer.read()/(seconds/2)));
vsluiter 1:7a2ec350cdf5 98 for(ledcounter = 0; ledcounter < NUMBER_OF_PIXELS; ledcounter++)
vsluiter 1:7a2ec350cdf5 99 {
vsluiter 1:7a2ec350cdf5 100 if(ledcounter < NUMBER_OF_PIXELS / 2)
vsluiter 1:7a2ec350cdf5 101 {
vsluiter 1:7a2ec350cdf5 102 if(side)
vsluiter 1:7a2ec350cdf5 103 write_led(&totalstrip[ledcounter], redvalue,0,0);
vsluiter 1:7a2ec350cdf5 104 else
vsluiter 1:7a2ec350cdf5 105 write_led(&totalstrip[ledcounter], 0,255,0);
vsluiter 1:7a2ec350cdf5 106 }
vsluiter 1:7a2ec350cdf5 107 else
vsluiter 1:7a2ec350cdf5 108 {
vsluiter 1:7a2ec350cdf5 109 if(side)
vsluiter 1:7a2ec350cdf5 110 write_led(&totalstrip[ledcounter], 0,255,0);
vsluiter 1:7a2ec350cdf5 111 else
vsluiter 1:7a2ec350cdf5 112 write_led(&totalstrip[ledcounter], redvalue ,0,0);
vsluiter 1:7a2ec350cdf5 113
vsluiter 1:7a2ec350cdf5 114 }
vsluiter 1:7a2ec350cdf5 115 }
vsluiter 1:7a2ec350cdf5 116 }
vsluiter 1:7a2ec350cdf5 117 }
vsluiter 0:cde34c55fa20 118 void PaddleDemo(float seconds, uint8_t red, uint8_t green, uint8_t blue)
vsluiter 0:cde34c55fa20 119 {
vsluiter 0:cde34c55fa20 120 uint8_t ledcounter;
vsluiter 0:cde34c55fa20 121 Timer timer;
vsluiter 0:cde34c55fa20 122 timer.start();
vsluiter 0:cde34c55fa20 123 while( timer.read() < seconds)
vsluiter 0:cde34c55fa20 124 {
vsluiter 0:cde34c55fa20 125 for(ledcounter = 0; ledcounter < NUMBER_OF_PIXELS; ledcounter++)
vsluiter 0:cde34c55fa20 126 {
vsluiter 0:cde34c55fa20 127 if((ledcounter >= paddlestart) && ( ledcounter <= paddlestart+PADDLE_LENGTH))
vsluiter 0:cde34c55fa20 128 write_led(&totalstrip[ledcounter], red,green,blue);
vsluiter 0:cde34c55fa20 129 else
vsluiter 0:cde34c55fa20 130 write_led(&totalstrip[ledcounter], 0,0,0);
vsluiter 0:cde34c55fa20 131 }
vsluiter 0:cde34c55fa20 132 }
vsluiter 0:cde34c55fa20 133 }
vsluiter 0:cde34c55fa20 134
vsluiter 0:cde34c55fa20 135 void Randomblinks(float seconds, bool colored)
vsluiter 0:cde34c55fa20 136 {
vsluiter 0:cde34c55fa20 137 uint8_t ledcounter;
vsluiter 0:cde34c55fa20 138 uint8_t test;
vsluiter 0:cde34c55fa20 139 Timer timer;
vsluiter 0:cde34c55fa20 140 timer.start();
vsluiter 0:cde34c55fa20 141 while( timer.read() < seconds )
vsluiter 0:cde34c55fa20 142 {
vsluiter 0:cde34c55fa20 143 test = 50.0*rand()/(RAND_MAX*1.0);
vsluiter 0:cde34c55fa20 144 for(ledcounter = 0; ledcounter < NUMBER_OF_PIXELS; ledcounter++)
vsluiter 0:cde34c55fa20 145 {
vsluiter 0:cde34c55fa20 146 if(ledcounter == test)
vsluiter 0:cde34c55fa20 147 {
vsluiter 0:cde34c55fa20 148 if(colored)
vsluiter 0:cde34c55fa20 149 write_led(&totalstrip[ledcounter], test*5,(test%10)*25,(test%15)*15);
vsluiter 0:cde34c55fa20 150 else
vsluiter 0:cde34c55fa20 151 write_led(&totalstrip[ledcounter], 255,255,255);
vsluiter 0:cde34c55fa20 152 }
vsluiter 0:cde34c55fa20 153 else
vsluiter 0:cde34c55fa20 154 write_led(&totalstrip[ledcounter], 0,0,0);
vsluiter 0:cde34c55fa20 155 }
vsluiter 0:cde34c55fa20 156 }
vsluiter 0:cde34c55fa20 157 }
vsluiter 0:cde34c55fa20 158
vsluiter 1:7a2ec350cdf5 159 void UpdatePaddle(void)
vsluiter 1:7a2ec350cdf5 160 {
vsluiter 1:7a2ec350cdf5 161 static uint8_t direction = 1;
vsluiter 1:7a2ec350cdf5 162 if(direction) {
vsluiter 1:7a2ec350cdf5 163 paddlestart++;
vsluiter 1:7a2ec350cdf5 164 } else {
vsluiter 1:7a2ec350cdf5 165 paddlestart--;
vsluiter 1:7a2ec350cdf5 166 }
vsluiter 1:7a2ec350cdf5 167
vsluiter 1:7a2ec350cdf5 168 if(paddlestart > (NUMBER_OF_PIXELS - PADDLE_LENGTH))
vsluiter 1:7a2ec350cdf5 169 direction = 0;
vsluiter 1:7a2ec350cdf5 170 if(paddlestart < 0)
vsluiter 1:7a2ec350cdf5 171 direction = 1;
vsluiter 1:7a2ec350cdf5 172 }
vsluiter 1:7a2ec350cdf5 173
vsluiter 2:d2f8772a8db5 174
vsluiter 0:cde34c55fa20 175 //DigitalOut myled(LED1);
vsluiter 0:cde34c55fa20 176
vsluiter 0:cde34c55fa20 177 //int main() {
vsluiter 0:cde34c55fa20 178 // while(1) {
vsluiter 0:cde34c55fa20 179 // myled = 1;
vsluiter 0:cde34c55fa20 180 // wait(0.2);
vsluiter 0:cde34c55fa20 181 // myled = 0;
vsluiter 0:cde34c55fa20 182 // wait(0.2);
vsluiter 0:cde34c55fa20 183 // }
vsluiter 0:cde34c55fa20 184 //}