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