summaryrefslogtreecommitdiff
path: root/src/displayapp/screens
diff options
context:
space:
mode:
authorJames A. Jerkins <evergreen@jamesjerkinscomputer.com>2021-12-24 02:30:14 (GMT)
committerJames A. Jerkins <evergreen@jamesjerkinscomputer.com>2021-12-24 02:30:14 (GMT)
commit319030d9e16e833cf8bff569a9ecfa452165ea27 (patch)
treeae2890204710ac41fd7f637ac1c367c09f671009 /src/displayapp/screens
parent3b0b48020d96353fc6cd114aa80fc2fec98363a3 (diff)
Add airplane mode feature
Implements 'Airplane mode' feature to disable and enable bluetooth/ble Adds airplaneMode as a non-persisted setting Adds a setting menu for switching airplane mode on and off Displays an airplane symbol on the Digital watch face and the PineTimeStyle watch face when airplane mode is enabled Always enables bluetooth/ble on boot (disable airplane mode) Alphabetizes the settings menu options Style cleanups Closes #632
Diffstat (limited to 'src/displayapp/screens')
-rw-r--r--src/displayapp/screens/BleIcon.cpp10
-rw-r--r--src/displayapp/screens/BleIcon.h6
-rw-r--r--src/displayapp/screens/PineTimeStyle.cpp6
-rw-r--r--src/displayapp/screens/PineTimeStyle.h7
-rw-r--r--src/displayapp/screens/Symbols.h1
-rw-r--r--src/displayapp/screens/WatchFaceDigital.cpp2
-rw-r--r--src/displayapp/screens/WatchFaceDigital.h7
-rw-r--r--src/displayapp/screens/settings/SettingAirplaneMode.cpp89
-rw-r--r--src/displayapp/screens/settings/SettingAirplaneMode.h30
-rw-r--r--src/displayapp/screens/settings/Settings.cpp22
10 files changed, 153 insertions, 27 deletions
diff --git a/src/displayapp/screens/BleIcon.cpp b/src/displayapp/screens/BleIcon.cpp
index 5058f3e..a30d23b 100644
--- a/src/displayapp/screens/BleIcon.cpp
+++ b/src/displayapp/screens/BleIcon.cpp
@@ -2,9 +2,11 @@
#include "displayapp/screens/Symbols.h"
using namespace Pinetime::Applications::Screens;
-const char* BleIcon::GetIcon(bool isConnected) {
- if (isConnected)
+const char* BleIcon::GetIcon(Pinetime::Controllers::Ble::ConnectStates state) {
+ if (state == Pinetime::Controllers::Ble::ConnectStates::Connected)
return Symbols::bluetooth;
+ else if (state == Pinetime::Controllers::Ble::ConnectStates::Airplane)
+ return Symbols::airplane;
else
- return "";
-} \ No newline at end of file
+ return Symbols::none;
+}
diff --git a/src/displayapp/screens/BleIcon.h b/src/displayapp/screens/BleIcon.h
index c1398d2..d7410ea 100644
--- a/src/displayapp/screens/BleIcon.h
+++ b/src/displayapp/screens/BleIcon.h
@@ -1,12 +1,14 @@
#pragma once
+#include "components/ble/BleController.h"
+
namespace Pinetime {
namespace Applications {
namespace Screens {
class BleIcon {
public:
- static const char* GetIcon(bool isConnected);
+ static const char* GetIcon(Pinetime::Controllers::Ble::ConnectStates state);
};
}
}
-} \ No newline at end of file
+}
diff --git a/src/displayapp/screens/PineTimeStyle.cpp b/src/displayapp/screens/PineTimeStyle.cpp
index d436869..e7b1f39 100644
--- a/src/displayapp/screens/PineTimeStyle.cpp
+++ b/src/displayapp/screens/PineTimeStyle.cpp
@@ -208,10 +208,10 @@ void PineTimeStyle::SetBatteryIcon() {
}
void PineTimeStyle::AlignIcons() {
- if (notificationState.Get() && bleState.Get()) {
+ if (notificationState.Get() && bleState.Get() != Pinetime::Controllers::Ble::ConnectStates::Disconnected) {
lv_obj_align(bleIcon, sidebar, LV_ALIGN_IN_TOP_MID, 8, 25);
lv_obj_align(notificationIcon, sidebar, LV_ALIGN_IN_TOP_MID, -8, 25);
- } else if (notificationState.Get() && !bleState.Get()) {
+ } else if (notificationState.Get() && bleState.Get() == Pinetime::Controllers::Ble::ConnectStates::Disconnected) {
lv_obj_align(notificationIcon, sidebar, LV_ALIGN_IN_TOP_MID, 0, 25);
} else {
lv_obj_align(bleIcon, sidebar, LV_ALIGN_IN_TOP_MID, 0, 25);
@@ -234,7 +234,7 @@ void PineTimeStyle::Refresh() {
}
}
- bleState = bleController.IsConnected();
+ bleState = bleController.GetConnectState();
if (bleState.IsUpdated()) {
lv_label_set_text(bleIcon, BleIcon::GetIcon(bleState.Get()));
AlignIcons();
diff --git a/src/displayapp/screens/PineTimeStyle.h b/src/displayapp/screens/PineTimeStyle.h
index 8382c53..c5136fc 100644
--- a/src/displayapp/screens/PineTimeStyle.h
+++ b/src/displayapp/screens/PineTimeStyle.h
@@ -6,6 +6,7 @@
#include <memory>
#include "displayapp/screens/Screen.h"
#include "components/datetime/DateTimeController.h"
+#include "components/ble/BleController.h"
namespace Pinetime {
namespace Controllers {
@@ -36,13 +37,13 @@ namespace Pinetime {
char displayedChar[5];
uint16_t currentYear = 1970;
- Pinetime::Controllers::DateTime::Months currentMonth = Pinetime::Controllers::DateTime::Months::Unknown;
- Pinetime::Controllers::DateTime::Days currentDayOfWeek = Pinetime::Controllers::DateTime::Days::Unknown;
+ Controllers::DateTime::Months currentMonth = Pinetime::Controllers::DateTime::Months::Unknown;
+ Controllers::DateTime::Days currentDayOfWeek = Pinetime::Controllers::DateTime::Days::Unknown;
uint8_t currentDay = 0;
DirtyValue<uint8_t> batteryPercentRemaining {};
DirtyValue<bool> isCharging {};
- DirtyValue<bool> bleState {};
+ DirtyValue<Controllers::Ble::ConnectStates> bleState {};
DirtyValue<std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds>> currentDateTime {};
DirtyValue<bool> motionSensorOk {};
DirtyValue<uint32_t> stepCount {};
diff --git a/src/displayapp/screens/Symbols.h b/src/displayapp/screens/Symbols.h
index e68a7af..5ba8f95 100644
--- a/src/displayapp/screens/Symbols.h
+++ b/src/displayapp/screens/Symbols.h
@@ -44,6 +44,7 @@ namespace Pinetime {
static constexpr const char* chartLine = "\xEF\x88\x81";
static constexpr const char* eye = "\xEF\x81\xAE";
static constexpr const char* home = "\xEF\x80\x95";
+ static constexpr const char* airplane = "\xEF\x81\xB2";
// lv_font_sys_48.c
static constexpr const char* settings = "\xEE\xA4\x82"; // e902
diff --git a/src/displayapp/screens/WatchFaceDigital.cpp b/src/displayapp/screens/WatchFaceDigital.cpp
index 8769579..8f06553 100644
--- a/src/displayapp/screens/WatchFaceDigital.cpp
+++ b/src/displayapp/screens/WatchFaceDigital.cpp
@@ -119,7 +119,7 @@ void WatchFaceDigital::Refresh() {
lv_label_set_text(batteryIcon, BatteryIcon::GetBatteryIcon(batteryPercent));
}
- bleState = bleController.IsConnected();
+ bleState = bleController.GetConnectState();
if (bleState.IsUpdated()) {
lv_label_set_text(bleIcon, BleIcon::GetIcon(bleState.Get()));
}
diff --git a/src/displayapp/screens/WatchFaceDigital.h b/src/displayapp/screens/WatchFaceDigital.h
index 627154c..addb539 100644
--- a/src/displayapp/screens/WatchFaceDigital.h
+++ b/src/displayapp/screens/WatchFaceDigital.h
@@ -6,6 +6,7 @@
#include <memory>
#include "displayapp/screens/Screen.h"
#include "components/datetime/DateTimeController.h"
+#include "components/ble/BleController.h"
namespace Pinetime {
namespace Controllers {
@@ -38,13 +39,13 @@ namespace Pinetime {
char displayedChar[5] {};
uint16_t currentYear = 1970;
- Pinetime::Controllers::DateTime::Months currentMonth = Pinetime::Controllers::DateTime::Months::Unknown;
- Pinetime::Controllers::DateTime::Days currentDayOfWeek = Pinetime::Controllers::DateTime::Days::Unknown;
+ Controllers::DateTime::Months currentMonth = Pinetime::Controllers::DateTime::Months::Unknown;
+ Controllers::DateTime::Days currentDayOfWeek = Pinetime::Controllers::DateTime::Days::Unknown;
uint8_t currentDay = 0;
DirtyValue<uint8_t> batteryPercentRemaining {};
DirtyValue<bool> powerPresent {};
- DirtyValue<bool> bleState {};
+ DirtyValue<Controllers::Ble::ConnectStates> bleState {};
DirtyValue<std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds>> currentDateTime {};
DirtyValue<bool> motionSensorOk {};
DirtyValue<uint32_t> stepCount {};
diff --git a/src/displayapp/screens/settings/SettingAirplaneMode.cpp b/src/displayapp/screens/settings/SettingAirplaneMode.cpp
new file mode 100644
index 0000000..0a364de
--- /dev/null
+++ b/src/displayapp/screens/settings/SettingAirplaneMode.cpp
@@ -0,0 +1,89 @@
+#include "displayapp/screens/settings/SettingAirplaneMode.h"
+#include <lvgl/lvgl.h>
+#include "displayapp/DisplayApp.h"
+#include "displayapp/Messages.h"
+#include "displayapp/screens/Styles.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) {
+ SettingAirplaneMode* screen = static_cast<SettingAirplaneMode*>(obj->user_data);
+ screen->UpdateSelected(obj, event);
+ }
+}
+
+constexpr std::array<const char*, 2> SettingAirplaneMode::options;
+
+SettingAirplaneMode::SettingAirplaneMode(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_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, "Airplane mode");
+ lv_label_set_align(title, LV_LABEL_ALIGN_CENTER);
+ lv_obj_align(title, lv_scr_act(), LV_ALIGN_IN_TOP_MID, 15, 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::airplane);
+ lv_label_set_align(icon, LV_LABEL_ALIGN_CENTER);
+ lv_obj_align(icon, title, LV_ALIGN_OUT_LEFT_MID, -10, 0);
+
+ for (unsigned int i = 0; i < options.size(); i++) {
+ cbOption[i] = lv_checkbox_create(container1, nullptr);
+ lv_checkbox_set_text(cbOption[i], options[i]);
+ cbOption[i]->user_data = this;
+ lv_obj_set_event_cb(cbOption[i], event_handler);
+ SetRadioButtonStyle(cbOption[i]);
+ }
+
+ if (settingsController.GetAirplaneMode() == false) {
+ lv_checkbox_set_checked(cbOption[0], true);
+ priorMode = false;
+ } else {
+ lv_checkbox_set_checked(cbOption[1], true);
+ priorMode = true;
+ }
+}
+
+SettingAirplaneMode::~SettingAirplaneMode() {
+ lv_obj_clean(lv_scr_act());
+ // Do not call SaveSettings - see src/components/settings/Settings.h
+ if (priorMode != settingsController.GetAirplaneMode()) {
+ app->PushMessage(Pinetime::Applications::Display::Messages::AirplaneModeToggle);
+ }
+}
+
+void SettingAirplaneMode::UpdateSelected(lv_obj_t* object, lv_event_t event) {
+ if (event == LV_EVENT_VALUE_CHANGED) {
+ for (unsigned int i = 0; i < options.size(); i++) {
+ if (object == cbOption[i]) {
+ lv_checkbox_set_checked(cbOption[i], true);
+
+ if (i == 0) {
+ settingsController.SetAirplaneMode(false);
+ };
+ if (i == 1) {
+ settingsController.SetAirplaneMode(true);
+ };
+
+ } else {
+ lv_checkbox_set_checked(cbOption[i], false);
+ }
+ }
+ }
+}
diff --git a/src/displayapp/screens/settings/SettingAirplaneMode.h b/src/displayapp/screens/settings/SettingAirplaneMode.h
new file mode 100644
index 0000000..fcc0222
--- /dev/null
+++ b/src/displayapp/screens/settings/SettingAirplaneMode.h
@@ -0,0 +1,30 @@
+#pragma once
+
+#include <array>
+#include <cstdint>
+#include <lvgl/lvgl.h>
+
+#include "components/settings/Settings.h"
+#include "displayapp/screens/Screen.h"
+
+namespace Pinetime {
+
+ namespace Applications {
+ namespace Screens {
+
+ class SettingAirplaneMode : public Screen {
+ public:
+ SettingAirplaneMode(DisplayApp* app, Pinetime::Controllers::Settings& settingsController);
+ ~SettingAirplaneMode() override;
+
+ void UpdateSelected(lv_obj_t* object, lv_event_t event);
+
+ private:
+ static constexpr std::array<const char*, 2> options = {" No", " Yes"};
+ Controllers::Settings& settingsController;
+ lv_obj_t* cbOption[options.size()];
+ bool priorMode;
+ };
+ }
+ }
+}
diff --git a/src/displayapp/screens/settings/Settings.cpp b/src/displayapp/screens/settings/Settings.cpp
index 392c12e..6be00f5 100644
--- a/src/displayapp/screens/settings/Settings.cpp
+++ b/src/displayapp/screens/settings/Settings.cpp
@@ -36,10 +36,10 @@ bool Settings::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
std::unique_ptr<Screen> Settings::CreateScreen1() {
std::array<Screens::List::Applications, 4> applications {{
- {Symbols::sun, "Display", Apps::SettingDisplay},
- {Symbols::eye, "Wake Up", Apps::SettingWakeUp},
- {Symbols::clock, "Time format", Apps::SettingTimeFormat},
- {Symbols::home, "Watch face", Apps::SettingWatchFace},
+ {Symbols::list, "About", Apps::SysInfo},
+ {Symbols::airplane, "Airplane mode", Apps::SettingAirplaneMode},
+ {Symbols::batteryHalf, "Battery", Apps::BatteryInfo},
+ {Symbols::sun, "Display", Apps::SettingDisplay}
}};
return std::make_unique<Screens::List>(0, 3, app, settingsController, applications);
@@ -48,10 +48,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::check, "Firmware", Apps::FirmwareValidation},
+ {Symbols::paintbrush, "PTS colors", Apps::SettingPineTimeStyle},
{Symbols::clock, "Set date", Apps::SettingSetDate},
- {Symbols::clock, "Set time", Apps::SettingSetTime},
- {Symbols::batteryHalf, "Battery", Apps::BatteryInfo}
+ {Symbols::clock, "Set time", Apps::SettingSetTime}
}};
return std::make_unique<Screens::List>(1, 3, app, settingsController, applications);
@@ -60,10 +60,10 @@ std::unique_ptr<Screen> Settings::CreateScreen2() {
std::unique_ptr<Screen> Settings::CreateScreen3() {
std::array<Screens::List::Applications, 4> applications {{
- {Symbols::paintbrush, "PTS Colors", Apps::SettingPineTimeStyle},
- {Symbols::check, "Firmware", Apps::FirmwareValidation},
- {Symbols::list, "About", Apps::SysInfo},
- {Symbols::none, "None", Apps::None},
+ {Symbols::shoe, "Steps", Apps::SettingSteps},
+ {Symbols::clock, "Time format", Apps::SettingTimeFormat},
+ {Symbols::eye, "Wake up", Apps::SettingWakeUp},
+ {Symbols::home, "Watch face", Apps::SettingWatchFace}
}};
return std::make_unique<Screens::List>(2, 3, app, settingsController, applications);