Skip to content

Commit bbb52e9

Browse files
committed
Add time since last weather update to weather app
1 parent 7b39d81 commit bbb52e9

File tree

2 files changed

+30
-4
lines changed

2 files changed

+30
-4
lines changed

src/displayapp/screens/Weather.cpp

+23-2
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,10 @@ namespace {
3535
}
3636
}
3737

38-
Weather::Weather(Controllers::Settings& settingsController, Controllers::SimpleWeatherService& weatherService)
39-
: settingsController {settingsController}, weatherService {weatherService} {
38+
Weather::Weather(Controllers::Settings& settingsController,
39+
Controllers::SimpleWeatherService& weatherService,
40+
Controllers::DateTime& dateTimeController)
41+
: settingsController {settingsController}, weatherService {weatherService}, dateTimeController {dateTimeController} {
4042

4143
temperature = lv_label_create(lv_scr_act(), nullptr);
4244
lv_obj_set_style_local_text_color(temperature, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_WHITE);
@@ -45,6 +47,11 @@ Weather::Weather(Controllers::Settings& settingsController, Controllers::SimpleW
4547
lv_obj_align(temperature, nullptr, LV_ALIGN_CENTER, 0, -30);
4648
lv_obj_set_auto_realign(temperature, true);
4749

50+
lastUpdated = lv_label_create(lv_scr_act(), nullptr);
51+
lv_obj_set_style_local_text_color(lastUpdated, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, Colors::bg);
52+
lv_label_set_text_fmt(lastUpdated, "");
53+
lv_obj_align(lastUpdated, nullptr, LV_ALIGN_CENTER, -40, 0);
54+
4855
minTemperature = lv_label_create(lv_scr_act(), nullptr);
4956
lv_obj_set_style_local_text_color(minTemperature, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, Colors::bg);
5057
lv_label_set_text(minTemperature, "");
@@ -137,6 +144,20 @@ void Weather::Refresh() {
137144
lv_label_set_text_fmt(temperature, "%d°%c", temp, tempUnit);
138145
lv_label_set_text_fmt(minTemperature, "%d°", minTemp);
139146
lv_label_set_text_fmt(maxTemperature, "%d°", maxTemp);
147+
148+
int64_t secondsSinceEpoch = dateTimeController.CurrentDateTime().time_since_epoch().count() / 1000000000;
149+
int64_t secondsSinceWeatherUpdate = secondsSinceEpoch - optCurrentWeather->timestamp;
150+
if (secondsSinceWeatherUpdate < 0) {
151+
lv_label_set_text_fmt(lastUpdated, "0s old", secondsSinceWeatherUpdate);
152+
}
153+
else if (secondsSinceWeatherUpdate < 60) {
154+
lv_label_set_text_fmt(lastUpdated, "%ds old", secondsSinceWeatherUpdate);
155+
}
156+
else if (secondsSinceWeatherUpdate > 59 && secondsSinceWeatherUpdate < 3600) {
157+
lv_label_set_text_fmt(lastUpdated, "%dm old", secondsSinceWeatherUpdate / 60);
158+
} else if (secondsSinceWeatherUpdate > 3599) {
159+
lv_label_set_text_fmt(lastUpdated, "%dh old", secondsSinceWeatherUpdate / 3600);
160+
}
140161
} else {
141162
lv_label_set_text(icon, "");
142163
lv_label_set_text(condition, "");

src/displayapp/screens/Weather.h

+7-2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include <lvgl/lvgl.h>
55
#include "displayapp/screens/Screen.h"
66
#include "components/ble/SimpleWeatherService.h"
7+
#include "components/datetime/DateTimeController.h"
78
#include "displayapp/apps/Apps.h"
89
#include "displayapp/Controllers.h"
910
#include "Symbols.h"
@@ -20,21 +21,25 @@ namespace Pinetime {
2021

2122
class Weather : public Screen {
2223
public:
23-
Weather(Controllers::Settings& settingsController, Controllers::SimpleWeatherService& weatherService);
24+
Weather(Controllers::Settings& settingsController,
25+
Controllers::SimpleWeatherService& weatherService,
26+
Controllers::DateTime& dateTimeController);
2427
~Weather() override;
2528

2629
void Refresh() override;
2730

2831
private:
2932
Controllers::Settings& settingsController;
3033
Controllers::SimpleWeatherService& weatherService;
34+
Controllers::DateTime& dateTimeController;
3135

3236
Utility::DirtyValue<std::optional<Controllers::SimpleWeatherService::CurrentWeather>> currentWeather {};
3337
Utility::DirtyValue<std::optional<Controllers::SimpleWeatherService::Forecast>> currentForecast {};
3438

3539
lv_obj_t* icon;
3640
lv_obj_t* condition;
3741
lv_obj_t* temperature;
42+
lv_obj_t* lastUpdated;
3843
lv_obj_t* minTemperature;
3944
lv_obj_t* maxTemperature;
4045
lv_obj_t* forecast;
@@ -49,7 +54,7 @@ namespace Pinetime {
4954
static constexpr const char* icon = Screens::Symbols::cloudSunRain;
5055

5156
static Screens::Screen* Create(AppControllers& controllers) {
52-
return new Screens::Weather(controllers.settingsController, *controllers.weatherController);
57+
return new Screens::Weather(controllers.settingsController, *controllers.weatherController, controllers.dateTimeController);
5358
};
5459
};
5560
}

0 commit comments

Comments
 (0)