From 8ea3815b62c81fdb64955cedd4c733b1e8d27370 Mon Sep 17 00:00:00 2001 From: Simon Reap Date: Sun, 7 Feb 2021 10:49:21 +0000 Subject: [PATCH 1/3] With repeat on +/- time keys for timer --- examples/pico_rtc_display/demo.cpp | 84 +++++++++++++++++++++++------- 1 file changed, 64 insertions(+), 20 deletions(-) diff --git a/examples/pico_rtc_display/demo.cpp b/examples/pico_rtc_display/demo.cpp index 4afd2c4f..94fbd3b6 100644 --- a/examples/pico_rtc_display/demo.cpp +++ b/examples/pico_rtc_display/demo.cpp @@ -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", From 11abbb575ee06ce2ce4d687ce0fbc8d9bf6d5868 Mon Sep 17 00:00:00 2001 From: Simon Reap Date: Mon, 8 Feb 2021 08:35:32 +0000 Subject: [PATCH 2/3] Fix getTimerCount() for > 256 units --- drivers/rv3028/rv3028.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/rv3028/rv3028.cpp b/drivers/rv3028/rv3028.cpp index be43c44b..7ec7db49 100644 --- a/drivers/rv3028/rv3028.cpp +++ b/drivers/rv3028/rv3028.cpp @@ -528,7 +528,7 @@ namespace pimoroni { { // Reads the number of remaining timer ticks uint8_t r0 =readRegister(RV3028_TIMERSTAT_0); - return(r0 + (readRegister(RV3028_TIMERSTAT_1) >> 8)); + return(r0 + (readRegister(RV3028_TIMERSTAT_1) << 8)); } void RV3028::enableTimerInterrupt() From 9343643f304e1cecedf14b139dd626b05ae44024 Mon Sep 17 00:00:00 2001 From: Simon Reap Date: Mon, 8 Feb 2021 09:04:54 +0000 Subject: [PATCH 3/3] Smaller running counter display in example) --- examples/pico_rtc_display/demo.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/pico_rtc_display/demo.cpp b/examples/pico_rtc_display/demo.cpp index 94fbd3b6..c4231448 100644 --- a/examples/pico_rtc_display/demo.cpp +++ b/examples/pico_rtc_display/demo.cpp @@ -202,7 +202,7 @@ int main() { } else { sprintf(buf, "%s %d", "Timer running", rv3028.getTimerCount()); pico_display.text(buf, - Point(text_box.x, text_box.y+30), 230, 4); + Point(text_box.x, text_box.y+30), 230, 3); } pico_display.text("Clock", Point(text_box.x, text_box.y+PicoDisplay::HEIGHT-20), 230, 1);