diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
index 9c99b664..f6038816 100644
--- a/.idea/codeStyles/Project.xml
+++ b/.idea/codeStyles/Project.xml
@@ -1,54 +1,7 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/components/ble/SimpleWeatherService.cpp b/src/components/ble/SimpleWeatherService.cpp
index 146152f8..60ce4667 100644
--- a/src/components/ble/SimpleWeatherService.cpp
+++ b/src/components/ble/SimpleWeatherService.cpp
@@ -153,6 +153,81 @@ std::optional SimpleWeatherService::GetForecast(
return {};
}
+//Linear gradient temperature color calculator :)
+
+ int16_t SimpleWeatherService::RoundTemperature(int16_t temp) {
+ return temp = temp / 100 + (temp % 100 >= 50 ? 1 : 0);
+ }
+
+ const char* floatToRgbHex(std::tuple rgb) {
+ char *rgbHex = new char[7];
+ snprintf(rgbHex, 7, "%02X%02X%02X", static_cast(std::get<0>(rgb)), static_cast(std::get<1>(rgb)), static_cast(std::get<2>(rgb)));
+ return rgbHex;
+ }
+
+ std::tuple hexToFloat(int rgb) {
+ float r = ((rgb >> 16) & 0xFF);
+ float g = ((rgb >> 8) & 0xFF);
+ float b = (rgb & 0xFF);
+ return std::tuple(r, g, b);
+ }
+
+ float normalize(float value) {
+ if (value < 0.0f) {
+ return 0.0f;
+ } else if (value > 1.0f) {
+ return 1.0f;
+ } else {
+ return value;
+ }
+}
+
+ // reference: https://dev.to/ndesmic/linear-color-gradients-from-scratch-1a0e
+ std::tuple lerp(std::tuple pointA, std::tuple pointB, float normalValue) {
+ NRF_LOG_INFO("Normal value: %f", normalValue);
+ auto lerpOutput = std::tuple(
+ get<0>(pointA) + (get<0>(pointB) - get<0>(pointA)) * normalValue,
+ get<1>(pointA) + (get<1>(pointB) - get<1>(pointA)) * normalValue,
+ get<2>(pointA) + (get<2>(pointB) - get<2>(pointA)) * normalValue
+ //std::lerp(get<0>(pointA), get<0>(pointB), normalValue),
+ //std::lerp(get<1>(pointA), get<1>(pointB), normalValue),
+ //std::lerp(get<2>(pointA), get<2>(pointB), normalValue)
+ );
+ NRF_LOG_INFO("pointA: %f, %f, %f", get<0>(pointA), get<1>(pointA), get<2>(pointA));
+ NRF_LOG_INFO("pointB: %f, %f, %f", get<0>(pointB), get<1>(pointB), get<2>(pointB));
+ NRF_LOG_INFO("lerp: %f, %f, %f", get<0>(lerpOutput), get<1>(lerpOutput), get<2>(lerpOutput));
+ return lerpOutput;
+ }
+
+ const char* SimpleWeatherService::TemperatureColor(int16_t temperature) {
+ const std::vector colors = {0x5555ff, 0x00c9ff, 0xff9b00, 0xff0000};
+ std::vector> stops;
+ for (auto colorVal: colors) {
+ stops.emplace_back(hexToFloat(colorVal));
+ }
+ int tempRounded = RoundTemperature(temperature);
+ if (tempRounded < 0) {
+ tempRounded = 1;
+ }
+ // convert temperature to range between newMin and newMax
+ float oldMax = 50;
+ float oldMin = 0;
+ float newMax = 1;
+ float newMin = 0;
+ float oldRange = (oldMax - oldMin);
+ float newRange = (newMax - newMin);
+ float newValue = (((tempRounded - oldMin) * newRange) / oldRange) + newMin;
+ newValue = normalize(newValue);
+ if (newValue <= .33f) {
+ return floatToRgbHex(lerp(stops[0], stops[1], newValue));
+ } else if (newValue <= .66f) {
+ return floatToRgbHex(lerp(stops[1], stops[2], newValue));
+ } else {
+ return floatToRgbHex(lerp(stops[2], stops[3], newValue));
+ }
+ }
+
+
bool SimpleWeatherService::CurrentWeather::operator==(const SimpleWeatherService::CurrentWeather& other) const {
return this->iconId == other.iconId && this->temperature == other.temperature && this->timestamp == other.timestamp &&
this->maxTemperature == other.maxTemperature && this->minTemperature == other.maxTemperature &&
diff --git a/src/components/ble/SimpleWeatherService.h b/src/components/ble/SimpleWeatherService.h
index 4bbefcfc..e1b05ad2 100644
--- a/src/components/ble/SimpleWeatherService.h
+++ b/src/components/ble/SimpleWeatherService.h
@@ -60,7 +60,7 @@ namespace Pinetime {
Smog = 8, // Mist
Unknown = 255
};
-
+
using Location = std::array; // 32 char + \0 (end of string)
struct CurrentWeather {
@@ -111,6 +111,10 @@ namespace Pinetime {
static int16_t CelsiusToFahrenheit(int16_t celsius) {
return celsius * 9 / 5 + 3200;
}
+
+ static const char* TemperatureColor(int16_t temperature);
+
+ static int16_t RoundTemperature(int16_t temp);
private:
// 00050000-78fc-48fe-8e23-433b3a1942d0
@@ -125,7 +129,7 @@ namespace Pinetime {
}
ble_uuid128_t weatherUuid {BaseUuid()};
-
+
ble_uuid128_t weatherDataCharUuid {CharUuid(0x00, 0x01)};
const struct ble_gatt_chr_def characteristicDefinition[2] = {{.uuid = &weatherDataCharUuid.u,
diff --git a/src/displayapp/screens/WatchFaceTerminal.cpp b/src/displayapp/screens/WatchFaceTerminal.cpp
index 061db927..94b98249 100644
--- a/src/displayapp/screens/WatchFaceTerminal.cpp
+++ b/src/displayapp/screens/WatchFaceTerminal.cpp
@@ -11,6 +11,7 @@
#include "components/heartrate/HeartRateController.h"
#include "components/motion/MotionController.h"
#include "components/settings/Settings.h"
+#include "components/ble/SimpleWeatherService.h"
#include
#include
#include
@@ -122,99 +123,6 @@ WatchFaceTerminal::~WatchFaceTerminal() {
}
}
}
-
- // TODO: This code is duplicated from Weather.cpp. It would probably be better to put it in its own class, but I'm not really certain where it should go.
- int16_t RoundTemperature(int16_t temp) {
- return temp = temp / 100 + (temp % 100 >= 50 ? 1 : 0);
- }
- // End of code duplication.
-
- //Linear gradient temperature color calculator :)
-
- const char* floatToRgbHex(std::tuple rgb) {
- char *rgbHex = new char[7];
- snprintf(rgbHex, 7, "%02X%02X%02X", static_cast(std::get<0>(rgb)), static_cast(std::get<1>(rgb)), static_cast(std::get<2>(rgb)));
- return rgbHex;
- }
-
- std::tuple hexToFloat(int rgb) {
- float r = ((rgb >> 16) & 0xFF);
- float g = ((rgb >> 8) & 0xFF);
- float b = (rgb & 0xFF);
- return std::tuple(r, g, b);
- }
-
- float normalize(float value) {
- if (value < 0.0f) {
- return 0.0f;
- } else if (value > 1.0f) {
- return 1.0f;
- } else {
- return value;
- }
-}
-
- // reference: https://dev.to/ndesmic/linear-color-gradients-from-scratch-1a0e
-
- std::tuple lerp(std::tuple pointA, std::tuple pointB, float normalValue) {
- NRF_LOG_INFO("Normal value: %f", normalValue);
- auto lerpOutput = std::tuple(
- get<0>(pointA) + (get<0>(pointB) - get<0>(pointA)) * normalValue,
- get<1>(pointA) + (get<1>(pointB) - get<1>(pointA)) * normalValue,
- get<2>(pointA) + (get<2>(pointB) - get<2>(pointA)) * normalValue
- //std::lerp(get<0>(pointA), get<0>(pointB), normalValue),
- //std::lerp(get<1>(pointA), get<1>(pointB), normalValue),
- //std::lerp(get<2>(pointA), get<2>(pointB), normalValue)
- );
- NRF_LOG_INFO("pointA: %f, %f, %f", get<0>(pointA), get<1>(pointA), get<2>(pointA));
- NRF_LOG_INFO("pointB: %f, %f, %f", get<0>(pointB), get<1>(pointB), get<2>(pointB));
- NRF_LOG_INFO("lerp: %f, %f, %f", get<0>(lerpOutput), get<1>(lerpOutput), get<2>(lerpOutput));
- return lerpOutput;
- }
-
- const char* TemperatureColor(int16_t temperature) {
- const std::vector colors = {0x5555ff, 0x00c9ff, 0xff9b00, 0xff0000};
- std::vector> stops;
- for (auto colorVal: colors) {
- stops.emplace_back(hexToFloat(colorVal));
- }
- int tempRounded = RoundTemperature(temperature);
- if (tempRounded < 0) {
- tempRounded = 1;
- }
- // convert temperature to range between newMin and newMax
- float oldMax = 26;
- float oldMin = 0;
- float newMax = 1;
- float newMin = 0;
- float oldRange = (oldMax - oldMin);
- float newRange = (newMax - newMin);
- float newValue = (((tempRounded - oldMin) * newRange) / oldRange) + newMin;
- newValue = normalize(newValue);
- if (newValue <= .50f) {
- return floatToRgbHex(lerp(stops[0], stops[1], newValue));
- } else if (newValue <= .85f) {
- return floatToRgbHex(lerp(stops[1], stops[2], newValue));
- } else {
- return floatToRgbHex(lerp(stops[2], stops[3], newValue));
- }
- }
-int16_t testVal = 0;
-bool incDec = true;
- void testColor() {
- if (incDec) {
- testVal++;
- } else {
- testVal--;
- }
- if (testVal == 26) {
- incDec = false;
- }
- if (testVal == 0) {
- incDec = true;
- }
- NRF_LOG_INFO("testVal: %i", testVal);
- }
void WatchFaceTerminal::Refresh() {
powerPresent = batteryController.IsPowerPresent();
@@ -260,9 +168,9 @@ void WatchFaceTerminal::Refresh() {
int16_t temp = optCurrentWeather->temperature; // current temperature
uint8_t weatherId = static_cast(optCurrentWeather->iconId); // weather type
NRF_LOG_INFO("Raw temp: %d", temp);
- NRF_LOG_INFO("Rounded temp: %d", RoundTemperature(temp));
+ NRF_LOG_INFO("Rounded temp: %d", Controllers::SimpleWeatherService::RoundTemperature(temp));
//testColor(); //testVal * 100
- auto color = TemperatureColor(temp); // call temperature color BEFORE unit conversion
+ auto color = Controllers::SimpleWeatherService::TemperatureColor(temp); // call temperature color BEFORE unit conversion
// unit conversion
char tempUnit = 'C';
if (settingsController.GetWeatherFormat() == Controllers::Settings::WeatherFormat::Imperial) {
@@ -270,7 +178,7 @@ void WatchFaceTerminal::Refresh() {
tempUnit = 'F';
}
NRF_LOG_INFO("Color hex: %s", color);
- lv_label_set_text_fmt(weatherStatus, "[WTHR]#%s %d#°%c %s", color, RoundTemperature(temp), tempUnit, WeatherString(weatherId));
+ lv_label_set_text_fmt(weatherStatus, "[WTHR]#%s %d#°%c %s", color, Controllers::SimpleWeatherService::RoundTemperature(temp), tempUnit, WeatherString(weatherId));
delete[] color;
} else {
lv_label_set_text_static(weatherStatus, "[WTHR]No Data");