Skip to content

Commit b1dd8e9

Browse files
authored
Merge pull request #213 from jasoncoon/utc-offset
Added UTC offset to firmware & web app.
2 parents 0a4b255 + bf5f172 commit b1dd8e9

File tree

8 files changed

+267
-49
lines changed

8 files changed

+267
-49
lines changed

esp8266-fastled-webserver/Fields.cpp

+36-6
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,11 @@ const String ColorFieldType = "Color";
2424
const String SectionFieldType = "Section";
2525
const String StringFieldType = "String";
2626
const String LabelFieldType = "Label";
27+
const String UtcOffsetIndexFieldType = "UtcOffsetIndex";
2728

2829
uint8_t power = 1;
2930
uint8_t brightness = brightnessMap[brightnessIndex];
3031

31-
32-
3332
//String setPower(String value) {
3433
// power = value.toInt();
3534
// if(power < 0) power = 0;
@@ -151,6 +150,36 @@ String getCoolLikeIncandescent() {
151150
String getName() {
152151
return nameString;
153152
}
153+
String getUtcOffsetIndex() {
154+
return String(utcOffsetIndex);
155+
}
156+
157+
String setUtcOffsetIndex(uint8_t value)
158+
{
159+
utcOffsetIndex = value;
160+
if (utcOffsetIndex > 104) utcOffsetIndex = 104;
161+
162+
const int32_t UTC_OFFSET_MINIMUM_MINUTES = ((int32_t)-12) * 60; // corresponds to index 0
163+
const int32_t UTC_OFFSET_INCREMENT_MINUTES = 15; // each higher index increments by this amount
164+
165+
// minutes above the minimum
166+
int32_t tmp = utcOffsetIndex * UTC_OFFSET_INCREMENT_MINUTES;
167+
// add that to the minimum value
168+
tmp = UTC_OFFSET_MINIMUM_MINUTES + tmp;
169+
// convert to seconds
170+
utcOffsetInSeconds = tmp * 60;
171+
172+
Serial.print(F("utcOffsetIndex: ")); Serial.println(utcOffsetIndex);
173+
Serial.print(F("utcOffsetInSeconds: ")); Serial.println(utcOffsetInSeconds);
174+
timeClient.setTimeOffset(utcOffsetInSeconds);
175+
writeAndCommitSettings();
176+
return String(utcOffsetIndex);
177+
}
178+
179+
String setUtcOffsetIndexString(String value)
180+
{
181+
return setUtcOffsetIndex(value.toInt());
182+
}
154183

155184
// Pride Playground fields
156185

@@ -359,7 +388,7 @@ String getFieldsJson(const Field (&fields)[N]) {
359388
}
360389
}
361390

362-
if (field.type == NumberFieldType) {
391+
if (field.type == NumberFieldType || field.type == UtcOffsetIndexFieldType) {
363392
json += ",\"min\":" + String(field.min);
364393
json += ",\"max\":" + String(field.max);
365394
}
@@ -399,9 +428,10 @@ const Field fields[] = {
399428
{"autoplayDuration", "Autoplay Duration", NumberFieldType, 0, 255, getAutoplayDuration, nullptr, nullptr},
400429

401430
//--------------------------------------------------------------------------------------------------------
402-
{"clock", "Clock", SectionFieldType, 0, 0, nullptr, nullptr, nullptr},
403-
{"showClock", "Show Clock", BooleanFieldType, 0, 1, getShowClock, nullptr, nullptr},
404-
{"clockBackgroundFade", "Background Fade", NumberFieldType, 0, 255, getClockBackgroundFade, nullptr, nullptr},
431+
{"clock", "Clock", SectionFieldType, 0, 0, nullptr, nullptr, nullptr},
432+
{"showClock", "Show Clock", BooleanFieldType, 0, 1, getShowClock, nullptr, nullptr},
433+
{"clockBackgroundFade", "Background Fade", NumberFieldType, 0, 255, getClockBackgroundFade, nullptr, nullptr},
434+
{"utcOffsetIndex", "UTC Offset", UtcOffsetIndexFieldType, 0, 104, getUtcOffsetIndex, nullptr, setUtcOffsetIndexString},
405435

406436
//--------------------------------------------------------------------------------------------------------
407437
{"solidColorSection", "Solid Color", SectionFieldType, 0, 0, nullptr, nullptr, nullptr},

esp8266-fastled-webserver/Map.cpp

+16-16
Original file line numberDiff line numberDiff line change
@@ -442,9 +442,9 @@ void drawAnalogClock() {
442442
float minute = timeClient.getMinutes() + (second / 60.0);
443443
float hour = timeClient.getHours() + (minute / 60.0);
444444

445-
hourAngle = 256u - hour * degreesPerHour;
446-
minuteAngle = 256u - minute * degreesPerMinute;
447-
secondAngle = 256u - second * degreesPerSecond;
445+
hourAngle = 64u - hour * degreesPerHour;
446+
minuteAngle = 64u - minute * degreesPerMinute;
447+
secondAngle = 64u - second * degreesPerSecond;
448448
}
449449

450450
// 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) {
473473
float minute = timeClient.getMinutes() + (second / 60.0);
474474
float hour = timeClient.getHours() + (minute / 60.0);
475475

476-
hourAngle = 256u - hour * degreesPerHour;
477-
minuteAngle = 256u - minute * degreesPerMinute;
478-
secondAngle = 256u - second * degreesPerSecond;
476+
hourAngle = 64u - hour * degreesPerHour;
477+
minuteAngle = 64u - minute * degreesPerMinute;
478+
secondAngle = 64u - second * degreesPerSecond;
479479
}
480480

481-
drawSpiralLine(secondAngle, step_s, CRGB(0, 0, 2));
482-
drawSpiralLine(minuteAngle, step_m, CRGB(0, 2, 0));
483-
drawSpiralLine(hourAngle, step_h, CRGB(2, 0, 0));
481+
drawSpiralLine(secondAngle, step_s, CRGB::Blue );
482+
drawSpiralLine(minuteAngle, step_m, CRGB::Green);
483+
drawSpiralLine(hourAngle, step_h, CRGB::Red );
484484
}
485485
void drawSpiralAnalogClock(uint8_t step) {
486486
drawSpiralAnalogClock(step, step, step);
487487
}
488488
void drawSpiralAnalogClock13() {
489489
fadeToBlackBy(leds, NUM_PIXELS, clockBackgroundFade);
490-
drawSpiralAnalogClock(13, 13, 13);
490+
drawSpiralAnalogClock(13);
491491
}
492492
void drawSpiralAnalogClock21() {
493493
fadeToBlackBy(leds, NUM_PIXELS, clockBackgroundFade);
494-
drawSpiralAnalogClock(21, 21, 21);
494+
drawSpiralAnalogClock(21);
495495
}
496496
void drawSpiralAnalogClock34() {
497497
fadeToBlackBy(leds, NUM_PIXELS, clockBackgroundFade);
498-
drawSpiralAnalogClock(34, 34, 34);
498+
drawSpiralAnalogClock(34);
499499
}
500500
void drawSpiralAnalogClock55() {
501501
fadeToBlackBy(leds, NUM_PIXELS, clockBackgroundFade);
502-
drawSpiralAnalogClock(55, 55, 55);
502+
drawSpiralAnalogClock(55);
503503
}
504504
void drawSpiralAnalogClock89() {
505505
fadeToBlackBy(leds, NUM_PIXELS, clockBackgroundFade);
506-
drawSpiralAnalogClock(89, 89, 89);
506+
drawSpiralAnalogClock(89);
507507
}
508508
void drawSpiralAnalogClock21and34() {
509509
fadeToBlackBy(leds, NUM_PIXELS, clockBackgroundFade);
510-
drawSpiralAnalogClock(21, 21, 21);
511-
drawSpiralAnalogClock(34, 34, 34);
510+
drawSpiralAnalogClock(21);
511+
drawSpiralAnalogClock(34);
512512
}
513513
void drawSpiralAnalogClock13_21_and_34() {
514514
fadeToBlackBy(leds, NUM_PIXELS, clockBackgroundFade);

esp8266-fastled-webserver/common.h

+3
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,9 @@ extern WiFiManager wifiManager;
197197
extern ESP8266WebServer webServer;
198198
extern NTPClient timeClient;
199199
extern String nameString;
200+
extern int utcOffsetInSeconds;
201+
extern uint8_t utcOffsetIndex;
202+
extern String setUtcOffsetIndex(uint8_t value);
200203

201204
extern CRGB leds[NUM_PIXELS];
202205

esp8266-fastled-webserver/config.h

-3
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,6 @@
9090
// Set defaults for optional values
9191
// ////////////////////////////////////////////////////////////////////////////////////////////////////
9292
#if 1 // just for collapsing
93-
#if !defined(UTC_OFFSET_IN_SECONDS)
94-
#define UTC_OFFSET_IN_SECONDS (-6L * 60L * 60L) // UTC-6 (East-coast US ... no DST support)
95-
#endif
9693
#if !defined(NTP_UPDATE_THROTTLE_MILLLISECONDS)
9794
#define NTP_UPDATE_THROTTLE_MILLLISECONDS (5UL * 60UL * 60UL * 1000UL) // Ping NTP server no more than every 5 minutes
9895
#endif

esp8266-fastled-webserver/data/index.htm

+129
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,135 @@ <h4 class="panel-title">
174174
</div>
175175
</div>
176176

177+
<div id="utcOffsetIndexTemplate" class="form-group">
178+
<label class="col-sm-2 control-label"></label>
179+
<div class="col-sm-8">
180+
<select class="form-control">
181+
<option value="0">-12:00</option>
182+
<option value="1">-11:45</option>
183+
<option value="2">-11:30</option>
184+
<option value="3">-11:15</option>
185+
<option value="4">-11:00</option>
186+
<option value="5">-10:45</option>
187+
<option value="6">-10:30</option>
188+
<option value="7">-10:15</option>
189+
<option value="8">-10:00</option>
190+
<option value="9">-9:45</option>
191+
<option value="10">-9:30</option>
192+
<option value="11">-9:15</option>
193+
<option value="12">-9:00</option>
194+
<option value="13">-8:45</option>
195+
<option value="14">-8:30</option>
196+
<option value="15">-8:15</option>
197+
<option value="16">-8:00</option>
198+
<option value="17">-7:45</option>
199+
<option value="18">-7:30</option>
200+
<option value="19">-7:15</option>
201+
<option value="20">-7:00</option>
202+
<option value="21">-6:45</option>
203+
<option value="22">-6:30</option>
204+
<option value="23">-6:15</option>
205+
<option value="24">-6:00</option>
206+
<option value="25">-5:45</option>
207+
<option value="26">-5:30</option>
208+
<option value="27">-5:15</option>
209+
<option value="28">-5:00</option>
210+
<option value="29">-4:45</option>
211+
<option value="30">-4:30</option>
212+
<option value="31">-4:15</option>
213+
<option value="32">-4:00</option>
214+
<option value="33">-3:45</option>
215+
<option value="34">-3:30</option>
216+
<option value="35">-3:15</option>
217+
<option value="36">-3:00</option>
218+
<option value="37">-2:45</option>
219+
<option value="38">-2:30</option>
220+
<option value="39">-2:15</option>
221+
<option value="40">-2:00</option>
222+
<option value="41">-1:45</option>
223+
<option value="42">-1:30</option>
224+
<option value="43">-1:15</option>
225+
<option value="44">-1:00</option>
226+
<option value="45">0:45</option>
227+
<option value="46">0:30</option>
228+
<option value="47">0:15</option>
229+
<option value="48">0:00</option>
230+
<option value="49">0:45</option>
231+
<option value="50">0:30</option>
232+
<option value="51">0:15</option>
233+
<option value="52">1:00</option>
234+
<option value="53">1:45</option>
235+
<option value="54">1:30</option>
236+
<option value="55">1:15</option>
237+
<option value="56">2:00</option>
238+
<option value="57">2:45</option>
239+
<option value="58">2:30</option>
240+
<option value="59">2:15</option>
241+
<option value="60">3:00</option>
242+
<option value="61">3:45</option>
243+
<option value="62">3:30</option>
244+
<option value="63">3:15</option>
245+
<option value="64">4:00</option>
246+
<option value="65">4:45</option>
247+
<option value="66">4:30</option>
248+
<option value="67">4:15</option>
249+
<option value="68">5:00</option>
250+
<option value="69">5:45</option>
251+
<option value="70">5:30</option>
252+
<option value="71">5:15</option>
253+
<option value="72">6:00</option>
254+
<option value="73">6:45</option>
255+
<option value="74">6:30</option>
256+
<option value="75">6:15</option>
257+
<option value="76">7:00</option>
258+
<option value="77">7:45</option>
259+
<option value="78">7:30</option>
260+
<option value="79">7:15</option>
261+
<option value="80">8:00</option>
262+
<option value="81">8:45</option>
263+
<option value="82">8:30</option>
264+
<option value="83">8:15</option>
265+
<option value="84">9:00</option>
266+
<option value="85">9:45</option>
267+
<option value="86">9:30</option>
268+
<option value="87">9:15</option>
269+
<option value="88">10:00</option>
270+
<option value="89">10:45</option>
271+
<option value="90">10:30</option>
272+
<option value="91">10:15</option>
273+
<option value="92">11:00</option>
274+
<option value="93">11:45</option>
275+
<option value="94">11:30</option>
276+
<option value="95">11:15</option>
277+
<option value="96">12:00</option>
278+
<option value="97">12:45</option>
279+
<option value="98">12:30</option>
280+
<option value="99">12:15</option>
281+
<option value="100">13:00</option>
282+
<option value="101">13:45</option>
283+
<option value="102">13:30</option>
284+
<option value="103">13:15</option>
285+
<option value="104">14:00</option>
286+
</select>
287+
</div>
288+
<div class="col-sm-2">
289+
<div class="btn-group" role="group" aria-label="...">
290+
<button type="button" class="btn btn-default btn-previous"
291+
aria-label="Previous" title="Previous">
292+
<span class="glyphicon glyphicon-chevron-left"></span>
293+
</button>
294+
<button type="button" class="btn btn-default btn-next"
295+
aria-label="Next" title="Next">
296+
<span class="glyphicon glyphicon-chevron-right"></span>
297+
</button>
298+
<a class="btn btn-default" href="https://en.wikipedia.org/wiki/List_of_UTC_time_offsets" role="button"
299+
title="List of UTC time offsets" target="_blank" rel="noopener noreferrer">
300+
<span class="glyphicon glyphicon-question-sign"></span>
301+
</a>
302+
</div>
303+
</div>
304+
</div>
305+
177306
<div id="colorPaletteTemplate" class="form-group">
178307
<label class="col-sm-2 control-label color-label"></label>
179308
<div class="col-sm-10">

esp8266-fastled-webserver/data/js/app.js

+48
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,8 @@ $(document).ready(function() {
145145
addStringField(field, false);
146146
} else if (field.type == "Label") {
147147
addStringField(field, true);
148+
} else if (field.type == "UtcOffsetIndex") {
149+
addUtcOffsetIndexField(field, true);
148150
}
149151
});
150152

@@ -300,6 +302,52 @@ function addSelectField(field) {
300302
$("#form").append(template);
301303
}
302304

305+
function addUtcOffsetIndexField(field) {
306+
var template = $("#utcOffsetIndexTemplate").clone();
307+
308+
template.attr("id", "form-group-" + field.name);
309+
template.attr("data-field-type", field.type);
310+
311+
var id = "input-" + field.name;
312+
313+
var label = template.find(".control-label");
314+
label.attr("for", id);
315+
label.text(field.label);
316+
317+
var select = template.find(".form-control");
318+
select.attr("id", id);
319+
320+
select.val(field.value);
321+
322+
select.change(function () {
323+
var value = template.find("#" + id + " option:selected").index();
324+
postValue(field.name, value);
325+
});
326+
327+
var previousButton = template.find(".btn-previous");
328+
var nextButton = template.find(".btn-next");
329+
330+
previousButton.click(function () {
331+
var value = template.find("#" + id + " option:selected").index();
332+
var count = select.find("option").length;
333+
value--;
334+
if (value < 0) value = count - 1;
335+
select.val(value);
336+
postValue(field.name, value);
337+
});
338+
339+
nextButton.click(function () {
340+
var value = template.find("#" + id + " option:selected").index();
341+
var count = select.find("option").length;
342+
value++;
343+
if (value >= count) value = 0;
344+
select.val(value);
345+
postValue(field.name, value);
346+
});
347+
348+
$("#form").append(template);
349+
}
350+
303351
function addColorFieldPicker(field) {
304352
var template = $("#colorTemplate").clone();
305353

0 commit comments

Comments
 (0)