updated 7seg controls for new 7 seg boards
Dependencies: PixelArray WS2812 mbed
Fork of frdm_pong_table_controller by
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); } } }