summaryrefslogtreecommitdiff
path: root/src/displayapp/screens
diff options
context:
space:
mode:
Diffstat (limited to 'src/displayapp/screens')
-rw-r--r--src/displayapp/screens/SystemInfo.cpp2
-rw-r--r--src/displayapp/screens/Weather.cpp222
-rw-r--r--src/displayapp/screens/Weather.h45
-rw-r--r--src/displayapp/screens/settings/SettingSteps.cpp15
4 files changed, 275 insertions, 9 deletions
diff --git a/src/displayapp/screens/SystemInfo.cpp b/src/displayapp/screens/SystemInfo.cpp
index c363e2dd..07626260 100644
--- a/src/displayapp/screens/SystemInfo.cpp
+++ b/src/displayapp/screens/SystemInfo.cpp
@@ -274,4 +274,4 @@ std::unique_ptr<Screen> SystemInfo::CreateScreen5() {
lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
lv_obj_align(label, lv_scr_act(), LV_ALIGN_CENTER, 0, 0);
return std::make_unique<Screens::Label>(4, 5, app, label);
-}
+} \ No newline at end of file
diff --git a/src/displayapp/screens/Weather.cpp b/src/displayapp/screens/Weather.cpp
new file mode 100644
index 00000000..1d0a83bd
--- /dev/null
+++ b/src/displayapp/screens/Weather.cpp
@@ -0,0 +1,222 @@
+/* Copyright (C) 2021 Avamander
+
+ This file is part of InfiniTime.
+
+ InfiniTime is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ InfiniTime is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
+*/
+#include "Weather.h"
+#include <lvgl/lvgl.h>
+#include <components/ble/weather/WeatherService.h>
+#include "Label.h"
+#include "components/battery/BatteryController.h"
+#include "components/ble/BleController.h"
+#include "components/ble/weather/WeatherData.h"
+
+using namespace Pinetime::Applications::Screens;
+
+Weather::Weather(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::WeatherService& weather)
+ : Screen(app),
+ dateTimeController {dateTimeController},
+ weatherService(weather),
+ screens {app,
+ 0,
+ {[this]() -> std::unique_ptr<Screen> {
+ return CreateScreenTemperature();
+ },
+ [this]() -> std::unique_ptr<Screen> {
+ return CreateScreenAir();
+ },
+ [this]() -> std::unique_ptr<Screen> {
+ return CreateScreenClouds();
+ },
+ [this]() -> std::unique_ptr<Screen> {
+ return CreateScreenPrecipitation();
+ },
+ [this]() -> std::unique_ptr<Screen> {
+ return CreateScreenHumidity();
+ }},
+ Screens::ScreenListModes::UpDown} {
+}
+
+Weather::~Weather() {
+ lv_obj_clean(lv_scr_act());
+}
+
+void Weather::Refresh() {
+ if (running) {
+ // screens.Refresh();
+ }
+}
+
+bool Weather::OnButtonPushed() {
+ running = false;
+ return true;
+}
+
+bool Weather::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
+ return screens.OnTouchEvent(event);
+}
+
+std::unique_ptr<Screen> Weather::CreateScreenTemperature() {
+ lv_obj_t* label = lv_label_create(lv_scr_act(), nullptr);
+ lv_label_set_recolor(label, true);
+ std::unique_ptr<Controllers::WeatherData::Temperature>& current = weatherService.GetCurrentTemperature();
+ if (current->timestamp == 0) {
+ // Do not use the data, it's invalid
+ lv_label_set_text_fmt(label,
+ "#FFFF00 Temperature#\n\n"
+ "#444444 %d#°C \n\n"
+ "#444444 %d#\n\n"
+ "%d\n"
+ "%d\n",
+ 0,
+ 0,
+ 0,
+ 0);
+ } else {
+ lv_label_set_text_fmt(label,
+ "#FFFF00 Temperature#\n\n"
+ "#444444 %d#°C \n\n"
+ "#444444 %hd#\n\n"
+ "%llu\n"
+ "%lu\n",
+ current->temperature / 100,
+ current->dewPoint,
+ current->timestamp,
+ current->expires);
+ }
+ lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+ lv_obj_align(label, lv_scr_act(), LV_ALIGN_CENTER, 0, 0);
+ return std::unique_ptr<Screen>(new Screens::Label(0, 5, app, label));
+}
+
+std::unique_ptr<Screen> Weather::CreateScreenAir() {
+ lv_obj_t* label = lv_label_create(lv_scr_act(), nullptr);
+ lv_label_set_recolor(label, true);
+ std::unique_ptr<Controllers::WeatherData::AirQuality>& current = weatherService.GetCurrentQuality();
+ if (current->timestamp == 0) {
+ // Do not use the data, it's invalid
+ lv_label_set_text_fmt(label,
+ "#FFFF00 Air quality#\n\n"
+ "#444444 %s#\n"
+ "#444444 %d#\n\n"
+ "%d\n"
+ "%d\n",
+ "",
+ 0,
+ 0,
+ 0);
+ } else {
+ lv_label_set_text_fmt(label,
+ "#FFFF00 Air quality#\n\n"
+ "#444444 %s#\n"
+ "#444444 %lu#\n\n"
+ "%llu\n"
+ "%lu\n",
+ current->polluter.c_str(),
+ (current->amount / 100),
+ current->timestamp,
+ current->expires);
+ }
+ lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+ lv_obj_align(label, lv_scr_act(), LV_ALIGN_CENTER, 0, 0);
+ return std::unique_ptr<Screen>(new Screens::Label(0, 5, app, label));
+}
+
+std::unique_ptr<Screen> Weather::CreateScreenClouds() {
+ lv_obj_t* label = lv_label_create(lv_scr_act(), nullptr);
+ lv_label_set_recolor(label, true);
+ std::unique_ptr<Controllers::WeatherData::Clouds>& current = weatherService.GetCurrentClouds();
+ if (current->timestamp == 0) {
+ // Do not use the data, it's invalid
+ lv_label_set_text_fmt(label,
+ "#FFFF00 Clouds#\n\n"
+ "#444444 %d%%#\n\n"
+ "%d\n"
+ "%d\n",
+ 0,
+ 0,
+ 0);
+ } else {
+ lv_label_set_text_fmt(label,
+ "#FFFF00 Clouds#\n\n"
+ "#444444 %hhu%%#\n\n"
+ "%llu\n"
+ "%lu\n",
+ current->amount,
+ current->timestamp,
+ current->expires);
+ }
+ lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+ lv_obj_align(label, lv_scr_act(), LV_ALIGN_CENTER, 0, 0);
+ return std::unique_ptr<Screen>(new Screens::Label(0, 5, app, label));
+}
+
+std::unique_ptr<Screen> Weather::CreateScreenPrecipitation() {
+ lv_obj_t* label = lv_label_create(lv_scr_act(), nullptr);
+ lv_label_set_recolor(label, true);
+ std::unique_ptr<Controllers::WeatherData::Precipitation>& current = weatherService.GetCurrentPrecipitation();
+ if (current->timestamp == 0) {
+ // Do not use the data, it's invalid
+ lv_label_set_text_fmt(label,
+ "#FFFF00 Precipitation#\n\n"
+ "#444444 %d%%#\n\n"
+ "%d\n"
+ "%d\n",
+ 0,
+ 0,
+ 0);
+ } else {
+ lv_label_set_text_fmt(label,
+ "#FFFF00 Precipitation#\n\n"
+ "#444444 %hhu%%#\n\n"
+ "%llu\n"
+ "%lu\n",
+ current->amount,
+ current->timestamp,
+ current->expires);
+ }
+ lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+ lv_obj_align(label, lv_scr_act(), LV_ALIGN_CENTER, 0, 0);
+ return std::unique_ptr<Screen>(new Screens::Label(0, 5, app, label));
+}
+
+std::unique_ptr<Screen> Weather::CreateScreenHumidity() {
+ lv_obj_t* label = lv_label_create(lv_scr_act(), nullptr);
+ lv_label_set_recolor(label, true);
+ std::unique_ptr<Controllers::WeatherData::Humidity>& current = weatherService.GetCurrentHumidity();
+ if (current->timestamp == 0) {
+ // Do not use the data, it's invalid
+ lv_label_set_text_fmt(label,
+ "#FFFF00 Humidity#\n\n"
+ "#444444 %d%%#\n\n"
+ "%d\n"
+ "%d\n",
+ 0,
+ 0,
+ 0);
+ } else {
+ lv_label_set_text_fmt(label,
+ "#FFFF00 Humidity#\n\n"
+ "#444444 %hhu%%#\n\n"
+ "%llu\n"
+ "%lu\n",
+ current->humidity,
+ current->timestamp,
+ current->expires);
+ }
+ lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
+ lv_obj_align(label, lv_scr_act(), LV_ALIGN_CENTER, 0, 0);
+ return std::unique_ptr<Screen>(new Screens::Label(0, 5, app, label));
+}
diff --git a/src/displayapp/screens/Weather.h b/src/displayapp/screens/Weather.h
new file mode 100644
index 00000000..34f95fce
--- /dev/null
+++ b/src/displayapp/screens/Weather.h
@@ -0,0 +1,45 @@
+#pragma once
+
+#include <memory>
+#include <components/ble/weather/WeatherService.h>
+#include "Screen.h"
+#include "ScreenList.h"
+
+namespace Pinetime {
+ namespace Applications {
+ class DisplayApp;
+
+ namespace Screens {
+ class Weather : public Screen {
+ public:
+ explicit Weather(DisplayApp* app, Pinetime::Controllers::WeatherService& weather);
+
+ ~Weather() override;
+
+ void Refresh() override;
+
+ bool OnButtonPushed() override;
+
+ bool OnTouchEvent(TouchEvents event) override;
+
+ private:
+ bool running = true;
+
+ Pinetime::Controllers::DateTime& dateTimeController;
+ Controllers::WeatherService& weatherService;
+
+ ScreenList<5> screens;
+
+ std::unique_ptr<Screen> CreateScreenTemperature();
+
+ std::unique_ptr<Screen> CreateScreenAir();
+
+ std::unique_ptr<Screen> CreateScreenClouds();
+
+ std::unique_ptr<Screen> CreateScreenPrecipitation();
+
+ std::unique_ptr<Screen> CreateScreenHumidity();
+ };
+ }
+ }
+}
diff --git a/src/displayapp/screens/settings/SettingSteps.cpp b/src/displayapp/screens/settings/SettingSteps.cpp
index 149840df..5ca3eecd 100644
--- a/src/displayapp/screens/settings/SettingSteps.cpp
+++ b/src/displayapp/screens/settings/SettingSteps.cpp
@@ -6,8 +6,8 @@
using namespace Pinetime::Applications::Screens;
namespace {
- static void event_handler(lv_obj_t * obj, lv_event_t event) {
- SettingSteps* screen = static_cast<SettingSteps *>(obj->user_data);
+ void event_handler(lv_obj_t* obj, lv_event_t event) {
+ SettingSteps* screen = static_cast<SettingSteps*>(obj->user_data);
screen->UpdateSelected(obj, event);
}
}
@@ -30,33 +30,32 @@ SettingSteps::SettingSteps(
lv_obj_set_height(container1, LV_VER_RES - 60);
lv_cont_set_layout(container1, LV_LAYOUT_COLUMN_LEFT);
- lv_obj_t * title = lv_label_create(lv_scr_act(), NULL);
+ lv_obj_t* title = lv_label_create(lv_scr_act(), nullptr);
lv_label_set_text_static(title,"Daily steps goal");
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(), NULL);
+ 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::shoe);
lv_label_set_align(icon, LV_LABEL_ALIGN_CENTER);
lv_obj_align(icon, title, LV_ALIGN_OUT_LEFT_MID, -10, 0);
-
- stepValue = lv_label_create(lv_scr_act(), NULL);
+ stepValue = lv_label_create(lv_scr_act(), nullptr);
lv_obj_set_style_local_text_font(stepValue, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_42);
lv_label_set_text_fmt(stepValue, "%lu", settingsController.GetStepsGoal());
lv_label_set_align(stepValue, LV_LABEL_ALIGN_CENTER);
lv_obj_align(stepValue, lv_scr_act(), LV_ALIGN_CENTER, 0, -10);
- btnPlus = lv_btn_create(lv_scr_act(), NULL);
+ btnPlus = lv_btn_create(lv_scr_act(), nullptr);
btnPlus->user_data = this;
lv_obj_set_size(btnPlus, 80, 50);
lv_obj_align(btnPlus, lv_scr_act(), LV_ALIGN_CENTER, 55, 80);
lv_obj_set_style_local_value_str(btnPlus, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, "+");
lv_obj_set_event_cb(btnPlus, event_handler);
- btnMinus = lv_btn_create(lv_scr_act(), NULL);
+ btnMinus = lv_btn_create(lv_scr_act(), nullptr);
btnMinus->user_data = this;
lv_obj_set_size(btnMinus, 80, 50);
lv_obj_set_event_cb(btnMinus, event_handler);