|
|
|
@ -22,19 +22,15 @@
|
|
|
|
|
using namespace Pinetime::Controllers;
|
|
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
|
enum class MessageType {
|
|
|
|
|
CurrentWeather,
|
|
|
|
|
Forecast,
|
|
|
|
|
Unknown
|
|
|
|
|
};
|
|
|
|
|
enum class MessageType { CurrentWeather, Forecast, Unknown };
|
|
|
|
|
|
|
|
|
|
SimpleWeatherService::CurrentWeather CreateCurrentWeather(const uint8_t* dataBuffer) {
|
|
|
|
|
char cityName[33];
|
|
|
|
|
std::memcpy(&cityName[0], &dataBuffer[13], 32);
|
|
|
|
|
cityName[32] = '\0';
|
|
|
|
|
return SimpleWeatherService::CurrentWeather {dataBuffer[2] + (dataBuffer[3] << 8) + (dataBuffer[4] << 16) + (dataBuffer[5] << 24) +
|
|
|
|
|
((uint64_t) dataBuffer[6] << 32) + ((uint64_t) dataBuffer[7] << 40) + ((uint64_t) dataBuffer[8] << 48) +
|
|
|
|
|
((uint64_t) dataBuffer[9] << 54),
|
|
|
|
|
((uint64_t) dataBuffer[6] << 32) + ((uint64_t) dataBuffer[7] << 40) +
|
|
|
|
|
((uint64_t) dataBuffer[8] << 48) + ((uint64_t) dataBuffer[9] << 54),
|
|
|
|
|
dataBuffer[10],
|
|
|
|
|
dataBuffer[11],
|
|
|
|
|
dataBuffer[12],
|
|
|
|
@ -44,23 +40,27 @@ namespace {
|
|
|
|
|
|
|
|
|
|
SimpleWeatherService::Forecast CreateForecast(const uint8_t* dataBuffer) {
|
|
|
|
|
uint64_t timestamp = static_cast<uint64_t>(dataBuffer[2] + (dataBuffer[3] << 8) + (dataBuffer[4] << 16) + (dataBuffer[5] << 24) +
|
|
|
|
|
((uint64_t) dataBuffer[6] << 32) + ((uint64_t) dataBuffer[7] << 40) + ((uint64_t) dataBuffer[8] << 48) +
|
|
|
|
|
((uint64_t) dataBuffer[9] << 54));
|
|
|
|
|
((uint64_t) dataBuffer[6] << 32) + ((uint64_t) dataBuffer[7] << 40) +
|
|
|
|
|
((uint64_t) dataBuffer[8] << 48) + ((uint64_t) dataBuffer[9] << 54));
|
|
|
|
|
uint8_t nbDays = dataBuffer[10];
|
|
|
|
|
std::array<SimpleWeatherService::Forecast::Day, 5> days;
|
|
|
|
|
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)], dataBuffer[13 + (i * 3)]};
|
|
|
|
|
}
|
|
|
|
|
return SimpleWeatherService::Forecast {timestamp, nbDays, days};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
MessageType GetMessageType(const uint8_t* dataBuffer) {
|
|
|
|
|
switch (dataBuffer[0]) {
|
|
|
|
|
case 0: return MessageType::CurrentWeather; break;
|
|
|
|
|
case 1: return MessageType::Forecast; break;
|
|
|
|
|
default: return MessageType::Unknown; break;
|
|
|
|
|
case 0:
|
|
|
|
|
return MessageType::CurrentWeather;
|
|
|
|
|
break;
|
|
|
|
|
case 1:
|
|
|
|
|
return MessageType::Forecast;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
return MessageType::Unknown;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -74,7 +74,6 @@ int WeatherCallback(uint16_t /*connHandle*/, uint16_t /*attrHandle*/, struct ble
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SimpleWeatherService::SimpleWeatherService(const DateTime& dateTimeController) : dateTimeController(dateTimeController) {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SimpleWeatherService::Init() {
|
|
|
|
@ -104,7 +103,11 @@ int SimpleWeatherService::OnCommand(struct ble_gatt_access_ctxt* ctxt) {
|
|
|
|
|
forecast = CreateForecast(dataBuffer);
|
|
|
|
|
NRF_LOG_INFO("Forecast : Timestamp : %d", forecast->timestamp);
|
|
|
|
|
for (int i = 0; i < 5; i++) {
|
|
|
|
|
NRF_LOG_INFO("\t[%d] Min: %d - Max : %d - Icon : %d", i, forecast->days[i].minTemperature, forecast->days[i].maxTemperature, forecast->days[i].iconId);
|
|
|
|
|
NRF_LOG_INFO("\t[%d] Min: %d - Max : %d - Icon : %d",
|
|
|
|
|
i,
|
|
|
|
|
forecast->days[i].minTemperature,
|
|
|
|
|
forecast->days[i].maxTemperature,
|
|
|
|
|
forecast->days[i].iconId);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|