Skip to content
Snippets Groups Projects
Commit d9baff01 authored by Malte Schmitz's avatar Malte Schmitz
Browse files

Add screensaver

parent 4e454aaf
No related branches found
No related tags found
No related merge requests found
......@@ -30,12 +30,18 @@ Task taskExternalWinAnimation(8, 2000, &handleExternalWinAnimation);
void handleInternalWinAnimation();
Task taskInternalWinAnimation(8, 2000, &handleInternalWinAnimation);
void handleBlinkPoint();
Task taskBlinkPoint(300, TASK_FOREVER, &handleBlinkPoint);
// blink point task starts the screensaver when done
Task taskBlinkPoint(333, 30*3, &handleBlinkPoint);
void handleScreensaver();
Task taskScreensaver(TASK_IMMEDIATE, TASK_FOREVER, &handleScreensaver);
void doneMissedAnimation();
void doneWinAnimation();
void internalMissed();
void externalMissed();
void resetGame();
void doneMissedAnimation();
void doneWinAnimation();
void doneBlinkPoint();
void setup() {
randomSeed(analogRead(0));
......@@ -67,6 +73,9 @@ void setup() {
taskInternalWinAnimation.setOnDisable(&doneWinAnimation);
scheduler.addTask(taskBlinkPoint);
taskBlinkPoint.enable();
taskBlinkPoint.setOnDisable(&doneBlinkPoint);
scheduler.addTask(taskScreensaver);
}
void loop() {
......@@ -84,27 +93,34 @@ bool hideLastPoint = false;
#define STATE_PAUSE 0
#define STATE_FORWARD 1
#define STATE_BACKWARD 2
#define STATE_MISSED 3;
#define STATE_WIN 4;
#define STATE_MISSED 3
#define STATE_WIN 4
#define STATE_SCREENSAVER 5
int state = STATE_PAUSE;
void show() {
pixels.clear();
if (state == STATE_PAUSE) {
int points = pointsInternal;
if (lastPointInternal && hideLastPoint) {
points = max(0, points - 1);
}
for (int i = 0; i < points; i++) {
pixels.setPixelColor(i, 0xFFFF00);
}
points = pointsExternal;
if (!lastPointInternal && hideLastPoint) {
points = max(0, points - 1);
}
for (int i = NEOPIXEL_LEN - 1 - points; i < NEOPIXEL_LEN; i++) {
pixels.setPixelColor(i, 0xFFFF00);
if (singlePlayer) {
for (int i = NEOPIXEL_LEN / 2; i < NEOPIXEL_LEN; i++) {
pixels.setPixelColor(i, 0x0000FF);
}
} else {
int points = pointsInternal;
if (lastPointInternal && hideLastPoint) {
points = max(0, points - 1);
}
for (int i = 0; i < points; i++) {
pixels.setPixelColor(i, 0xFFFF00);
}
points = pointsExternal;
if (!lastPointInternal && hideLastPoint) {
points = max(0, points - 1);
}
for (int i = NEOPIXEL_LEN - 1 - points; i < NEOPIXEL_LEN; i++) {
pixels.setPixelColor(i, 0xFFFF00);
}
}
} else if (state == STATE_FORWARD || state == STATE_BACKWARD) {
......@@ -149,30 +165,38 @@ void firstRound() {
void internalButtonPressed() {
if (state == STATE_PAUSE) {
state = STATE_FORWARD;
taskBlinkPoint.abort();
position = 0;
firstRound();
} else if (state == STATE_BACKWARD) {
if (position < greenLength) {
state = STATE_FORWARD;
taskBlinkPoint.abort();
nextRound();
} else {
internalMissed();
}
} else if (state == STATE_SCREENSAVER) {
resetGame();
}
}
void externalButtonPressed() {
if (state == STATE_PAUSE) {
state = STATE_BACKWARD;
taskBlinkPoint.abort();
position = NEOPIXEL_LEN - 1;
firstRound();
} else if (state == STATE_FORWARD) {
if (position >= NEOPIXEL_LEN - greenLength) {
state = STATE_BACKWARD;
taskBlinkPoint.abort();
nextRound();
} else {
externalMissed();
}
} else if (state == STATE_SCREENSAVER) {
resetGame();
}
}
......@@ -217,6 +241,7 @@ void handleInternalMissedAnimation() {
void externalMissed() {
state = STATE_MISSED;
taskBlinkPoint.abort();
pointsInternal += 1;
lastPointInternal = true;
taskExternalMissedAnimation.restart();
......@@ -224,18 +249,28 @@ void externalMissed() {
void internalMissed() {
state = STATE_MISSED;
pointsExternal += 1;
lastPointInternal = false;
taskBlinkPoint.abort();
if (!singlePlayer) {
pointsExternal = 0;
pointsInternal = 0;
lastPointInternal = false;
} else {
pointsExternal += 1;
lastPointInternal = false;
}
taskInternalMissedAnimation.restart();
}
void doneMissedAnimation() {
state = STATE_PAUSE;
taskBlinkPoint.restart();
if (pointsExternal >= 7) {
state = STATE_WIN;
taskBlinkPoint.abort();
taskExternalWinAnimation.restart();
} else if (pointsInternal >= 7) {
state = STATE_WIN;
taskBlinkPoint.abort();
taskInternalWinAnimation.restart();
}
}
......@@ -251,6 +286,7 @@ void handleStep() {
if (position > NEOPIXEL_LEN / 2 - 1) {
position = NEOPIXEL_LEN / 2 - 2;
state = STATE_BACKWARD;
taskBlinkPoint.abort();
}
show();
} else {
......@@ -355,12 +391,32 @@ void handleInternalWinAnimation() {
handleWinAnimation(false);
}
void doneWinAnimation() {
void resetGame() {
pointsExternal = 0;
pointsInternal = 0;
lastPointInternal = false;
state = STATE_PAUSE;
taskBlinkPoint.restart();
taskScreensaver.abort();
}
void doneWinAnimation() {
for (int i = 0; i < NUM_WIN_POSITIONS; i++) {
winPositions[i] = -1;
}
resetGame();
}
void doneBlinkPoint() {
state = STATE_SCREENSAVER;
taskBlinkPoint.abort();
taskScreensaver.enable();
}
uint16_t screensaverHue = 0;
void handleScreensaver() {
pixels.rainbow(screensaverHue);
pixels.show();
screensaverHue += 100;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment