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:
parent
199aefc617
commit
ef2c431569
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue