updated 7seg controls for new 7 seg boards

Dependencies:   PixelArray WS2812 mbed

Fork of frdm_pong_table_controller by Demo Team

Revision:
0:f2b739e846ae
Child:
1:24bc4d8ed2ae
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Feb 27 16:38:51 2017 +0000
@@ -0,0 +1,407 @@
+#include "mbed.h"
+#include "WS2812.h"
+#include "PixelArray.h"
+
+#define WS2812_BUF 112
+#define NUM_COLORS 6
+#define NUM_LEDS_PER_COLOR 1
+
+//-------- Colours -----------
+#define RED 0x2f0000
+#define YELLOW 0x2f2f00
+#define GREEN 0x002f00
+#define LIGHTBLUE 0x002f2f
+#define DARKBLUE 0x00002f
+#define BLUE 0x0000ff // Player scored a goal
+#define PINK 0x2f002f
+#define OFF 0x000000
+#define WHITE 0xffffff
+#define ARMBLUE 0x128BAB
+#define PURPLE 0xff0055 // Player has conceded a goal
+
+// GPIO
+AnalogIn robotBreakBeam(A0);
+AnalogIn playerBreakBeam(A1);
+DigitalOut led_green(LED_GREEN, 1);
+
+// SERIAL
+Serial pc(USBTX, USBRX); // tx, rx
+
+// LED STRIPS
+// See the program page for information on the timing numbers
+// The given numbers are for the K64F
+WS2812 robotScoreLED(D9, WS2812_BUF, 0, 5, 5, 0);
+WS2812 playerScoreLED(D8,WS2812_BUF, 0, 5, 5, 0);
+WS2812 robotGoalLED(D7,WS2812_BUF, 0, 5, 5, 0);
+WS2812 playerGoalLED(D6,WS2812_BUF, 0, 5, 5, 0);
+
+// LED Variables
+bool seg1A, seg1B, seg1C, seg1D, seg1E, seg1F, seg1G;
+int seg1Array[112];
+int mainArray[11][122];
+PixelArray px(WS2812_BUF);
+
+// Score counters
+int robotScore;
+int playerScore;
+int scoreLimit = 3;
+bool finishedGame = false;
+int endFlashes = 0;
+int numFlashes;
+
+// Robot Bream Beam value
+double prevRbbValue; // Previous Robot break beam value
+double prevPbbValue; // Previous player break beam value
+
+// FUNCTION DECLERATIONS
+void Write7Seg(int num);
+void SetLEDArray(int x);
+void WriteRobotGoal(bool scored);
+void WritePlayerGoal(bool scored);
+void WriteScores();
+void HandleGoal(bool hasRobotScored);
+void WritePxScores(int line_num);
+void WritePxGoal(unsigned int colour);
+
+
+void setup()
+{
+    // Set brightness of the 4 LED strips
+    robotScoreLED.setII(0xFF);
+    robotScoreLED.useII(WS2812::GLOBAL);
+    playerScoreLED.setII(0xFF);
+    playerScoreLED.useII(WS2812::GLOBAL);
+    robotGoalLED.setII(0xFF);
+    robotGoalLED.useII(WS2812::GLOBAL);
+    playerGoalLED.setII(0xFF);
+    playerGoalLED.useII(WS2812::GLOBAL);
+
+    // Turn on green LED
+    led_green = 0;
+
+    // Fills 2D array with data
+    for(int i=0; i<10; i++) {
+        Write7Seg(i);
+    }
+
+    // Set scores to 0
+    robotScore = 0;
+    playerScore = 0;
+    numFlashes = 0;
+
+    // Set LEDS to start values
+    WriteScores();
+    wait(0.01);
+    WritePlayerGoal(true);
+    wait(0.01);
+    WriteRobotGoal(true);
+    
+    // Turn off green LED
+    led_green = 1;
+}
+
+// Set segment variables
+void Write7Seg(int num)
+{
+    switch (num) {
+        case 0 :
+            // Off
+            seg1A = 1;
+            seg1B = 1;
+            seg1C = 1;
+            seg1D = 1;
+            seg1E = 1;
+            seg1F = 1;
+            seg1G = 0;
+
+            SetLEDArray(0);
+
+            break;
+
+        case 1 :
+            // 1
+            seg1A = 0;
+            seg1B = 1;
+            seg1C = 1;
+            seg1D = 0;
+            seg1E = 0;
+            seg1F = 0;
+            seg1G = 0;
+
+            SetLEDArray(1);
+            break;
+
+        case 2 :
+            // 2
+            seg1A = 1;
+            seg1B = 1;
+            seg1C = 0;
+            seg1D = 1;
+            seg1E = 1;
+            seg1F = 0;
+            seg1G = 1;
+
+            SetLEDArray(2);
+
+            break;
+
+        case 3 :
+            // 3
+            seg1A = 1;
+            seg1B = 1;
+            seg1C = 1;
+            seg1D = 1;
+            seg1E = 0;
+            seg1F = 0;
+            seg1G = 1;
+
+            SetLEDArray(3);
+            break;
+
+        case 4:
+            // 4
+            seg1A = 0;
+            seg1B = 1;
+            seg1C = 1;
+            seg1D = 0;
+            seg1E = 0;
+            seg1F = 1;
+            seg1G = 1;
+
+            SetLEDArray(4);
+
+            break;
+
+        case 5:
+            // 5
+            seg1A = 1;
+            seg1B = 0;
+            seg1C = 1;
+            seg1D = 1;
+            seg1E = 0;
+            seg1F = 1;
+            seg1G = 1;
+
+            SetLEDArray(5);
+
+            break;
+
+        case 6:
+            // 6
+            seg1A = 1;
+            seg1B = 0;
+            seg1C = 1;
+            seg1D = 1;
+            seg1E = 1;
+            seg1F = 1;
+            seg1G = 1;
+
+            SetLEDArray(6);
+
+            break;
+
+        case 7:
+            // 7
+            seg1A = 1;
+            seg1B = 1;
+            seg1C = 1;
+            seg1D = 0;
+            seg1E = 0;
+            seg1F = 0;
+            seg1G = 0;
+
+            SetLEDArray(7);
+
+            break;
+
+        case 8:
+            // 8
+            seg1A = 1;
+            seg1B = 1;
+            seg1C = 1;
+            seg1D = 1;
+            seg1E = 1;
+            seg1F = 1;
+            seg1G = 1;
+
+            SetLEDArray(8);
+            break;
+
+        case 9:
+            // 9
+            seg1A = 1;
+            seg1B = 1;
+            seg1C = 1;
+            seg1D = 0;
+            seg1E = 0;
+            seg1F = 1;
+            seg1G = 1;
+
+            SetLEDArray(9);
+            break;
+
+        case 10:
+            // OFF
+            seg1A = 0;
+            seg1B = 0;
+            seg1C = 0;
+            seg1D = 0;
+            seg1E = 0;
+            seg1F = 0;
+            seg1G = 0;
+
+            SetLEDArray(10);
+            break;
+
+        default :
+
+            break;
+
+    }
+}
+
+// Write segment config to main array
+void SetLEDArray(int x)
+{
+    for (int i = 0; i < WS2812_BUF; i++) {
+        if (i < 16) {
+            mainArray[x][i] = seg1A;
+        }
+
+        if ( i >= 16 && i < 32) {
+            mainArray[x][i] = seg1B;
+        }
+
+        if (i >= 32 && i < 48) {
+            mainArray[x][i] = seg1C;
+        }
+
+        if (i >= 48 && i < 64) {
+            mainArray[x][i]= seg1D;
+        }
+
+        if ( i >= 64 && i < 80) {
+            mainArray[x][i] = seg1E;
+        }
+
+        if (i >= 80 && i < 96) {
+            mainArray[x][i] = seg1F;
+        }
+
+        if ( i >= 96 && i < 112) {
+            mainArray[x][i] = seg1G;
+        }
+    }// FOR LOOP
+}
+
+// Write to player 1 LED (ROBOT)
+void WriteRobotGoal(bool scored)
+{
+    if(scored == true)
+    {
+        WritePxGoal(BLUE);
+    } else {
+        WritePxGoal(PURPLE);    
+    }
+    robotGoalLED.write(px.getBuf());
+}
+
+// Write to player 1 LED (ROBOT)
+void WritePlayerGoal(bool scored)
+{
+    if(scored == true)
+    {
+        WritePxGoal(BLUE);
+    } else {
+        WritePxGoal(PURPLE);    
+    }
+    playerGoalLED.write(px.getBuf());
+}
+
+void WriteGoalsOff()
+{
+    WritePxGoal(OFF);
+    robotGoalLED.write(px.getBuf());
+    WritePxGoal(OFF);
+    playerGoalLED.write(px.getBuf());    
+}
+
+void WriteScores()
+{
+    WritePxScores(playerScore);
+    playerScoreLED.write(px.getBuf());
+    wait(0.01);
+    WritePxScores(robotScore);
+    robotScoreLED.write(px.getBuf());
+}
+
+// Write pixel array
+void WritePxScores(int line_num)
+{
+    for (int i = 0; i < WS2812_BUF; i++) {
+        if (mainArray[line_num][i] == 0) {
+            px.Set(i,OFF);
+        }
+
+        if (mainArray[line_num][i] == 1) {
+            px.Set(i,LIGHTBLUE);
+        }
+    }
+}
+
+void WritePxGoal(unsigned int colour)
+{
+    for (int i = 0; i < WS2812_BUF; i++) {
+        px.Set(i,colour);
+    }
+}
+
+void HandleGoal(bool hasRobotScored)
+{
+    if(hasRobotScored == true) {
+        robotScore++;
+        WriteRobotGoal(true);
+        wait(0.01);
+        WritePlayerGoal(false);
+        wait(0.01);
+        WriteScores();
+    } else {
+        playerScore++;
+        WriteRobotGoal(false);
+        wait(0.01);
+        WritePlayerGoal(true);
+        wait(0.01);
+        WriteScores();
+    }
+    
+    wait(5);
+    WriteGoalsOff();
+}
+
+int main()
+{
+    while(1) {
+        double rbbValue = robotBreakBeam; // Read Robot Break beam
+        double pbbValue = playerBreakBeam; // Read Player Break beam
+
+        // IF PLAYER HAS SCORED A GOAL
+        if ((prevRbbValue - rbbValue)>0.01) {
+            pc.printf("Player has scored a goal \n\r");
+            HandleGoal(false);
+        }
+
+        // IF ROBOT HAS SCORED A GOAL
+        if ((prevPbbValue - pbbValue) > 0.01) {
+            pc.printf("Robot has scored a goal \n\r");
+            HandleGoal(true);
+        }
+        
+        prevRbbValue = rbbValue;
+        prevPbbValue = pbbValue;
+        
+        pc.printf("PlayerGoal: %f, RobotGoal: %f",pbbValue,rbbValue);
+        pc.printf("Player: %i v %i : Robot",playerScore,robotScore);
+        wait(0.01);
+
+    }
+}
\ No newline at end of file