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
- 5 = Rain
- 6 = Thunderstorm
- 7 = snow
- 8 = mist, smog
- 7 = Snow
- 8 = Mist, smog
### Forecast
@ -65,4 +65,4 @@ The byte array must contain the following data:
- [22] Day 3 Icon ID
- [23] Day 4 Minimum 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
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include "components/ble/SimpleWeatherService.h"
#include <algorithm>
#include "SimpleWeatherService.h"
#include <cstring>
#include <nrf_log.h>
#include <array>
using namespace Pinetime::Controllers;
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) {
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),
return SimpleWeatherService::CurrentWeather {ToUInt64(&dataBuffer[2]),
dataBuffer[10],
dataBuffer[11],
dataBuffer[12],
@ -41,9 +44,7 @@ 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));
auto timestamp = static_cast<uint64_t>(ToUInt64(&dataBuffer[2]));
std::array<SimpleWeatherService::Forecast::Day, SimpleWeatherService::MaxNbForecastDays> days;
const uint8_t nbDaysInBuffer = dataBuffer[10];
@ -54,19 +55,13 @@ namespace {
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:
MessageType GetMessageType(const uint8_t* data) {
auto messageType = static_cast<MessageType>(*data);
if(messageType > MessageType::Unknown) {
return MessageType::Unknown;
break;
}
return messageType;
}
}
uint8_t GetVersion(const uint8_t* dataBuffer) {
return dataBuffer[1];
@ -154,7 +149,3 @@ bool SimpleWeatherService::CurrentWeather::operator==(const SimpleWeatherService
return this->iconId == other.iconId && this->temperature == other.temperature && this->timestamp == other.timestamp &&
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)
bool operator==(const CurrentWeather& other) const;
bool operator!=(const CurrentWeather& other) const;
};
struct Forecast {

View File

@ -68,7 +68,7 @@
"sources": [
{
"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,

View File

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

View File

@ -45,6 +45,9 @@ namespace Pinetime {
static constexpr const char* cloudShowersHeavy = "\xEF\x9D\x80";
static constexpr const char* smog = "\xEF\x9D\x9F";
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";
// lv_font_sys_48.c

View File

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