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 17:14:08 2013 +0000
Revision:
1:7a2ec350cdf5
Parent:
0:cde34c55fa20
Child:
2:d2f8772a8db5
Added 'WinLoose' to show who's won / lost

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 0:cde34c55fa20 5
vsluiter 0:cde34c55fa20 6 void Randomblinks(float seconds, bool colored = false);
vsluiter 0:cde34c55fa20 7 void PaddleDemo(float seconds, uint8_t red, uint8_t green, uint8_t blue);
vsluiter 1:7a2ec350cdf5 8 void WinLoose(float seconds, bool side);
vsluiter 1:7a2ec350cdf5 9 void UpdatePaddle(void);
vsluiter 0:cde34c55fa20 10 uint16_t totalstrip[NUMBER_OF_PIXELS];
vsluiter 0:cde34c55fa20 11 volatile int8_t paddlestart= 0;
vsluiter 0:cde34c55fa20 12 SPI ledstrip(PTD2,NC,PTD1);
vsluiter 0:cde34c55fa20 13
vsluiter 0:cde34c55fa20 14
vsluiter 0:cde34c55fa20 15 void UpdateLEDstrip(void)
vsluiter 0:cde34c55fa20 16 {
vsluiter 0:cde34c55fa20 17 uint8_t pixelcounter;
vsluiter 0:cde34c55fa20 18 /*start by writing 32 zeroes */
vsluiter 0:cde34c55fa20 19 ledstrip.write(0);
vsluiter 0:cde34c55fa20 20 ledstrip.write(0);
vsluiter 0:cde34c55fa20 21 ledstrip.write(0);
vsluiter 0:cde34c55fa20 22 ledstrip.write(0);
vsluiter 0:cde34c55fa20 23 for(pixelcounter = 0 ; pixelcounter < NUMBER_OF_PIXELS; pixelcounter++) {
vsluiter 0:cde34c55fa20 24 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 25 ledstrip.write( uint8_t(totalstrip[pixelcounter]));//(*(uint16_t *)(&totalstrip[pixelcounter]))>>8);
vsluiter 0:cde34c55fa20 26 }
vsluiter 0:cde34c55fa20 27 }
vsluiter 0:cde34c55fa20 28
vsluiter 0:cde34c55fa20 29 void write_led(uint16_t * led, uint8_t red, uint8_t green, uint8_t blue)
vsluiter 0:cde34c55fa20 30 {
vsluiter 0:cde34c55fa20 31 *led = (1<<15) | ((green >> 3)<<10) | ((red >>3)<< 5) | (blue >>3);
vsluiter 0:cde34c55fa20 32 }
vsluiter 0:cde34c55fa20 33 int main()
vsluiter 0:cde34c55fa20 34 {
vsluiter 0:cde34c55fa20 35 Ticker updater;
vsluiter 0:cde34c55fa20 36 Ticker paddlepos;
vsluiter 0:cde34c55fa20 37 uint8_t ledcounter;
vsluiter 0:cde34c55fa20 38 updater.attach(UpdateLEDstrip, .05);
vsluiter 0:cde34c55fa20 39 paddlepos.attach(UpdatePaddle, .03);
vsluiter 0:cde34c55fa20 40 ledstrip.format(8,0); //15 bits, mode '0'
vsluiter 0:cde34c55fa20 41 ledstrip.frequency(100000);
vsluiter 0:cde34c55fa20 42 for(ledcounter = 0; ledcounter < NUMBER_OF_PIXELS; ledcounter++) {
vsluiter 0:cde34c55fa20 43 write_led(&totalstrip[ledcounter], 0,0,0);
vsluiter 0:cde34c55fa20 44 }
vsluiter 0:cde34c55fa20 45 while(1) {
vsluiter 1:7a2ec350cdf5 46 PaddleDemo(2,255,10,100);
vsluiter 1:7a2ec350cdf5 47 WinLoose(3, true);
vsluiter 0:cde34c55fa20 48 Randomblinks(5, true);
vsluiter 1:7a2ec350cdf5 49 WinLoose(3, false);
vsluiter 0:cde34c55fa20 50 }
vsluiter 0:cde34c55fa20 51 }
vsluiter 0:cde34c55fa20 52
vsluiter 1:7a2ec350cdf5 53 void WinLoose(float seconds, bool side)
vsluiter 1:7a2ec350cdf5 54 {
vsluiter 1:7a2ec350cdf5 55 uint8_t ledcounter;
vsluiter 1:7a2ec350cdf5 56 Timer timer;
vsluiter 1:7a2ec350cdf5 57 timer.start();
vsluiter 1:7a2ec350cdf5 58 while( timer.read() < seconds)
vsluiter 1:7a2ec350cdf5 59 {
vsluiter 1:7a2ec350cdf5 60 uint8_t redvalue = 255-(255.0*(timer.read()/(seconds/2)));
vsluiter 1:7a2ec350cdf5 61 for(ledcounter = 0; ledcounter < NUMBER_OF_PIXELS; ledcounter++)
vsluiter 1:7a2ec350cdf5 62 {
vsluiter 1:7a2ec350cdf5 63 if(ledcounter < NUMBER_OF_PIXELS / 2)
vsluiter 1:7a2ec350cdf5 64 {
vsluiter 1:7a2ec350cdf5 65 if(side)
vsluiter 1:7a2ec350cdf5 66 write_led(&totalstrip[ledcounter], redvalue,0,0);
vsluiter 1:7a2ec350cdf5 67 else
vsluiter 1:7a2ec350cdf5 68 write_led(&totalstrip[ledcounter], 0,255,0);
vsluiter 1:7a2ec350cdf5 69 }
vsluiter 1:7a2ec350cdf5 70 else
vsluiter 1:7a2ec350cdf5 71 {
vsluiter 1:7a2ec350cdf5 72 if(side)
vsluiter 1:7a2ec350cdf5 73 write_led(&totalstrip[ledcounter], 0,255,0);
vsluiter 1:7a2ec350cdf5 74 else
vsluiter 1:7a2ec350cdf5 75 write_led(&totalstrip[ledcounter], redvalue ,0,0);
vsluiter 1:7a2ec350cdf5 76
vsluiter 1:7a2ec350cdf5 77 }
vsluiter 1:7a2ec350cdf5 78 }
vsluiter 1:7a2ec350cdf5 79 }
vsluiter 1:7a2ec350cdf5 80 }
vsluiter 0:cde34c55fa20 81 void PaddleDemo(float seconds, uint8_t red, uint8_t green, uint8_t blue)
vsluiter 0:cde34c55fa20 82 {
vsluiter 0:cde34c55fa20 83 uint8_t ledcounter;
vsluiter 0:cde34c55fa20 84 Timer timer;
vsluiter 0:cde34c55fa20 85 timer.start();
vsluiter 0:cde34c55fa20 86 while( timer.read() < seconds)
vsluiter 0:cde34c55fa20 87 {
vsluiter 0:cde34c55fa20 88 for(ledcounter = 0; ledcounter < NUMBER_OF_PIXELS; ledcounter++)
vsluiter 0:cde34c55fa20 89 {
vsluiter 0:cde34c55fa20 90 if((ledcounter >= paddlestart) && ( ledcounter <= paddlestart+PADDLE_LENGTH))
vsluiter 0:cde34c55fa20 91 write_led(&totalstrip[ledcounter], red,green,blue);
vsluiter 0:cde34c55fa20 92 else
vsluiter 0:cde34c55fa20 93 write_led(&totalstrip[ledcounter], 0,0,0);
vsluiter 0:cde34c55fa20 94 }
vsluiter 0:cde34c55fa20 95 }
vsluiter 0:cde34c55fa20 96 }
vsluiter 0:cde34c55fa20 97
vsluiter 0:cde34c55fa20 98 void Randomblinks(float seconds, bool colored)
vsluiter 0:cde34c55fa20 99 {
vsluiter 0:cde34c55fa20 100 uint8_t ledcounter;
vsluiter 0:cde34c55fa20 101 uint8_t test;
vsluiter 0:cde34c55fa20 102 Timer timer;
vsluiter 0:cde34c55fa20 103 timer.start();
vsluiter 0:cde34c55fa20 104 while( timer.read() < seconds )
vsluiter 0:cde34c55fa20 105 {
vsluiter 0:cde34c55fa20 106 test = 50.0*rand()/(RAND_MAX*1.0);
vsluiter 0:cde34c55fa20 107 for(ledcounter = 0; ledcounter < NUMBER_OF_PIXELS; ledcounter++)
vsluiter 0:cde34c55fa20 108 {
vsluiter 0:cde34c55fa20 109 if(ledcounter == test)
vsluiter 0:cde34c55fa20 110 {
vsluiter 0:cde34c55fa20 111 if(colored)
vsluiter 0:cde34c55fa20 112 write_led(&totalstrip[ledcounter], test*5,(test%10)*25,(test%15)*15);
vsluiter 0:cde34c55fa20 113 else
vsluiter 0:cde34c55fa20 114 write_led(&totalstrip[ledcounter], 255,255,255);
vsluiter 0:cde34c55fa20 115 }
vsluiter 0:cde34c55fa20 116 else
vsluiter 0:cde34c55fa20 117 write_led(&totalstrip[ledcounter], 0,0,0);
vsluiter 0:cde34c55fa20 118 }
vsluiter 0:cde34c55fa20 119 }
vsluiter 0:cde34c55fa20 120 }
vsluiter 0:cde34c55fa20 121
vsluiter 1:7a2ec350cdf5 122 void UpdatePaddle(void)
vsluiter 1:7a2ec350cdf5 123 {
vsluiter 1:7a2ec350cdf5 124 static uint8_t direction = 1;
vsluiter 1:7a2ec350cdf5 125 if(direction) {
vsluiter 1:7a2ec350cdf5 126 paddlestart++;
vsluiter 1:7a2ec350cdf5 127 } else {
vsluiter 1:7a2ec350cdf5 128 paddlestart--;
vsluiter 1:7a2ec350cdf5 129 }
vsluiter 1:7a2ec350cdf5 130
vsluiter 1:7a2ec350cdf5 131 if(paddlestart > (NUMBER_OF_PIXELS - PADDLE_LENGTH))
vsluiter 1:7a2ec350cdf5 132 direction = 0;
vsluiter 1:7a2ec350cdf5 133 if(paddlestart < 0)
vsluiter 1:7a2ec350cdf5 134 direction = 1;
vsluiter 1:7a2ec350cdf5 135 }
vsluiter 1:7a2ec350cdf5 136
vsluiter 0:cde34c55fa20 137 //DigitalOut myled(LED1);
vsluiter 0:cde34c55fa20 138
vsluiter 0:cde34c55fa20 139 //int main() {
vsluiter 0:cde34c55fa20 140 // while(1) {
vsluiter 0:cde34c55fa20 141 // myled = 1;
vsluiter 0:cde34c55fa20 142 // wait(0.2);
vsluiter 0:cde34c55fa20 143 // myled = 0;
vsluiter 0:cde34c55fa20 144 // wait(0.2);
vsluiter 0:cde34c55fa20 145 // }
vsluiter 0:cde34c55fa20 146 //}