From a89af00a110e910f61737b54b5a7c5a1b7de6f15 Mon Sep 17 00:00:00 2001 From: borkymcgee Date: Sat, 15 Jul 2023 10:13:52 -0600 Subject: [PATCH 1/6] Swiping up on metronome app opens a counter to allow for more precise adjustment of bpm --- src/displayapp/screens/Metronome.cpp | 29 +++++++++++++++++++++++++--- src/displayapp/screens/Metronome.h | 3 +++ 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/displayapp/screens/Metronome.cpp b/src/displayapp/screens/Metronome.cpp index 314fde73e0..e69430b65a 100644 --- a/src/displayapp/screens/Metronome.cpp +++ b/src/displayapp/screens/Metronome.cpp @@ -38,12 +38,18 @@ Metronome::Metronome(Controllers::MotorController& motorController, System::Syst bpmValue = createLabel("120", bpmArc, LV_ALIGN_IN_TOP_MID, &jetbrains_mono_76, 0, 55); createLabel("bpm", bpmValue, LV_ALIGN_OUT_BOTTOM_MID, &jetbrains_mono_bold_20, 0, 0); + bpmCounter.Create(); + bpmCounter.SetValue(120); + lv_obj_align(bpmCounter.GetObject(), lv_scr_act(), LV_ALIGN_IN_TOP_MID, 0, 0); + lv_obj_set_hidden(bpmCounter.GetObject(), true); + //bpmCounter.HideControls(); + bpmTap = lv_btn_create(lv_scr_act(), nullptr); bpmTap->user_data = this; lv_obj_set_event_cb(bpmTap, eventHandler); lv_obj_set_style_local_bg_opa(bpmTap, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_TRANSP); lv_obj_set_height(bpmTap, 80); - lv_obj_align(bpmTap, bpmValue, LV_ALIGN_IN_TOP_MID, 0, 0); + lv_obj_align(bpmTap, bpmCounter.GetObject(), LV_ALIGN_CENTER, 0, 0); bpbDropdown = lv_dropdown_create(lv_scr_act(), nullptr); bpbDropdown->user_data = this; @@ -77,6 +83,11 @@ Metronome::~Metronome() { } void Metronome::Refresh() { + if (bpm != bpmCounter.GetValue()) { + bpm = bpmCounter.GetValue(); + lv_arc_set_value(bpmArc, bpm); + lv_label_set_text_fmt(bpmValue, "%03d", bpm); + } if (metronomeStarted) { if (xTaskGetTickCount() - startTime > 60u * configTICK_RATE_HZ / static_cast(bpm)) { startTime += 60 * configTICK_RATE_HZ / bpm; @@ -96,6 +107,7 @@ void Metronome::OnEvent(lv_obj_t* obj, lv_event_t event) { case LV_EVENT_VALUE_CHANGED: { if (obj == bpmArc) { bpm = lv_arc_get_value(bpmArc); + bpmCounter.SetValue(bpm); lv_label_set_text_fmt(bpmValue, "%03d", bpm); } else if (obj == bpbDropdown) { bpb = lv_dropdown_get_selected(obj) + 1; @@ -111,6 +123,7 @@ void Metronome::OnEvent(lv_obj_t* obj, lv_event_t event) { bpm = configTICK_RATE_HZ * 60 / delta; lv_arc_set_value(bpmArc, bpm); lv_label_set_text_fmt(bpmValue, "%03d", bpm); + bpmCounter.SetValue(bpm); } tappedTime = xTaskGetTickCount(); allowExit = true; @@ -144,8 +157,18 @@ void Metronome::OnEvent(lv_obj_t* obj, lv_event_t event) { } bool Metronome::OnTouchEvent(TouchEvents event) { - if (event == TouchEvents::SwipeDown && allowExit) { - running = false; + if (event == TouchEvents::SwipeDown) { + if (allowExit) { + return false; + } + lv_obj_set_hidden(bpmTap, false); + lv_obj_set_hidden(bpmArc, false); + lv_obj_set_hidden(bpmCounter.GetObject(), true); + } else if (event == TouchEvents::SwipeUp){ + lv_obj_set_hidden(bpmCounter.GetObject(), false); + lv_obj_set_hidden(bpmTap, true); + lv_obj_set_hidden(bpmArc, true); + allowExit = false; } return true; } diff --git a/src/displayapp/screens/Metronome.h b/src/displayapp/screens/Metronome.h index 13b0d66491..637626148a 100644 --- a/src/displayapp/screens/Metronome.h +++ b/src/displayapp/screens/Metronome.h @@ -3,6 +3,7 @@ #include "systemtask/SystemTask.h" #include "components/motor/MotorController.h" #include "displayapp/screens/Screen.h" +#include "displayapp/widgets/Counter.h" namespace Pinetime { namespace Applications { @@ -33,6 +34,8 @@ namespace Pinetime { lv_obj_t* playPause; lv_obj_t* lblPlayPause; + Widgets::Counter bpmCounter = Widgets::Counter(0, 220, jetbrains_mono_76); + lv_task_t* taskRefresh; }; } From 18666d6bf8f98e340c3c7c0cd52662a75708dd4a Mon Sep 17 00:00:00 2001 From: borkymcgee Date: Sat, 15 Jul 2023 11:18:00 -0600 Subject: [PATCH 2/6] enabled use of bpmTap while counter is open, made sure bpmTap does not capture swipes --- src/displayapp/screens/Metronome.cpp | 23 +++++++++++++---------- src/displayapp/screens/Metronome.h | 3 ++- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/displayapp/screens/Metronome.cpp b/src/displayapp/screens/Metronome.cpp index e69430b65a..d6a5ac95df 100644 --- a/src/displayapp/screens/Metronome.cpp +++ b/src/displayapp/screens/Metronome.cpp @@ -39,15 +39,14 @@ Metronome::Metronome(Controllers::MotorController& motorController, System::Syst createLabel("bpm", bpmValue, LV_ALIGN_OUT_BOTTOM_MID, &jetbrains_mono_bold_20, 0, 0); bpmCounter.Create(); - bpmCounter.SetValue(120); + bpmCounter.SetValue(bpm); lv_obj_align(bpmCounter.GetObject(), lv_scr_act(), LV_ALIGN_IN_TOP_MID, 0, 0); lv_obj_set_hidden(bpmCounter.GetObject(), true); - //bpmCounter.HideControls(); bpmTap = lv_btn_create(lv_scr_act(), nullptr); bpmTap->user_data = this; lv_obj_set_event_cb(bpmTap, eventHandler); - lv_obj_set_style_local_bg_opa(bpmTap, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_TRANSP); + lv_obj_set_style_local_bg_opa(bpmTap, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_60); lv_obj_set_height(bpmTap, 80); lv_obj_align(bpmTap, bpmCounter.GetObject(), LV_ALIGN_CENTER, 0, 0); @@ -116,21 +115,27 @@ void Metronome::OnEvent(lv_obj_t* obj, lv_event_t event) { } break; } - case LV_EVENT_PRESSED: { + case LV_EVENT_PRESSED: { // if bmp is tapped, record the tap... + if (obj == bpmTap) { + delta = xTaskGetTickCount() - tappedTime; + tappedTime = xTaskGetTickCount(); + if (lv_obj_get_hidden(bpmCounter.GetObject())) { + allowExit = true; + } + } + break; + } + case LV_EVENT_RELEASED: { // but only commit the change if the tap leaves the button as well, so as not to capture bpm on swipe events if (obj == bpmTap) { - TickType_t delta = xTaskGetTickCount() - tappedTime; if (tappedTime != 0 && delta < configTICK_RATE_HZ * 3) { bpm = configTICK_RATE_HZ * 60 / delta; lv_arc_set_value(bpmArc, bpm); lv_label_set_text_fmt(bpmValue, "%03d", bpm); bpmCounter.SetValue(bpm); } - tappedTime = xTaskGetTickCount(); - allowExit = true; } break; } - case LV_EVENT_RELEASED: case LV_EVENT_PRESS_LOST: if (obj == bpmTap) { allowExit = false; @@ -161,12 +166,10 @@ bool Metronome::OnTouchEvent(TouchEvents event) { if (allowExit) { return false; } - lv_obj_set_hidden(bpmTap, false); lv_obj_set_hidden(bpmArc, false); lv_obj_set_hidden(bpmCounter.GetObject(), true); } else if (event == TouchEvents::SwipeUp){ lv_obj_set_hidden(bpmCounter.GetObject(), false); - lv_obj_set_hidden(bpmTap, true); lv_obj_set_hidden(bpmArc, true); allowExit = false; } diff --git a/src/displayapp/screens/Metronome.h b/src/displayapp/screens/Metronome.h index 637626148a..374e61ca77 100644 --- a/src/displayapp/screens/Metronome.h +++ b/src/displayapp/screens/Metronome.h @@ -20,6 +20,7 @@ namespace Pinetime { private: TickType_t startTime = 0; TickType_t tappedTime = 0; + TickType_t delta = 0; Controllers::MotorController& motorController; System::SystemTask& systemTask; int16_t bpm = 120; @@ -34,7 +35,7 @@ namespace Pinetime { lv_obj_t* playPause; lv_obj_t* lblPlayPause; - Widgets::Counter bpmCounter = Widgets::Counter(0, 220, jetbrains_mono_76); + Widgets::Counter bpmCounter = Widgets::Counter(40, 220, jetbrains_mono_76); lv_task_t* taskRefresh; }; From 6157b1a08a6c8b67131c8559903058aa4c55b890 Mon Sep 17 00:00:00 2001 From: borkymcgee Date: Sat, 15 Jul 2023 11:32:27 -0600 Subject: [PATCH 3/6] disabled swipe gestures within metronome if dropdown is open, fixed a placeholder value --- src/displayapp/screens/Metronome.cpp | 27 +++++++++++++++++---------- src/displayapp/screens/Metronome.h | 1 + 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/displayapp/screens/Metronome.cpp b/src/displayapp/screens/Metronome.cpp index d6a5ac95df..a8d004ae71 100644 --- a/src/displayapp/screens/Metronome.cpp +++ b/src/displayapp/screens/Metronome.cpp @@ -46,7 +46,7 @@ Metronome::Metronome(Controllers::MotorController& motorController, System::Syst bpmTap = lv_btn_create(lv_scr_act(), nullptr); bpmTap->user_data = this; lv_obj_set_event_cb(bpmTap, eventHandler); - lv_obj_set_style_local_bg_opa(bpmTap, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_60); + lv_obj_set_style_local_bg_opa(bpmTap, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_TRANSP); lv_obj_set_height(bpmTap, 80); lv_obj_align(bpmTap, bpmCounter.GetObject(), LV_ALIGN_CENTER, 0, 0); @@ -159,19 +159,26 @@ void Metronome::OnEvent(lv_obj_t* obj, lv_event_t event) { default: break; } + if (obj == bpbDropdown) { // if the user is interacting with the dropdown, take note + inDropdown = true; + } else { + inDropdown = false; + } } bool Metronome::OnTouchEvent(TouchEvents event) { - if (event == TouchEvents::SwipeDown) { - if (allowExit) { - return false; + if (!inDropdown) { // only parse swipe events when not in the dropdown menu + if (event == TouchEvents::SwipeDown) { + if (allowExit) { + return false; + } + lv_obj_set_hidden(bpmArc, false); + lv_obj_set_hidden(bpmCounter.GetObject(), true); + } else if (event == TouchEvents::SwipeUp){ + lv_obj_set_hidden(bpmCounter.GetObject(), false); + lv_obj_set_hidden(bpmArc, true); + allowExit = false; } - lv_obj_set_hidden(bpmArc, false); - lv_obj_set_hidden(bpmCounter.GetObject(), true); - } else if (event == TouchEvents::SwipeUp){ - lv_obj_set_hidden(bpmCounter.GetObject(), false); - lv_obj_set_hidden(bpmArc, true); - allowExit = false; } return true; } diff --git a/src/displayapp/screens/Metronome.h b/src/displayapp/screens/Metronome.h index 374e61ca77..ff8fa14dcb 100644 --- a/src/displayapp/screens/Metronome.h +++ b/src/displayapp/screens/Metronome.h @@ -29,6 +29,7 @@ namespace Pinetime { bool metronomeStarted = false; bool allowExit = false; + bool inDropdown = false; // used to block swipes while dropdown is open lv_obj_t *bpmArc, *bpmTap, *bpmValue; lv_obj_t *bpbDropdown, *currentBpbText; From 69342aefa41bd4eb112da3686728d21c67d9eb75 Mon Sep 17 00:00:00 2001 From: borkymcgee Date: Sat, 15 Jul 2023 11:39:25 -0600 Subject: [PATCH 4/6] clang-formatted code --- src/displayapp/screens/Metronome.cpp | 6 +++--- src/displayapp/screens/Metronome.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/displayapp/screens/Metronome.cpp b/src/displayapp/screens/Metronome.cpp index a8d004ae71..c1905b28d1 100644 --- a/src/displayapp/screens/Metronome.cpp +++ b/src/displayapp/screens/Metronome.cpp @@ -115,7 +115,7 @@ void Metronome::OnEvent(lv_obj_t* obj, lv_event_t event) { } break; } - case LV_EVENT_PRESSED: { // if bmp is tapped, record the tap... + case LV_EVENT_PRESSED: { // if bmp is tapped, record the tap... if (obj == bpmTap) { delta = xTaskGetTickCount() - tappedTime; tappedTime = xTaskGetTickCount(); @@ -167,14 +167,14 @@ void Metronome::OnEvent(lv_obj_t* obj, lv_event_t event) { } bool Metronome::OnTouchEvent(TouchEvents event) { - if (!inDropdown) { // only parse swipe events when not in the dropdown menu + if (!inDropdown) { // only parse swipe events when not in the dropdown menu if (event == TouchEvents::SwipeDown) { if (allowExit) { return false; } lv_obj_set_hidden(bpmArc, false); lv_obj_set_hidden(bpmCounter.GetObject(), true); - } else if (event == TouchEvents::SwipeUp){ + } else if (event == TouchEvents::SwipeUp) { lv_obj_set_hidden(bpmCounter.GetObject(), false); lv_obj_set_hidden(bpmArc, true); allowExit = false; diff --git a/src/displayapp/screens/Metronome.h b/src/displayapp/screens/Metronome.h index ff8fa14dcb..aac18dc950 100644 --- a/src/displayapp/screens/Metronome.h +++ b/src/displayapp/screens/Metronome.h @@ -29,7 +29,7 @@ namespace Pinetime { bool metronomeStarted = false; bool allowExit = false; - bool inDropdown = false; // used to block swipes while dropdown is open + bool inDropdown = false; // used to block swipes while dropdown is open lv_obj_t *bpmArc, *bpmTap, *bpmValue; lv_obj_t *bpbDropdown, *currentBpbText; From 4dff952f285c5d55524636bab756c6cac03ef8d1 Mon Sep 17 00:00:00 2001 From: borkymcgee Date: Sat, 15 Jul 2023 12:12:48 -0600 Subject: [PATCH 5/6] extended bpmTap down to help avoid accidentally setting bpm to 40 when a swipe begins below the "BPM" text --- src/displayapp/screens/Metronome.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/displayapp/screens/Metronome.cpp b/src/displayapp/screens/Metronome.cpp index c1905b28d1..78eea73225 100644 --- a/src/displayapp/screens/Metronome.cpp +++ b/src/displayapp/screens/Metronome.cpp @@ -47,8 +47,8 @@ Metronome::Metronome(Controllers::MotorController& motorController, System::Syst bpmTap->user_data = this; lv_obj_set_event_cb(bpmTap, eventHandler); lv_obj_set_style_local_bg_opa(bpmTap, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_TRANSP); - lv_obj_set_height(bpmTap, 80); - lv_obj_align(bpmTap, bpmCounter.GetObject(), LV_ALIGN_CENTER, 0, 0); + lv_obj_set_height(bpmTap, 130); + lv_obj_align(bpmTap, bpmCounter.GetObject(), LV_ALIGN_CENTER, 0, 30); bpbDropdown = lv_dropdown_create(lv_scr_act(), nullptr); bpbDropdown->user_data = this; From 72492a9b42c15b08047053ecd33477b7ee1d3420 Mon Sep 17 00:00:00 2001 From: borkymcgee Date: Sat, 15 Jul 2023 12:48:31 -0600 Subject: [PATCH 6/6] Revert "extended bpmTap down to help avoid accidentally setting bpm to 40 when a swipe begins below the "BPM" text" Commit introduces a bug wherein one cannot decrement the counter This reverts commit 4dff952f285c5d55524636bab756c6cac03ef8d1. --- src/displayapp/screens/Metronome.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/displayapp/screens/Metronome.cpp b/src/displayapp/screens/Metronome.cpp index 78eea73225..c1905b28d1 100644 --- a/src/displayapp/screens/Metronome.cpp +++ b/src/displayapp/screens/Metronome.cpp @@ -47,8 +47,8 @@ Metronome::Metronome(Controllers::MotorController& motorController, System::Syst bpmTap->user_data = this; lv_obj_set_event_cb(bpmTap, eventHandler); lv_obj_set_style_local_bg_opa(bpmTap, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_TRANSP); - lv_obj_set_height(bpmTap, 130); - lv_obj_align(bpmTap, bpmCounter.GetObject(), LV_ALIGN_CENTER, 0, 30); + lv_obj_set_height(bpmTap, 80); + lv_obj_align(bpmTap, bpmCounter.GetObject(), LV_ALIGN_CENTER, 0, 0); bpbDropdown = lv_dropdown_create(lv_scr_act(), nullptr); bpbDropdown->user_data = this;