InfiniTime.git

commit 0f9f606b78ffbb93b1365156d8492bbf4ee4995d

Author: FintasticMan <finlay.neon.kid@gmail.com>

lowersleep: Implement Lower to Sleep functionality (#827)

 src/components/motion/MotionController.cpp | 14 ++++++++++++++
 src/components/motion/MotionController.h | 1 +
 src/components/settings/Settings.h | 14 +++++---------
 src/displayapp/screens/settings/SettingWakeUp.cpp | 6 +++---
 src/displayapp/screens/settings/SettingWakeUp.h | 3 ++-
 src/systemtask/SystemTask.cpp | 4 ++++


diff --git a/src/components/motion/MotionController.cpp b/src/components/motion/MotionController.cpp
index feb9ead015120885f45074beab1caee6fefcaafa..d28378d5422f89b2e75e8933a4bd12817bbe4891 100644
--- a/src/components/motion/MotionController.cpp
+++ b/src/components/motion/MotionController.cpp
@@ -115,6 +115,20 @@
   return accumulatedSpeed > thresh;
 }
 
+bool MotionController::ShouldLowerSleep() const {
+  if (stats.yMean < 724 || DegreesRolled(stats.yMean, stats.zMean, stats.prevYMean, stats.prevZMean) < 30) {
+    return false;
+  }
+
+  for (uint8_t i = AccelStats::numHistory + 1; i < yHistory.Size(); i++) {
+    if (yHistory[i] < 265) {
+      return false;
+    }
+  }
+
+  return true;
+}
+
 void MotionController::Init(Pinetime::Drivers::Bma421::DeviceTypes types) {
   switch (types) {
     case Drivers::Bma421::DeviceTypes::BMA421:




diff --git a/src/components/motion/MotionController.h b/src/components/motion/MotionController.h
index 1ad032b83f99129796927c5b4a942a11f16061ec..0aa7823e05e6d2b6702385b42a60d5eff0013e4d 100644
--- a/src/components/motion/MotionController.h
+++ b/src/components/motion/MotionController.h
@@ -46,6 +46,7 @@       }
 
       bool ShouldShakeWake(uint16_t thresh);
       bool ShouldRaiseWake() const;
+      bool ShouldLowerSleep() const;
 
       int32_t CurrentShakeSpeed() const {
         return accumulatedSpeed;




diff --git a/src/components/settings/Settings.h b/src/components/settings/Settings.h
index efa44fdee46e33315d590cfcf6813d75e2c4ea99..81cf4923323666341e8a9813e69a0998eec7d069 100644
--- a/src/components/settings/Settings.h
+++ b/src/components/settings/Settings.h
@@ -12,12 +12,7 @@     public:
       enum class ClockType : uint8_t { H24, H12 };
       enum class Notification : uint8_t { On, Off, Sleep };
       enum class ChimesOption : uint8_t { None, Hours, HalfHours };
-      enum class WakeUpMode : uint8_t {
-        SingleTap = 0,
-        DoubleTap = 1,
-        RaiseWrist = 2,
-        Shake = 3,
-      };
+      enum class WakeUpMode : uint8_t { SingleTap = 0, DoubleTap = 1, RaiseWrist = 2, Shake = 3, LowerWrist = 4 };
       enum class Colors : uint8_t {
         White,
         Silver,
@@ -238,7 +233,7 @@           }
         }
       };
 
-      std::bitset<4> getWakeUpModes() const {
+      std::bitset<5> getWakeUpModes() const {
         return settings.wakeUpMode;
       }
 
@@ -279,7 +274,7 @@
     private:
       Pinetime::Controllers::FS& fs;
 
-      static constexpr uint32_t settingsVersion = 0x0005;
+      static constexpr uint32_t settingsVersion = 0x0006;
 
       struct SettingsData {
         uint32_t version = settingsVersion;
@@ -296,8 +291,9 @@         PineTimeStyle PTS;
 
         WatchFaceInfineat watchFaceInfineat;
 
-        std::bitset<4> wakeUpMode {0};
+        std::bitset<5> wakeUpMode {0};
         uint16_t shakeWakeThreshold = 150;
+
         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 8df34c208452054bebc8141e04bf180220dbb88f..4649dc82e2cc8f54869d06e48330c67873d87599 100644
--- a/src/displayapp/screens/settings/SettingWakeUp.cpp
+++ b/src/displayapp/screens/settings/SettingWakeUp.cpp
@@ -8,7 +8,7 @@ #include "displayapp/screens/Styles.h"
 
 using namespace Pinetime::Applications::Screens;
 
-constexpr std::array<SettingWakeUp::Option, 4> SettingWakeUp::options;
+constexpr std::array<SettingWakeUp::Option, 5> SettingWakeUp::options;
 
 namespace {
   void event_handler(lv_obj_t* obj, lv_event_t event) {
@@ -27,9 +27,9 @@   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_pos(container1, 10, 35);
   lv_obj_set_width(container1, LV_HOR_RES - 20);
-  lv_obj_set_height(container1, LV_VER_RES - 50);
+  lv_obj_set_height(container1, LV_VER_RES - 20);
   lv_cont_set_layout(container1, LV_LAYOUT_COLUMN_LEFT);
 
   lv_obj_t* title = lv_label_create(lv_scr_act(), nullptr);




diff --git a/src/displayapp/screens/settings/SettingWakeUp.h b/src/displayapp/screens/settings/SettingWakeUp.h
index 28219ca1c407fd5300300e92cb36f6e9a0f854e3..61edabce34fc64e2705b7e00eb793a739121f013 100644
--- a/src/displayapp/screens/settings/SettingWakeUp.h
+++ b/src/displayapp/screens/settings/SettingWakeUp.h
@@ -25,11 +25,12 @@           const char* name;
         };
 
         Controllers::Settings& settingsController;
-        static constexpr std::array<Option, 4> options = {{
+        static constexpr std::array<Option, 5> options = {{
           {Controllers::Settings::WakeUpMode::SingleTap, "Single Tap"},
           {Controllers::Settings::WakeUpMode::DoubleTap, "Double Tap"},
           {Controllers::Settings::WakeUpMode::RaiseWrist, "Raise Wrist"},
           {Controllers::Settings::WakeUpMode::Shake, "Shake Wake"},
+          {Controllers::Settings::WakeUpMode::LowerWrist, "Lower Wrist"},
         }};
 
         lv_obj_t* cbOption[options.size()];




diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp
index 4719bb50aeac0402c6ea40cec95cdfc2b58305f6..e59a0ff7a4f24c580a75c19b99ef0e6a021e43d1 100644
--- a/src/systemtask/SystemTask.cpp
+++ b/src/systemtask/SystemTask.cpp
@@ -436,6 +436,10 @@          motionController.ShouldShakeWake(settingsController.GetShakeThreshold()))) {
       GoToRunning();
     }
   }
+  if (settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::LowerWrist) && state == SystemTaskState::Running &&
+      motionController.ShouldLowerSleep()) {
+    PushMessage(Messages::GoToSleep);
+  }
 }
 
 void SystemTask::HandleButtonAction(Controllers::ButtonActions action) {