diff --git a/src/components/motion/MotionController.cpp b/src/components/motion/MotionController.cpp index cae4910518..76c2a7a1d1 100644 --- a/src/components/motion/MotionController.cpp +++ b/src/components/motion/MotionController.cpp @@ -39,6 +39,18 @@ bool MotionController::ShouldWakeUp(bool isSleeping) { } return false; } +bool MotionController::ShouldSleep() { + bool ret = false; + + if (y >= lastYForSleep + 192) { + ret = true; + } + + lastYForSleep = (y > 320) ? y : 320; + + return ret; +} + void MotionController::IsSensorOk(bool isOk) { isSensorOk = isOk; } diff --git a/src/components/motion/MotionController.h b/src/components/motion/MotionController.h index c72d8a4a0f..703d322dbc 100644 --- a/src/components/motion/MotionController.h +++ b/src/components/motion/MotionController.h @@ -29,6 +29,7 @@ namespace Pinetime { return nbSteps; } bool ShouldWakeUp(bool isSleeping); + bool ShouldSleep(); void IsSensorOk(bool isOk); bool IsSensorOk() const { @@ -48,9 +49,10 @@ namespace Pinetime { int16_t y; int16_t z; int16_t lastYForWakeUp = 0; + int16_t lastYForSleep = 0; bool isSensorOk = false; DeviceTypes deviceType = DeviceTypes::Unknown; Pinetime::Controllers::MotionService* service = nullptr; }; } -} \ No newline at end of file +} diff --git a/src/components/settings/Settings.h b/src/components/settings/Settings.h index 2d7973d8f0..43f0919ea6 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, + LowerWrist = 3 }; enum class Colors : uint8_t { White, Silver, Gray, Black, Red, Maroon, Yellow, Olive, Lime, Green, Cyan, Teal, Blue, Navy, Magenta, Purple, Orange @@ -126,13 +127,13 @@ namespace Pinetime { case WakeUpMode::DoubleTap: settings.wakeUpMode.set(static_cast(WakeUpMode::SingleTap), false); break; - case WakeUpMode::RaiseWrist: + default: break; } } }; - std::bitset<3> getWakeUpModes() const { + std::bitset<4> getWakeUpModes() const { return settings.wakeUpMode; } @@ -175,7 +176,7 @@ namespace Pinetime { PineTimeStyle PTS; - std::bitset<3> wakeUpMode {0}; + std::bitset<4> wakeUpMode {0}; Controllers::BrightnessController::Levels brightLevel = Controllers::BrightnessController::Levels::Medium; }; diff --git a/src/displayapp/screens/settings/SettingWakeUp.cpp b/src/displayapp/screens/settings/SettingWakeUp.cpp index 8339d9adc3..c75773c4ea 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], " Lower Wrist"); + cbOption[optionsTotal]->user_data = this; + lv_obj_set_event_cb(cbOption[optionsTotal], event_handler); + if (settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::LowerWrist)) { + lv_checkbox_set_checked(cbOption[optionsTotal], true); + } + optionsTotal++; } SettingWakeUp::~SettingWakeUp() { diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp index a95d479dec..ff44c8c19d 100644 --- a/src/systemtask/SystemTask.cpp +++ b/src/systemtask/SystemTask.cpp @@ -473,6 +473,10 @@ void SystemTask::UpdateMotion() { if (motionController.ShouldWakeUp(isSleeping)) { GoToRunning(); } + if (settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::LowerWrist)) { + if (motionController.ShouldSleep() && !isSleeping) + PushMessage(Messages::GoToSleep); + } } void SystemTask::HandleButtonAction(Controllers::ButtonActions action) {