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);