Simple implementation of goal counter for table football using laser diode and phototransistor.

Dependencies:   GoalCounter WS2812 PixelArray

Files at this revision

API Documentation at this revision

Comitter:
nxf46245
Date:
Mon Jan 14 17:48:30 2019 +0000
Parent:
5:95cb2348af01
Commit message:
Code cleaning, added winner animation

Changed in this revision

GoalCounter.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/GoalCounter.lib	Sun Jan 13 14:51:45 2019 +0000
+++ b/GoalCounter.lib	Mon Jan 14 17:48:30 2019 +0000
@@ -1,1 +1,1 @@
-https://os.mbed.com/users/nxf46245/code/GoalCounter/#eb4ee5706587
+https://os.mbed.com/users/nxf46245/code/GoalCounter/#fc48ef79f484
--- a/main.cpp	Sun Jan 13 14:51:45 2019 +0000
+++ b/main.cpp	Mon Jan 14 17:48:30 2019 +0000
@@ -3,17 +3,16 @@
 #include "PixelArray.h"
 #include "GoalCounter.h"
 
-#define WS2812_BUF 10
-#define NUM_COLORS 1
+#define WS2812_BUF 10 
+#define NUM_COLORS 6
 #define NUM_LEDS_PER_COLOR 2
-//#define COLOR 0x2f2020 
-#define DEBUG 1
+#define COLOR 0x2f2020 
 
-//Initialize instances of Timers
+//Initialize instances of Timers for goal counters
 Timer timer1;
 Timer timer2;
 
-// Initialize instace of a pixel array for LED strip 1 ar 2
+// Initialize instace of a pixel array for LED strip 1 and 2
 PixelArray px1(WS2812_BUF);
 PixelArray px2(WS2812_BUF);
 
@@ -21,10 +20,10 @@
 WS2812 ws1(D4, WS2812_BUF, 0, 5, 5, 0);
 WS2812 ws2(D5, WS2812_BUF, 0, 5, 5, 0);
 
-// For debug use 
+// For printing information to serial console 
 Serial pc(USBTX, USBRX);
 
-GoalCounter gc(D2, &timer1);
+GoalCounter gc1(D2, &timer1);
 GoalCounter gc2(D3, &timer2);
 
 float balltime1 = 0;
@@ -36,15 +35,16 @@
 uint8_t score1 = 0;
 uint8_t score2 = 0;
 
+// This function sets 1 - 10 to ws2812 led strip
 void set_score(uint8_t score, PixelArray * px, WS2812 * ws) {
-    px->SetAll(0);
+    px->SetAll(0); // null pixel array 
     
     for (int i=0; i < score; i++) {
-        px->Set(i, 0x2f2020);
+        px->Set(i, COLOR); // set pixels to correspondig score
     }
     
-    px->SetAllI(0x0f);
-    ws->write(px->getBuf()); 
+    px->SetAllI(0x0f); // set intensity
+    ws->write(px->getBuf()); // write buffer to the led strip
 }
 
 void print_score(uint8_t score, float balltime, float speed) {
@@ -53,41 +53,94 @@
     pc.printf("Speed of ball (34 mm diameter) : %f kph\n\r", speed);
 }
 
+// get information about score, balltime and speed from the GoalCounter 
 void get_info(uint8_t * score, float * balltime, float * speed, GoalCounter * gc) {
     *score = gc->get_score();
     *balltime = gc->get_balltime();
     *speed = gc->get_ballspeed();
 }
 
+// Play animation for the winner, use pixel array 1, target strip passed as pointer
+void winner_animation(WS2812 * ws) {
+     // This function is modified and taken from the Brian Daniels WS2812 example
+     // set up the colours we want to draw with
+    int colorbuf[NUM_COLORS] = {0x2f0000,0x2f2f00,0x002f00,0x002f2f,0x00002f,0x2f002f};
+
+    // for each of the colours (j) write out 10 of them
+    // the pixels are written at the colour*10, plus the colour position
+    // all modulus 60 so it wraps around
+    for (int i = 0; i < WS2812_BUF; i++) {
+        px1.Set(i, colorbuf[(i / NUM_LEDS_PER_COLOR) % NUM_COLORS]);
+    }
+
+    // now all the colours are computed, add a fade effect using intensity scaling
+    // compute and write the II value for each pixel
+    for (int j=0; j<WS2812_BUF; j++) {
+        // px.SetI(pixel position, II value)
+        px1.SetI(j%WS2812_BUF, 0xf+(0xf*(j%NUM_LEDS_PER_COLOR)));
+    }
+
+
+    // Now the buffer is written, rotate it
+    // by writing it out with an increasing offset
+    // 
+    for (int i=0; i < 1000 ; i++) {
+        for (int z=WS2812_BUF; z >= 0 ; z--) {
+            ws->write_offsets(px1.getBuf(),z,z,z);
+            wait(0.075);
+        }
+    }
+
+}
 
 int main()
 {
+    // use global intensity scaling
+    ws1.useII(WS2812::GLOBAL);
+    ws2.useII(WS2812::GLOBAL); 
+      
+    pc.printf("Initialization of the game... \n\r");
     
-    ws1.useII(WS2812::GLOBAL); // use global intensity scaling
-    ws2.useII(WS2812::GLOBAL); // use global intensity scaling
-      
-    pc.printf("Initialization... \n\r");
     while(1) {
-        if (gc.is_goal == 1) {
-            get_info(&score1, &balltime1, &speed1, &gc);
+        // polling - checking if goal was detected
+        if (gc1.is_goal == 1) {
+            get_info(&score1, &balltime1, &speed1, &gc1);
             set_score(score1, &px1, &ws1);
+            pc.printf("Side 1 score \n\r");
             print_score(score1, balltime1, speed1);
-            gc.is_goal = 0;
+            gc1.is_goal = 0;
         }
         else if (gc2.is_goal == 1) {
             get_info(&score2, &balltime2, &speed2, &gc2);
             set_score(score2, &px2, &ws2);
+            pc.printf("Side 2 score \n\r");
             print_score(score2, balltime2, speed2);
             gc2.is_goal = 0;     
         }
-        if (score1 >= 10) {
+        // when game is over, print game replay and winning animation
+        if (score1 >= 10 || score2 >= 10) {
             pc.printf("Game over \n\r");
-            for (int i=1; i<= 10; i++) {
-                    pc.printf("Game score: \n\r");
-                    balltime1 = gc.get_balltime(i);
-                    speed1 = gc.get_ballspeed(i);
+            pc.printf(((score1 > score2) ? "Team 1 is winner" : "Team 2 is winner"));
+            
+            pc.printf("\n Game score Team 1 : \n\r");
+            
+            for (int i=1; i<= score1; i++) {
+                    balltime1 = gc1.get_balltime(i);
+                    speed1 = gc1.get_ballspeed(i);
                     print_score(i, balltime1, speed1);
                 }
+            
+            pc.printf("Game score Team 2 : \n\r");
+            
+            for (int i=1; i<= score2; i++) {
+                    balltime2 = gc2.get_balltime(i);
+                    speed2 = gc2.get_ballspeed(i);
+                    print_score(i, balltime2, speed2);
+                }
+            
+            // play winner animation on winning team's LED strip
+            winner_animation(((score1 > score2) ? &ws1 : &ws2));
+              
             return 0;
         }