Dependencies: PixelArray WS2812 mbed
[OLD - NOT FINISHED CODE]
Final code for the Pong Table Code can be found here: https://developer.mbed.org/teams/ASE/code/frdm_pong_table_controller/
main.cpp
- Committer:
- benswindell
- Date:
- 2017-02-22
- Revision:
- 1:58c735e369b1
- Parent:
- 0:e610b1d38e80
File content as of revision 1:58c735e369b1:
#include "mbed.h"
#include "WS2812.h"
#include "PixelArray.h"
Serial pc(USBTX, USBRX);
DigitalOut led_green(LED_GREEN, 1);
AnalogIn sensor1(PTB2);
AnalogIn sensor2(A0);
#define WS2812_BUF 112
#define NUM_COLORS 6
#define NUM_LEDS_PER_COLOR 1
//-------- Colours -----------
#define RED 0x2f0000
#define YELLOW 0x2f2f00
#define GREEN 0x002f00 // Player has conceded a goal
#define LIGHTBLUE 0x002f2f
#define DARKBLUE 0x00002f // Player scored a goal
#define PINK 0x2f002f
#define OFF 0x000000
#define WHITE 0xffffff
#define ARMBLUE 0x128BAB
// Parameters
const int READ_FREQUENCY = 20;
const int BUFFER_SIZE = 2*READ_FREQUENCY; // in seconds
const float VOLTAGE_REF = 5.000f; // V
const int DEVIATION = 100; // mV
const int DEFAULT_DATA = -1;
bool seg1A, seg1B, seg1C, seg1D, seg1E, seg1F, seg1G;
int seg1Array[112];
int MainArray[11][122];
//void write_8Seg(int num);
PixelArray px(WS2812_BUF);
// See the program page for information on the timing numbers
// The given numbers are for the K64F
WS2812 ws(D9, WS2812_BUF, 0, 5, 5, 0);
WS2812 ws2(D8,WS2812_BUF, 0, 5, 5, 0);
WS2812 ws3(D7,WS2812_BUF, 0, 5, 5, 0);
WS2812 ws4(D6,WS2812_BUF, 0, 5, 5, 0);
// Score counters
int p1Score;
int p2Score;
int ScoreLimit = 5;
bool FinishedGame = false;
int EndFlashes = 0;
int NumFlashes;
// Create timers
Ticker pollTicker1;
Ticker pollTicker2;
Timer t;
int readings[BUFFER_SIZE]; // array of readings
int reading = 0; // index into above
int min = DEFAULT_DATA;
int max = DEFAULT_DATA;
int average = DEFAULT_DATA;
void readSensor();
void handleGoal();
void reset();
void setup()
{
// Turn on green LED
led_green = 1;
// Fills 2D array with data
for(int i=0; i<10; i++) {
write_7Seg(i);
}
p1Score = 0;
p2Score = 0;
NumFlashes = 0;
// Set LEDS to start values
write_pbbuf(p1Score);
write_pbbuf2(p2Score);
write_goal1(WHITE);
write_goal2(WHITE);
wait_ms(1000);
write_goal1(OFF);
write_goal2(OFF);
// Fill buffer with default data
for (int i=0; i<BUFFER_SIZE; i++) {
readings[i] = DEFAULT_DATA;
}
pollTicker1.attach(&readSensor1,(float)1/READ_FREQUENCY);
pollTicker2.attach(&readSensor2,(float)1/READ_FREQUENCY);
// Turn off green LED
led_green = 0;
}
// Set segment variables
void write_7Seg(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 write_pbbuf(int line_num)
{
write_px(line_num);
ws.write(px.getBuf());
}
// Write to player 2 LED (HUMAN)
void write_pbbuf2(int line_num)
{
write_px(line_num);
ws2.write(px2.getBuf());
}
// Write pixel array
void write_px(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);
}
}
}
// Read goal sensor 1 (ROBOT)
void readSensor1()
{
// Convert readings to mV
readings[reading] = (int)(sensor1.read() * 1000 * VOLTAGE_REF);
analyseReadings(0);
}
// Read goal sensor 2 (HUMAN)
void readSensor2()
{
// Convert readings to mV
readings[reading] = (int)(sensor2.read() * 1000 * VOLTAGE_REF);
analyseReadings(1);
}
// Analyse sensor readings
void analyseReadings(bool player)
{
min = DEFAULT_DATA;
max = DEFAULT_DATA;
int sum = 0;
int count = 0;
for (int i=0; i<BUFFER_SIZE; i++) {
if (readings[i] == DEFAULT_DATA) {
// ignore default values
break;
}
if ((min == DEFAULT_DATA) || (readings[i] < min)) {
min = readings[i];
}
if ((max == DEFAULT_DATA) || (readings[i] > max)) {
max = readings[i];
}
sum += readings[i];
count++;
}
if (count == 0) {
// No data yet
return;
}
average = sum/count;
// Goal detected if current reading deviates from average by more than 'deviation'
if ((readings[reading] < (average - DEVIATION)) || (readings[reading] > (average + DEVIATION))) {
incrementScore(!player); // Increase player score opposite the player whose goal's sensor reported a goal
}
reading = (reading + 1) % BUFFER_SIZE;
}
// Increment score
void incrementScore(bool isPlayer1)
{
// Player 1 sensor reported goal, increase player 2 score
if(isPlayer1 == 1) {
if(p2Score < ScoreLimit) {
p2Score++;
write_goal(GREEN, isPlayer1);
write_goal(DARKBLUE, !isPlayer1);
t.start();
} else if(Score == ScoreLimit) {
FinishedGame = true;
}
write_pbbuf2(p2Score);
}
// Player 2 sensor reported goal, increase player 1 score
if(isPlayer1 == 0) {
if(p1Score < ScoreLimit) {
p1Score++;
write_goal(DARKBLUE,isPlayer1);
write_goal(GREEN,!isPlayer1);
t.start();
} else if(p1Score == ScoreLimit) {
FinishedGame = true;
}
write_pbbuf(p1Score);
}
t.start();
}
// Write goal LED
void write_goal(unsigned int Colour, bool player1Goal)
{
for (int i = 0; i < WS2812_BUF; i++) {
px.Set(i,Colour);
}
if(player1Goal == 1) {
ws4.write(px.getBuf());
} else if (player1Goal == 0) {
ws3.write(px.getBuf());
}
}
// Turn off goal LEDS
void turn_off_goal(unsigned int Colour)
{
for (int i = 0; i < WS2812_BUF; i++) {
px.Set(i,Colour);
}
ws4.write(px.getBuf());
for (int i = 0; i < WS2812_BUF; i++) {
px.Set(i,Colour);
}
ws4.write(px.getBuf());
}
int main()
{
// Set brightness of the 4 LED strips
ws.setII(0xFF);
ws.useII(WS2812::GLOBAL);
ws2.setII(0xFF);
ws2.useII(WS2812::GLOBAL);
ws3.setII(0xFF);
ws3.useII(WS2812::GLOBAL);
ws4.setII(0xFF);
ws4.useII(WS2812::GLOBAL);
setup();
while(1) {
wait(1.0f);
// Check timer to see if 3s or 5s has elapsed
if(t.read() >= 3.0f && FinishedGame == false) {
turn_off_goal(OFF);
t.stop();
t.reset();
} else if(t.read() >= 5.0f && FinishedGame == true) {
/* Some finished game code here */
t.stop();
t.reset();
}
}
}