Simple Weather Service - code cleaning and improvements

Add missing icons (heavy clouds, thunderstorm, snow).
Remove unneeded comparison operator (!=), improve conversion of Timestamp and MessageType, order includes.
Fix typo in documentation.
Remove not related change in StopWatch.
This commit is contained in:
Jean-François Milants 2023-12-18 18:07:36 +01:00 committed by JF
parent fe4b07c610
commit 3a8c7dc038
7 changed files with 28 additions and 37 deletions

View File

@ -40,8 +40,8 @@ The byte array must contain the following data:
- 4 = Clouds & rain - 4 = Clouds & rain
- 5 = Rain - 5 = Rain
- 6 = Thunderstorm - 6 = Thunderstorm
- 7 = snow - 7 = Snow
- 8 = mist, smog - 8 = Mist, smog
### Forecast ### Forecast
@ -65,4 +65,4 @@ The byte array must contain the following data:
- [22] Day 3 Icon ID - [22] Day 3 Icon ID
- [23] Day 4 Minimum temperature - [23] Day 4 Minimum temperature
- [24] Day 4 Maximum temperature - [24] Day 4 Maximum temperature
- [25] Day 4 Incon ID - [25] Day 4 Icon ID

View File

@ -15,24 +15,27 @@
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
#include "components/ble/SimpleWeatherService.h"
#include <algorithm> #include <algorithm>
#include "SimpleWeatherService.h"
#include <cstring> #include <cstring>
#include <nrf_log.h> #include <nrf_log.h>
#include <array>
using namespace Pinetime::Controllers; using namespace Pinetime::Controllers;
namespace { namespace {
enum class MessageType { CurrentWeather, Forecast, Unknown }; enum class MessageType : uint8_t { CurrentWeather, Forecast, Unknown };
uint64_t ToUInt64(const uint8_t* data) {
return *(reinterpret_cast<const uint64_t*>(data));
}
SimpleWeatherService::CurrentWeather CreateCurrentWeather(const uint8_t* dataBuffer) { SimpleWeatherService::CurrentWeather CreateCurrentWeather(const uint8_t* dataBuffer) {
char cityName[33]; char cityName[33];
std::memcpy(&cityName[0], &dataBuffer[13], 32); std::memcpy(&cityName[0], &dataBuffer[13], 32);
cityName[32] = '\0'; cityName[32] = '\0';
return SimpleWeatherService::CurrentWeather {dataBuffer[2] + (dataBuffer[3] << 8) + (dataBuffer[4] << 16) + (dataBuffer[5] << 24) + return SimpleWeatherService::CurrentWeather {ToUInt64(&dataBuffer[2]),
((uint64_t) dataBuffer[6] << 32) + ((uint64_t) dataBuffer[7] << 40) +
((uint64_t) dataBuffer[8] << 48) + ((uint64_t) dataBuffer[9] << 54),
dataBuffer[10], dataBuffer[10],
dataBuffer[11], dataBuffer[11],
dataBuffer[12], dataBuffer[12],
@ -41,9 +44,7 @@ namespace {
} }
SimpleWeatherService::Forecast CreateForecast(const uint8_t* dataBuffer) { 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) + auto timestamp = static_cast<uint64_t>(ToUInt64(&dataBuffer[2]));
((uint64_t) dataBuffer[6] << 32) + ((uint64_t) dataBuffer[7] << 40) +
((uint64_t) dataBuffer[8] << 48) + ((uint64_t) dataBuffer[9] << 54));
std::array<SimpleWeatherService::Forecast::Day, SimpleWeatherService::MaxNbForecastDays> days; std::array<SimpleWeatherService::Forecast::Day, SimpleWeatherService::MaxNbForecastDays> days;
const uint8_t nbDaysInBuffer = dataBuffer[10]; const uint8_t nbDaysInBuffer = dataBuffer[10];
@ -54,18 +55,12 @@ namespace {
return SimpleWeatherService::Forecast {timestamp, nbDays, days}; return SimpleWeatherService::Forecast {timestamp, nbDays, days};
} }
MessageType GetMessageType(const uint8_t* dataBuffer) { MessageType GetMessageType(const uint8_t* data) {
switch (dataBuffer[0]) { auto messageType = static_cast<MessageType>(*data);
case 0: if(messageType > MessageType::Unknown) {
return MessageType::CurrentWeather;
break;
case 1:
return MessageType::Forecast;
break;
default:
return MessageType::Unknown; return MessageType::Unknown;
break;
} }
return messageType;
} }
uint8_t GetVersion(const uint8_t* dataBuffer) { uint8_t GetVersion(const uint8_t* dataBuffer) {
@ -154,7 +149,3 @@ bool SimpleWeatherService::CurrentWeather::operator==(const SimpleWeatherService
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;
} }
bool SimpleWeatherService::CurrentWeather::operator!=(const SimpleWeatherService::CurrentWeather& other) const {
return !operator==(other);
}

View File

@ -85,7 +85,6 @@ namespace Pinetime {
char location[33]; // 32 char + \0 (end of string) char location[33]; // 32 char + \0 (end of string)
bool operator==(const CurrentWeather& other) const; bool operator==(const CurrentWeather& other) const;
bool operator!=(const CurrentWeather& other) const;
}; };
struct Forecast { struct Forecast {

View File

@ -68,7 +68,7 @@
"sources": [ "sources": [
{ {
"file": "FontAwesome5-Solid+Brands+Regular.woff", "file": "FontAwesome5-Solid+Brands+Regular.woff",
"range": "0xf185, 0xf6c4, 0xf743, 0xf740, 0xf75f, 0xf0c2, 0xf05e" "range": "0xf185, 0xf6c4, 0xf743, 0xf740, 0xf75f, 0xf0c2, 0xf05e, 0xf73b, 0xf0e7, 0xf2dc"
} }
], ],
"bpp": 1, "bpp": 1,

View File

@ -5,8 +5,6 @@
using namespace Pinetime::Applications::Screens; using namespace Pinetime::Applications::Screens;
constexpr int Pinetime::Applications::Screens::StopWatch::maxLapCount;
namespace { namespace {
TimeSeparated_t convertTicksToTimeSegments(const TickType_t timeElapsed) { TimeSeparated_t convertTicksToTimeSegments(const TickType_t timeElapsed) {
// Centiseconds // Centiseconds

View File

@ -45,6 +45,9 @@ namespace Pinetime {
static constexpr const char* cloudShowersHeavy = "\xEF\x9D\x80"; static constexpr const char* cloudShowersHeavy = "\xEF\x9D\x80";
static constexpr const char* smog = "\xEF\x9D\x9F"; static constexpr const char* smog = "\xEF\x9D\x9F";
static constexpr const char* cloud = "\xEF\x83\x82"; static constexpr const char* cloud = "\xEF\x83\x82";
static constexpr const char* cloud_meatball = "\xEF\x9C\xBB";
static constexpr const char* bolt = "\xEF\x83\xA7";
static constexpr const char* snowflake = "\xEF\x8B\x9C";
static constexpr const char* ban = "\xEF\x81\x9E"; static constexpr const char* ban = "\xEF\x81\x9E";
// lv_font_sys_48.c // lv_font_sys_48.c

View File

@ -55,14 +55,14 @@ namespace {
return Symbols::cloud; return Symbols::cloud;
break; break;
case Pinetime::Controllers::SimpleWeatherService::Icons::BrokenClouds: case Pinetime::Controllers::SimpleWeatherService::Icons::BrokenClouds:
return Symbols::cloud; return Symbols::cloud_meatball;
break; // TODO missing symbol break;
case Pinetime::Controllers::SimpleWeatherService::Icons::Thunderstorm: case Pinetime::Controllers::SimpleWeatherService::Icons::Thunderstorm:
return Symbols::cloud; return Symbols::bolt;
break; // TODO missing symbol break;
case Pinetime::Controllers::SimpleWeatherService::Icons::Snow: case Pinetime::Controllers::SimpleWeatherService::Icons::Snow:
return Symbols::cloud; return Symbols::snowflake;
break; // TODO missing symbol break;
case Pinetime::Controllers::SimpleWeatherService::Icons::CloudShowerHeavy: case Pinetime::Controllers::SimpleWeatherService::Icons::CloudShowerHeavy:
return Symbols::cloudShowersHeavy; return Symbols::cloudShowersHeavy;
break; break;