updated 7seg controls for new 7 seg boards

Dependencies:   PixelArray WS2812 mbed

Fork of frdm_pong_table_controller by Demo Team

main.cpp

Committer:
DanGibbons
Date:
2017-07-05
Revision:
4:2e80bd814f57
Parent:
3:51604b5710f1
Child:
5:2d439ccefc7d

File content as of revision 4:2e80bd814f57:

#include "main.h"

int main()
{
    Setup();

    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.03)|| (PB1==0)) {
            pc.printf("Player has scored a goal \n\r");
            HandleGoal(false);
        }

        // IF ROBOT HAS SCORED A GOAL
        if (((prevPbbValue - pbbValue) > 0.03)|| (PB2==0)) {
            pc.printf("Robot has scored a goal \n\r");
            HandleGoal(true);
        }

        prevRbbValue = rbbValue;
        prevPbbValue = pbbValue;

        pc.printf("PlayerGoal: %f, RobotGoal: %f \r\n",pbbValue,rbbValue);
        pc.printf("Player: %i v %i : Robot \r\n",playerScore,robotScore);
        wait(0.02);

    }
}

void Setup()
{
    // Turn on green LED
    led_green = 0;

    // Set brightness of the 4 LED strips
    robotScoreLED.setII(0xB0);
    robotScoreLED.useII(WS2812::GLOBAL);
    playerScoreLED.setII(0xB0);
    playerScoreLED.useII(WS2812::GLOBAL);
    
    SetFigureOf8Pattern();
    
    FigureOf8Animation();
    
    // Fills 2D main array with data
    SetNumberPatterns();
    
    // Set scores to 0
    robotScore = 0;
    playerScore = 0;
    numFlashes = 0;

    // Set LEDS to start values
    WriteScores();

    wait(1);

    // Turn off green LED
    led_green = 1;
}

// Set segment variables
void SetNumberPatterns()
{
    for (int num = 0; num < 11; num++) {

        switch (num) {
            case 0 :
                // 0
                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;

        }

    }

}

void SetFigureOf8Pattern()
{
    for(int seg = 0; seg < 8; seg++) {

        switch (seg) {
            case 0 :
                seg1A = 1;
                seg1B = 0;
                seg1C = 0;
                seg1D = 0;
                seg1E = 0;
                seg1F = 0;
                seg1G = 0;

                SetLEDArray(0);
                break;

            case 1 :
                seg1A = 0;
                seg1B = 1;
                seg1C = 0;
                seg1D = 0;
                seg1E = 0;
                seg1F = 0;
                seg1G = 0;

                SetLEDArray(1);
                break;

            case 2 :
                seg1A = 0;
                seg1B = 0;
                seg1C = 0;
                seg1D = 0;
                seg1E = 0;
                seg1F = 0;
                seg1G = 1;

                SetLEDArray(2);
                break;

            case 3 :
                seg1A = 0;
                seg1B = 0;
                seg1C = 0;
                seg1D = 0;
                seg1E = 1;
                seg1F = 0;
                seg1G = 0;

                SetLEDArray(3);
                break;

            case 4:
                seg1A = 0;
                seg1B = 0;
                seg1C = 0;
                seg1D = 1;
                seg1E = 0;
                seg1F = 0;
                seg1G = 0;

                SetLEDArray(4);
                break;

            case 5:
                seg1A = 0;
                seg1B = 0;
                seg1C = 1;
                seg1D = 0;
                seg1E = 0;
                seg1F = 0;
                seg1G = 0;

                SetLEDArray(5);
                break;

            case 6:
                seg1A = 0;
                seg1B = 0;
                seg1C = 0;
                seg1D = 0;
                seg1E = 0;
                seg1F = 0;
                seg1G = 1;

                SetLEDArray(6);
                break;

            case 7:
                seg1A = 0;
                seg1B = 0;
                seg1C = 0;
                seg1D = 0;
                seg1E = 0;
                seg1F = 1;
                seg1G = 0;

                SetLEDArray(7);
                break;

            default :

                break;

        }
        
    }

}

// Write segment config to main array
void SetLEDArray(int x)
{
    for (int i = 0; i < WS2812_BUF; i++) {
        if (i < 18) {
            mainArray[x][i] = seg1A;
        }

        if ( i >= 18 && i < 35) {
            mainArray[x][i] = seg1B;
        }

        if (i >= 35 && i < 52) {
            mainArray[x][i] = seg1C;
        }

        if (i >= 52 && i < 70) {
            mainArray[x][i]= seg1D;
        }

        if ( i >= 70 && i < 87) {
            mainArray[x][i] = seg1E;
        }

        if (i >= 87 && i < 104) {
            mainArray[x][i] = seg1F;
        }

        if ( i >= 104 && i < 122) {
            mainArray[x][i] = seg1G;
        }
    }
}

// Update both Score LEDs with the current score
void WriteScores()
{
    WritePxScores(playerScore,false);
    playerScoreLED.write(playerScorePx.getBuf());
    wait(0.01);
    WritePxScores(robotScore,true);
    robotScoreLED.write(robotScorePx.getBuf());
}

// Write pixel array
void WritePxScores(int line_num,bool isRobot)
{
    if(isRobot == true) {

        for (int i = 0; i < WS2812_BUF; i++) {
            if (mainArray[line_num][i] == 0) {
                robotScorePx.Set(i,OFF);
            }

            if (mainArray[line_num][i] == 1) {
                robotScorePx.Set(i,BLUE);
            }
        }
    } else {
        for (int i = 0; i < WS2812_BUF; i++) {
            if (mainArray[line_num][i] == 0) {
                playerScorePx.Set(i,OFF);
            }

            if (mainArray[line_num][i] == 1) {
                playerScorePx.Set(i,BLUE);
            }
        }
    }

}

// Write the goal LEDs and score LEDs when a goal is recorded. Also check to see if the goal being scored
// is the final point of the game and the game is over.
// INPUTS: hasRobotScored
//      
//      hasRobotScored - true if the goal being recorded is from the playerside goal, meaning the robot has scored a point
//
void HandleGoal(bool hasRobotScored)
{
    GoalAnimation(hasRobotScored);

    wait(1);

    // If either player reaches the score limit, then call HandleWin(). If not, then turn goal LEDs off
    if(robotScore == scoreLimit || playerScore == scoreLimit) {
        HandleWin();
    } 
}

// Handle behaviour when either the player or robot has won a game. 
void HandleWin()
{
    // Initalise variable as true
    bool isRobotWinner = true;
    
    // Decide if the robot is the winner. If not, then change isRobotWinner to false
    if(playerScore == scoreLimit) {
        
        isRobotWinner = false;
        pc.printf("Player won!");
        WinAnimation(isRobotWinner);

    } else {
        
        pc.printf("Robot won!");
        WinAnimation(isRobotWinner);

    }

    // Reset scores then write to LEDs
    robotScore = 0;
    playerScore = 0;
    WriteScores();
}

void GoalAnimation(bool hasRobotScored)
{
    if(hasRobotScored == true) {
        robotScore++;
        wait(0.5);
        WriteScores();
        wait(0.5);
        robotScorePx.SetAll(0);
        robotScoreLED.write(robotScorePx.getBuf());
        wait(0.5);
        WriteScores();
        
    } else {
        playerScore++;
        wait(0.5);
        WriteScores();
        wait(0.5);
        playerScorePx.SetAll(0);
        playerScoreLED.write(playerScorePx.getBuf());
        wait(0.5);
        WriteScores();
    }
    
}

void WinAnimation(bool isRobotWinner)
{
    if(isRobotWinner == false) {
        


    } else {
        
        

    }
    
} 

void FigureOf8Animation()
{
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 8; j++) {

            WritePxScores(j,false);
            playerScoreLED.write(playerScorePx.getBuf());
            WritePxScores(j,true);
            robotScoreLED.write(robotScorePx.getBuf());
            wait_ms(100);

        }
    }
}