updated 7seg controls for new 7 seg boards
Dependencies: PixelArray WS2812 mbed
Fork of frdm_pong_table_controller by
main.cpp
- Committer:
- samuelmoss
- Date:
- 2017-07-04
- Revision:
- 2:ff409472bc08
- Parent:
- 1:24bc4d8ed2ae
- Child:
- 3:51604b5710f1
File content as of revision 2:ff409472bc08:
#include "mbed.h" #include "WS2812.h" #include "PixelArray.h" #define WS2812_BUF 122 #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 0xffffaa #define ARMBLUE 0x128BAB #define PURPLE 0xff0055 // Player has conceded a goal // GPIO AnalogIn robotBreakBeam(A0); AnalogIn playerBreakBeam(A1); DigitalOut led_green(LED_GREEN, 1); DigitalIn PB1(PTC6); DigitalIn PB2(PTA4); // 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(D3, WS2812_BUF, 0, 5, 5, 0); WS2812 playerScoreLED(D5,WS2812_BUF, 0, 5, 5, 0); // LED Variables bool seg1A, seg1B, seg1C, seg1D, seg1E, seg1F, seg1G; int seg1Array[122]; int mainArray[11][122]; PixelArray robotScorePx(WS2812_BUF); PixelArray playerScorePx(WS2812_BUF); // Score counters int robotScore; int playerScore; int scoreLimit = 3; bool finishedGame = false; int endFlashes = 3; 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 WriteScores(); void HandleGoal(bool hasRobotScored); void WritePxScores(int line_num, bool isRobot); void WritePxGoal(unsigned int colour,bool isRobot); void HandleWin(); 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); // 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(1); // Turn off green LED led_green = 1; } // Set segment variables void Write7Seg(int 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; } } // 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; } }// FOR LOOP } // 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) { if(hasRobotScored == true) { robotScore++; WriteScores(); } else { playerScore++; WriteScores(); } 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!"); } else { pc.printf("Robot won!"); } // Reset scores then write to LEDs robotScore = 0; playerScore = 0; WriteScores(); } 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); } }