updated 7seg controls for new 7 seg boards
Dependencies: PixelArray WS2812 mbed
Fork of frdm_pong_table_controller by
Diff: main.cpp
- Revision:
- 0:f2b739e846ae
- Child:
- 1:24bc4d8ed2ae
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Mon Feb 27 16:38:51 2017 +0000 @@ -0,0 +1,407 @@ +#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); + + } +} \ No newline at end of file