updated 7seg controls for new 7 seg boards
Dependencies: PixelArray WS2812 mbed
Fork of frdm_pong_table_controller by
Revision 2:ff409472bc08, committed 2017-07-04
- Comitter:
- samuelmoss
- Date:
- Tue Jul 04 15:51:03 2017 +0000
- Parent:
- 1:24bc4d8ed2ae
- Child:
- 3:51604b5710f1
- Commit message:
- Updated LED code for the new 7-seg displays
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/main.cpp Mon Mar 20 12:12:46 2017 +0000
+++ b/main.cpp Tue Jul 04 15:51:03 2017 +0000
@@ -2,7 +2,7 @@
#include "WS2812.h"
#include "PixelArray.h"
-#define WS2812_BUF 112
+#define WS2812_BUF 122
#define NUM_COLORS 6
#define NUM_LEDS_PER_COLOR 1
@@ -23,6 +23,8 @@
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
@@ -30,21 +32,15 @@
// 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(D5,WS2812_BUF, 0, 5, 5, 0);
-WS2812 playerGoalLED(D3,WS2812_BUF, 0, 5, 5, 0);
+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[112];
+int seg1Array[122];
int mainArray[11][122];
PixelArray robotScorePx(WS2812_BUF);
PixelArray playerScorePx(WS2812_BUF);
-PixelArray robotGoalPx(WS2812_BUF);
-PixelArray playerGoalPx(WS2812_BUF);
-const int PLAYERGOALLEDS = 55;
-const int ROBOTGOALLEDS = 55;
// Score counters
int robotScore;
@@ -61,14 +57,13 @@
// 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, bool isRobot);
void WritePxGoal(unsigned int colour,bool isRobot);
void HandleWin();
-void WriteGoalsOff();
+
void setup()
@@ -78,14 +73,11 @@
led_green = 0;
// Set brightness of the 4 LED strips
- robotScoreLED.setII(0x19);
+ robotScoreLED.setII(0xB0);
robotScoreLED.useII(WS2812::GLOBAL);
- playerScoreLED.setII(0x19);
+ playerScoreLED.setII(0xB0);
playerScoreLED.useII(WS2812::GLOBAL);
- robotGoalLED.setII(0x19);
- robotGoalLED.useII(WS2812::GLOBAL);
- playerGoalLED.setII(0x80);
- playerGoalLED.useII(WS2812::GLOBAL);
+
// Fills 2D array with data
for(int i=0; i<10; i++) {
@@ -99,14 +91,11 @@
// Set LEDS to start values
WriteScores();
- wait(0.01);
- WritePlayerGoal(true);
- wait(0.01);
- WriteRobotGoal(true);
+
- wait(5);
+ wait(1);
- WriteGoalsOff();
+
// Turn off green LED
led_green = 1;
}
@@ -116,7 +105,7 @@
{
switch (num) {
case 0 :
- // Off
+ // 0
seg1A = 1;
seg1B = 1;
seg1C = 1;
@@ -275,67 +264,36 @@
void SetLEDArray(int x)
{
for (int i = 0; i < WS2812_BUF; i++) {
- if (i < 16) {
+ if (i < 18) {
mainArray[x][i] = seg1A;
}
- if ( i >= 16 && i < 32) {
+ if ( i >= 18 && i < 35) {
mainArray[x][i] = seg1B;
}
- if (i >= 32 && i < 48) {
+ if (i >= 35 && i < 52) {
mainArray[x][i] = seg1C;
}
- if (i >= 48 && i < 64) {
+ if (i >= 52 && i < 70) {
mainArray[x][i]= seg1D;
}
- if ( i >= 64 && i < 80) {
+ if ( i >= 70 && i < 87) {
mainArray[x][i] = seg1E;
}
- if (i >= 80 && i < 96) {
+ if (i >= 87 && i < 104) {
mainArray[x][i] = seg1F;
}
- if ( i >= 96 && i < 112) {
+ if ( i >= 104 && i < 122) {
mainArray[x][i] = seg1G;
}
}// FOR LOOP
}
-// Write to player 1 LED (ROBOT)
-void WriteRobotGoal(bool scored)
-{
- if(scored == true) {
- WritePxGoal(BLUE,true);
- } else {
- WritePxGoal(PURPLE,true);
- }
- robotGoalLED.write(robotGoalPx.getBuf());
-}
-
-// Write to player 1 LED (ROBOT)
-void WritePlayerGoal(bool scored)
-{
- if(scored == true) {
- WritePxGoal(BLUE,false);
- } else {
- WritePxGoal(PURPLE,false);
- }
- playerGoalLED.write(playerGoalPx.getBuf());
-}
-
-// Write OFF to both goals
-void WriteGoalsOff()
-{
- WritePxGoal(OFF,true);
- robotGoalLED.write(robotGoalPx.getBuf());
- WritePxGoal(OFF,false);
- playerGoalLED.write(playerGoalPx.getBuf());
-}
-
// Update both Score LEDs with the current score
void WriteScores()
{
@@ -357,7 +315,7 @@
}
if (mainArray[line_num][i] == 1) {
- robotScorePx.Set(i,WHITE);
+ robotScorePx.Set(i,BLUE);
}
}
} else {
@@ -367,32 +325,13 @@
}
if (mainArray[line_num][i] == 1) {
- playerScorePx.Set(i,WHITE);
+ playerScorePx.Set(i,BLUE);
}
}
}
}
-// Write Goal pixel array, using input colour for the specified goal
-// INPUTS: colour, isRobot
-//
-// colour - This is the colour that you wish to set the array to
-// isRobot - This specifies which goal to set the colours of, based on if it is the Robot side goal or not
-//
-void WritePxGoal(unsigned int colour,bool isRobot)
-{
- if(isRobot == true) {
- for (int i = 0; i < WS2812_BUF; i++) {
- robotGoalPx.Set(i,colour);
- }
- } else {
- for (int i = 0; i < WS2812_BUF; i++) {
- playerGoalPx.Set(i,colour);
- }
- }
-}
-
// 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
@@ -403,28 +342,18 @@
{
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);
+ 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();
- } else {
- WriteGoalsOff();
- }
+ }
}
// Handle behaviour when either the player or robot has won a game.
@@ -438,28 +367,16 @@
isRobotWinner = false;
pc.printf("Player won!");
- // Animation for goal LEDs. Turns off the robot Goal LEDs, working from in the middle point outwards.
- for(int i = 0; i < (ROBOTGOALLEDS / 2); i++) {
- robotGoalPx.Set((ROBOTGOALLEDS /2) - i, OFF);
- robotGoalPx.Set((ROBOTGOALLEDS /2) + i, OFF);
- robotGoalLED.write(robotGoalPx.getBuf());
- wait(0.15);
- }
+
- WriteGoalsOff();
+
} else {
pc.printf("Robot won!");
- // Animation for goal LEDs. Turns off the player Goal LEDs, working from in the middle point outwards.
- for(int i = 0; i < (PLAYERGOALLEDS / 2); i++) {
- playerGoalPx.Set((PLAYERGOALLEDS /2) - i, OFF);
- playerGoalPx.Set((PLAYERGOALLEDS /2) + i, OFF);
- playerGoalLED.write(playerGoalPx.getBuf());
- wait(0.25);
- }
+
- WriteGoalsOff();
+
}
// Reset scores then write to LEDs
@@ -477,13 +394,13 @@
double pbbValue = playerBreakBeam; // Read Player Break beam
// IF PLAYER HAS SCORED A GOAL
- if ((prevRbbValue - rbbValue)>0.03) {
+ 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) {
+ if (((prevPbbValue - pbbValue) > 0.03)|| (PB2==0)) {
pc.printf("Robot has scored a goal \n\r");
HandleGoal(true);
}
