diff options
author | Jean-François Milants <jf@codingfield.com> | 2022-01-04 21:48:08 +0100 |
---|---|---|
committer | Jean-François Milants <jf@codingfield.com> | 2022-01-04 21:48:08 +0100 |
commit | bef3e708f6b5a6f71797f72aab89d09520813046 (patch) | |
tree | 8e955bb1b6c11c65afcc30eb39174ab20bfa0437 /src/displayapp/screens/settings | |
parent | b8b54f47a2a09e32186bf7d8dddc658fae2c6e5f (diff) | |
parent | e82469bffac6383ab898fa71dc3a88e164dc86ff (diff) |
Merge branch 'ShakeWake' of https://github.com/geekbozu/InfiniTime into geekbozu-ShakeWake
# Conflicts:
# src/CMakeLists.txt
# src/displayapp/Apps.h
# src/displayapp/DisplayApp.cpp
# src/displayapp/screens/settings/Settings.cpp
Diffstat (limited to 'src/displayapp/screens/settings')
-rw-r--r-- | src/displayapp/screens/settings/SettingShakeThreshold.cpp | 137 | ||||
-rw-r--r-- | src/displayapp/screens/settings/SettingShakeThreshold.h | 36 | ||||
-rw-r--r-- | src/displayapp/screens/settings/SettingWakeUp.cpp | 8 | ||||
-rw-r--r-- | src/displayapp/screens/settings/SettingWakeUp.h | 2 | ||||
-rw-r--r-- | src/displayapp/screens/settings/Settings.cpp | 15 |
5 files changed, 188 insertions, 10 deletions
diff --git a/src/displayapp/screens/settings/SettingShakeThreshold.cpp b/src/displayapp/screens/settings/SettingShakeThreshold.cpp new file mode 100644 index 00000000..1791b550 --- /dev/null +++ b/src/displayapp/screens/settings/SettingShakeThreshold.cpp @@ -0,0 +1,137 @@ +#include "SettingShakeThreshold.h" +#include <lvgl/lvgl.h> +#include "displayapp/DisplayApp.h" +#include "displayapp/screens/Screen.h" +#include "displayapp/screens/Symbols.h" + +using namespace Pinetime::Applications::Screens; + +namespace { + void event_handler(lv_obj_t* obj, lv_event_t event) { + SettingShakeThreshold* screen = static_cast<SettingShakeThreshold*>(obj->user_data); + screen->UpdateSelected(obj, event); + } +} + +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, "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); + + positionArc = lv_arc_create(lv_scr_act(), nullptr); + positionArc->user_data = this; + + lv_obj_set_event_cb(positionArc, event_handler); + lv_arc_set_bg_angles(positionArc, 180, 360); + lv_arc_set_range(positionArc, 0, 4095); + lv_arc_set_adjustable(positionArc, true); + lv_obj_set_width(positionArc, lv_obj_get_width(lv_scr_act()) - 10); + lv_obj_set_height(positionArc, 240); + lv_obj_align(positionArc, title, LV_ALIGN_OUT_BOTTOM_MID, 0, 0); + + animArc = lv_arc_create(positionArc, positionArc); + lv_arc_set_adjustable(animArc, false); + lv_obj_set_width(animArc, lv_obj_get_width(positionArc)); + lv_obj_set_height(animArc, lv_obj_get_height(positionArc)); + lv_obj_align_mid(animArc, positionArc, LV_ALIGN_CENTER, 0, 0); + lv_obj_set_style_local_line_opa(animArc, LV_ARC_PART_BG, LV_STATE_DEFAULT, 0); + lv_obj_set_style_local_line_opa(animArc, LV_ARC_PART_INDIC, LV_STATE_DEFAULT, LV_OPA_70); + lv_obj_set_style_local_line_opa(animArc, LV_ARC_PART_KNOB, LV_STATE_DEFAULT, LV_OPA_0); + lv_obj_set_style_local_line_color(animArc, LV_ARC_PART_INDIC, LV_STATE_DEFAULT, LV_COLOR_RED); + lv_obj_set_style_local_bg_color(animArc, LV_ARC_PART_BG, LV_STATE_CHECKED, LV_COLOR_TRANSP); + + animArc->user_data = this; + lv_obj_set_click(animArc, false); + + calButton = lv_btn_create(lv_scr_act(), nullptr); + calButton->user_data = this; + lv_obj_set_event_cb(calButton, event_handler); + lv_obj_set_height(calButton, 80); + lv_obj_set_width(calButton, 200); + lv_obj_align(calButton, lv_scr_act(), LV_ALIGN_IN_BOTTOM_MID, 0, 0); + lv_btn_set_checkable(calButton, true); + calLabel = lv_label_create(calButton, NULL); + lv_label_set_text(calLabel, "Calibrate"); + + lv_arc_set_value(positionArc, settingsController.GetShakeThreshold()); + + vDecay = xTaskGetTickCount(); + calibrating = false; + EnableForCal = false; + if(!settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::Shake)){ + EnableForCal = true; + settingsController.setWakeUpMode(Pinetime::Controllers::Settings::WakeUpMode::Shake,true); + } + refreshTask = lv_task_create(RefreshTaskCallback, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, this); +} + +SettingShakeThreshold::~SettingShakeThreshold() { + settingsController.SetShakeThreshold(lv_arc_get_value(positionArc)); + + if(EnableForCal){ + settingsController.setWakeUpMode(Pinetime::Controllers::Settings::WakeUpMode::Shake,false); + EnableForCal = false; + } + lv_task_del(refreshTask); + settingsController.SaveSettings(); + lv_obj_clean(lv_scr_act()); +} + +void SettingShakeThreshold::Refresh() { + + if (calibrating == 1) { + if (xTaskGetTickCount() - vCalTime > pdMS_TO_TICKS(2000)) { + vCalTime = xTaskGetTickCount(); + calibrating = 2; + lv_obj_set_style_local_bg_color(calButton, LV_BTN_PART_MAIN, LV_STATE_CHECKED, LV_COLOR_RED); + lv_obj_set_style_local_bg_color(calButton, LV_BTN_PART_MAIN, LV_STATE_CHECKED, LV_COLOR_RED); + lv_label_set_text(calLabel, "Shake!!"); + } + } + if (calibrating == 2) { + + if ((motionController.currentShakeSpeed() - 300) > lv_arc_get_value(positionArc)) { + lv_arc_set_value(positionArc, (int16_t) motionController.currentShakeSpeed() - 300); + } + if (xTaskGetTickCount() - vCalTime > pdMS_TO_TICKS(7500)) { + lv_btn_set_state(calButton, LV_STATE_DEFAULT); + lv_event_send(calButton, LV_EVENT_VALUE_CHANGED, NULL); + } + } + if (motionController.currentShakeSpeed() - 300 > lv_arc_get_value(animArc)) { + lv_arc_set_value(animArc, (uint16_t) motionController.currentShakeSpeed() - 300); + vDecay = xTaskGetTickCount(); + } else if ((xTaskGetTickCount() - vDecay) > pdMS_TO_TICKS(1500)) { + lv_arc_set_value(animArc, lv_arc_get_value(animArc) - 25); + } +} + +void SettingShakeThreshold::UpdateSelected(lv_obj_t* object, lv_event_t event) { + + switch (event) { + case LV_EVENT_VALUE_CHANGED: { + if (object == calButton) { + if (lv_btn_get_state(calButton) == LV_BTN_STATE_CHECKED_RELEASED && calibrating == 0) { + lv_arc_set_value(positionArc, 0); + calibrating = 1; + vCalTime = xTaskGetTickCount(); + lv_label_set_text(calLabel, "Ready!"); + lv_obj_set_click(positionArc, false); + lv_obj_set_style_local_bg_color(calButton, LV_BTN_PART_MAIN, LV_STATE_CHECKED, LV_COLOR_GREEN); + lv_obj_set_style_local_bg_color(calButton, LV_BTN_PART_MAIN, LV_STATE_CHECKED, LV_COLOR_GREEN); + } else if (lv_btn_get_state(calButton) == LV_BTN_STATE_RELEASED) { + calibrating = 0; + lv_obj_set_click(positionArc, true); + lv_label_set_text(calLabel, "Calibrate"); + } + break; + } + } + } +} diff --git a/src/displayapp/screens/settings/SettingShakeThreshold.h b/src/displayapp/screens/settings/SettingShakeThreshold.h new file mode 100644 index 00000000..b9ddd8b4 --- /dev/null +++ b/src/displayapp/screens/settings/SettingShakeThreshold.h @@ -0,0 +1,36 @@ +#pragma once + +#include <cstdint> +#include <lvgl/lvgl.h> +#include "components/settings/Settings.h" +#include "displayapp/screens/Screen.h" +#include <components/motion/MotionController.h> +namespace Pinetime { + + namespace Applications { + namespace Screens { + + class SettingShakeThreshold : public Screen { + public: + 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; + Controllers::MotionController& motionController; + System::SystemTask& systemTask; + uint8_t calibrating; + bool EnableForCal; + uint32_t vDecay,vCalTime; + lv_obj_t *positionArc, *animArc,*calButton, *calLabel; + lv_task_t* refreshTask; + }; + } + } +} diff --git a/src/displayapp/screens/settings/SettingWakeUp.cpp b/src/displayapp/screens/settings/SettingWakeUp.cpp index 8339d9ad..e1b6e36e 100644 --- a/src/displayapp/screens/settings/SettingWakeUp.cpp +++ b/src/displayapp/screens/settings/SettingWakeUp.cpp @@ -65,6 +65,14 @@ SettingWakeUp::SettingWakeUp(Pinetime::Applications::DisplayApp* app, Pinetime:: lv_checkbox_set_checked(cbOption[optionsTotal], true); } optionsTotal++; + cbOption[optionsTotal] = lv_checkbox_create(container1, nullptr); + lv_checkbox_set_text_static(cbOption[optionsTotal], " Shake Wake"); + cbOption[optionsTotal]->user_data = this; + lv_obj_set_event_cb(cbOption[optionsTotal], event_handler); + if (settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::Shake)) { + lv_checkbox_set_checked(cbOption[optionsTotal], true); + } + optionsTotal++; } SettingWakeUp::~SettingWakeUp() { diff --git a/src/displayapp/screens/settings/SettingWakeUp.h b/src/displayapp/screens/settings/SettingWakeUp.h index b9a31dc9..cd244ae5 100644 --- a/src/displayapp/screens/settings/SettingWakeUp.h +++ b/src/displayapp/screens/settings/SettingWakeUp.h @@ -20,7 +20,7 @@ namespace Pinetime { private: Controllers::Settings& settingsController; uint8_t optionsTotal; - lv_obj_t* cbOption[4]; + lv_obj_t* cbOption[5]; // When UpdateSelected is called, it uses lv_checkbox_set_checked, // which can cause extra events to be fired, // which might trigger UpdateSelected again, causing a loop. diff --git a/src/displayapp/screens/settings/Settings.cpp b/src/displayapp/screens/settings/Settings.cpp index 3bc1372c..a87340e2 100644 --- a/src/displayapp/screens/settings/Settings.cpp +++ b/src/displayapp/screens/settings/Settings.cpp @@ -47,12 +47,10 @@ std::unique_ptr<Screen> Settings::CreateScreen1() { std::unique_ptr<Screen> Settings::CreateScreen2() { - std::array<Screens::List::Applications, 4> applications {{ - {Symbols::shoe, "Steps", Apps::SettingSteps}, - {Symbols::clock, "Set date", Apps::SettingSetDate}, - {Symbols::clock, "Set time", Apps::SettingSetTime}, - {Symbols::batteryHalf, "Battery", Apps::BatteryInfo} - }}; + std::array<Screens::List::Applications, 4> applications {{{Symbols::shoe, "Steps", Apps::SettingSteps}, + {Symbols::clock, "Set date", Apps::SettingSetDate}, + {Symbols::clock, "Set time", Apps::SettingSetTime}, + {Symbols::batteryHalf, "Battery", Apps::BatteryInfo}}}; return std::make_unique<Screens::List>(1, 3, app, settingsController, applications); } @@ -60,11 +58,10 @@ std::unique_ptr<Screen> Settings::CreateScreen2() { std::unique_ptr<Screen> Settings::CreateScreen3() { std::array<Screens::List::Applications, 4> applications {{ - {Symbols::clock, "Chimes", Apps::SettingChimes}, + {Symbols::none, "Wake Sense", Apps::SettingShakeThreshold}, {Symbols::check, "Firmware", Apps::FirmwareValidation}, - {Symbols::list, "About", Apps::SysInfo}, - {Symbols::none, "None", Apps::None} + {Symbols::list, "About", Apps::SysInfo} }}; return std::make_unique<Screens::List>(2, 3, app, settingsController, applications); |