From ff26b8fe0af54a31c073c42b5021738e2971440b Mon Sep 17 00:00:00 2001 From: Ewowi Date: Fri, 12 Aug 2022 11:52:10 +0200 Subject: [PATCH] WeatherMod: move class statics back to globals using prefix --- .../usermod_v2_weather/usermod_v2_weather.h | 195 +++++++++--------- 1 file changed, 100 insertions(+), 95 deletions(-) diff --git a/usermods/usermod_v2_weather/usermod_v2_weather.h b/usermods/usermod_v2_weather/usermod_v2_weather.h index 01d35a9a..850ea850 100644 --- a/usermods/usermod_v2_weather/usermod_v2_weather.h +++ b/usermods/usermod_v2_weather/usermod_v2_weather.h @@ -4,9 +4,93 @@ // #define WEATHER_DEBUG -//forward declarations as usermod class needs them -uint16_t mode_2DWeather(void); -//would like _data_FX_MODE_2DWEATHER after effect declaration but due to class static vars not possible... +//declare weathermod global variables (always precede with weather_ (psuedo class static variables) +static uint32_t usermods_pushLoop = 0; //effect pushes loop to execute. might be interesting for audioreactive too +static uint8_t weather_units = 1; //config var metric (celsius) is default. (Standard=Kelvin, Imperial is Fahrenheit) +static float weather_minTemp = 0; //config var +static float weather_maxTemp = 40; //config var +static float weather_temps[100]; //array of temperatures +static time_t weather_times[100]; //array of corresponding times + +//effect function +uint16_t mode_2DWeather(void) { + + usermods_pushLoop = millis(); //will be reset to 0 in usermod loop + + SEGMENT.fadeToBlackBy(10); + + float currentTemp = 0; + // time_t currentTime = 0; + + for (int x=0; x= localTime) { + color = RED; + currentTemp = map(localTime, weather_times[x%100], weather_times[(x+1)%100], weather_temps[x%100] * 1000, weather_temps[(x+1)%100] * 1000) / 1000.0; + // currentTime = localTime; + } + else + color = ColorFromPalette(SEGPALETTE, map((uint8_t)weather_temps[x%100], 0, 40, 0, 255), 255, LINEARBLEND); + + for (int y=0; y millis() - 1000 && (lastTime == 0 || millis() - lastTime > 3600 * 1000)) { + if (usermods_pushLoop > millis() - 1000 && (lastTime == 0 || millis() - lastTime > 3600 * 1000)) { lastTime = millis(); WiFiClient client; char url[180]; - sprintf(url, "GET /data/2.5/forecast?lat=%f&lon=%f&appid=%s&units=%s HTTP/1.0", latitude, longitude, apiKey.c_str(), units==0?"standard":units==1?"metric":"imperial"); + sprintf(url, "GET /data/2.5/forecast?lat=%f&lon=%f&appid=%s&units=%s HTTP/1.0", latitude, longitude, apiKey.c_str(), weather_units==0?"standard":weather_units==1?"metric":"imperial"); #ifdef WEATHER_DEBUG Serial.println(url); #endif @@ -93,7 +170,6 @@ class WeatherUsermod : public Usermod { httpGet(client, url, errorMessage); if (strcmp(errorMessage, "") == 0) { - Serial.println("after httpget"); // Allocate the JSON document // Use arduinojson.org/v6/assistant to compute the capacity. // const size_t capacity = JSON_OBJECT_SIZE(3) + JSON_ARRAY_SIZE(2) + 60; @@ -117,10 +193,10 @@ class WeatherUsermod : public Usermod { uint8_t i = 0; for (JsonObject listElement: list) { - times[i%100] = listElement["dt"]; + weather_times[i%100] = listElement["dt"]; JsonObject main = listElement["main"]; - temps[i%100] = main["temp"]; + weather_temps[i%100] = main["temp"]; #ifdef WEATHER_DEBUG char timeString[64]; @@ -128,7 +204,7 @@ class WeatherUsermod : public Usermod { Serial.print(timeString); Serial.print(" temp "); - Serial.print(temps[i%100]); + Serial.print(weather_temps[i%100]); Serial.print(" city "); Serial.print(errorMessage); @@ -155,7 +231,7 @@ class WeatherUsermod : public Usermod { client.stop(); } - pushLoop = 0; + usermods_pushLoop = 0; } /* @@ -199,9 +275,9 @@ class WeatherUsermod : public Usermod { { JsonObject top = root.createNestedObject(FPSTR(_name)); top[F("apiKey")] = apiKey; - top[F("units")] = units; - top[F("minTemp")] = minTemp; - top[F("maxTemp")] = maxTemp; + top[F("units")] = weather_units; + top[F("minTemp")] = weather_minTemp; + top[F("maxTemp")] = weather_maxTemp; } @@ -212,9 +288,9 @@ class WeatherUsermod : public Usermod { bool configComplete = !top.isNull(); configComplete &= getJsonValue(top[F("apiKey")], apiKey); - configComplete &= getJsonValue(top[F("units")], units); - configComplete &= getJsonValue(top[F("minTemp")], minTemp); - configComplete &= getJsonValue(top[F("maxTemp")], maxTemp); + configComplete &= getJsonValue(top[F("units")], weather_units); + configComplete &= getJsonValue(top[F("minTemp")], weather_minTemp); + configComplete &= getJsonValue(top[F("maxTemp")], weather_maxTemp); // * Return true in case the config values returned from Usermod Settings were complete, or false if you'd like WLED to save your defaults to disk (so any missing values are editable in Usermod Settings) return configComplete; @@ -254,74 +330,3 @@ class WeatherUsermod : public Usermod { // strings to reduce flash memory usage (used more than twice) const char WeatherUsermod::_name[] PROGMEM = "WeatherUserMod"; - -//define class static variables used in weather effect -String WeatherUsermod::apiKey = ""; //config var -float WeatherUsermod::minTemp = 0; //config var -float WeatherUsermod::maxTemp = 40; //config var -uint8_t WeatherUsermod::units = 1; //config var: metric (celsius) is default. (Standard=Kelvin, Imperial is Fahrenheit) -uint32_t WeatherUsermod::pushLoop = 0; -float WeatherUsermod::temps[100]; //array of temperatures -time_t WeatherUsermod::times[100]; //array of corresponding times - -//effect function -uint16_t mode_2DWeather(void) { - - WeatherUsermod::pushLoop = millis(); //will be reset to 0 in usermod loop - - SEGMENT.fadeToBlackBy(10); - - float currentTemp = 0; - // time_t currentTime = 0; - - for (int x=0; x= localTime) { - color = RED; - currentTemp = map(localTime, WeatherUsermod::times[x%100], WeatherUsermod::times[(x+1)%100], WeatherUsermod::temps[x%100] * 1000, WeatherUsermod::temps[(x+1)%100] * 1000) / 1000.0; - // currentTime = localTime; - } - else - color = ColorFromPalette(SEGPALETTE, map((uint8_t)WeatherUsermod::temps[x%100], 0, 40, 0, 255), 255, LINEARBLEND); - - for (int y=0; y