diff --git a/esp8266-fastled-webserver/Fields.cpp b/esp8266-fastled-webserver/Fields.cpp index f20af72a..4821eb9e 100644 --- a/esp8266-fastled-webserver/Fields.cpp +++ b/esp8266-fastled-webserver/Fields.cpp @@ -24,12 +24,11 @@ const String ColorFieldType = "Color"; const String SectionFieldType = "Section"; const String StringFieldType = "String"; const String LabelFieldType = "Label"; +const String UtcOffsetIndexFieldType = "UtcOffsetIndex"; uint8_t power = 1; uint8_t brightness = brightnessMap[brightnessIndex]; - - //String setPower(String value) { // power = value.toInt(); // if(power < 0) power = 0; @@ -151,6 +150,36 @@ String getCoolLikeIncandescent() { String getName() { return nameString; } +String getUtcOffsetIndex() { + return String(utcOffsetIndex); +} + +String setUtcOffsetIndex(uint8_t value) +{ + utcOffsetIndex = value; + if (utcOffsetIndex > 104) utcOffsetIndex = 104; + + const int32_t UTC_OFFSET_MINIMUM_MINUTES = ((int32_t)-12) * 60; // corresponds to index 0 + const int32_t UTC_OFFSET_INCREMENT_MINUTES = 15; // each higher index increments by this amount + + // minutes above the minimum + int32_t tmp = utcOffsetIndex * UTC_OFFSET_INCREMENT_MINUTES; + // add that to the minimum value + tmp = UTC_OFFSET_MINIMUM_MINUTES + tmp; + // convert to seconds + utcOffsetInSeconds = tmp * 60; + + Serial.print(F("utcOffsetIndex: ")); Serial.println(utcOffsetIndex); + Serial.print(F("utcOffsetInSeconds: ")); Serial.println(utcOffsetInSeconds); + timeClient.setTimeOffset(utcOffsetInSeconds); + writeAndCommitSettings(); + return String(utcOffsetIndex); +} + +String setUtcOffsetIndexString(String value) +{ + return setUtcOffsetIndex(value.toInt()); +} // Pride Playground fields @@ -359,7 +388,7 @@ String getFieldsJson(const Field (&fields)[N]) { } } - if (field.type == NumberFieldType) { + if (field.type == NumberFieldType || field.type == UtcOffsetIndexFieldType) { json += ",\"min\":" + String(field.min); json += ",\"max\":" + String(field.max); } @@ -399,9 +428,10 @@ const Field fields[] = { {"autoplayDuration", "Autoplay Duration", NumberFieldType, 0, 255, getAutoplayDuration, nullptr, nullptr}, //-------------------------------------------------------------------------------------------------------- - {"clock", "Clock", SectionFieldType, 0, 0, nullptr, nullptr, nullptr}, - {"showClock", "Show Clock", BooleanFieldType, 0, 1, getShowClock, nullptr, nullptr}, - {"clockBackgroundFade", "Background Fade", NumberFieldType, 0, 255, getClockBackgroundFade, nullptr, nullptr}, + {"clock", "Clock", SectionFieldType, 0, 0, nullptr, nullptr, nullptr}, + {"showClock", "Show Clock", BooleanFieldType, 0, 1, getShowClock, nullptr, nullptr}, + {"clockBackgroundFade", "Background Fade", NumberFieldType, 0, 255, getClockBackgroundFade, nullptr, nullptr}, + {"utcOffsetIndex", "UTC Offset", UtcOffsetIndexFieldType, 0, 104, getUtcOffsetIndex, nullptr, setUtcOffsetIndexString}, //-------------------------------------------------------------------------------------------------------- {"solidColorSection", "Solid Color", SectionFieldType, 0, 0, nullptr, nullptr, nullptr}, diff --git a/esp8266-fastled-webserver/Map.cpp b/esp8266-fastled-webserver/Map.cpp index b59fb188..29936ff3 100644 --- a/esp8266-fastled-webserver/Map.cpp +++ b/esp8266-fastled-webserver/Map.cpp @@ -442,9 +442,9 @@ void drawAnalogClock() { float minute = timeClient.getMinutes() + (second / 60.0); float hour = timeClient.getHours() + (minute / 60.0); - hourAngle = 256u - hour * degreesPerHour; - minuteAngle = 256u - minute * degreesPerMinute; - secondAngle = 256u - second * degreesPerSecond; + hourAngle = 64u - hour * degreesPerHour; + minuteAngle = 64u - minute * degreesPerMinute; + secondAngle = 64u - second * degreesPerSecond; } // although can update angles once every 100ms, have to perform fade & overlay with each cycle @@ -473,42 +473,42 @@ void drawSpiralAnalogClock(uint8_t step_h, uint8_t step_m, uint8_t step_s) { float minute = timeClient.getMinutes() + (second / 60.0); float hour = timeClient.getHours() + (minute / 60.0); - hourAngle = 256u - hour * degreesPerHour; - minuteAngle = 256u - minute * degreesPerMinute; - secondAngle = 256u - second * degreesPerSecond; + hourAngle = 64u - hour * degreesPerHour; + minuteAngle = 64u - minute * degreesPerMinute; + secondAngle = 64u - second * degreesPerSecond; } - drawSpiralLine(secondAngle, step_s, CRGB(0, 0, 2)); - drawSpiralLine(minuteAngle, step_m, CRGB(0, 2, 0)); - drawSpiralLine(hourAngle, step_h, CRGB(2, 0, 0)); + drawSpiralLine(secondAngle, step_s, CRGB::Blue ); + drawSpiralLine(minuteAngle, step_m, CRGB::Green); + drawSpiralLine(hourAngle, step_h, CRGB::Red ); } void drawSpiralAnalogClock(uint8_t step) { drawSpiralAnalogClock(step, step, step); } void drawSpiralAnalogClock13() { fadeToBlackBy(leds, NUM_PIXELS, clockBackgroundFade); - drawSpiralAnalogClock(13, 13, 13); + drawSpiralAnalogClock(13); } void drawSpiralAnalogClock21() { fadeToBlackBy(leds, NUM_PIXELS, clockBackgroundFade); - drawSpiralAnalogClock(21, 21, 21); + drawSpiralAnalogClock(21); } void drawSpiralAnalogClock34() { fadeToBlackBy(leds, NUM_PIXELS, clockBackgroundFade); - drawSpiralAnalogClock(34, 34, 34); + drawSpiralAnalogClock(34); } void drawSpiralAnalogClock55() { fadeToBlackBy(leds, NUM_PIXELS, clockBackgroundFade); - drawSpiralAnalogClock(55, 55, 55); + drawSpiralAnalogClock(55); } void drawSpiralAnalogClock89() { fadeToBlackBy(leds, NUM_PIXELS, clockBackgroundFade); - drawSpiralAnalogClock(89, 89, 89); + drawSpiralAnalogClock(89); } void drawSpiralAnalogClock21and34() { fadeToBlackBy(leds, NUM_PIXELS, clockBackgroundFade); - drawSpiralAnalogClock(21, 21, 21); - drawSpiralAnalogClock(34, 34, 34); + drawSpiralAnalogClock(21); + drawSpiralAnalogClock(34); } void drawSpiralAnalogClock13_21_and_34() { fadeToBlackBy(leds, NUM_PIXELS, clockBackgroundFade); diff --git a/esp8266-fastled-webserver/common.h b/esp8266-fastled-webserver/common.h index 0b0a3e1a..83f14898 100644 --- a/esp8266-fastled-webserver/common.h +++ b/esp8266-fastled-webserver/common.h @@ -197,6 +197,9 @@ extern WiFiManager wifiManager; extern ESP8266WebServer webServer; extern NTPClient timeClient; extern String nameString; +extern int utcOffsetInSeconds; +extern uint8_t utcOffsetIndex; +extern String setUtcOffsetIndex(uint8_t value); extern CRGB leds[NUM_PIXELS]; diff --git a/esp8266-fastled-webserver/config.h b/esp8266-fastled-webserver/config.h index 06a9082f..6278fef1 100644 --- a/esp8266-fastled-webserver/config.h +++ b/esp8266-fastled-webserver/config.h @@ -90,9 +90,6 @@ // Set defaults for optional values // //////////////////////////////////////////////////////////////////////////////////////////////////// #if 1 // just for collapsing - #if !defined(UTC_OFFSET_IN_SECONDS) - #define UTC_OFFSET_IN_SECONDS (-6L * 60L * 60L) // UTC-6 (East-coast US ... no DST support) - #endif #if !defined(NTP_UPDATE_THROTTLE_MILLLISECONDS) #define NTP_UPDATE_THROTTLE_MILLLISECONDS (5UL * 60UL * 60UL * 1000UL) // Ping NTP server no more than every 5 minutes #endif diff --git a/esp8266-fastled-webserver/data/index.htm b/esp8266-fastled-webserver/data/index.htm index 3400fefd..ba05ed92 100644 --- a/esp8266-fastled-webserver/data/index.htm +++ b/esp8266-fastled-webserver/data/index.htm @@ -174,6 +174,135 @@

+
+ +
+ +
+
+
+ + + + + +
+
+
+
diff --git a/esp8266-fastled-webserver/data/js/app.js b/esp8266-fastled-webserver/data/js/app.js index 02cba8be..6be83cf4 100644 --- a/esp8266-fastled-webserver/data/js/app.js +++ b/esp8266-fastled-webserver/data/js/app.js @@ -145,6 +145,8 @@ $(document).ready(function() { addStringField(field, false); } else if (field.type == "Label") { addStringField(field, true); + } else if (field.type == "UtcOffsetIndex") { + addUtcOffsetIndexField(field, true); } }); @@ -300,6 +302,52 @@ function addSelectField(field) { $("#form").append(template); } +function addUtcOffsetIndexField(field) { + var template = $("#utcOffsetIndexTemplate").clone(); + + template.attr("id", "form-group-" + field.name); + template.attr("data-field-type", field.type); + + var id = "input-" + field.name; + + var label = template.find(".control-label"); + label.attr("for", id); + label.text(field.label); + + var select = template.find(".form-control"); + select.attr("id", id); + + select.val(field.value); + + select.change(function () { + var value = template.find("#" + id + " option:selected").index(); + postValue(field.name, value); + }); + + var previousButton = template.find(".btn-previous"); + var nextButton = template.find(".btn-next"); + + previousButton.click(function () { + var value = template.find("#" + id + " option:selected").index(); + var count = select.find("option").length; + value--; + if (value < 0) value = count - 1; + select.val(value); + postValue(field.name, value); + }); + + nextButton.click(function () { + var value = template.find("#" + id + " option:selected").index(); + var count = select.find("option").length; + value++; + if (value >= count) value = 0; + select.val(value); + postValue(field.name, value); + }); + + $("#form").append(template); +} + function addColorFieldPicker(field) { var template = $("#colorTemplate").clone(); diff --git a/esp8266-fastled-webserver/esp8266-fastled-webserver.ino b/esp8266-fastled-webserver/esp8266-fastled-webserver.ino index 1b72b113..5748cff7 100644 --- a/esp8266-fastled-webserver/esp8266-fastled-webserver.ino +++ b/esp8266-fastled-webserver/esp8266-fastled-webserver.ino @@ -23,9 +23,11 @@ ESP8266WebServer webServer(80); //WebSocketsServer webSocketsServer = WebSocketsServer(81); ESP8266HTTPUpdateServer httpUpdateServer; +int utcOffsetInSeconds = -6 * 60 * 60; + // Define NTP Client to get time WiFiUDP ntpUDP; -NTPClient timeClient(ntpUDP, "pool.ntp.org", UTC_OFFSET_IN_SECONDS, NTP_UPDATE_THROTTLE_MILLLISECONDS); +NTPClient timeClient(ntpUDP, "pool.ntp.org", utcOffsetInSeconds, NTP_UPDATE_THROTTLE_MILLLISECONDS); String nameString; @@ -68,7 +70,8 @@ uint8_t autoplayDuration = 10; unsigned long autoPlayTimeout = 0; uint8_t showClock = 0; -uint8_t clockBackgroundFade = 240; +uint8_t clockBackgroundFade = 160; +uint8_t utcOffsetIndex = 24; // map(-6, -12, 14, 0, 104); -12 to 14 in 15 minute increments, mapped to 0 to 104 uint8_t currentPaletteIndex = 0; @@ -114,26 +117,6 @@ const PatternAndName patterns[] = { { colorWavesFibonacci, "Color Waves Fibonacci" }, #endif -#if HAS_COORDINATE_MAP // really a wrong name... and likely doing way more computation than necessary - { radarSweepPalette, "Radar Sweep Palette" }, -#endif -#if HAS_POLAR_COORDS // really a wrong name... and likely doing way more computation than necessary - // noise patterns (Polar variations) - { gradientPalettePolarNoise, "Gradient Palette Polar Noise" }, - { palettePolarNoise, "Palette Polar Noise" }, - { firePolarNoise, "Fire Polar Noise" }, - { firePolarNoise2, "Fire Polar Noise 2" }, - { lavaPolarNoise, "Lava Polar Noise" }, - { rainbowPolarNoise, "Rainbow Polar Noise" }, - { rainbowStripePolarNoise, "Rainbow Stripe Polar Noise" }, - { partyPolarNoise, "Party Polar Noise" }, - { forestPolarNoise, "Forest Polar Noise" }, - { cloudPolarNoise, "Cloud Polar Noise" }, - { oceanPolarNoise, "Ocean Polar Noise" }, - { blackAndWhitePolarNoise, "Black & White Polar Noise" }, - { blackAndBluePolarNoise, "Black & Blue Polar Noise" }, -#endif - #if IS_FIBONACCI { pridePlayground, "Pride Playground" }, { pridePlaygroundFibonacci, "Pride Playground Fibonacci" }, @@ -157,6 +140,10 @@ const PatternAndName patterns[] = { { pacifica_fibonacci_loop, "Pacifica Fibonacci" }, #endif +#if HAS_COORDINATE_MAP // really a wrong name... and likely doing way more computation than necessary + { radarSweepPalette, "Radar Sweep Palette" }, +#endif + #if HAS_COORDINATE_MAP // matrix patterns { anglePalette, "Angle Palette" }, @@ -172,6 +159,23 @@ const PatternAndName patterns[] = { { xyGradientPalette, "XY Axis Gradient Palette" }, #endif +#if HAS_POLAR_COORDS // really a wrong name... and likely doing way more computation than necessary + // noise patterns (Polar variations) + { gradientPalettePolarNoise, "Gradient Palette Polar Noise" }, + { palettePolarNoise, "Palette Polar Noise" }, + { firePolarNoise, "Fire Polar Noise" }, + { firePolarNoise2, "Fire Polar Noise 2" }, + { lavaPolarNoise, "Lava Polar Noise" }, + { rainbowPolarNoise, "Rainbow Polar Noise" }, + { rainbowStripePolarNoise, "Rainbow Stripe Polar Noise" }, + { partyPolarNoise, "Party Polar Noise" }, + { forestPolarNoise, "Forest Polar Noise" }, + { cloudPolarNoise, "Cloud Polar Noise" }, + { oceanPolarNoise, "Ocean Polar Noise" }, + { blackAndWhitePolarNoise, "Black & White Polar Noise" }, + { blackAndBluePolarNoise, "Black & Blue Polar Noise" }, +#endif + #if HAS_COORDINATE_MAP // noise patterns { fireNoise, "Fire Noise" }, @@ -353,6 +357,8 @@ void setup() { Serial.print(F("currentPaletteIndex: ")); Serial.println(currentPaletteIndex); Serial.print(F("showClock: ")); Serial.println(showClock); Serial.print(F("clockBackgroundFade: ")); Serial.println(clockBackgroundFade); + Serial.print(F("utcOffsetIndex: ")); Serial.println(utcOffsetIndex); + Serial.print(F("utcOffsetInSeconds: ")); Serial.println(utcOffsetInSeconds); Serial.println(); @@ -838,7 +844,10 @@ void readSettings() showClock = EEPROM.read(14); clockBackgroundFade = EEPROM.read(15); + utcOffsetIndex = EEPROM.read(16); + setUtcOffsetIndex(utcOffsetIndex); } + void writeAndCommitSettings() { EEPROM.write(0, brightness); EEPROM.write(1, currentPatternIndex); @@ -856,6 +865,7 @@ void writeAndCommitSettings() { EEPROM.write(13, coolLikeIncandescent); EEPROM.write(14, showClock); EEPROM.write(15, clockBackgroundFade); + EEPROM.write(16, utcOffsetIndex); EEPROM.write(511, SETTINGS_MAGIC_BYTE); EEPROM.commit(); } @@ -1389,7 +1399,7 @@ void fireFibonacci() { uint16_t x = coordsX[i]; uint16_t y = coordsY[i]; - uint8_t n = qsub8( inoise8((x << 2) - beat88(speed << 2), (y << 2)), x ); + uint8_t n = qsub8(inoise8((y << 2) - beat88(speed << 2), (x << 2)), y); leds[i] = ColorFromPalette(HeatColors_p, n); } @@ -1403,7 +1413,7 @@ void waterFibonacci() { uint16_t x = coordsX[i]; uint16_t y = coordsY[i]; - uint8_t n = inoise8((x << 2) + beat88(speed << 2), (y << 4)); + uint8_t n = inoise8((y << 2) + beat88(speed << 2), (x << 4)); leds[i] = ColorFromPalette(IceColors_p, n); } diff --git a/esp8266-fastled-webserver/include/Fields.hpp b/esp8266-fastled-webserver/include/Fields.hpp index e0e2ff8a..88d28a8b 100644 --- a/esp8266-fastled-webserver/include/Fields.hpp +++ b/esp8266-fastled-webserver/include/Fields.hpp @@ -24,6 +24,7 @@ extern uint8_t brightness; void setShowClock(uint8_t value); void setClockBackgroundFade(uint8_t value); +String setUtcOffsetIndexString(String value); String getFieldValue(String name); String setFieldValue(String name, String value);