Simple Weather Service

Code improvements : icon fields are now typed as Icons, move the location string when creating a new instance of CurrentWeather, fix SimpleWeatherService::CurrentWeather::operator== (location was missing from the comparison).
This commit is contained in:
Jean-François Milants 2023-12-23 15:54:23 +01:00 committed by JF
parent 199aefc617
commit ef2c431569
2 changed files with 16 additions and 14 deletions

View File

@ -19,6 +19,7 @@
#include "components/ble/SimpleWeatherService.h" #include "components/ble/SimpleWeatherService.h"
#include <algorithm> #include <algorithm>
#include <array>
#include <cstring> #include <cstring>
#include <nrf_log.h> #include <nrf_log.h>
@ -32,15 +33,15 @@ namespace {
} }
SimpleWeatherService::CurrentWeather CreateCurrentWeather(const uint8_t* dataBuffer) { SimpleWeatherService::CurrentWeather CreateCurrentWeather(const uint8_t* dataBuffer) {
char cityName[33]; SimpleWeatherService::Location cityName;
std::memcpy(&cityName[0], &dataBuffer[13], 32); std::memcpy(cityName.data(), &dataBuffer[13], 32);
cityName[32] = '\0'; cityName[32] = '\0';
return SimpleWeatherService::CurrentWeather {ToUInt64(&dataBuffer[2]), return SimpleWeatherService::CurrentWeather (ToUInt64(&dataBuffer[2]),
dataBuffer[10], dataBuffer[10],
dataBuffer[11], dataBuffer[11],
dataBuffer[12], dataBuffer[12],
dataBuffer[13 + 32], SimpleWeatherService::Icons{dataBuffer[13 + 32]},
cityName}; std::move(cityName));
} }
SimpleWeatherService::Forecast CreateForecast(const uint8_t* dataBuffer) { SimpleWeatherService::Forecast CreateForecast(const uint8_t* dataBuffer) {
@ -50,7 +51,7 @@ namespace {
const uint8_t nbDaysInBuffer = dataBuffer[10]; const uint8_t nbDaysInBuffer = dataBuffer[10];
const uint8_t nbDays = std::min(SimpleWeatherService::MaxNbForecastDays, nbDaysInBuffer); const uint8_t nbDays = std::min(SimpleWeatherService::MaxNbForecastDays, nbDaysInBuffer);
for (int i = 0; i < nbDays; i++) { for (int i = 0; i < nbDays; i++) {
days[i] = SimpleWeatherService::Forecast::Day {dataBuffer[11 + (i * 3)], dataBuffer[12 + (i * 3)], dataBuffer[13 + (i * 3)]}; days[i] = SimpleWeatherService::Forecast::Day {dataBuffer[11 + (i * 3)], dataBuffer[12 + (i * 3)], SimpleWeatherService::Icons{dataBuffer[13 + (i * 3)]}};
} }
return SimpleWeatherService::Forecast {timestamp, nbDays, days}; return SimpleWeatherService::Forecast {timestamp, nbDays, days};
} }
@ -147,5 +148,6 @@ std::optional<SimpleWeatherService::Forecast> SimpleWeatherService::GetForecast(
bool SimpleWeatherService::CurrentWeather::operator==(const SimpleWeatherService::CurrentWeather& other) const { bool SimpleWeatherService::CurrentWeather::operator==(const SimpleWeatherService::CurrentWeather& other) const {
return this->iconId == other.iconId && this->temperature == other.temperature && this->timestamp == other.timestamp && return this->iconId == other.iconId && this->temperature == other.temperature && this->timestamp == other.timestamp &&
this->maxTemperature == other.maxTemperature && this->minTemperature == other.maxTemperature; this->maxTemperature == other.maxTemperature && this->minTemperature == other.maxTemperature &&
std::strcmp(this->location.data(), other.location.data()) == 0;
} }

View File

@ -61,20 +61,20 @@ namespace Pinetime {
Unknown = 255 Unknown = 255
}; };
using Location = std::array<char, 33>; // 32 char + \0 (end of string)
struct CurrentWeather { struct CurrentWeather {
CurrentWeather(uint64_t timestamp, CurrentWeather(uint64_t timestamp,
uint8_t temperature, uint8_t temperature,
uint8_t minTemperature, uint8_t minTemperature,
uint8_t maxTemperature, uint8_t maxTemperature,
uint8_t iconId, Icons iconId,
const char* location) Location&& location)
: timestamp {timestamp}, : timestamp {timestamp},
temperature {temperature}, temperature {temperature},
minTemperature {minTemperature}, minTemperature {minTemperature},
maxTemperature {maxTemperature}, maxTemperature {maxTemperature},
iconId {iconId} { iconId {iconId},
std::memcpy(this->location, location, 32); location{std::move(location)} {
this->location[32] = 0;
} }
uint64_t timestamp; uint64_t timestamp;
@ -82,7 +82,7 @@ namespace Pinetime {
uint8_t minTemperature; uint8_t minTemperature;
uint8_t maxTemperature; uint8_t maxTemperature;
Icons iconId; Icons iconId;
char location[33]; // 32 char + \0 (end of string) Location location;
bool operator==(const CurrentWeather& other) const; bool operator==(const CurrentWeather& other) const;
}; };
@ -94,7 +94,7 @@ namespace Pinetime {
struct Day { struct Day {
uint8_t minTemperature; uint8_t minTemperature;
uint8_t maxTemperature; uint8_t maxTemperature;
uint8_t iconId; Icons iconId;
}; };
std::array<Day, MaxNbForecastDays> days; std::array<Day, MaxNbForecastDays> days;