From d270275bd2d1044cb4db9af8efc1d766617b07a1 Mon Sep 17 00:00:00 2001 From: Tim Keller Date: Mon, 27 Sep 2021 01:20:44 +0000 Subject: Added Shake to wake --- src/components/settings/Settings.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'src/components/settings/Settings.h') diff --git a/src/components/settings/Settings.h b/src/components/settings/Settings.h index 2d7973d8..928d04c8 100644 --- a/src/components/settings/Settings.h +++ b/src/components/settings/Settings.h @@ -15,6 +15,7 @@ namespace Pinetime { SingleTap = 0, DoubleTap = 1, RaiseWrist = 2, + Shake = 3, }; enum class Colors : uint8_t { White, Silver, Gray, Black, Red, Maroon, Yellow, Olive, Lime, Green, Cyan, Teal, Blue, Navy, Magenta, Purple, Orange @@ -127,12 +128,13 @@ namespace Pinetime { settings.wakeUpMode.set(static_cast(WakeUpMode::SingleTap), false); break; case WakeUpMode::RaiseWrist: + case WakeUpMode::Shake: break; } } }; - std::bitset<3> getWakeUpModes() const { + std::bitset<4> getWakeUpModes() const { return settings.wakeUpMode; } @@ -162,7 +164,7 @@ namespace Pinetime { private: Pinetime::Controllers::FS& fs; - static constexpr uint32_t settingsVersion = 0x0002; + static constexpr uint32_t settingsVersion = 0x0003; struct SettingsData { uint32_t version = settingsVersion; uint32_t stepsGoal = 10000; @@ -175,7 +177,7 @@ namespace Pinetime { PineTimeStyle PTS; - std::bitset<3> wakeUpMode {0}; + std::bitset<4> wakeUpMode {0}; Controllers::BrightnessController::Levels brightLevel = Controllers::BrightnessController::Levels::Medium; }; -- cgit v1.2.3 From 3ebf002f9db75513d036c0eaa0863e75882b3a40 Mon Sep 17 00:00:00 2001 From: Tim Keller Date: Mon, 27 Sep 2021 02:52:02 +0000 Subject: Add start of settings app for senstivity. really just debugging. I want to make it more configurable then high med low. Position of setting needs a new location...dynamicly adding it currently at the end. Which honestly im fine with. --- src/CMakeLists.txt | 1 + src/components/motion/MotionController.cpp | 4 +- src/components/motion/MotionController.h | 3 +- src/components/settings/Settings.h | 13 +++- src/displayapp/Apps.h | 4 +- src/displayapp/DisplayApp.cpp | 5 ++ .../screens/settings/SettingShakeThreshold.cpp | 89 ++++++++++++++++++++++ .../screens/settings/SettingShakeThreshold.h | 27 +++++++ src/displayapp/screens/settings/Settings.cpp | 4 +- src/systemtask/SystemTask.cpp | 3 +- 10 files changed, 145 insertions(+), 8 deletions(-) create mode 100644 src/displayapp/screens/settings/SettingShakeThreshold.cpp create mode 100644 src/displayapp/screens/settings/SettingShakeThreshold.h (limited to 'src/components/settings/Settings.h') diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 47da4a8a..311eee23 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -447,6 +447,7 @@ list(APPEND SOURCE_FILES displayapp/screens/settings/SettingSteps.cpp displayapp/screens/settings/SettingSetDate.cpp displayapp/screens/settings/SettingSetTime.cpp + displayapp/screens/settings/SettingShakeThreshold.cpp ## Watch faces displayapp/icons/bg_clock.c diff --git a/src/components/motion/MotionController.cpp b/src/components/motion/MotionController.cpp index 58a7f672..615ad26c 100644 --- a/src/components/motion/MotionController.cpp +++ b/src/components/motion/MotionController.cpp @@ -45,12 +45,12 @@ bool MotionController::Should_RaiseWake(bool isSleeping) { return false; } -bool MotionController::Should_ShakeWake() { +bool MotionController::Should_ShakeWake(uint16_t thresh) { bool wake = false; auto diff = xTaskGetTickCount() - lastShakeTime; lastShakeTime = xTaskGetTickCount(); int32_t speed = std::abs(y + z - lastYForShake - lastZForShake) / diff * 10; - if (speed > 150) { // TODO move threshold to a setting + if (speed > thresh) { wake = true; } lastXForShake = x; diff --git a/src/components/motion/MotionController.h b/src/components/motion/MotionController.h index bd925cc7..28f7d3a7 100644 --- a/src/components/motion/MotionController.h +++ b/src/components/motion/MotionController.h @@ -35,7 +35,8 @@ namespace Pinetime { uint32_t GetTripSteps() const { return currentTripSteps; } - bool Should_ShakeWake(); + + bool Should_ShakeWake(uint16_t thresh); bool Should_RaiseWake(bool isSleeping); void IsSensorOk(bool isOk); diff --git a/src/components/settings/Settings.h b/src/components/settings/Settings.h index 928d04c8..a4145738 100644 --- a/src/components/settings/Settings.h +++ b/src/components/settings/Settings.h @@ -109,10 +109,19 @@ namespace Pinetime { } settings.screenTimeOut = timeout; }; + uint32_t GetScreenTimeOut() const { return settings.screenTimeOut; }; + void SetShakeThreshold(uint16_t thresh){ + settings.shakeWakeThreshold = thresh; + } + + int16_t GetShakeThreshold() const{ + return settings.shakeWakeThreshold; + } + void setWakeUpMode(WakeUpMode wakeUp, bool enabled) { if (enabled != isWakeUpModeOn(wakeUp)) { settingsChanged = true; @@ -164,7 +173,7 @@ namespace Pinetime { private: Pinetime::Controllers::FS& fs; - static constexpr uint32_t settingsVersion = 0x0003; + static constexpr uint32_t settingsVersion = 0x0004; struct SettingsData { uint32_t version = settingsVersion; uint32_t stepsGoal = 10000; @@ -178,7 +187,7 @@ namespace Pinetime { PineTimeStyle PTS; std::bitset<4> wakeUpMode {0}; - + uint16_t shakeWakeThreshold = 300; Controllers::BrightnessController::Levels brightLevel = Controllers::BrightnessController::Levels::Medium; }; diff --git a/src/displayapp/Apps.h b/src/displayapp/Apps.h index c77bd29f..a6ea8dee 100644 --- a/src/displayapp/Apps.h +++ b/src/displayapp/Apps.h @@ -36,7 +36,9 @@ namespace Pinetime { SettingSteps, SettingSetDate, SettingSetTime, - Error, + SettingShakeThreshold, + Error + }; } } diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp index 2354107b..7f511672 100644 --- a/src/displayapp/DisplayApp.cpp +++ b/src/displayapp/DisplayApp.cpp @@ -47,6 +47,7 @@ #include "displayapp/screens/settings/SettingSteps.h" #include "displayapp/screens/settings/SettingSetDate.h" #include "displayapp/screens/settings/SettingSetTime.h" +#include "displayapp/screens/settings/SettingShakeThreshold.h" #include "libs/lv_conf.h" @@ -415,6 +416,10 @@ void DisplayApp::LoadApp(Apps app, DisplayApp::FullRefreshDirections direction) currentScreen = std::make_unique(this, dateTimeController); ReturnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown); break; + case Apps::SettingShakeThreshold: + currentScreen = std::make_unique(this, settingsController); + ReturnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown); + break; case Apps::BatteryInfo: currentScreen = std::make_unique(this, batteryController); ReturnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown); diff --git a/src/displayapp/screens/settings/SettingShakeThreshold.cpp b/src/displayapp/screens/settings/SettingShakeThreshold.cpp new file mode 100644 index 00000000..6665e4b6 --- /dev/null +++ b/src/displayapp/screens/settings/SettingShakeThreshold.cpp @@ -0,0 +1,89 @@ +#include "SettingShakeThreshold.h" +#include +#include "displayapp/DisplayApp.h" +#include "displayapp/screens/Screen.h" +#include "displayapp/screens/Symbols.h" + +using namespace Pinetime::Applications::Screens; + +namespace { + static void event_handler(lv_obj_t* obj, lv_event_t event) { + SettingShakeThreshold* screen = static_cast(obj->user_data); + screen->UpdateSelected(obj, event); + } +} + +SettingShakeThreshold::SettingShakeThreshold(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Settings& settingsController) + : Screen(app), settingsController {settingsController} { + + lv_obj_t* container1 = lv_cont_create(lv_scr_act(), nullptr); + + // lv_obj_set_style_local_bg_color(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x111111)); + lv_obj_set_style_local_bg_opa(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_TRANSP); + lv_obj_set_style_local_pad_all(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 10); + lv_obj_set_style_local_pad_inner(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 5); + lv_obj_set_style_local_border_width(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 0); + + lv_obj_set_pos(container1, 10, 60); + lv_obj_set_width(container1, LV_HOR_RES - 20); + lv_obj_set_height(container1, LV_VER_RES - 50); + lv_cont_set_layout(container1, LV_LAYOUT_COLUMN_LEFT); + + lv_obj_t* title = lv_label_create(lv_scr_act(), nullptr); + lv_label_set_text_static(title, "Shake Threshold"); + lv_label_set_align(title, LV_LABEL_ALIGN_CENTER); + lv_obj_align(title, lv_scr_act(), LV_ALIGN_IN_TOP_MID, 10, 15); + + lv_obj_t* icon = lv_label_create(lv_scr_act(), nullptr); + lv_obj_set_style_local_text_color(icon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_ORANGE); + lv_label_set_text_static(icon, Symbols::home); + lv_label_set_align(icon, LV_LABEL_ALIGN_CENTER); + lv_obj_align(icon, title, LV_ALIGN_OUT_LEFT_MID, -10, 0); + + optionsTotal = 0; + cbOption[optionsTotal] = lv_checkbox_create(container1, nullptr); + lv_checkbox_set_text_static(cbOption[optionsTotal], " High"); + cbOption[optionsTotal]->user_data = this; + lv_obj_set_event_cb(cbOption[optionsTotal], event_handler); + if (settingsController.GetShakeThreshold() == 150) { + lv_checkbox_set_checked(cbOption[optionsTotal], true); + } + + optionsTotal++; + cbOption[optionsTotal] = lv_checkbox_create(container1, nullptr); + lv_checkbox_set_text_static(cbOption[optionsTotal], " Medium"); + cbOption[optionsTotal]->user_data = this; + lv_obj_set_event_cb(cbOption[optionsTotal], event_handler); + if (settingsController.GetShakeThreshold() == 300) { + lv_checkbox_set_checked(cbOption[optionsTotal], true); + } + + optionsTotal++; + cbOption[optionsTotal] = lv_checkbox_create(container1, nullptr); + lv_checkbox_set_text_static(cbOption[optionsTotal], " Low"); + cbOption[optionsTotal]->user_data = this; + lv_obj_set_event_cb(cbOption[optionsTotal], event_handler); + if (settingsController.GetShakeThreshold() == 450) { + lv_checkbox_set_checked(cbOption[optionsTotal], true); + } + + optionsTotal++; +} + +SettingShakeThreshold::~SettingShakeThreshold() { + lv_obj_clean(lv_scr_act()); + settingsController.SaveSettings(); +} + +void SettingShakeThreshold::UpdateSelected(lv_obj_t* object, lv_event_t event) { + if (event == LV_EVENT_VALUE_CHANGED) { + for (uint8_t i = 0; i < optionsTotal; i++) { + if (object == cbOption[i]) { + lv_checkbox_set_checked(cbOption[i], true); + settingsController.SetShakeThreshold((i+1)*150); + } else { + lv_checkbox_set_checked(cbOption[i], false); + } + } + } +} diff --git a/src/displayapp/screens/settings/SettingShakeThreshold.h b/src/displayapp/screens/settings/SettingShakeThreshold.h new file mode 100644 index 00000000..387f0b6f --- /dev/null +++ b/src/displayapp/screens/settings/SettingShakeThreshold.h @@ -0,0 +1,27 @@ +#pragma once + +#include +#include +#include "components/settings/Settings.h" +#include "displayapp/screens/Screen.h" + +namespace Pinetime { + + namespace Applications { + namespace Screens { + + class SettingShakeThreshold : public Screen { + public: + SettingShakeThreshold(DisplayApp* app, Pinetime::Controllers::Settings& settingsController); + ~SettingShakeThreshold() override; + + void UpdateSelected(lv_obj_t* object, lv_event_t event); + + private: + Controllers::Settings& settingsController; + uint8_t optionsTotal; + lv_obj_t* cbOption[2]; + }; + } + } +} diff --git a/src/displayapp/screens/settings/Settings.cpp b/src/displayapp/screens/settings/Settings.cpp index 31ee8831..cf78ad13 100644 --- a/src/displayapp/screens/settings/Settings.cpp +++ b/src/displayapp/screens/settings/Settings.cpp @@ -65,6 +65,8 @@ std::unique_ptr Settings::CreateScreen3() { {Symbols::none, "None", Apps::None}, {Symbols::none, "None", Apps::None} }}; - + if (settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::Shake)) { + applications[1] = {Symbols::list, "Shake Threshold", Apps::SettingShakeThreshold}; + } return std::make_unique(2, 3, app, settingsController, applications); } \ No newline at end of file diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp index 54f3c840..41b42c65 100644 --- a/src/systemtask/SystemTask.cpp +++ b/src/systemtask/SystemTask.cpp @@ -475,7 +475,8 @@ void SystemTask::UpdateMotion() { motionController.Should_RaiseWake(isSleeping)) { GoToRunning(); } - if (settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::Shake) && motionController.Should_ShakeWake()) { + if (settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::Shake) && + motionController.Should_ShakeWake(settingsController.GetShakeThreshold())) { GoToRunning(); } } -- cgit v1.2.3 From 6d748206983ca1ae7c929fba58d62ddfdb365650 Mon Sep 17 00:00:00 2001 From: Tim Keller Date: Mon, 27 Sep 2021 03:30:49 +0000 Subject: Add averaging to wake threshold. Makes it take more then just a "flick" to turn on --- src/components/motion/MotionController.cpp | 5 ++++- src/components/motion/MotionController.h | 1 + src/components/settings/Settings.h | 4 ++-- 3 files changed, 7 insertions(+), 3 deletions(-) (limited to 'src/components/settings/Settings.h') diff --git a/src/components/motion/MotionController.cpp b/src/components/motion/MotionController.cpp index 615ad26c..4843f304 100644 --- a/src/components/motion/MotionController.cpp +++ b/src/components/motion/MotionController.cpp @@ -50,7 +50,10 @@ bool MotionController::Should_ShakeWake(uint16_t thresh) { auto diff = xTaskGetTickCount() - lastShakeTime; lastShakeTime = xTaskGetTickCount(); int32_t speed = std::abs(y + z - lastYForShake - lastZForShake) / diff * 10; - if (speed > thresh) { + //(.2 * speed) + ((1 - .2) * accumulatedspeed); + //implemented without floats as .25Alpha + accumulatedspeed = (speed/4) + ((accumulatedspeed/4)*3); + if (accumulatedspeed > thresh) { wake = true; } lastXForShake = x; diff --git a/src/components/motion/MotionController.h b/src/components/motion/MotionController.h index 28f7d3a7..aee9e63f 100644 --- a/src/components/motion/MotionController.h +++ b/src/components/motion/MotionController.h @@ -65,6 +65,7 @@ namespace Pinetime { int16_t lastXForShake = 0; int16_t lastYForShake = 0; int16_t lastZForShake = 0; + int32_t accumulatedspeed = 0; uint32_t lastShakeTime = 0; }; } diff --git a/src/components/settings/Settings.h b/src/components/settings/Settings.h index a4145738..5c3d2f4d 100644 --- a/src/components/settings/Settings.h +++ b/src/components/settings/Settings.h @@ -173,7 +173,7 @@ namespace Pinetime { private: Pinetime::Controllers::FS& fs; - static constexpr uint32_t settingsVersion = 0x0004; + static constexpr uint32_t settingsVersion = 0x0003; struct SettingsData { uint32_t version = settingsVersion; uint32_t stepsGoal = 10000; @@ -187,7 +187,7 @@ namespace Pinetime { PineTimeStyle PTS; std::bitset<4> wakeUpMode {0}; - uint16_t shakeWakeThreshold = 300; + uint16_t shakeWakeThreshold = 150; Controllers::BrightnessController::Levels brightLevel = Controllers::BrightnessController::Levels::Medium; }; -- cgit v1.2.3 From d2510d7926227df36ff0dcb9fe1b5ea9d586596c Mon Sep 17 00:00:00 2001 From: Tim Keller Date: Tue, 28 Sep 2021 03:50:08 +0000 Subject: Better Sensitivity UI, Calibration button added --- src/components/motion/MotionController.cpp | 13 ++- src/components/motion/MotionController.h | 2 +- src/components/settings/Settings.h | 3 +- src/displayapp/DisplayApp.cpp | 2 +- .../screens/settings/SettingShakeThreshold.cpp | 118 +++++++++++---------- .../screens/settings/SettingShakeThreshold.h | 20 +++- 6 files changed, 89 insertions(+), 69 deletions(-) (limited to 'src/components/settings/Settings.h') diff --git a/src/components/motion/MotionController.cpp b/src/components/motion/MotionController.cpp index 4843f304..d26fffd0 100644 --- a/src/components/motion/MotionController.cpp +++ b/src/components/motion/MotionController.cpp @@ -1,6 +1,5 @@ #include "components/motion/MotionController.h" #include "os/os_cputime.h" - using namespace Pinetime::Controllers; void MotionController::Update(int16_t x, int16_t y, int16_t z, uint32_t nbSteps) { @@ -49,18 +48,22 @@ bool MotionController::Should_ShakeWake(uint16_t thresh) { bool wake = false; auto diff = xTaskGetTickCount() - lastShakeTime; lastShakeTime = xTaskGetTickCount(); - int32_t speed = std::abs(y + z - lastYForShake - lastZForShake) / diff * 10; + int32_t speed = std::abs(z + (y/2) + (x/4)- lastYForShake - lastZForShake) / diff * 100; //(.2 * speed) + ((1 - .2) * accumulatedspeed); //implemented without floats as .25Alpha - accumulatedspeed = (speed/4) + ((accumulatedspeed/4)*3); + accumulatedspeed = (speed/5) + ((accumulatedspeed/5)*4); + if (accumulatedspeed > thresh) { wake = true; } - lastXForShake = x; - lastYForShake = y; + lastXForShake = x/4; + lastYForShake = y/2; lastZForShake = z; return wake; } +int32_t MotionController::currentShakeSpeed(){ + return accumulatedspeed; +} void MotionController::IsSensorOk(bool isOk) { isSensorOk = isOk; diff --git a/src/components/motion/MotionController.h b/src/components/motion/MotionController.h index aee9e63f..f80b11b9 100644 --- a/src/components/motion/MotionController.h +++ b/src/components/motion/MotionController.h @@ -38,7 +38,7 @@ namespace Pinetime { bool Should_ShakeWake(uint16_t thresh); bool Should_RaiseWake(bool isSleeping); - + int32_t currentShakeSpeed(); void IsSensorOk(bool isOk); bool IsSensorOk() const { return isSensorOk; diff --git a/src/components/settings/Settings.h b/src/components/settings/Settings.h index 5c3d2f4d..e623f3a5 100644 --- a/src/components/settings/Settings.h +++ b/src/components/settings/Settings.h @@ -136,8 +136,7 @@ namespace Pinetime { case WakeUpMode::DoubleTap: settings.wakeUpMode.set(static_cast(WakeUpMode::SingleTap), false); break; - case WakeUpMode::RaiseWrist: - case WakeUpMode::Shake: + default: break; } } diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp index 7f511672..34c9bfd2 100644 --- a/src/displayapp/DisplayApp.cpp +++ b/src/displayapp/DisplayApp.cpp @@ -417,7 +417,7 @@ void DisplayApp::LoadApp(Apps app, DisplayApp::FullRefreshDirections direction) ReturnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown); break; case Apps::SettingShakeThreshold: - currentScreen = std::make_unique(this, settingsController); + currentScreen = std::make_unique(this, settingsController,motionController,*systemTask); ReturnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown); break; case Apps::BatteryInfo: diff --git a/src/displayapp/screens/settings/SettingShakeThreshold.cpp b/src/displayapp/screens/settings/SettingShakeThreshold.cpp index 6665e4b6..19afa24f 100644 --- a/src/displayapp/screens/settings/SettingShakeThreshold.cpp +++ b/src/displayapp/screens/settings/SettingShakeThreshold.cpp @@ -4,6 +4,7 @@ #include "displayapp/screens/Screen.h" #include "displayapp/screens/Symbols.h" + using namespace Pinetime::Applications::Screens; namespace { @@ -13,77 +14,82 @@ namespace { } } -SettingShakeThreshold::SettingShakeThreshold(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Settings& settingsController) - : Screen(app), settingsController {settingsController} { - - lv_obj_t* container1 = lv_cont_create(lv_scr_act(), nullptr); - - // lv_obj_set_style_local_bg_color(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x111111)); - lv_obj_set_style_local_bg_opa(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_TRANSP); - lv_obj_set_style_local_pad_all(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 10); - lv_obj_set_style_local_pad_inner(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 5); - lv_obj_set_style_local_border_width(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 0); - - lv_obj_set_pos(container1, 10, 60); - lv_obj_set_width(container1, LV_HOR_RES - 20); - lv_obj_set_height(container1, LV_VER_RES - 50); - lv_cont_set_layout(container1, LV_LAYOUT_COLUMN_LEFT); +SettingShakeThreshold::SettingShakeThreshold(DisplayApp* app, + Controllers::Settings& settingsController, + Controllers::MotionController& motionController, + System::SystemTask& systemTask) + : Screen(app), + settingsController {settingsController}, + motionController {motionController}, + systemTask {systemTask} { lv_obj_t* title = lv_label_create(lv_scr_act(), nullptr); lv_label_set_text_static(title, "Shake Threshold"); lv_label_set_align(title, LV_LABEL_ALIGN_CENTER); - lv_obj_align(title, lv_scr_act(), LV_ALIGN_IN_TOP_MID, 10, 15); - - lv_obj_t* icon = lv_label_create(lv_scr_act(), nullptr); - lv_obj_set_style_local_text_color(icon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_ORANGE); - lv_label_set_text_static(icon, Symbols::home); - lv_label_set_align(icon, LV_LABEL_ALIGN_CENTER); - lv_obj_align(icon, title, LV_ALIGN_OUT_LEFT_MID, -10, 0); - - optionsTotal = 0; - cbOption[optionsTotal] = lv_checkbox_create(container1, nullptr); - lv_checkbox_set_text_static(cbOption[optionsTotal], " High"); - cbOption[optionsTotal]->user_data = this; - lv_obj_set_event_cb(cbOption[optionsTotal], event_handler); - if (settingsController.GetShakeThreshold() == 150) { - lv_checkbox_set_checked(cbOption[optionsTotal], true); - } + lv_obj_align(title, lv_scr_act(), LV_ALIGN_IN_TOP_MID, 0, 0); - optionsTotal++; - cbOption[optionsTotal] = lv_checkbox_create(container1, nullptr); - lv_checkbox_set_text_static(cbOption[optionsTotal], " Medium"); - cbOption[optionsTotal]->user_data = this; - lv_obj_set_event_cb(cbOption[optionsTotal], event_handler); - if (settingsController.GetShakeThreshold() == 300) { - lv_checkbox_set_checked(cbOption[optionsTotal], true); - } - optionsTotal++; - cbOption[optionsTotal] = lv_checkbox_create(container1, nullptr); - lv_checkbox_set_text_static(cbOption[optionsTotal], " Low"); - cbOption[optionsTotal]->user_data = this; - lv_obj_set_event_cb(cbOption[optionsTotal], event_handler); - if (settingsController.GetShakeThreshold() == 450) { - lv_checkbox_set_checked(cbOption[optionsTotal], true); - } + positionArc = lv_arc_create(lv_scr_act(), nullptr); + // Why do this? + positionArc->user_data = this; - optionsTotal++; -} + lv_obj_set_event_cb(positionArc, event_handler); + // lv_arc_set_start_angle(positionArc,270); + lv_arc_set_angles(positionArc, 180, 360); + lv_arc_set_bg_angles(positionArc, 180, 360); + + // lv_arc_set_rotation(positionArc, 135); + lv_arc_set_range(positionArc, 10, 4095); + lv_arc_set_value(positionArc, settingsController.GetShakeThreshold()); + lv_obj_set_size(positionArc, 240, 180); + lv_arc_set_adjustable(positionArc, false); + lv_obj_align(positionArc, title, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10); + + calButton = lv_btn_create(lv_scr_act(), nullptr); + calButton->user_data = this; + lv_obj_set_event_cb(calButton, event_handler); + lv_btn_set_fit(calButton, LV_FIT_TIGHT); + + // lv_obj_set_style_local_bg_opa(calButton, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_TRANSP); + lv_obj_set_height(calButton, 80); + lv_obj_align(calButton, lv_scr_act(), LV_ALIGN_IN_BOTTOM_MID, 0, 0); + calLabel = lv_label_create(calButton, NULL); + lv_label_set_text(calLabel, "Calibrate"); + + } SettingShakeThreshold::~SettingShakeThreshold() { lv_obj_clean(lv_scr_act()); settingsController.SaveSettings(); } +void SettingShakeThreshold::Refresh() { + + taskCount++; //100ms Update time so finish @100 + if((motionController.currentShakeSpeed()-200) > lv_arc_get_value(positionArc)){ + lv_arc_set_value(positionArc,(int16_t)motionController.currentShakeSpeed()-200); + } + if(taskCount >= 100){ + lv_label_set_text(calLabel, "Calibrate"); + lv_task_del(refreshTask); + } + +} + void SettingShakeThreshold::UpdateSelected(lv_obj_t* object, lv_event_t event) { - if (event == LV_EVENT_VALUE_CHANGED) { - for (uint8_t i = 0; i < optionsTotal; i++) { - if (object == cbOption[i]) { - lv_checkbox_set_checked(cbOption[i], true); - settingsController.SetShakeThreshold((i+1)*150); - } else { - lv_checkbox_set_checked(cbOption[i], false); + + switch (event) { + case LV_EVENT_PRESSED: { + taskCount = 0; + refreshTask = lv_task_create(RefreshTaskCallback, 100, LV_TASK_PRIO_MID, this); + lv_label_set_text(calLabel, "Shake!!!"); + break; + } + case LV_EVENT_VALUE_CHANGED: { + if (object == positionArc) { + settingsController.SetShakeThreshold(lv_arc_get_value(positionArc)); } + break; } } } diff --git a/src/displayapp/screens/settings/SettingShakeThreshold.h b/src/displayapp/screens/settings/SettingShakeThreshold.h index 387f0b6f..f6918f4d 100644 --- a/src/displayapp/screens/settings/SettingShakeThreshold.h +++ b/src/displayapp/screens/settings/SettingShakeThreshold.h @@ -4,7 +4,7 @@ #include #include "components/settings/Settings.h" #include "displayapp/screens/Screen.h" - +#include namespace Pinetime { namespace Applications { @@ -12,15 +12,27 @@ namespace Pinetime { class SettingShakeThreshold : public Screen { public: - SettingShakeThreshold(DisplayApp* app, Pinetime::Controllers::Settings& settingsController); - ~SettingShakeThreshold() override; + SettingShakeThreshold(DisplayApp* app, + Pinetime::Controllers::Settings& settingsController, + Controllers::MotionController& motionController, + System::SystemTask& systemTask); + ~SettingShakeThreshold() override; + void Refresh() override; void UpdateSelected(lv_obj_t* object, lv_event_t event); private: Controllers::Settings& settingsController; - uint8_t optionsTotal; + Controllers::MotionController& motionController; + System::SystemTask& systemTask; + + + + + uint8_t taskCount; lv_obj_t* cbOption[2]; + lv_obj_t *positionArc, *calButton, *calLabel; + lv_task_t* refreshTask; }; } } -- cgit v1.2.3 From f780ac999a069b3539f5419b9e07a624ae018030 Mon Sep 17 00:00:00 2001 From: Tim Keller Date: Tue, 28 Sep 2021 04:21:47 +0000 Subject: Actually save the threshold Prevent a few crashes due to an LV task being active when it shouldnt be. --- src/components/settings/Settings.h | 6 +++++- .../screens/settings/SettingShakeThreshold.cpp | 23 ++++++++++++++++------ src/displayapp/screens/settings/Settings.cpp | 2 +- 3 files changed, 23 insertions(+), 8 deletions(-) (limited to 'src/components/settings/Settings.h') diff --git a/src/components/settings/Settings.h b/src/components/settings/Settings.h index e623f3a5..12ac85b5 100644 --- a/src/components/settings/Settings.h +++ b/src/components/settings/Settings.h @@ -115,7 +115,11 @@ namespace Pinetime { }; void SetShakeThreshold(uint16_t thresh){ - settings.shakeWakeThreshold = thresh; + if(settings.shakeWakeThreshold != thresh){ + settings.shakeWakeThreshold = thresh; + settingsChanged = true; + } + } int16_t GetShakeThreshold() const{ diff --git a/src/displayapp/screens/settings/SettingShakeThreshold.cpp b/src/displayapp/screens/settings/SettingShakeThreshold.cpp index 19afa24f..dc0812a7 100644 --- a/src/displayapp/screens/settings/SettingShakeThreshold.cpp +++ b/src/displayapp/screens/settings/SettingShakeThreshold.cpp @@ -24,13 +24,14 @@ SettingShakeThreshold::SettingShakeThreshold(DisplayApp* app, systemTask {systemTask} { lv_obj_t* title = lv_label_create(lv_scr_act(), nullptr); - lv_label_set_text_static(title, "Shake Threshold"); + lv_label_set_text_static(title, "Wake Sensitivity"); lv_label_set_align(title, LV_LABEL_ALIGN_CENTER); lv_obj_align(title, lv_scr_act(), LV_ALIGN_IN_TOP_MID, 0, 0); + taskCount = 0; positionArc = lv_arc_create(lv_scr_act(), nullptr); - // Why do this? + positionArc->user_data = this; lv_obj_set_event_cb(positionArc, event_handler); @@ -59,6 +60,8 @@ SettingShakeThreshold::SettingShakeThreshold(DisplayApp* app, } SettingShakeThreshold::~SettingShakeThreshold() { + settingsController.SetShakeThreshold(lv_arc_get_value(positionArc)); + lv_task_del(refreshTask); lv_obj_clean(lv_scr_act()); settingsController.SaveSettings(); } @@ -69,8 +72,9 @@ void SettingShakeThreshold::Refresh() { if((motionController.currentShakeSpeed()-200) > lv_arc_get_value(positionArc)){ lv_arc_set_value(positionArc,(int16_t)motionController.currentShakeSpeed()-200); } - if(taskCount >= 100){ + if(taskCount >= 50){ lv_label_set_text(calLabel, "Calibrate"); + taskCount=0; lv_task_del(refreshTask); } @@ -80,11 +84,18 @@ void SettingShakeThreshold::UpdateSelected(lv_obj_t* object, lv_event_t event) { switch (event) { case LV_EVENT_PRESSED: { - taskCount = 0; - refreshTask = lv_task_create(RefreshTaskCallback, 100, LV_TASK_PRIO_MID, this); - lv_label_set_text(calLabel, "Shake!!!"); + if(taskCount == 0){ + refreshTask = lv_task_create(RefreshTaskCallback, 100, LV_TASK_PRIO_MID, this); + lv_label_set_text(calLabel, "Shake!!!"); + }else{ + + lv_task_del(refreshTask); + taskCount=0; + lv_label_set_text(calLabel, "Calibrate"); + } break; } + case LV_EVENT_VALUE_CHANGED: { if (object == positionArc) { settingsController.SetShakeThreshold(lv_arc_get_value(positionArc)); diff --git a/src/displayapp/screens/settings/Settings.cpp b/src/displayapp/screens/settings/Settings.cpp index cf78ad13..0f77456a 100644 --- a/src/displayapp/screens/settings/Settings.cpp +++ b/src/displayapp/screens/settings/Settings.cpp @@ -66,7 +66,7 @@ std::unique_ptr Settings::CreateScreen3() { {Symbols::none, "None", Apps::None} }}; if (settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::Shake)) { - applications[1] = {Symbols::list, "Shake Threshold", Apps::SettingShakeThreshold}; + applications[1] = {Symbols::list, "Wake Sense", Apps::SettingShakeThreshold}; } return std::make_unique(2, 3, app, settingsController, applications); } \ No newline at end of file -- cgit v1.2.3