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:35:43 2013 +0000
Revision:
4:119537f0ff8e
Parent:
3:a2b58da5c03b
Child:
5:d2e819018807
Increased SPI frequency, and update rate

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 4:119537f0ff8e 40 updater.attach(UpdateLEDstrip, .02);
vsluiter 0:cde34c55fa20 41 paddlepos.attach(UpdatePaddle, .03);
vsluiter 0:cde34c55fa20 42 ledstrip.format(8,0); //15 bits, mode '0'
vsluiter 4:119537f0ff8e 43 ledstrip.frequency(1000000);
vsluiter 4:119537f0ff8e 44 for(ledcounter = 0; ledcounter < NUMBER_OF_PIXELS; ledcounter++) {//turn off leds
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 4:119537f0ff8e 49
vsluiter 2:d2f8772a8db5 50 Score(0,0);
vsluiter 3:a2b58da5c03b 51 Score(1,1);
vsluiter 2:d2f8772a8db5 52 Score(0,1);
vsluiter 2:d2f8772a8db5 53 Score(3,2);
vsluiter 2:d2f8772a8db5 54 WinLoose(2.5, LEFT);
vsluiter 2:d2f8772a8db5 55 Score(3,4);
vsluiter 2:d2f8772a8db5 56 WinLoose(1.5, RIGHT);
vsluiter 2:d2f8772a8db5 57 //Randomblinks(5, true);
vsluiter 2:d2f8772a8db5 58 //WinLoose(3, false);
vsluiter 0:cde34c55fa20 59 }
vsluiter 0:cde34c55fa20 60 }
vsluiter 0:cde34c55fa20 61
vsluiter 2:d2f8772a8db5 62 void Score(uint8_t left, uint8_t right)
vsluiter 2:d2f8772a8db5 63 {
vsluiter 2:d2f8772a8db5 64 uint8_t maxscore;
vsluiter 2:d2f8772a8db5 65 int8_t ledcounter;
vsluiter 2:d2f8772a8db5 66 uint8_t scorecounter;
vsluiter 3:a2b58da5c03b 67 typedef struct ledcolor
vsluiter 3:a2b58da5c03b 68 {
vsluiter 3:a2b58da5c03b 69 uint8_t red;
vsluiter 3:a2b58da5c03b 70 uint8_t green;
vsluiter 3:a2b58da5c03b 71 uint8_t blue;
vsluiter 3:a2b58da5c03b 72 }ledcolor_t;
vsluiter 3:a2b58da5c03b 73 ledcolor_t rightled={0,0,0}, leftled={0,0,0};
vsluiter 3:a2b58da5c03b 74 if(left >= right)
vsluiter 3:a2b58da5c03b 75 {
vsluiter 3:a2b58da5c03b 76 maxscore = left;
vsluiter 3:a2b58da5c03b 77 leftled.green = 255;
vsluiter 3:a2b58da5c03b 78 rightled.red = 255;
vsluiter 3:a2b58da5c03b 79 }
vsluiter 3:a2b58da5c03b 80 if(right >= left)
vsluiter 3:a2b58da5c03b 81 {
vsluiter 3:a2b58da5c03b 82 maxscore = right;
vsluiter 3:a2b58da5c03b 83 leftled.red = 255;
vsluiter 3:a2b58da5c03b 84 rightled.green = 255;
vsluiter 3:a2b58da5c03b 85 }
vsluiter 2:d2f8772a8db5 86 for(scorecounter = 0 ; scorecounter <= maxscore ; scorecounter++)
vsluiter 2:d2f8772a8db5 87 {
vsluiter 2:d2f8772a8db5 88 uint8_t templeft,tempright;
vsluiter 2:d2f8772a8db5 89 templeft = left>scorecounter?scorecounter:left;
vsluiter 2:d2f8772a8db5 90 tempright = right>scorecounter?scorecounter:right;
vsluiter 2:d2f8772a8db5 91 uint8_t sidecounter;
vsluiter 2:d2f8772a8db5 92 for(ledcounter = 0; ledcounter < NUMBER_OF_PIXELS; ledcounter++)
vsluiter 2:d2f8772a8db5 93 {
vsluiter 2:d2f8772a8db5 94 write_led(&totalstrip[ledcounter], 0, 0 ,0);
vsluiter 2:d2f8772a8db5 95 }
vsluiter 2:d2f8772a8db5 96 for(sidecounter = 0 ; sidecounter < templeft; sidecounter++)
vsluiter 2:d2f8772a8db5 97 {
vsluiter 3:a2b58da5c03b 98 write_led(&totalstrip[sidecounter*2],leftled.red,leftled.green,leftled.blue);
vsluiter 2:d2f8772a8db5 99 }
vsluiter 2:d2f8772a8db5 100 for(sidecounter = 0 ; sidecounter < tempright ; sidecounter++)
vsluiter 2:d2f8772a8db5 101 {
vsluiter 3:a2b58da5c03b 102 write_led(&totalstrip[(NUMBER_OF_PIXELS-1)-(sidecounter*2)],rightled.red,rightled.green,rightled.blue);
vsluiter 2:d2f8772a8db5 103 }
vsluiter 3:a2b58da5c03b 104 wait(0.7);
vsluiter 2:d2f8772a8db5 105 }
vsluiter 3:a2b58da5c03b 106 wait(0.5);
vsluiter 2:d2f8772a8db5 107 }
vsluiter 2:d2f8772a8db5 108
vsluiter 1:7a2ec350cdf5 109 void WinLoose(float seconds, bool side)
vsluiter 1:7a2ec350cdf5 110 {
vsluiter 1:7a2ec350cdf5 111 uint8_t ledcounter;
vsluiter 1:7a2ec350cdf5 112 Timer timer;
vsluiter 1:7a2ec350cdf5 113 timer.start();
vsluiter 1:7a2ec350cdf5 114 while( timer.read() < seconds)
vsluiter 1:7a2ec350cdf5 115 {
vsluiter 1:7a2ec350cdf5 116 uint8_t redvalue = 255-(255.0*(timer.read()/(seconds/2)));
vsluiter 1:7a2ec350cdf5 117 for(ledcounter = 0; ledcounter < NUMBER_OF_PIXELS; ledcounter++)
vsluiter 1:7a2ec350cdf5 118 {
vsluiter 1:7a2ec350cdf5 119 if(ledcounter < NUMBER_OF_PIXELS / 2)
vsluiter 1:7a2ec350cdf5 120 {
vsluiter 1:7a2ec350cdf5 121 if(side)
vsluiter 1:7a2ec350cdf5 122 write_led(&totalstrip[ledcounter], redvalue,0,0);
vsluiter 1:7a2ec350cdf5 123 else
vsluiter 1:7a2ec350cdf5 124 write_led(&totalstrip[ledcounter], 0,255,0);
vsluiter 1:7a2ec350cdf5 125 }
vsluiter 1:7a2ec350cdf5 126 else
vsluiter 1:7a2ec350cdf5 127 {
vsluiter 1:7a2ec350cdf5 128 if(side)
vsluiter 1:7a2ec350cdf5 129 write_led(&totalstrip[ledcounter], 0,255,0);
vsluiter 1:7a2ec350cdf5 130 else
vsluiter 1:7a2ec350cdf5 131 write_led(&totalstrip[ledcounter], redvalue ,0,0);
vsluiter 1:7a2ec350cdf5 132
vsluiter 1:7a2ec350cdf5 133 }
vsluiter 1:7a2ec350cdf5 134 }
vsluiter 1:7a2ec350cdf5 135 }
vsluiter 1:7a2ec350cdf5 136 }
vsluiter 0:cde34c55fa20 137 void PaddleDemo(float seconds, uint8_t red, uint8_t green, uint8_t blue)
vsluiter 0:cde34c55fa20 138 {
vsluiter 0:cde34c55fa20 139 uint8_t ledcounter;
vsluiter 0:cde34c55fa20 140 Timer timer;
vsluiter 0:cde34c55fa20 141 timer.start();
vsluiter 0:cde34c55fa20 142 while( timer.read() < seconds)
vsluiter 0:cde34c55fa20 143 {
vsluiter 0:cde34c55fa20 144 for(ledcounter = 0; ledcounter < NUMBER_OF_PIXELS; ledcounter++)
vsluiter 0:cde34c55fa20 145 {
vsluiter 0:cde34c55fa20 146 if((ledcounter >= paddlestart) && ( ledcounter <= paddlestart+PADDLE_LENGTH))
vsluiter 0:cde34c55fa20 147 write_led(&totalstrip[ledcounter], red,green,blue);
vsluiter 0:cde34c55fa20 148 else
vsluiter 0:cde34c55fa20 149 write_led(&totalstrip[ledcounter], 0,0,0);
vsluiter 0:cde34c55fa20 150 }
vsluiter 0:cde34c55fa20 151 }
vsluiter 0:cde34c55fa20 152 }
vsluiter 0:cde34c55fa20 153
vsluiter 0:cde34c55fa20 154 void Randomblinks(float seconds, bool colored)
vsluiter 0:cde34c55fa20 155 {
vsluiter 0:cde34c55fa20 156 uint8_t ledcounter;
vsluiter 0:cde34c55fa20 157 uint8_t test;
vsluiter 0:cde34c55fa20 158 Timer timer;
vsluiter 0:cde34c55fa20 159 timer.start();
vsluiter 0:cde34c55fa20 160 while( timer.read() < seconds )
vsluiter 0:cde34c55fa20 161 {
vsluiter 0:cde34c55fa20 162 test = 50.0*rand()/(RAND_MAX*1.0);
vsluiter 0:cde34c55fa20 163 for(ledcounter = 0; ledcounter < NUMBER_OF_PIXELS; ledcounter++)
vsluiter 0:cde34c55fa20 164 {
vsluiter 0:cde34c55fa20 165 if(ledcounter == test)
vsluiter 0:cde34c55fa20 166 {
vsluiter 0:cde34c55fa20 167 if(colored)
vsluiter 0:cde34c55fa20 168 write_led(&totalstrip[ledcounter], test*5,(test%10)*25,(test%15)*15);
vsluiter 0:cde34c55fa20 169 else
vsluiter 0:cde34c55fa20 170 write_led(&totalstrip[ledcounter], 255,255,255);
vsluiter 0:cde34c55fa20 171 }
vsluiter 0:cde34c55fa20 172 else
vsluiter 0:cde34c55fa20 173 write_led(&totalstrip[ledcounter], 0,0,0);
vsluiter 0:cde34c55fa20 174 }
vsluiter 0:cde34c55fa20 175 }
vsluiter 0:cde34c55fa20 176 }
vsluiter 0:cde34c55fa20 177
vsluiter 1:7a2ec350cdf5 178 void UpdatePaddle(void)
vsluiter 1:7a2ec350cdf5 179 {
vsluiter 1:7a2ec350cdf5 180 static uint8_t direction = 1;
vsluiter 1:7a2ec350cdf5 181 if(direction) {
vsluiter 1:7a2ec350cdf5 182 paddlestart++;
vsluiter 1:7a2ec350cdf5 183 } else {
vsluiter 1:7a2ec350cdf5 184 paddlestart--;
vsluiter 1:7a2ec350cdf5 185 }
vsluiter 1:7a2ec350cdf5 186
vsluiter 1:7a2ec350cdf5 187 if(paddlestart > (NUMBER_OF_PIXELS - PADDLE_LENGTH))
vsluiter 1:7a2ec350cdf5 188 direction = 0;
vsluiter 1:7a2ec350cdf5 189 if(paddlestart < 0)
vsluiter 1:7a2ec350cdf5 190 direction = 1;
vsluiter 1:7a2ec350cdf5 191 }
vsluiter 1:7a2ec350cdf5 192
vsluiter 2:d2f8772a8db5 193
vsluiter 0:cde34c55fa20 194 //DigitalOut myled(LED1);
vsluiter 0:cde34c55fa20 195
vsluiter 0:cde34c55fa20 196 //int main() {
vsluiter 0:cde34c55fa20 197 // while(1) {
vsluiter 0:cde34c55fa20 198 // myled = 1;
vsluiter 0:cde34c55fa20 199 // wait(0.2);
vsluiter 0:cde34c55fa20 200 // myled = 0;
vsluiter 0:cde34c55fa20 201 // wait(0.2);
vsluiter 0:cde34c55fa20 202 // }
vsluiter 0:cde34c55fa20 203 //}