updated 7seg controls for new 7 seg boards

Dependencies:   PixelArray WS2812 mbed

Fork of frdm_pong_table_controller by Demo Team

main.cpp

Committer:
benswindell
Date:
2017-02-27
Revision:
0:f2b739e846ae
Child:
1:24bc4d8ed2ae

File content as of revision 0:f2b739e846ae:

#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);

    }
}