summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/components/ble/weather/WeatherData.h6
-rw-r--r--src/components/ble/weather/WeatherService.cpp84
-rw-r--r--src/components/ble/weather/WeatherService.h20
-rw-r--r--src/displayapp/screens/Weather.cpp16
4 files changed, 85 insertions, 41 deletions
diff --git a/src/components/ble/weather/WeatherData.h b/src/components/ble/weather/WeatherData.h
index ee2a364d..9b424004 100644
--- a/src/components/ble/weather/WeatherData.h
+++ b/src/components/ble/weather/WeatherData.h
@@ -122,7 +122,7 @@ namespace Pinetime {
* Events have types
* then they're easier to parse after sending them over the air
*/
- enum class eventtype {
+ enum class eventtype : uint8_t {
/** @see obscuration */
Obscuration = 0,
/** @see precipitation */
@@ -141,6 +141,8 @@ namespace Pinetime {
Location = 7,
/** @see cloud */
Clouds = 8,
+ /** @see humidity */
+ Humidity = 9,
Length
};
@@ -340,4 +342,4 @@ namespace Pinetime {
};
};
}
-} \ No newline at end of file
+}
diff --git a/src/components/ble/weather/WeatherService.cpp b/src/components/ble/weather/WeatherService.cpp
index a9c9f114..22c80837 100644
--- a/src/components/ble/weather/WeatherService.cpp
+++ b/src/components/ble/weather/WeatherService.cpp
@@ -90,7 +90,7 @@ namespace Pinetime {
airquality->polluter = std::make_unique<std::string>(static_cast<const char*>(String.ptr), String.len);
int64_t tmpAmount = 0;
QCBORDecode_GetInt64InMapSZ(&decodeContext, "Amount", &tmpAmount);
- if (tmpAmount < 0 || tmpAmount > 4294967295) {
+ if (tmpAmount < 0) {
return BLE_ATT_ERR_INVALID_ATTR_VALUE_LEN;
}
airquality->amount = tmpAmount;
@@ -162,6 +162,14 @@ namespace Pinetime {
timeline.push_back(std::move(clouds));
break;
}
+ case WeatherData::eventtype::Humidity: {
+ std::unique_ptr<WeatherData::Humidity> humidity = std::make_unique<WeatherData::Humidity>();
+ humidity->timestamp = tmpTimestamp;
+ humidity->eventType = static_cast<WeatherData::eventtype>(tmpEventType);
+ humidity->expires = tmpExpires;
+ timeline.push_back(std::move(humidity));
+ break;
+ }
default: {
break;
}
@@ -201,46 +209,94 @@ namespace Pinetime {
return 0;
}
- WeatherData::Location WeatherService::GetCurrentLocation() const {
- return WeatherData::Location();
- }
-
WeatherData::Clouds WeatherService::GetCurrentClouds() const {
- return WeatherData::Clouds();
+ uint64_t currentTimestamp = GetCurrentUnixTimestamp();
+ for (auto&& header : timeline) {
+ if (header->eventType == WeatherData::eventtype::Clouds && header->timestamp + header->expires <= currentTimestamp) {
+ return reinterpret_cast<const WeatherData::Clouds&>(header);
+ }
+ }
+ return {};
}
WeatherData::Obscuration WeatherService::GetCurrentObscuration() const {
- return WeatherData::Obscuration();
+ uint64_t currentTimestamp = GetCurrentUnixTimestamp();
+ for (auto&& header : timeline) {
+ if (header->eventType == WeatherData::eventtype::Obscuration && header->timestamp + header->expires <= currentTimestamp) {
+ return reinterpret_cast<const WeatherData::Obscuration&>(header);
+ }
+ }
+ return {};
}
WeatherData::Precipitation WeatherService::GetCurrentPrecipitation() const {
- return WeatherData::Precipitation();
+ uint64_t currentTimestamp = GetCurrentUnixTimestamp();
+ for (auto&& header : timeline) {
+ if (header->eventType == WeatherData::eventtype::Precipitation && header->timestamp + header->expires <= currentTimestamp) {
+ return reinterpret_cast<const WeatherData::Precipitation&>(header);
+ }
+ }
+ return {};
}
WeatherData::Wind WeatherService::GetCurrentWind() const {
- return WeatherData::Wind();
+ uint64_t currentTimestamp = GetCurrentUnixTimestamp();
+ for (auto&& header : timeline) {
+ if (header->eventType == WeatherData::eventtype::Wind && header->timestamp + header->expires <= currentTimestamp) {
+ return reinterpret_cast<const WeatherData::Wind&>(header);
+ }
+ }
+ return {};
}
WeatherData::Temperature WeatherService::GetCurrentTemperature() const {
- return WeatherData::Temperature();
+ uint64_t currentTimestamp = GetCurrentUnixTimestamp();
+ for (auto&& header : timeline) {
+ if (header->eventType == WeatherData::eventtype::Temperature && header->timestamp + header->expires <= currentTimestamp) {
+ return reinterpret_cast<const WeatherData::Temperature&>(header);
+ }
+ }
+ return {};
}
WeatherData::Humidity WeatherService::GetCurrentHumidity() const {
- return WeatherData::Humidity();
+ uint64_t currentTimestamp = GetCurrentUnixTimestamp();
+ for (auto&& header : timeline) {
+ if (header->eventType == WeatherData::eventtype::Humidity && header->timestamp + header->expires <= currentTimestamp) {
+ return reinterpret_cast<const WeatherData::Humidity&>(header);
+ }
+ }
+ return {};
}
WeatherData::Pressure WeatherService::GetCurrentPressure() const {
uint64_t currentTimestamp = GetCurrentUnixTimestamp();
for (auto&& header : timeline) {
if (header->eventType == WeatherData::eventtype::Pressure && header->timestamp + header->expires <= currentTimestamp) {
- return WeatherData::Pressure();
+ return reinterpret_cast<const WeatherData::Pressure&>(header);
+ }
+ }
+ return {};
+ }
+
+ WeatherData::Location WeatherService::GetCurrentLocation() const {
+ uint64_t currentTimestamp = GetCurrentUnixTimestamp();
+ for (auto&& header : timeline) {
+ if (header->eventType == WeatherData::eventtype::Location && header->timestamp + header->expires <= currentTimestamp) {
+ return reinterpret_cast<const WeatherData::Location&>(header);
}
}
- return WeatherData::Pressure();
+ return {};
}
WeatherData::AirQuality WeatherService::GetCurrentQuality() const {
- return WeatherData::AirQuality();
+ uint64_t currentTimestamp = GetCurrentUnixTimestamp();
+ for (auto&& header : timeline) {
+ if (header->eventType == WeatherData::eventtype::AirQuality && header->timestamp + header->expires <= currentTimestamp) {
+ return reinterpret_cast<const WeatherData::AirQuality&>(header);
+ }
+ }
+ return {};
}
size_t WeatherService::GetTimelineLength() const {
diff --git a/src/components/ble/weather/WeatherService.h b/src/components/ble/weather/WeatherService.h
index 995f856e..5504ea49 100644
--- a/src/components/ble/weather/WeatherService.h
+++ b/src/components/ble/weather/WeatherService.h
@@ -77,42 +77,42 @@ namespace Pinetime {
* Checks if an event of a certain type exists in the timeline
* @return
*/
- bool HasTimelineEventOfType(const WeatherData::eventtype type) const;
+ bool HasTimelineEventOfType(WeatherData::eventtype type) const;
private:
// 00030000-78fc-48fe-8e23-433b3a1942d0
- static constexpr ble_uuid128_t BaseUUID() {
- return CharUUID(0x00, 0x00);
+ static constexpr ble_uuid128_t BaseUuid() {
+ return CharUuid(0x00, 0x00);
}
// 0003yyxx-78fc-48fe-8e23-433b3a1942d0
- static constexpr ble_uuid128_t CharUUID(uint8_t x, uint8_t y) {
+ static constexpr ble_uuid128_t CharUuid(uint8_t x, uint8_t y) {
return ble_uuid128_t {.u = {.type = BLE_UUID_TYPE_128},
.value = {0xd0, 0x42, 0x19, 0x3a, 0x3b, 0x43, 0x23, 0x8e, 0xfe, 0x48, 0xfc, 0x78, x, y, 0x03, 0x00}};
}
- ble_uuid128_t weatherUUID {BaseUUID()};
+ ble_uuid128_t weatherUuid {BaseUuid()};
/**
* Just write timeline data here
*/
- ble_uuid128_t weatherDataCharUUID {CharUUID(0x00, 0x01)};
+ ble_uuid128_t weatherDataCharUuid {CharUuid(0x00, 0x01)};
/**
* This doesn't take timeline data,
* provides some control over it
*/
- ble_uuid128_t weatherControlCharUUID {CharUUID(0x00, 0x02)};
+ ble_uuid128_t weatherControlCharUuid {CharUuid(0x00, 0x02)};
const struct ble_gatt_chr_def characteristicDefinition[3] = {
- {.uuid = &weatherDataCharUUID.u,
+ {.uuid = &weatherDataCharUuid.u,
.access_cb = WeatherCallback,
.arg = this,
.flags = BLE_GATT_CHR_F_WRITE,
.val_handle = &eventHandle},
- {.uuid = &weatherControlCharUUID.u, .access_cb = WeatherCallback, .arg = this, .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ},
+ {.uuid = &weatherControlCharUuid.u, .access_cb = WeatherCallback, .arg = this, .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ},
{nullptr}};
const struct ble_gatt_svc_def serviceDefinition[2] = {
- {.type = BLE_GATT_SVC_TYPE_PRIMARY, .uuid = &weatherUUID.u, .characteristics = characteristicDefinition}, {0}};
+ {.type = BLE_GATT_SVC_TYPE_PRIMARY, .uuid = &weatherUuid.u, .characteristics = characteristicDefinition}, {0}};
uint16_t eventHandle {};
diff --git a/src/displayapp/screens/Weather.cpp b/src/displayapp/screens/Weather.cpp
index a1278649..ea96c9f2 100644
--- a/src/displayapp/screens/Weather.cpp
+++ b/src/displayapp/screens/Weather.cpp
@@ -105,7 +105,6 @@ bool sortById(const TaskStatus_t& lhs, const TaskStatus_t& rhs) {
}
std::unique_ptr<Screen> Weather::CreateScreen4() {
- TaskStatus_t tasksStatus[7];
lv_obj_t* infoTask = lv_table_create(lv_scr_act(), nullptr);
lv_table_set_col_cnt(infoTask, 3);
lv_table_set_row_cnt(infoTask, 8);
@@ -118,19 +117,6 @@ std::unique_ptr<Screen> Weather::CreateScreen4() {
lv_table_set_cell_value(infoTask, 0, 2, "Free");
lv_table_set_col_width(infoTask, 2, 90);
- auto nb = uxTaskGetSystemState(tasksStatus, 7, nullptr);
- std::sort(tasksStatus, tasksStatus + nb, sortById);
- for (uint8_t i = 0; i < nb; i++) {
-
- lv_table_set_cell_value(infoTask, i + 1, 0, std::to_string(tasksStatus[i].xTaskNumber).c_str());
- lv_table_set_cell_value(infoTask, i + 1, 1, tasksStatus[i].pcTaskName);
- if (tasksStatus[i].usStackHighWaterMark < 20) {
- std::string str1 = std::to_string(tasksStatus[i].usStackHighWaterMark) + " low";
- lv_table_set_cell_value(infoTask, i + 1, 2, str1.c_str());
- } else {
- lv_table_set_cell_value(infoTask, i + 1, 2, std::to_string(tasksStatus[i].usStackHighWaterMark).c_str());
- }
- }
return std::unique_ptr<Screen>(new Screens::Label(3, 5, app, infoTask));
}
@@ -148,4 +134,4 @@ std::unique_ptr<Screen> Weather::CreateScreen5() {
lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
lv_obj_align(label, lv_scr_act(), LV_ALIGN_CENTER, 0, 0);
return std::unique_ptr<Screen>(new Screens::Label(4, 5, app, label));
-} \ No newline at end of file
+}