11#include " displayapp/screens/Weather.h"
2+
23#include < lvgl/lvgl.h>
4+
35#include " components/ble/SimpleWeatherService.h"
46#include " components/datetime/DateTimeController.h"
57#include " components/settings/Settings.h"
8+ #include " displayapp/Weather.h"
69#include " displayapp/DisplayApp.h"
710#include " displayapp/screens/WeatherSymbols.h"
811#include " displayapp/InfiniTimeTheme.h"
912
1013using namespace Pinetime ::Applications::Screens;
1114
1215namespace {
13- lv_color_t TemperatureColor (int16_t temperature ) {
14- if (temperature <= 0 ) { // freezing
16+ lv_color_t TemperatureColor (Pinetime::Applications::Temperature temp ) {
17+ if (temp. temp <= 0 ) { // freezing
1518 return Colors::blue;
16- } else if (temperature <= 400 ) { // ice
19+ } else if (temp. temp <= 4 ) { // ice
1720 return LV_COLOR_CYAN;
18- } else if (temperature >= 2700 ) { // hot
21+ } else if (temp. temp >= 27 ) { // hot
1922 return Colors::deepOrange;
2023 }
2124 return Colors::orange; // normal
2225 }
2326
24- uint8_t TemperatureStyle (int16_t temperature ) {
25- if (temperature <= 0 ) { // freezing
27+ uint8_t TemperatureStyle (Pinetime::Applications::Temperature temp ) {
28+ if (temp. temp <= 0 ) { // freezing
2629 return LV_TABLE_PART_CELL3;
27- } else if (temperature <= 400 ) { // ice
30+ } else if (temp. temp <= 4 ) { // ice
2831 return LV_TABLE_PART_CELL4;
29- } else if (temperature >= 2700 ) { // hot
32+ } else if (temp. temp >= 27 ) { // hot
3033 return LV_TABLE_PART_CELL6;
3134 }
3235 return LV_TABLE_PART_CELL5; // normal
3336 }
34-
35- int16_t RoundTemperature (int16_t temp) {
36- return temp = temp / 100 + (temp % 100 >= 50 ? 1 : 0 );
37- }
3837}
3938
4039Weather::Weather (Controllers::Settings& settingsController, Controllers::SimpleWeatherService& weatherService)
@@ -120,22 +119,19 @@ void Weather::Refresh() {
120119 if (currentWeather.IsUpdated ()) {
121120 auto optCurrentWeather = currentWeather.Get ();
122121 if (optCurrentWeather) {
123- int16_t temp = optCurrentWeather->temperature ;
124- int16_t minTemp = optCurrentWeather->minTemperature ;
125- int16_t maxTemp = optCurrentWeather->maxTemperature ;
122+ Applications::Temperature temp = Applications::Convert ( optCurrentWeather->temperature , settingsController. GetWeatherFormat ()) ;
123+ Applications::Temperature minTemp = Applications::Convert ( optCurrentWeather->minTemperature , settingsController. GetWeatherFormat ()) ;
124+ Applications::Temperature maxTemp = Applications::Convert ( optCurrentWeather->maxTemperature , settingsController. GetWeatherFormat ()) ;
126125 lv_obj_set_style_local_text_color (temperature, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, TemperatureColor (temp));
127126 char tempUnit = ' C' ;
128127 if (settingsController.GetWeatherFormat () == Controllers::Settings::WeatherFormat::Imperial) {
129- temp = Controllers::SimpleWeatherService::CelsiusToFahrenheit (temp);
130- minTemp = Controllers::SimpleWeatherService::CelsiusToFahrenheit (minTemp);
131- maxTemp = Controllers::SimpleWeatherService::CelsiusToFahrenheit (maxTemp);
132128 tempUnit = ' F' ;
133129 }
134130 lv_label_set_text (icon, Symbols::GetSymbol (optCurrentWeather->iconId ));
135131 lv_label_set_text (condition, Symbols::GetCondition (optCurrentWeather->iconId ));
136- lv_label_set_text_fmt (temperature, " %d°%c" , RoundTemperature ( temp) , tempUnit);
137- lv_label_set_text_fmt (minTemperature, " %d°" , RoundTemperature ( minTemp) );
138- lv_label_set_text_fmt (maxTemperature, " %d°" , RoundTemperature ( maxTemp) );
132+ lv_label_set_text_fmt (temperature, " %d°%c" , temp. temp , tempUnit);
133+ lv_label_set_text_fmt (minTemperature, " %d°" , minTemp. temp );
134+ lv_label_set_text_fmt (maxTemperature, " %d°" , maxTemp. temp );
139135 } else {
140136 lv_label_set_text (icon, " " );
141137 lv_label_set_text (condition, " " );
@@ -153,36 +149,32 @@ void Weather::Refresh() {
153149 std::tm localTime = *std::localtime (reinterpret_cast <const time_t *>(&optCurrentForecast->timestamp ));
154150
155151 for (int i = 0 ; i < Controllers::SimpleWeatherService::MaxNbForecastDays; i++) {
156- int16_t maxTemp = optCurrentForecast->days [i].maxTemperature ;
157- int16_t minTemp = optCurrentForecast->days [i].minTemperature ;
152+ Applications::Temperature maxTemp =
153+ Applications::Convert (optCurrentForecast->days [i].maxTemperature , settingsController.GetWeatherFormat ());
154+ Applications::Temperature minTemp =
155+ Applications::Convert (optCurrentForecast->days [i].minTemperature , settingsController.GetWeatherFormat ());
158156 lv_table_set_cell_type (forecast, 2 , i, TemperatureStyle (maxTemp));
159157 lv_table_set_cell_type (forecast, 3 , i, TemperatureStyle (minTemp));
160- if (settingsController.GetWeatherFormat () == Controllers::Settings::WeatherFormat::Imperial) {
161- maxTemp = Controllers::SimpleWeatherService::CelsiusToFahrenheit (maxTemp);
162- minTemp = Controllers::SimpleWeatherService::CelsiusToFahrenheit (minTemp);
163- }
164158 uint8_t wday = localTime.tm_wday + i + 1 ;
165159 if (wday > 7 ) {
166160 wday -= 7 ;
167161 }
168- maxTemp = RoundTemperature (maxTemp);
169- minTemp = RoundTemperature (minTemp);
170162 const char * dayOfWeek = Controllers::DateTime::DayOfWeekShortToStringLow (static_cast <Controllers::DateTime::Days>(wday));
171163 lv_table_set_cell_value (forecast, 0 , i, dayOfWeek);
172164 lv_table_set_cell_value (forecast, 1 , i, Symbols::GetSymbol (optCurrentForecast->days [i].iconId ));
173165 // Pad cells based on the largest number of digits on each column
174166 char maxPadding[3 ] = " " ;
175167 char minPadding[3 ] = " " ;
176- int diff = snprintf (nullptr , 0 , " %d" , maxTemp) - snprintf (nullptr , 0 , " %d" , minTemp);
168+ int diff = snprintf (nullptr , 0 , " %d" , maxTemp. temp ) - snprintf (nullptr , 0 , " %d" , minTemp. temp );
177169 if (diff <= 0 ) {
178170 maxPadding[-diff] = ' \0 ' ;
179171 minPadding[0 ] = ' \0 ' ;
180172 } else {
181173 maxPadding[0 ] = ' \0 ' ;
182174 minPadding[diff] = ' \0 ' ;
183175 }
184- lv_table_set_cell_value_fmt (forecast, 2 , i, " %s%d" , maxPadding, maxTemp);
185- lv_table_set_cell_value_fmt (forecast, 3 , i, " %s%d" , minPadding, minTemp);
176+ lv_table_set_cell_value_fmt (forecast, 2 , i, " %s%d" , maxPadding, maxTemp. temp );
177+ lv_table_set_cell_value_fmt (forecast, 3 , i, " %s%d" , minPadding, minTemp. temp );
186178 }
187179 } else {
188180 for (int i = 0 ; i < Controllers::SimpleWeatherService::MaxNbForecastDays; i++) {
0 commit comments