With repeat on +/- time keys for timer

pull/46/head
Simon Reap 2021-02-07 10:49:21 +00:00
rodzic f9e6abb84e
commit 990ce09b4c
1 zmienionych plików z 64 dodań i 20 usunięć

Wyświetl plik

@ -14,6 +14,11 @@
// (There are on-screen reminders of the active buttons)
// **************************************************************************
// To use Explorer,
// - replace pico_display.hpp include with pico_explorer.hpp
// - replace all PicoDisplay with PicoExplorer
// - in CMakeLists.txt replace pico_display with pico_explorer
// - Comment out the .set_led() calls in flash_led()
#include "pico_display.hpp"
#include "rv3028.hpp"
@ -30,6 +35,30 @@ PicoDisplay pico_display(buffer);
RV3028 rv3028;
#define LOW_COUNT_MOD 40
#define HIGH_COUNT_MOD 20
bool repeat_count_reached(uint16_t curr_count) {
// Check whether the current counter means that a key has repeated
if (curr_count <= 10*LOW_COUNT_MOD) {
return (0 == (curr_count % LOW_COUNT_MOD));
} else {
return (0 == (curr_count % HIGH_COUNT_MOD));
}
}
#define FLASH_MOD 20
void flash_led(uint32_t curr_count) {
// Flash the LED based on the current loop counter
// curr_count=0 will turn LED off
if ((curr_count % FLASH_MOD) < (FLASH_MOD / 2)) {
// value less than half modded number - LED off
pico_display.set_led(0, 0, 0);
} else {
// value more than half modded number - LED on
pico_display.set_led(128, 128, 128);
}
}
int main() {
pico_display.init();
@ -40,10 +69,12 @@ int main() {
if (rv3028.is12Hour()) rv3028.set24Hour();
// Use these variables to make the buttons single-shot
bool a_pressed = false;
bool b_pressed = false;
bool x_pressed = false;
bool y_pressed = false;
// Counts number of loops pressed, 0 if not pressed
// Only for x and y - a and b are single-shot
uint16_t a_pressed = 0;
uint16_t b_pressed = 0;
uint16_t x_pressed = 0;
uint16_t y_pressed = 0;
struct pt {
float x;
@ -61,8 +92,8 @@ int main() {
while(true) {
if (a_pressed == false && pico_display.is_pressed(pico_display.A)) {
a_pressed = true;
if (a_pressed == 0 && pico_display.is_pressed(pico_display.A)) {
a_pressed = 1;
if (display_mode == MODE_DISP_CLOCK) {
// We were displaying clock = set up timer
display_mode = MODE_SET_TIMER;
@ -80,12 +111,12 @@ int main() {
rv3028.clearTimerInterruptFlag();
display_mode = MODE_SET_TIMER;
}
} else if (a_pressed == true && !pico_display.is_pressed(pico_display.A)) {
a_pressed = false;
} else if (a_pressed >= 1 && !pico_display.is_pressed(pico_display.A)) {
a_pressed = 0;
}
if (b_pressed == false && pico_display.is_pressed(pico_display.B)) {
b_pressed = true;
if (b_pressed == 0 && pico_display.is_pressed(pico_display.B)) {
b_pressed = 1;
if ((display_mode == MODE_DISP_TIMER)
|| (display_mode == MODE_SET_TIMER)) {
// We were setting or displaying timer - revert to clock
@ -95,28 +126,38 @@ int main() {
display_mode = MODE_DISP_CLOCK;
timer_count = DEFAULT_TIMER_COUNT;
}
} else if (b_pressed == true && !pico_display.is_pressed(pico_display.B)) {
b_pressed = false;
} else if (b_pressed >= 1 && !pico_display.is_pressed(pico_display.B)) {
b_pressed = 0;
}
if (x_pressed == false && pico_display.is_pressed(pico_display.X)) {
x_pressed = true;
if (x_pressed == 0 && pico_display.is_pressed(pico_display.X)) {
x_pressed = 1;
if (display_mode == MODE_SET_TIMER) {
// Setting timer - Increment count
timer_count++;
}
} else if (x_pressed == true && !pico_display.is_pressed(pico_display.X)) {
x_pressed = false;
} else if (x_pressed >= 1 && pico_display.is_pressed(pico_display.X)) {
// Button still pressed - check if has reached repeat count
if (repeat_count_reached(x_pressed++)) {
timer_count++;
}
} else if (x_pressed >= 1 && !pico_display.is_pressed(pico_display.X)) {
x_pressed = 0;
}
if (y_pressed == false && pico_display.is_pressed(pico_display.Y)) {
y_pressed = true;
if (y_pressed == 0 && pico_display.is_pressed(pico_display.Y)) {
y_pressed = 1;
if (display_mode == MODE_SET_TIMER) {
// Setting timer - Decrement count
if (timer_count >= 1) timer_count--;
}
} else if (y_pressed == true && !pico_display.is_pressed(pico_display.Y)) {
y_pressed = false;
} else if (y_pressed >= 1 && pico_display.is_pressed(pico_display.Y)) {
// Button still pressed - check if has reached repeat count
if (repeat_count_reached(y_pressed++)) {
if (timer_count >= 1) timer_count--;
}
} else if (y_pressed >= 1 && !pico_display.is_pressed(pico_display.Y)) {
y_pressed = 0;
}
Rect text_box(5, 5, PicoDisplay::WIDTH-10, PicoDisplay::HEIGHT-10);
@ -128,6 +169,7 @@ int main() {
switch (display_mode) {
case MODE_DISP_CLOCK:
// Show the clock face
flash_led(0);
if (rv3028.updateTime()) {
pico_display.text("Set Timer",
Point(text_box.x, text_box.y+2), 230, 1);
@ -156,6 +198,7 @@ int main() {
pico_display.text(buf,
Point(text_box.x, text_box.y+30), 230, 4);
pico_display.set_pen(255, 255, 255);
flash_led(i);
} else {
sprintf(buf, "%s %d", "Timer running", rv3028.getTimerCount());
pico_display.text(buf,
@ -165,6 +208,7 @@ int main() {
Point(text_box.x, text_box.y+PicoDisplay::HEIGHT-20), 230, 1);
break;
case MODE_SET_TIMER:
flash_led(0);
pico_display.text("Run Timer",
Point(text_box.x, text_box.y+2), 230, 1);
pico_display.text("+ Time",