Replaced native Cronixie support with usermod
This commit is contained in:
parent
ad301fd087
commit
a2c8796e04
@ -2,6 +2,14 @@
|
|||||||
|
|
||||||
### Builds after release 0.12.0
|
### Builds after release 0.12.0
|
||||||
|
|
||||||
|
#### Build 2203060
|
||||||
|
|
||||||
|
- Dynamic hiding of unused color controls in UI (PR #2567)
|
||||||
|
- Removed native Cronixie support and added Cronixie usermod
|
||||||
|
- Fixed disabled timed preset expanding calendar
|
||||||
|
- Fixed Color Order setting shown for analog busses
|
||||||
|
- Fixed incorrect operator (#2566)
|
||||||
|
|
||||||
#### Build 2203011
|
#### Build 2203011
|
||||||
|
|
||||||
- IR rewrite (PR #2561), supports CCT
|
- IR rewrite (PR #2561), supports CCT
|
||||||
|
@ -335,10 +335,10 @@ build_flags = ${common.build_flags_esp32} -D WLED_RELEASE_NAME=ESP32_Ethernet -D
|
|||||||
lib_deps = ${esp32.lib_deps}
|
lib_deps = ${esp32.lib_deps}
|
||||||
board_build.partitions = ${esp32.default_partitions}
|
board_build.partitions = ${esp32.default_partitions}
|
||||||
|
|
||||||
# ESP32 ETH build that fits in old 1M app space (disables Blynk, Cronixie, and Hue sync)
|
# ESP32 ETH build that fits in old 1M app space (disables Blynk and Hue sync)
|
||||||
[env:esp32_eth_ota1mapp]
|
[env:esp32_eth_ota1mapp]
|
||||||
extends = env:esp32_eth
|
extends = env:esp32_eth
|
||||||
build_flags = ${common.build_flags_esp32} -D WLED_RELEASE_NAME=ESP32_Ethernet_OTA -D RLYPIN=-1 -D WLED_USE_ETHERNET -D BTNPIN=-1 -D WLED_DISABLE_BLYNK -D WLED_DISABLE_CRONIXIE -D WLED_DISABLE_HUESYNC
|
build_flags = ${common.build_flags_esp32} -D WLED_RELEASE_NAME=ESP32_Ethernet_OTA -D RLYPIN=-1 -D WLED_USE_ETHERNET -D BTNPIN=-1 -D WLED_DISABLE_BLYNK -D WLED_DISABLE_HUESYNC
|
||||||
|
|
||||||
[env:esp32s2_saola]
|
[env:esp32s2_saola]
|
||||||
board = esp32-s2-saola-1
|
board = esp32-s2-saola-1
|
||||||
@ -529,7 +529,6 @@ board = esp32dev
|
|||||||
platform = espressif32@3.2
|
platform = espressif32@3.2
|
||||||
upload_speed = 921600
|
upload_speed = 921600
|
||||||
build_flags = ${common.build_flags_esp32} -D WLED_DISABLE_BROWNOUT_DET -D WLED_DISABLE_INFRARED
|
build_flags = ${common.build_flags_esp32} -D WLED_DISABLE_BROWNOUT_DET -D WLED_DISABLE_INFRARED
|
||||||
#-D ELEKSTUBE_DIMMING # if enabled, scale display brightness (does not set backlight, only scales contents)
|
|
||||||
-D USERMOD_RTC
|
-D USERMOD_RTC
|
||||||
-D USERMOD_ELEKSTUBE_IPS
|
-D USERMOD_ELEKSTUBE_IPS
|
||||||
-D LEDPIN=12
|
-D LEDPIN=12
|
||||||
|
@ -22,7 +22,6 @@ build_flags = ${common.build_flags_esp8266}
|
|||||||
; -D WLED_DISABLE_OTA
|
; -D WLED_DISABLE_OTA
|
||||||
; -D WLED_DISABLE_ALEXA
|
; -D WLED_DISABLE_ALEXA
|
||||||
; -D WLED_DISABLE_BLYNK
|
; -D WLED_DISABLE_BLYNK
|
||||||
; -D WLED_DISABLE_CRONIXIE
|
|
||||||
; -D WLED_DISABLE_HUESYNC
|
; -D WLED_DISABLE_HUESYNC
|
||||||
; -D WLED_DISABLE_INFRARED
|
; -D WLED_DISABLE_INFRARED
|
||||||
; -D WLED_DISABLE_WEBSOCKETS
|
; -D WLED_DISABLE_WEBSOCKETS
|
||||||
|
@ -27,7 +27,7 @@ A fast and feature-rich implementation of an ESP8266/ESP32 webserver to control
|
|||||||
- Presets can be used to automatically execute API calls
|
- Presets can be used to automatically execute API calls
|
||||||
- Nightlight function (gradually dims down)
|
- Nightlight function (gradually dims down)
|
||||||
- Full OTA software updatability (HTTP + ArduinoOTA), password protectable
|
- Full OTA software updatability (HTTP + ArduinoOTA), password protectable
|
||||||
- Configurable analog clock + support for the Cronixie kit by Diamex
|
- Configurable analog clock (Cronixie, 7-segment and EleksTube IPS clock support via usermods)
|
||||||
- Configurable Auto Brightness limit for safer operation
|
- Configurable Auto Brightness limit for safer operation
|
||||||
- Filesystem-based config for easier backup of presets and settings
|
- Filesystem-based config for easier backup of presets and settings
|
||||||
|
|
||||||
|
8
usermods/Cronixie/readme.md
Normal file
8
usermods/Cronixie/readme.md
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
# Cronixie clock usermod
|
||||||
|
|
||||||
|
This usermod supports driving the Cronixie M and L clock kits by Diamex.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
Compile and upload after adding `-D USERMOD_CRONIXIE` to `build_flags` of your PlatformIO environment.
|
||||||
|
Make sure the Auto Brightness Limiter is enabled at 420mA (!) and configure 60 WS281x LEDs.
|
301
usermods/Cronixie/usermod_cronixie.h
Normal file
301
usermods/Cronixie/usermod_cronixie.h
Normal file
@ -0,0 +1,301 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "wled.h"
|
||||||
|
|
||||||
|
class UsermodCronixie : public Usermod {
|
||||||
|
private:
|
||||||
|
unsigned long lastTime = 0;
|
||||||
|
char cronixieDisplay[7] = "HHMMSS";
|
||||||
|
byte _digitOut[6] = {10,10,10,10,10,10};
|
||||||
|
byte dP[6] = {255, 255, 255, 255, 255, 255};
|
||||||
|
|
||||||
|
// set your config variables to their boot default value (this can also be done in readFromConfig() or a constructor if you prefer)
|
||||||
|
bool backlight = true;
|
||||||
|
|
||||||
|
public:
|
||||||
|
void initCronixie()
|
||||||
|
{
|
||||||
|
if (dP[0] == 255) // if dP[0] is 255, cronixie is not yet init'ed
|
||||||
|
{
|
||||||
|
setCronixie();
|
||||||
|
strip.getSegment(0).grouping = 10; // 10 LEDs per digit
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
if (!toki.isTick()) return;
|
||||||
|
initCronixie();
|
||||||
|
_overlayCronixie();
|
||||||
|
strip.trigger();
|
||||||
|
}
|
||||||
|
|
||||||
|
byte getSameCodeLength(char code, int index, char const cronixieDisplay[])
|
||||||
|
{
|
||||||
|
byte counter = 0;
|
||||||
|
|
||||||
|
for (int i = index+1; i < 6; i++)
|
||||||
|
{
|
||||||
|
if (cronixieDisplay[i] == code)
|
||||||
|
{
|
||||||
|
counter++;
|
||||||
|
} else {
|
||||||
|
return counter;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return counter;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setCronixie()
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* digit purpose index
|
||||||
|
* 0-9 | 0-9 (incl. random)
|
||||||
|
* 10 | blank
|
||||||
|
* 11 | blank, bg off
|
||||||
|
* 12 | test upw.
|
||||||
|
* 13 | test dnw.
|
||||||
|
* 14 | binary AM/PM
|
||||||
|
* 15 | BB upper +50 for no trailing 0
|
||||||
|
* 16 | BBB
|
||||||
|
* 17 | BBBB
|
||||||
|
* 18 | BBBBB
|
||||||
|
* 19 | BBBBBB
|
||||||
|
* 20 | H
|
||||||
|
* 21 | HH
|
||||||
|
* 22 | HHH
|
||||||
|
* 23 | HHHH
|
||||||
|
* 24 | M
|
||||||
|
* 25 | MM
|
||||||
|
* 26 | MMM
|
||||||
|
* 27 | MMMM
|
||||||
|
* 28 | MMMMM
|
||||||
|
* 29 | MMMMMM
|
||||||
|
* 30 | S
|
||||||
|
* 31 | SS
|
||||||
|
* 32 | SSS
|
||||||
|
* 33 | SSSS
|
||||||
|
* 34 | SSSSS
|
||||||
|
* 35 | SSSSSS
|
||||||
|
* 36 | Y
|
||||||
|
* 37 | YY
|
||||||
|
* 38 | YYYY
|
||||||
|
* 39 | I
|
||||||
|
* 40 | II
|
||||||
|
* 41 | W
|
||||||
|
* 42 | WW
|
||||||
|
* 43 | D
|
||||||
|
* 44 | DD
|
||||||
|
* 45 | DDD
|
||||||
|
* 46 | V
|
||||||
|
* 47 | VV
|
||||||
|
* 48 | VVV
|
||||||
|
* 49 | VVVV
|
||||||
|
* 50 | VVVVV
|
||||||
|
* 51 | VVVVVV
|
||||||
|
* 52 | v
|
||||||
|
* 53 | vv
|
||||||
|
* 54 | vvv
|
||||||
|
* 55 | vvvv
|
||||||
|
* 56 | vvvvv
|
||||||
|
* 57 | vvvvvv
|
||||||
|
*/
|
||||||
|
|
||||||
|
//H HourLower | HH - Hour 24. | AH - Hour 12. | HHH Hour of Month | HHHH Hour of Year
|
||||||
|
//M MinuteUpper | MM Minute of Hour | MMM Minute of 12h | MMMM Minute of Day | MMMMM Minute of Month | MMMMMM Minute of Year
|
||||||
|
//S SecondUpper | SS Second of Minute | SSS Second of 10 Minute | SSSS Second of Hour | SSSSS Second of Day | SSSSSS Second of Week
|
||||||
|
//B AM/PM | BB 0-6/6-12/12-18/18-24 | BBB 0-3... | BBBB 0-1.5... | BBBBB 0-1 | BBBBBB 0-0.5
|
||||||
|
|
||||||
|
//Y YearLower | YY - Year LU | YYYY - Std.
|
||||||
|
//I MonthLower | II - Month of Year
|
||||||
|
//W Week of Month | WW Week of Year
|
||||||
|
//D Day of Week | DD Day Of Month | DDD Day Of Year
|
||||||
|
|
||||||
|
DEBUG_PRINT("cset ");
|
||||||
|
DEBUG_PRINTLN(cronixieDisplay);
|
||||||
|
|
||||||
|
for (int i = 0; i < 6; i++)
|
||||||
|
{
|
||||||
|
dP[i] = 10;
|
||||||
|
switch (cronixieDisplay[i])
|
||||||
|
{
|
||||||
|
case '_': dP[i] = 10; break;
|
||||||
|
case '-': dP[i] = 11; break;
|
||||||
|
case 'r': dP[i] = random(1,7); break; //random btw. 1-6
|
||||||
|
case 'R': dP[i] = random(0,10); break; //random btw. 0-9
|
||||||
|
//case 't': break; //Test upw.
|
||||||
|
//case 'T': break; //Test dnw.
|
||||||
|
case 'b': dP[i] = 14 + getSameCodeLength('b',i,cronixieDisplay); i = i+dP[i]-14; break;
|
||||||
|
case 'B': dP[i] = 14 + getSameCodeLength('B',i,cronixieDisplay); i = i+dP[i]-14; break;
|
||||||
|
case 'h': dP[i] = 70 + getSameCodeLength('h',i,cronixieDisplay); i = i+dP[i]-70; break;
|
||||||
|
case 'H': dP[i] = 20 + getSameCodeLength('H',i,cronixieDisplay); i = i+dP[i]-20; break;
|
||||||
|
case 'A': dP[i] = 108; i++; break;
|
||||||
|
case 'a': dP[i] = 58; i++; break;
|
||||||
|
case 'm': dP[i] = 74 + getSameCodeLength('m',i,cronixieDisplay); i = i+dP[i]-74; break;
|
||||||
|
case 'M': dP[i] = 24 + getSameCodeLength('M',i,cronixieDisplay); i = i+dP[i]-24; break;
|
||||||
|
case 's': dP[i] = 80 + getSameCodeLength('s',i,cronixieDisplay); i = i+dP[i]-80; break; //refresh more often bc. of secs
|
||||||
|
case 'S': dP[i] = 30 + getSameCodeLength('S',i,cronixieDisplay); i = i+dP[i]-30; break;
|
||||||
|
case 'Y': dP[i] = 36 + getSameCodeLength('Y',i,cronixieDisplay); i = i+dP[i]-36; break;
|
||||||
|
case 'y': dP[i] = 86 + getSameCodeLength('y',i,cronixieDisplay); i = i+dP[i]-86; break;
|
||||||
|
case 'I': dP[i] = 39 + getSameCodeLength('I',i,cronixieDisplay); i = i+dP[i]-39; break; //Month. Don't ask me why month and minute both start with M.
|
||||||
|
case 'i': dP[i] = 89 + getSameCodeLength('i',i,cronixieDisplay); i = i+dP[i]-89; break;
|
||||||
|
//case 'W': break;
|
||||||
|
//case 'w': break;
|
||||||
|
case 'D': dP[i] = 43 + getSameCodeLength('D',i,cronixieDisplay); i = i+dP[i]-43; break;
|
||||||
|
case 'd': dP[i] = 93 + getSameCodeLength('d',i,cronixieDisplay); i = i+dP[i]-93; break;
|
||||||
|
case '0': dP[i] = 0; break;
|
||||||
|
case '1': dP[i] = 1; break;
|
||||||
|
case '2': dP[i] = 2; break;
|
||||||
|
case '3': dP[i] = 3; break;
|
||||||
|
case '4': dP[i] = 4; break;
|
||||||
|
case '5': dP[i] = 5; break;
|
||||||
|
case '6': dP[i] = 6; break;
|
||||||
|
case '7': dP[i] = 7; break;
|
||||||
|
case '8': dP[i] = 8; break;
|
||||||
|
case '9': dP[i] = 9; break;
|
||||||
|
//case 'V': break; //user var0
|
||||||
|
//case 'v': break; //user var1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DEBUG_PRINT("result ");
|
||||||
|
for (int i = 0; i < 5; i++)
|
||||||
|
{
|
||||||
|
DEBUG_PRINT((int)dP[i]);
|
||||||
|
DEBUG_PRINT(" ");
|
||||||
|
}
|
||||||
|
DEBUG_PRINTLN((int)dP[5]);
|
||||||
|
|
||||||
|
_overlayCronixie(); // refresh
|
||||||
|
}
|
||||||
|
|
||||||
|
void _overlayCronixie()
|
||||||
|
{
|
||||||
|
byte h = hour(localTime);
|
||||||
|
byte h0 = h;
|
||||||
|
byte m = minute(localTime);
|
||||||
|
byte s = second(localTime);
|
||||||
|
byte d = day(localTime);
|
||||||
|
byte mi = month(localTime);
|
||||||
|
int y = year(localTime);
|
||||||
|
//this has to be changed in time for 22nd century
|
||||||
|
y -= 2000; if (y<0) y += 30; //makes countdown work
|
||||||
|
|
||||||
|
if (useAMPM && !countdownMode)
|
||||||
|
{
|
||||||
|
if (h>12) h-=12;
|
||||||
|
else if (h==0) h+=12;
|
||||||
|
}
|
||||||
|
for (int i = 0; i < 6; i++)
|
||||||
|
{
|
||||||
|
if (dP[i] < 12) _digitOut[i] = dP[i];
|
||||||
|
else {
|
||||||
|
if (dP[i] < 65)
|
||||||
|
{
|
||||||
|
switch(dP[i])
|
||||||
|
{
|
||||||
|
case 21: _digitOut[i] = h/10; _digitOut[i+1] = h- _digitOut[i]*10; i++; break; //HH
|
||||||
|
case 25: _digitOut[i] = m/10; _digitOut[i+1] = m- _digitOut[i]*10; i++; break; //MM
|
||||||
|
case 31: _digitOut[i] = s/10; _digitOut[i+1] = s- _digitOut[i]*10; i++; break; //SS
|
||||||
|
|
||||||
|
case 20: _digitOut[i] = h- (h/10)*10; break; //H
|
||||||
|
case 24: _digitOut[i] = m/10; break; //M
|
||||||
|
case 30: _digitOut[i] = s/10; break; //S
|
||||||
|
|
||||||
|
case 43: _digitOut[i] = weekday(localTime); _digitOut[i]--; if (_digitOut[i]<1) _digitOut[i]= 7; break; //D
|
||||||
|
case 44: _digitOut[i] = d/10; _digitOut[i+1] = d- _digitOut[i]*10; i++; break; //DD
|
||||||
|
case 40: _digitOut[i] = mi/10; _digitOut[i+1] = mi- _digitOut[i]*10; i++; break; //II
|
||||||
|
case 37: _digitOut[i] = y/10; _digitOut[i+1] = y- _digitOut[i]*10; i++; break; //YY
|
||||||
|
case 39: _digitOut[i] = 2; _digitOut[i+1] = 0; _digitOut[i+2] = y/10; _digitOut[i+3] = y- _digitOut[i+2]*10; i+=3; break; //YYYY
|
||||||
|
|
||||||
|
//case 16: _digitOut[i+2] = ((h0/3)&1)?1:0; i++; //BBB (BBBB NI)
|
||||||
|
//case 15: _digitOut[i+1] = (h0>17 || (h0>5 && h0<12))?1:0; i++; //BB
|
||||||
|
case 14: _digitOut[i] = (h0>11)?1:0; break; //B
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
switch(dP[i])
|
||||||
|
{
|
||||||
|
case 71: _digitOut[i] = h/10; _digitOut[i+1] = h- _digitOut[i]*10; if(_digitOut[i] == 0) _digitOut[i]=10; i++; break; //hh
|
||||||
|
case 75: _digitOut[i] = m/10; _digitOut[i+1] = m- _digitOut[i]*10; if(_digitOut[i] == 0) _digitOut[i]=10; i++; break; //mm
|
||||||
|
case 81: _digitOut[i] = s/10; _digitOut[i+1] = s- _digitOut[i]*10; if(_digitOut[i] == 0) _digitOut[i]=10; i++; break; //ss
|
||||||
|
//case 66: _digitOut[i+2] = ((h0/3)&1)?1:10; i++; //bbb (bbbb NI)
|
||||||
|
//case 65: _digitOut[i+1] = (h0>17 || (h0>5 && h0<12))?1:10; i++; //bb
|
||||||
|
case 64: _digitOut[i] = (h0>11)?1:10; break; //b
|
||||||
|
|
||||||
|
case 93: _digitOut[i] = weekday(localTime); _digitOut[i]--; if (_digitOut[i]<1) _digitOut[i]= 7; break; //d
|
||||||
|
case 94: _digitOut[i] = d/10; _digitOut[i+1] = d- _digitOut[i]*10; if(_digitOut[i] == 0) _digitOut[i]=10; i++; break; //dd
|
||||||
|
case 90: _digitOut[i] = mi/10; _digitOut[i+1] = mi- _digitOut[i]*10; if(_digitOut[i] == 0) _digitOut[i]=10; i++; break; //ii
|
||||||
|
case 87: _digitOut[i] = y/10; _digitOut[i+1] = y- _digitOut[i]*10; i++; break; //yy
|
||||||
|
case 89: _digitOut[i] = 2; _digitOut[i+1] = 0; _digitOut[i+2] = y/10; _digitOut[i+3] = y- _digitOut[i+2]*10; i+=3; break; //yyyy
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void handleOverlayDraw()
|
||||||
|
{
|
||||||
|
byte offsets[] = {5, 0, 6, 1, 7, 2, 8, 3, 9, 4};
|
||||||
|
|
||||||
|
for (uint16_t i = 0; i < 6; i++)
|
||||||
|
{
|
||||||
|
byte o = 10*i;
|
||||||
|
byte excl = 10;
|
||||||
|
if(_digitOut[i] < 10) excl = offsets[_digitOut[i]];
|
||||||
|
excl += o;
|
||||||
|
|
||||||
|
if (backlight && _digitOut[i] <11)
|
||||||
|
{
|
||||||
|
uint32_t col = strip.gamma32(strip.getSegment(0).colors[1]);
|
||||||
|
for (uint16_t j=o; j< o+10; j++) {
|
||||||
|
if (j != excl) strip.setPixelColor(j, col);
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
for (uint16_t j=o; j< o+10; j++) {
|
||||||
|
if (j != excl) strip.setPixelColor(j, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void addToJsonState(JsonObject& root)
|
||||||
|
{
|
||||||
|
root["nx"] = cronixieDisplay;
|
||||||
|
}
|
||||||
|
|
||||||
|
void readFromJsonState(JsonObject& root)
|
||||||
|
{
|
||||||
|
if (root["nx"].is<const char*>()) {
|
||||||
|
strncpy(cronixieDisplay, root["nx"], 6);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void addToConfig(JsonObject& root)
|
||||||
|
{
|
||||||
|
JsonObject top = root.createNestedObject(F("Cronixie"));
|
||||||
|
top["backlight"] = backlight;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool readFromConfig(JsonObject& root)
|
||||||
|
{
|
||||||
|
// default settings values could be set here (or below using the 3-argument getJsonValue()) instead of in the class definition or constructor
|
||||||
|
// setting them inside readFromConfig() is slightly more robust, handling the rare but plausible use case of single value being missing after boot (e.g. if the cfg.json was manually edited and a value was removed)
|
||||||
|
|
||||||
|
JsonObject top = root[F("Cronixie")];
|
||||||
|
|
||||||
|
bool configComplete = !top.isNull();
|
||||||
|
|
||||||
|
configComplete &= getJsonValue(top["backlight"], backlight);
|
||||||
|
|
||||||
|
return configComplete;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t getId()
|
||||||
|
{
|
||||||
|
return USERMOD_ID_CRONIXIE;
|
||||||
|
}
|
||||||
|
};
|
@ -11,6 +11,8 @@ class ElekstubeIPSUsermod : public Usermod {
|
|||||||
static const char _tubeSeg[];
|
static const char _tubeSeg[];
|
||||||
static const char _digitOffset[];
|
static const char _digitOffset[];
|
||||||
|
|
||||||
|
char cronixieDisplay[7] = "HHMMSS";
|
||||||
|
|
||||||
TFTs tfts;
|
TFTs tfts;
|
||||||
void updateClockDisplay(TFTs::show_t show=TFTs::yes) {
|
void updateClockDisplay(TFTs::show_t show=TFTs::yes) {
|
||||||
bool set[6] = {false};
|
bool set[6] = {false};
|
||||||
@ -123,6 +125,7 @@ class ElekstubeIPSUsermod : public Usermod {
|
|||||||
*/
|
*/
|
||||||
void addToJsonState(JsonObject& root)
|
void addToJsonState(JsonObject& root)
|
||||||
{
|
{
|
||||||
|
root["nx"] = cronixieDisplay;
|
||||||
root[FPSTR(_digitOffset)] = tfts.digitOffset;
|
root[FPSTR(_digitOffset)] = tfts.digitOffset;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -133,6 +136,10 @@ class ElekstubeIPSUsermod : public Usermod {
|
|||||||
*/
|
*/
|
||||||
void readFromJsonState(JsonObject& root)
|
void readFromJsonState(JsonObject& root)
|
||||||
{
|
{
|
||||||
|
if (root["nx"].is<const char*>()) {
|
||||||
|
strncpy(cronixieDisplay, root["nx"], 6);
|
||||||
|
}
|
||||||
|
|
||||||
uint8_t digitOffsetPrev = tfts.digitOffset;
|
uint8_t digitOffsetPrev = tfts.digitOffset;
|
||||||
tfts.digitOffset = root[FPSTR(_digitOffset)] | tfts.digitOffset;
|
tfts.digitOffset = root[FPSTR(_digitOffset)] | tfts.digitOffset;
|
||||||
if (tfts.digitOffset > 240) tfts.digitOffset = 240;
|
if (tfts.digitOffset > 240) tfts.digitOffset = 240;
|
||||||
|
@ -71,6 +71,7 @@
|
|||||||
#define USERMOD_RGB_ROTARY_ENCODER 22 //Usermod "rgb-rotary-encoder.h"
|
#define USERMOD_RGB_ROTARY_ENCODER 22 //Usermod "rgb-rotary-encoder.h"
|
||||||
#define USERMOD_ID_QUINLED_AN_PENTA 23 //Usermod "quinled-an-penta.h"
|
#define USERMOD_ID_QUINLED_AN_PENTA 23 //Usermod "quinled-an-penta.h"
|
||||||
#define USERMOD_ID_SSDR 24 //Usermod "usermod_v2_seven_segment_display_reloaded.h"
|
#define USERMOD_ID_SSDR 24 //Usermod "usermod_v2_seven_segment_display_reloaded.h"
|
||||||
|
#define USERMOD_ID_CRONIXIE 25 //Usermod "usermod_cronixie.h"
|
||||||
|
|
||||||
//Access point behavior
|
//Access point behavior
|
||||||
#define AP_BEHAVIOR_BOOT_NO_CONN 0 //Open AP when no connection after boot
|
#define AP_BEHAVIOR_BOOT_NO_CONN 0 //Open AP when no connection after boot
|
||||||
|
@ -36,22 +36,7 @@
|
|||||||
}
|
}
|
||||||
function Cs()
|
function Cs()
|
||||||
{
|
{
|
||||||
gId("cac").style.display="none";
|
gId("cac").style.display=(gN("OL").checked)?"block":"none";
|
||||||
gId("coc").style.display="block";
|
|
||||||
gId("ccc").style.display="none";
|
|
||||||
if (gId("ca").selected)
|
|
||||||
{
|
|
||||||
gId("cac").style.display="block";
|
|
||||||
}
|
|
||||||
if (gId("cc").selected)
|
|
||||||
{
|
|
||||||
gId("coc").style.display="none";
|
|
||||||
gId("ccc").style.display="block";
|
|
||||||
}
|
|
||||||
if (gId("cn").selected)
|
|
||||||
{
|
|
||||||
gId("coc").style.display="none";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
function BTa()
|
function BTa()
|
||||||
{
|
{
|
||||||
@ -199,24 +184,13 @@
|
|||||||
<div><i>(opens new tab, only works in browser)</i></div>
|
<div><i>(opens new tab, only works in browser)</i></div>
|
||||||
<div id="sun" class="times"></div>
|
<div id="sun" class="times"></div>
|
||||||
<h3>Clock</h3>
|
<h3>Clock</h3>
|
||||||
Clock Overlay:
|
Analog Clock overlay: <input type="checkbox" name="OL" onchange="Cs()"><br>
|
||||||
<select name="OL" onchange="Cs()">
|
|
||||||
<option value="0" id="cn" selected>None</option>
|
|
||||||
<option value="1" id="ca">Analog Clock</option>
|
|
||||||
<option value="2">Single Digit Clock</option>
|
|
||||||
<option value="3" id="cc">Cronixie Clock</option>
|
|
||||||
</select><br>
|
|
||||||
<div id="coc">
|
|
||||||
First LED: <input name="O1" type="number" min="0" max="255" required> Last LED: <input name="O2" type="number" min="0" max="255" required><br>
|
|
||||||
<div id="cac">
|
<div id="cac">
|
||||||
|
First LED: <input name="O1" type="number" min="0" max="255" required> Last LED: <input name="O2" type="number" min="0" max="255" required><br>
|
||||||
12h LED: <input name="OM" type="number" min="0" max="255" required><br>
|
12h LED: <input name="OM" type="number" min="0" max="255" required><br>
|
||||||
Show 5min marks: <input type="checkbox" name="O5"><br></div>
|
Show 5min marks: <input type="checkbox" name="O5"><br>
|
||||||
Seconds (as trail): <input type="checkbox" name="OS"><br>
|
Seconds (as trail): <input type="checkbox" name="OS"><br>
|
||||||
</div>
|
</div>
|
||||||
<div id="ccc">
|
|
||||||
Cronixie Display: <input name="CX" maxlength="6"><br>
|
|
||||||
Cronixie Backlight: <input type="checkbox" name="CB"><br>
|
|
||||||
</div>
|
|
||||||
Countdown Mode: <input type="checkbox" name="CE"><br>
|
Countdown Mode: <input type="checkbox" name="CE"><br>
|
||||||
Countdown Goal:<br>
|
Countdown Goal:<br>
|
||||||
Date: <nowrap>20<input name="CY" class="xs" type="number" min="0" max="99" required>-<input name="CI" class="xs" type="number" min="1" max="12" required>-<input name="CD" class="xs" type="number" min="1" max="31" required></nowrap><br>
|
Date: <nowrap>20<input name="CY" class="xs" type="number" min="0" max="99" required>-<input name="CI" class="xs" type="number" min="1" max="12" required>-<input name="CD" class="xs" type="number" min="1" max="31" required></nowrap><br>
|
||||||
|
@ -177,17 +177,10 @@ void calculateSunriseAndSunset();
|
|||||||
void setTimeFromAPI(uint32_t timein);
|
void setTimeFromAPI(uint32_t timein);
|
||||||
|
|
||||||
//overlay.cpp
|
//overlay.cpp
|
||||||
void initCronixie();
|
|
||||||
void handleOverlays();
|
|
||||||
void handleOverlayDraw();
|
void handleOverlayDraw();
|
||||||
void _overlayAnalogCountdown();
|
void _overlayAnalogCountdown();
|
||||||
void _overlayAnalogClock();
|
void _overlayAnalogClock();
|
||||||
|
|
||||||
byte getSameCodeLength(char code, int index, char const cronixieDisplay[]);
|
|
||||||
void setCronixie();
|
|
||||||
void _overlayCronixie();
|
|
||||||
void _drawOverlayCronixie();
|
|
||||||
|
|
||||||
//playlist.cpp
|
//playlist.cpp
|
||||||
void shufflePlaylist();
|
void shufflePlaylist();
|
||||||
void unloadPlaylist();
|
void unloadPlaylist();
|
||||||
|
@ -358,7 +358,7 @@ Keep at 115200 to use Improv. Some boards may not support high rates.</i><hr>
|
|||||||
// Autogenerated from wled00/data/settings_time.htm, do not edit!!
|
// Autogenerated from wled00/data/settings_time.htm, do not edit!!
|
||||||
const char PAGE_settings_time[] PROGMEM = R"=====(<!DOCTYPE html><html lang="en"><head><meta name="viewport" content="width=500">
|
const char PAGE_settings_time[] PROGMEM = R"=====(<!DOCTYPE html><html lang="en"><head><meta name="viewport" content="width=500">
|
||||||
<meta charset="utf-8"><title>Time Settings</title><script>
|
<meta charset="utf-8"><title>Time Settings</title><script>
|
||||||
var d=document,el=!1,ms=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],cals='style="font-size:27px;margin-top:-6px;cursor:pointer"';function H(){window.open("https://kno.wled.ge/features/settings/#time-settings")}function B(){window.open("/settings","_self")}function S(){BTa(),GetV(),updLoc(),Cs(),FC()}function gId(t){return d.getElementById(t)}function gN(t){return d.getElementsByName(t)[0]}function expand(t,e){var n=gId("WD"+e);n.style.display="none"!==n.style.display?"none":"",t.innerHTML="none"===n.style.display?"📅":"✕"}function Cs(){gId("cac").style.display="none",gId("coc").style.display="block",gId("ccc").style.display="none",gId("ca").selected&&(gId("cac").style.display="block"),gId("cc").selected&&(gId("coc").style.display="none",gId("ccc").style.display="block"),gId("cn").selected&&(gId("coc").style.display="none")}function BTa(){var t="<tr><th>En.</th><th>Hour</th><th>Minute</th><th>Preset</th><th></th></tr>";for(i=0;i<8;i++){for(t+=`<tr><td><input name="W${i}" id="W${i}" type="hidden"><input id="W${i}0" type="checkbox"></td>\n<td><input name="H${i}" class="xs" type="number" min="0" max="24"></td>\n<td><input name="N${i}" class="xs" type="number" min="0" max="59"></td>\n<td><input name="T${i}" class="s" type="number" min="0" max="250"></td>\n<td><div id="CB${i}" onclick="expand(this,${i})" ${cals}>🗓</div></td></tr>`,t+=`<tr><td colspan=5><div id="WD${i}" style="display:none;">Run on weekdays`,t+='<table style="width:100%%;"><tr><th>M</th><th>T</th><th>W</th><th>T</th><th>F</th><th>S</th><th>S</th></tr><tr>',j=1;j<8;j++)t+=`<td><input id="W${i}${j}" type="checkbox"></td>`;for(t+=`</tr></table>from\n<select name="M${i}">`,j=0;j<12;j++)t+=`<option value="${j+1}">${ms[j]}</option>`;for(t+=`</select><input name="D${i}" class="xs" type="number" min="1" max="31"></input> to\n<select name="P${i}">`,j=0;j<12;j++)t+=`<option value="${j+1}">${ms[j]}</option>`;t+=`</select><input name="E${i}" class="xs" type="number" min="1" max="31"></input>\n\t\t<hr></div></td></tr>`}for(t+=`<tr><td><input name="W8" id="W8" type="hidden"><input id="W80" type="checkbox"></td>\n<td>Sunrise<input name="H8" value="255" type="hidden"></td>\n<td><input name="N8" class="xs" type="number" min="-59" max="59"></td>\n<td><input name="T8" class="s" type="number" min="0" max="250"></td>\n<td><div id="CB8" onclick="expand(this,8)" ${cals}>🗓</div></td></tr><tr><td colspan=5>`,t+='<div id="WD8"style="display:none;"><table style="width:100%%;"><tr><th>M</th><th>T</th><th>W</th><th>T</th><th>F</th><th>S</th><th>S</th></tr><tr>',j=1;j<8;j++)t+=`<td><input id="W8${j}" type="checkbox"></td>`;for(t+="</tr></table><hr></div></td></tr>",t+=`<tr><td><input name="W9" id="W9" type="hidden"><input id="W90" type="checkbox"></td>\n<td>Sunset<input name="H9" value="255" type="hidden"></td>\n<td><input name="N9" class="xs" type="number" min="-59" max="59"></td>\n<td><input name="T9" class="s" type="number" min="0" max="250"></td>\n<td><div id="CB9" onclick="expand(this,9)" ${cals}>🗓</div></td></tr><tr><td colspan=5>`,t+='<div id="WD9" style="display:none;"><table style="width:100%%;"><tr><th>M</th><th>T</th><th>W</th><th>T</th><th>F</th><th>S</th><th>S</th></tr><tr>',j=1;j<8;j++)t+=`<td><input id="W9${j}" type="checkbox"></td>`;t+="</tr></table><hr></div></td></tr>",gId("TMT").innerHTML=t}function FC(){for(i=0;i<10;i++){let t=gId("W"+i).value;for(j=0;j<8;j++)gId("W"+i+j).checked=t>>j&1;(254!=(254&t)||i<8&&(1!=gN("M"+i).value||1!=gN("D"+i).value||12!=gN("P"+i).value||31!=gN("E"+i).value))&&expand(gId("CB"+i),i)}}function Wd(){for(a=[0,0,0,0,0,0,0,0,0,0],i=0;i<10;i++){for(m=1,j=0;j<8;j++)a[i]+=gId("W"+i+j).checked*m,m*=2;gId("W"+i).value=a[i]}"S"===d.Sf.LTR.value&&(d.Sf.LT.value=-1*parseFloat(d.Sf.LT.value)),"W"===d.Sf.LNR.value&&(d.Sf.LN.value=-1*parseFloat(d.Sf.LN.value))}function addRow(t,e,n,i){var d=gId("macros"),a=d.rows.length,l=d.insertRow(a),s=String.fromCharCode((t<10?48:55)+t);document.createElement("td");l.insertCell(0).innerHTML=`Button ${t}:`,l.insertCell(1).innerHTML=`<input name="MP${s}" type="number" class="s" min="0" max="250" value="${e}" required>`,l.insertCell(2).innerHTML=`<input name="ML${s}" type="number" class="s" min="0" max="250" value="${n}" required>`,l.insertCell(3).innerHTML=`<input name="MD${s}" type="number" class="s" min="0" max="250" value="${i}" required>`}function getLoc(){el||(window.addEventListener("message",t=>{"https://locate.wled.me"===t.origin&&t.data instanceof Object&&(d.Sf.LT.value=t.data.lat,d.Sf.LN.value=t.data.lon,updLoc())},!1),el=!0),window.open("https://locate.wled.me","_blank")}function updLoc(t){parseFloat(d.Sf.LT.value)<0?(d.Sf.LTR.value="S",d.Sf.LT.value=-1*parseFloat(d.Sf.LT.value)):d.Sf.LTR.value="N",parseFloat(d.Sf.LN.value)<0?(d.Sf.LNR.value="W",d.Sf.LN.value=-1*parseFloat(d.Sf.LN.value)):d.Sf.LNR.value="E"}function GetV() {
|
var d=document,el=!1,ms=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],cals='style="font-size:27px;margin-top:-6px;cursor:pointer"';function H(){window.open("https://kno.wled.ge/features/settings/#time-settings")}function B(){window.open("/settings","_self")}function S(){BTa(),GetV(),updLoc(),Cs(),FC()}function gId(t){return d.getElementById(t)}function gN(t){return d.getElementsByName(t)[0]}function expand(t,e){var n=gId("WD"+e);n.style.display="none"!==n.style.display?"none":"",t.innerHTML="none"===n.style.display?"📅":"✕"}function Cs(){gId("cac").style.display=gN("OL").checked?"block":"none"}function BTa(){var t="<tr><th>En.</th><th>Hour</th><th>Minute</th><th>Preset</th><th></th></tr>";for(i=0;i<8;i++){for(t+=`<tr><td><input name="W${i}" id="W${i}" type="hidden"><input id="W${i}0" type="checkbox"></td>\n<td><input name="H${i}" class="xs" type="number" min="0" max="24"></td>\n<td><input name="N${i}" class="xs" type="number" min="0" max="59"></td>\n<td><input name="T${i}" class="s" type="number" min="0" max="250"></td>\n<td><div id="CB${i}" onclick="expand(this,${i})" ${cals}>🗓</div></td></tr>`,t+=`<tr><td colspan=5><div id="WD${i}" style="display:none;">Run on weekdays`,t+='<table style="width:100%%;"><tr><th>M</th><th>T</th><th>W</th><th>T</th><th>F</th><th>S</th><th>S</th></tr><tr>',j=1;j<8;j++)t+=`<td><input id="W${i}${j}" type="checkbox"></td>`;for(t+=`</tr></table>from\n<select name="M${i}">`,j=0;j<12;j++)t+=`<option value="${j+1}">${ms[j]}</option>`;for(t+=`</select><input name="D${i}" class="xs" type="number" min="1" max="31"></input> to\n<select name="P${i}">`,j=0;j<12;j++)t+=`<option value="${j+1}">${ms[j]}</option>`;t+=`</select><input name="E${i}" class="xs" type="number" min="1" max="31"></input>\n\t\t<hr></div></td></tr>`}for(t+=`<tr><td><input name="W8" id="W8" type="hidden"><input id="W80" type="checkbox"></td>\n<td>Sunrise<input name="H8" value="255" type="hidden"></td>\n<td><input name="N8" class="xs" type="number" min="-59" max="59"></td>\n<td><input name="T8" class="s" type="number" min="0" max="250"></td>\n<td><div id="CB8" onclick="expand(this,8)" ${cals}>🗓</div></td></tr><tr><td colspan=5>`,t+='<div id="WD8"style="display:none;"><table style="width:100%%;"><tr><th>M</th><th>T</th><th>W</th><th>T</th><th>F</th><th>S</th><th>S</th></tr><tr>',j=1;j<8;j++)t+=`<td><input id="W8${j}" type="checkbox"></td>`;for(t+="</tr></table><hr></div></td></tr>",t+=`<tr><td><input name="W9" id="W9" type="hidden"><input id="W90" type="checkbox"></td>\n<td>Sunset<input name="H9" value="255" type="hidden"></td>\n<td><input name="N9" class="xs" type="number" min="-59" max="59"></td>\n<td><input name="T9" class="s" type="number" min="0" max="250"></td>\n<td><div id="CB9" onclick="expand(this,9)" ${cals}>🗓</div></td></tr><tr><td colspan=5>`,t+='<div id="WD9" style="display:none;"><table style="width:100%%;"><tr><th>M</th><th>T</th><th>W</th><th>T</th><th>F</th><th>S</th><th>S</th></tr><tr>',j=1;j<8;j++)t+=`<td><input id="W9${j}" type="checkbox"></td>`;t+="</tr></table><hr></div></td></tr>",gId("TMT").innerHTML=t}function FC(){for(i=0;i<10;i++){let t=gId("W"+i).value;for(j=0;j<8;j++)gId("W"+i+j).checked=t>>j&1;(254!=(254&t)||i<8&&(1!=gN("M"+i).value||1!=gN("D"+i).value||12!=gN("P"+i).value||31!=gN("E"+i).value))&&expand(gId("CB"+i),i)}}function Wd(){for(a=[0,0,0,0,0,0,0,0,0,0],i=0;i<10;i++){for(m=1,j=0;j<8;j++)a[i]+=gId("W"+i+j).checked*m,m*=2;gId("W"+i).value=a[i]}"S"===d.Sf.LTR.value&&(d.Sf.LT.value=-1*parseFloat(d.Sf.LT.value)),"W"===d.Sf.LNR.value&&(d.Sf.LN.value=-1*parseFloat(d.Sf.LN.value))}function addRow(t,e,n,i){var d=gId("macros"),a=d.rows.length,l=d.insertRow(a),s=String.fromCharCode((t<10?48:55)+t);document.createElement("td");l.insertCell(0).innerHTML=`Button ${t}:`,l.insertCell(1).innerHTML=`<input name="MP${s}" type="number" class="s" min="0" max="250" value="${e}" required>`,l.insertCell(2).innerHTML=`<input name="ML${s}" type="number" class="s" min="0" max="250" value="${n}" required>`,l.insertCell(3).innerHTML=`<input name="MD${s}" type="number" class="s" min="0" max="250" value="${i}" required>`}function getLoc(){el||(window.addEventListener("message",t=>{"https://locate.wled.me"===t.origin&&t.data instanceof Object&&(d.Sf.LT.value=t.data.lat,d.Sf.LN.value=t.data.lon,updLoc())},!1),el=!0),window.open("https://locate.wled.me","_blank")}function updLoc(t){parseFloat(d.Sf.LT.value)<0?(d.Sf.LTR.value="S",d.Sf.LT.value=-1*parseFloat(d.Sf.LT.value)):d.Sf.LTR.value="N",parseFloat(d.Sf.LN.value)<0?(d.Sf.LNR.value="W",d.Sf.LN.value=-1*parseFloat(d.Sf.LN.value)):d.Sf.LNR.value="E"}function GetV() {
|
||||||
%CSS%%SCSS%</head><body onload="S()"><form
|
%CSS%%SCSS%</head><body onload="S()"><form
|
||||||
id="form_s" name="Sf" method="post" onsubmit="Wd()"><div class="helpB"><button
|
id="form_s" name="Sf" method="post" onsubmit="Wd()"><div class="helpB"><button
|
||||||
type="button" onclick="H()">?</button></div><button type="button" onclick="B()">
|
type="button" onclick="H()">?</button></div><button type="button" onclick="B()">
|
||||||
@ -386,25 +386,20 @@ value="E">E</option><option value="W">W</option></select><input name="LN"
|
|||||||
type="number" class="xl" min="0" max="180" step="0.01"><br><button
|
type="number" class="xl" min="0" max="180" step="0.01"><br><button
|
||||||
type="button" id="locbtn" onclick="getLoc()">Get location</button><div><i>
|
type="button" id="locbtn" onclick="getLoc()">Get location</button><div><i>
|
||||||
(opens new tab, only works in browser)</i></div><div id="sun" class="times">
|
(opens new tab, only works in browser)</i></div><div id="sun" class="times">
|
||||||
</div><h3>Clock</h3>Clock Overlay: <select name="OL" onchange="Cs()"><option
|
</div><h3>Clock</h3>Analog Clock overlay: <input type="checkbox" name="OL"
|
||||||
value="0" id="cn" selected="selected">None</option><option value="1" id="ca">
|
onchange="Cs()"><br><div id="cac">First LED: <input name="O1" type="number"
|
||||||
Analog Clock</option><option value="2">Single Digit Clock</option><option
|
min="0" max="255" required> Last LED: <input name="O2" type="number" min="0"
|
||||||
value="3" id="cc">Cronixie Clock</option></select><br><div id="coc">First LED:
|
max="255" required><br>12h LED: <input name="OM" type="number" min="0"
|
||||||
<input name="O1" type="number" min="0" max="255" required> Last LED: <input
|
max="255" required><br>Show 5min marks: <input type="checkbox" name="O5"><br>
|
||||||
name="O2" type="number" min="0" max="255" required><br><div id="cac">12h LED:
|
Seconds (as trail): <input type="checkbox" name="OS"><br></div>Countdown Mode:
|
||||||
<input name="OM" type="number" min="0" max="255" required><br>Show 5min marks:
|
<input type="checkbox" name="CE"><br>Countdown Goal:<br>Date: <nowrap>20
|
||||||
<input type="checkbox" name="O5"><br></div>Seconds (as trail): <input
|
<input name="CY" class="xs" type="number" min="0" max="99" required>-<input
|
||||||
type="checkbox" name="OS"><br></div><div id="ccc">Cronixie Display: <input
|
name="CI" class="xs" type="number" min="1" max="12" required>-<input name="CD"
|
||||||
name="CX" maxlength="6"><br>Cronixie Backlight: <input type="checkbox"
|
class="xs" type="number" min="1" max="31" required></nowrap><br>Time:<nowrap>
|
||||||
name="CB"><br></div>Countdown Mode: <input type="checkbox" name="CE"><br>
|
<input name="CH" class="xs" type="number" min="0" max="23" required>:<input
|
||||||
Countdown Goal:<br>Date: <nowrap>20<input name="CY" class="xs"
|
name="CM" class="xs" type="number" min="0" max="59" required>:<input name="CS"
|
||||||
type="number" min="0" max="99" required>-<input name="CI" class="xs"
|
class="xs" type="number" min="0" max="59" required></nowrap><br><h3>
|
||||||
type="number" min="1" max="12" required>-<input name="CD" class="xs"
|
Macro presets</h3><b>Macros have moved!</b><br><i>
|
||||||
type="number" min="1" max="31" required></nowrap><br>Time:<nowrap><input
|
|
||||||
name="CH" class="xs" type="number" min="0" max="23" required>:<input name="CM"
|
|
||||||
class="xs" type="number" min="0" max="59" required>:<input name="CS" class="xs"
|
|
||||||
type="number" min="0" max="59" required></nowrap><br><h3>Macro presets</h3><b>
|
|
||||||
Macros have moved!</b><br><i>
|
|
||||||
Presets now also can be used as macros to save both JSON and HTTP API commands.
|
Presets now also can be used as macros to save both JSON and HTTP API commands.
|
||||||
<br>Just enter the preset ID below!</i> <i>
|
<br>Just enter the preset ID below!</i> <i>
|
||||||
Use 0 for the default action instead of a preset</i><br>Alexa On/Off Preset:
|
Use 0 for the default action instead of a preset</i><br>Alexa On/Off Preset:
|
||||||
|
@ -330,12 +330,6 @@ bool deserializeState(JsonObject root, byte callMode, byte presetId)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef WLED_DISABLE_CRONIXIE
|
|
||||||
if (root["nx"].is<const char*>()) {
|
|
||||||
strncpy(cronixieDisplay, root["nx"], 6);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
usermods.readFromJsonState(root);
|
usermods.readFromJsonState(root);
|
||||||
|
|
||||||
loadLedmap = root[F("ledmap")] | loadLedmap;
|
loadLedmap = root[F("ledmap")] | loadLedmap;
|
||||||
@ -619,7 +613,7 @@ void serializeInfo(JsonObject root)
|
|||||||
#ifndef WLED_DISABLE_BLYNK
|
#ifndef WLED_DISABLE_BLYNK
|
||||||
os += 0x20;
|
os += 0x20;
|
||||||
#endif
|
#endif
|
||||||
#ifndef WLED_DISABLE_CRONIXIE
|
#ifdef USERMOD_CRONIXIE
|
||||||
os += 0x10;
|
os += 0x10;
|
||||||
#endif
|
#endif
|
||||||
#ifndef WLED_DISABLE_FILESYSTEM
|
#ifndef WLED_DISABLE_FILESYSTEM
|
||||||
|
@ -169,7 +169,6 @@ void handleTime() {
|
|||||||
updateLocalTime();
|
updateLocalTime();
|
||||||
checkTimers();
|
checkTimers();
|
||||||
checkCountdown();
|
checkCountdown();
|
||||||
handleOverlays();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,31 +4,6 @@
|
|||||||
* Used to draw clock overlays over the strip
|
* Used to draw clock overlays over the strip
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void initCronixie()
|
|
||||||
{
|
|
||||||
if (overlayCurrent == 3 && dP[0] == 255) //if dP[0] is 255, cronixie is not yet init'ed
|
|
||||||
{
|
|
||||||
setCronixie();
|
|
||||||
strip.getSegment(0).grouping = 10; //10 LEDs per digit
|
|
||||||
} else if (dP[0] < 255 && overlayCurrent != 3)
|
|
||||||
{
|
|
||||||
strip.getSegment(0).grouping = 1;
|
|
||||||
dP[0] = 255;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//handleOverlays is essentially the equivalent of usermods.loop
|
|
||||||
void handleOverlays()
|
|
||||||
{
|
|
||||||
initCronixie();
|
|
||||||
if (overlayCurrent == 3) {
|
|
||||||
_overlayCronixie();//Diamex cronixie clock kit
|
|
||||||
strip.trigger();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void _overlayAnalogClock()
|
void _overlayAnalogClock()
|
||||||
{
|
{
|
||||||
int overlaySize = overlayMax - overlayMin +1;
|
int overlaySize = overlayMax - overlayMin +1;
|
||||||
@ -114,253 +89,9 @@ void _overlayAnalogCountdown()
|
|||||||
|
|
||||||
void handleOverlayDraw() {
|
void handleOverlayDraw() {
|
||||||
usermods.handleOverlayDraw();
|
usermods.handleOverlayDraw();
|
||||||
if (!overlayCurrent) return;
|
if (overlayCurrent == 1) _overlayAnalogClock();
|
||||||
switch (overlayCurrent)
|
|
||||||
{
|
|
||||||
case 1: _overlayAnalogClock(); break;
|
|
||||||
case 3: _drawOverlayCronixie(); break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Support for the Cronixie clock
|
* Support for the Cronixie clock has moved to a usermod, compile with "-D USERMOD_CRONIXIE" to enable
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef WLED_DISABLE_CRONIXIE
|
|
||||||
byte _digitOut[6] = {10,10,10,10,10,10};
|
|
||||||
|
|
||||||
byte getSameCodeLength(char code, int index, char const cronixieDisplay[])
|
|
||||||
{
|
|
||||||
byte counter = 0;
|
|
||||||
|
|
||||||
for (int i = index+1; i < 6; i++)
|
|
||||||
{
|
|
||||||
if (cronixieDisplay[i] == code)
|
|
||||||
{
|
|
||||||
counter++;
|
|
||||||
} else {
|
|
||||||
return counter;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return counter;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setCronixie()
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* digit purpose index
|
|
||||||
* 0-9 | 0-9 (incl. random)
|
|
||||||
* 10 | blank
|
|
||||||
* 11 | blank, bg off
|
|
||||||
* 12 | test upw.
|
|
||||||
* 13 | test dnw.
|
|
||||||
* 14 | binary AM/PM
|
|
||||||
* 15 | BB upper +50 for no trailing 0
|
|
||||||
* 16 | BBB
|
|
||||||
* 17 | BBBB
|
|
||||||
* 18 | BBBBB
|
|
||||||
* 19 | BBBBBB
|
|
||||||
* 20 | H
|
|
||||||
* 21 | HH
|
|
||||||
* 22 | HHH
|
|
||||||
* 23 | HHHH
|
|
||||||
* 24 | M
|
|
||||||
* 25 | MM
|
|
||||||
* 26 | MMM
|
|
||||||
* 27 | MMMM
|
|
||||||
* 28 | MMMMM
|
|
||||||
* 29 | MMMMMM
|
|
||||||
* 30 | S
|
|
||||||
* 31 | SS
|
|
||||||
* 32 | SSS
|
|
||||||
* 33 | SSSS
|
|
||||||
* 34 | SSSSS
|
|
||||||
* 35 | SSSSSS
|
|
||||||
* 36 | Y
|
|
||||||
* 37 | YY
|
|
||||||
* 38 | YYYY
|
|
||||||
* 39 | I
|
|
||||||
* 40 | II
|
|
||||||
* 41 | W
|
|
||||||
* 42 | WW
|
|
||||||
* 43 | D
|
|
||||||
* 44 | DD
|
|
||||||
* 45 | DDD
|
|
||||||
* 46 | V
|
|
||||||
* 47 | VV
|
|
||||||
* 48 | VVV
|
|
||||||
* 49 | VVVV
|
|
||||||
* 50 | VVVVV
|
|
||||||
* 51 | VVVVVV
|
|
||||||
* 52 | v
|
|
||||||
* 53 | vv
|
|
||||||
* 54 | vvv
|
|
||||||
* 55 | vvvv
|
|
||||||
* 56 | vvvvv
|
|
||||||
* 57 | vvvvvv
|
|
||||||
*/
|
|
||||||
|
|
||||||
//H HourLower | HH - Hour 24. | AH - Hour 12. | HHH Hour of Month | HHHH Hour of Year
|
|
||||||
//M MinuteUpper | MM Minute of Hour | MMM Minute of 12h | MMMM Minute of Day | MMMMM Minute of Month | MMMMMM Minute of Year
|
|
||||||
//S SecondUpper | SS Second of Minute | SSS Second of 10 Minute | SSSS Second of Hour | SSSSS Second of Day | SSSSSS Second of Week
|
|
||||||
//B AM/PM | BB 0-6/6-12/12-18/18-24 | BBB 0-3... | BBBB 0-1.5... | BBBBB 0-1 | BBBBBB 0-0.5
|
|
||||||
|
|
||||||
//Y YearLower | YY - Year LU | YYYY - Std.
|
|
||||||
//I MonthLower | II - Month of Year
|
|
||||||
//W Week of Month | WW Week of Year
|
|
||||||
//D Day of Week | DD Day Of Month | DDD Day Of Year
|
|
||||||
|
|
||||||
DEBUG_PRINT("cset ");
|
|
||||||
DEBUG_PRINTLN(cronixieDisplay);
|
|
||||||
|
|
||||||
for (int i = 0; i < 6; i++)
|
|
||||||
{
|
|
||||||
dP[i] = 10;
|
|
||||||
switch (cronixieDisplay[i])
|
|
||||||
{
|
|
||||||
case '_': dP[i] = 10; break;
|
|
||||||
case '-': dP[i] = 11; break;
|
|
||||||
case 'r': dP[i] = random(1,7); break; //random btw. 1-6
|
|
||||||
case 'R': dP[i] = random(0,10); break; //random btw. 0-9
|
|
||||||
//case 't': break; //Test upw.
|
|
||||||
//case 'T': break; //Test dnw.
|
|
||||||
case 'b': dP[i] = 14 + getSameCodeLength('b',i,cronixieDisplay); i = i+dP[i]-14; break;
|
|
||||||
case 'B': dP[i] = 14 + getSameCodeLength('B',i,cronixieDisplay); i = i+dP[i]-14; break;
|
|
||||||
case 'h': dP[i] = 70 + getSameCodeLength('h',i,cronixieDisplay); i = i+dP[i]-70; break;
|
|
||||||
case 'H': dP[i] = 20 + getSameCodeLength('H',i,cronixieDisplay); i = i+dP[i]-20; break;
|
|
||||||
case 'A': dP[i] = 108; i++; break;
|
|
||||||
case 'a': dP[i] = 58; i++; break;
|
|
||||||
case 'm': dP[i] = 74 + getSameCodeLength('m',i,cronixieDisplay); i = i+dP[i]-74; break;
|
|
||||||
case 'M': dP[i] = 24 + getSameCodeLength('M',i,cronixieDisplay); i = i+dP[i]-24; break;
|
|
||||||
case 's': dP[i] = 80 + getSameCodeLength('s',i,cronixieDisplay); i = i+dP[i]-80; break; //refresh more often bc. of secs
|
|
||||||
case 'S': dP[i] = 30 + getSameCodeLength('S',i,cronixieDisplay); i = i+dP[i]-30; break;
|
|
||||||
case 'Y': dP[i] = 36 + getSameCodeLength('Y',i,cronixieDisplay); i = i+dP[i]-36; break;
|
|
||||||
case 'y': dP[i] = 86 + getSameCodeLength('y',i,cronixieDisplay); i = i+dP[i]-86; break;
|
|
||||||
case 'I': dP[i] = 39 + getSameCodeLength('I',i,cronixieDisplay); i = i+dP[i]-39; break; //Month. Don't ask me why month and minute both start with M.
|
|
||||||
case 'i': dP[i] = 89 + getSameCodeLength('i',i,cronixieDisplay); i = i+dP[i]-89; break;
|
|
||||||
//case 'W': break;
|
|
||||||
//case 'w': break;
|
|
||||||
case 'D': dP[i] = 43 + getSameCodeLength('D',i,cronixieDisplay); i = i+dP[i]-43; break;
|
|
||||||
case 'd': dP[i] = 93 + getSameCodeLength('d',i,cronixieDisplay); i = i+dP[i]-93; break;
|
|
||||||
case '0': dP[i] = 0; break;
|
|
||||||
case '1': dP[i] = 1; break;
|
|
||||||
case '2': dP[i] = 2; break;
|
|
||||||
case '3': dP[i] = 3; break;
|
|
||||||
case '4': dP[i] = 4; break;
|
|
||||||
case '5': dP[i] = 5; break;
|
|
||||||
case '6': dP[i] = 6; break;
|
|
||||||
case '7': dP[i] = 7; break;
|
|
||||||
case '8': dP[i] = 8; break;
|
|
||||||
case '9': dP[i] = 9; break;
|
|
||||||
//case 'V': break; //user var0
|
|
||||||
//case 'v': break; //user var1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
DEBUG_PRINT("result ");
|
|
||||||
for (int i = 0; i < 5; i++)
|
|
||||||
{
|
|
||||||
DEBUG_PRINT((int)dP[i]);
|
|
||||||
DEBUG_PRINT(" ");
|
|
||||||
}
|
|
||||||
DEBUG_PRINTLN((int)dP[5]);
|
|
||||||
|
|
||||||
_overlayCronixie(); //refresh
|
|
||||||
}
|
|
||||||
|
|
||||||
void _overlayCronixie()
|
|
||||||
{
|
|
||||||
byte h = hour(localTime);
|
|
||||||
byte h0 = h;
|
|
||||||
byte m = minute(localTime);
|
|
||||||
byte s = second(localTime);
|
|
||||||
byte d = day(localTime);
|
|
||||||
byte mi = month(localTime);
|
|
||||||
int y = year(localTime);
|
|
||||||
//this has to be changed in time for 22nd century
|
|
||||||
y -= 2000; if (y<0) y += 30; //makes countdown work
|
|
||||||
|
|
||||||
if (useAMPM && !countdownMode)
|
|
||||||
{
|
|
||||||
if (h>12) h-=12;
|
|
||||||
else if (h==0) h+=12;
|
|
||||||
}
|
|
||||||
for (int i = 0; i < 6; i++)
|
|
||||||
{
|
|
||||||
if (dP[i] < 12) _digitOut[i] = dP[i];
|
|
||||||
else {
|
|
||||||
if (dP[i] < 65)
|
|
||||||
{
|
|
||||||
switch(dP[i])
|
|
||||||
{
|
|
||||||
case 21: _digitOut[i] = h/10; _digitOut[i+1] = h- _digitOut[i]*10; i++; break; //HH
|
|
||||||
case 25: _digitOut[i] = m/10; _digitOut[i+1] = m- _digitOut[i]*10; i++; break; //MM
|
|
||||||
case 31: _digitOut[i] = s/10; _digitOut[i+1] = s- _digitOut[i]*10; i++; break; //SS
|
|
||||||
|
|
||||||
case 20: _digitOut[i] = h- (h/10)*10; break; //H
|
|
||||||
case 24: _digitOut[i] = m/10; break; //M
|
|
||||||
case 30: _digitOut[i] = s/10; break; //S
|
|
||||||
|
|
||||||
case 43: _digitOut[i] = weekday(localTime); _digitOut[i]--; if (_digitOut[i]<1) _digitOut[i]= 7; break; //D
|
|
||||||
case 44: _digitOut[i] = d/10; _digitOut[i+1] = d- _digitOut[i]*10; i++; break; //DD
|
|
||||||
case 40: _digitOut[i] = mi/10; _digitOut[i+1] = mi- _digitOut[i]*10; i++; break; //II
|
|
||||||
case 37: _digitOut[i] = y/10; _digitOut[i+1] = y- _digitOut[i]*10; i++; break; //YY
|
|
||||||
case 39: _digitOut[i] = 2; _digitOut[i+1] = 0; _digitOut[i+2] = y/10; _digitOut[i+3] = y- _digitOut[i+2]*10; i+=3; break; //YYYY
|
|
||||||
|
|
||||||
//case 16: _digitOut[i+2] = ((h0/3)&1)?1:0; i++; //BBB (BBBB NI)
|
|
||||||
//case 15: _digitOut[i+1] = (h0>17 || (h0>5 && h0<12))?1:0; i++; //BB
|
|
||||||
case 14: _digitOut[i] = (h0>11)?1:0; break; //B
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
{
|
|
||||||
switch(dP[i])
|
|
||||||
{
|
|
||||||
case 71: _digitOut[i] = h/10; _digitOut[i+1] = h- _digitOut[i]*10; if(_digitOut[i] == 0) _digitOut[i]=10; i++; break; //hh
|
|
||||||
case 75: _digitOut[i] = m/10; _digitOut[i+1] = m- _digitOut[i]*10; if(_digitOut[i] == 0) _digitOut[i]=10; i++; break; //mm
|
|
||||||
case 81: _digitOut[i] = s/10; _digitOut[i+1] = s- _digitOut[i]*10; if(_digitOut[i] == 0) _digitOut[i]=10; i++; break; //ss
|
|
||||||
//case 66: _digitOut[i+2] = ((h0/3)&1)?1:10; i++; //bbb (bbbb NI)
|
|
||||||
//case 65: _digitOut[i+1] = (h0>17 || (h0>5 && h0<12))?1:10; i++; //bb
|
|
||||||
case 64: _digitOut[i] = (h0>11)?1:10; break; //b
|
|
||||||
|
|
||||||
case 93: _digitOut[i] = weekday(localTime); _digitOut[i]--; if (_digitOut[i]<1) _digitOut[i]= 7; break; //d
|
|
||||||
case 94: _digitOut[i] = d/10; _digitOut[i+1] = d- _digitOut[i]*10; if(_digitOut[i] == 0) _digitOut[i]=10; i++; break; //dd
|
|
||||||
case 90: _digitOut[i] = mi/10; _digitOut[i+1] = mi- _digitOut[i]*10; if(_digitOut[i] == 0) _digitOut[i]=10; i++; break; //ii
|
|
||||||
case 87: _digitOut[i] = y/10; _digitOut[i+1] = y- _digitOut[i]*10; i++; break; //yy
|
|
||||||
case 89: _digitOut[i] = 2; _digitOut[i+1] = 0; _digitOut[i+2] = y/10; _digitOut[i+3] = y- _digitOut[i+2]*10; i+=3; break; //yyyy
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void _drawOverlayCronixie()
|
|
||||||
{
|
|
||||||
byte offsets[] = {5, 0, 6, 1, 7, 2, 8, 3, 9, 4};
|
|
||||||
|
|
||||||
for (uint16_t i = 0; i < 6; i++)
|
|
||||||
{
|
|
||||||
byte o = 10*i;
|
|
||||||
byte excl = 10;
|
|
||||||
if(_digitOut[i] < 10) excl = offsets[_digitOut[i]];
|
|
||||||
excl += o;
|
|
||||||
|
|
||||||
if (cronixieBacklight && _digitOut[i] <11)
|
|
||||||
{
|
|
||||||
uint32_t col = strip.gamma32(strip.getSegment(0).colors[1]);
|
|
||||||
for (uint16_t j=o; j< o+10; j++) {
|
|
||||||
if (j != excl) strip.setPixelColor(j, col);
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
{
|
|
||||||
for (uint16_t j=o; j< o+10; j++) {
|
|
||||||
if (j != excl) strip.setPixelColor(j, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#else // WLED_DISABLE_CRONIXIE
|
|
||||||
byte getSameCodeLength(char code, int index, char const cronixieDisplay[]) { return 0; }
|
|
||||||
void setCronixie() {}
|
|
||||||
void _overlayCronixie() {}
|
|
||||||
void _drawOverlayCronixie() {}
|
|
||||||
#endif
|
|
||||||
|
@ -333,10 +333,6 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
|
|||||||
analogClock5MinuteMarks = request->hasArg(F("O5"));
|
analogClock5MinuteMarks = request->hasArg(F("O5"));
|
||||||
analogClockSecondsTrail = request->hasArg(F("OS"));
|
analogClockSecondsTrail = request->hasArg(F("OS"));
|
||||||
|
|
||||||
#ifndef WLED_DISABLE_CRONIXIE
|
|
||||||
strlcpy(cronixieDisplay,request->arg(F("CX")).c_str(),7);
|
|
||||||
cronixieBacklight = request->hasArg(F("CB"));
|
|
||||||
#endif
|
|
||||||
countdownMode = request->hasArg(F("CE"));
|
countdownMode = request->hasArg(F("CE"));
|
||||||
countdownYear = request->arg(F("CY")).toInt();
|
countdownYear = request->arg(F("CY")).toInt();
|
||||||
countdownMonth = request->arg(F("CI")).toInt();
|
countdownMonth = request->arg(F("CI")).toInt();
|
||||||
@ -944,25 +940,10 @@ bool handleSet(AsyncWebServerRequest *request, const String& req, bool apply)
|
|||||||
pos = req.indexOf(F("RB"));
|
pos = req.indexOf(F("RB"));
|
||||||
if (pos > 0) doReboot = true;
|
if (pos > 0) doReboot = true;
|
||||||
|
|
||||||
//cronixie
|
// clock mode, 0: normal, 1: countdown
|
||||||
#ifndef WLED_DISABLE_CRONIXIE
|
|
||||||
//mode, 1 countdown
|
|
||||||
pos = req.indexOf(F("NM="));
|
pos = req.indexOf(F("NM="));
|
||||||
if (pos > 0) countdownMode = (req.charAt(pos+3) != '0');
|
if (pos > 0) countdownMode = (req.charAt(pos+3) != '0');
|
||||||
|
|
||||||
pos = req.indexOf(F("NX=")); //sets digits to code
|
|
||||||
if (pos > 0) {
|
|
||||||
strlcpy(cronixieDisplay, req.substring(pos + 3, pos + 9).c_str(), 7);
|
|
||||||
setCronixie();
|
|
||||||
}
|
|
||||||
|
|
||||||
pos = req.indexOf(F("NB="));
|
|
||||||
if (pos > 0) //sets backlight
|
|
||||||
{
|
|
||||||
cronixieBacklight = (req.charAt(pos+3) != '0');
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
pos = req.indexOf(F("U0=")); //user var 0
|
pos = req.indexOf(F("U0=")); //user var 0
|
||||||
if (pos > 0) {
|
if (pos > 0) {
|
||||||
userVar0 = getNumVal(&req, pos);
|
userVar0 = getNumVal(&req, pos);
|
||||||
|
@ -104,6 +104,10 @@
|
|||||||
#include "../usermods/seven_segment_display_reloaded/usermod_seven_segment_reloaded.h"
|
#include "../usermods/seven_segment_display_reloaded/usermod_seven_segment_reloaded.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef USERMOD_CRONIXIE
|
||||||
|
#include "../usermods/Cronixie/usermod_cronixie.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef QUINLED_AN_PENTA
|
#ifdef QUINLED_AN_PENTA
|
||||||
#include "../usermods/quinled-an-penta/quinled-an-penta.h"
|
#include "../usermods/quinled-an-penta/quinled-an-penta.h"
|
||||||
#endif
|
#endif
|
||||||
@ -200,6 +204,10 @@ void registerUsermods()
|
|||||||
usermods.add(new UsermodSSDR());
|
usermods.add(new UsermodSSDR());
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef USERMOD_CRONIXIE
|
||||||
|
usermods.add(new UsermodCronixie());
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef QUINLED_AN_PENTA
|
#ifdef QUINLED_AN_PENTA
|
||||||
usermods.add(new QuinLEDAnPentaUsermod());
|
usermods.add(new QuinLEDAnPentaUsermod());
|
||||||
#endif
|
#endif
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// version code in format yymmddb (b = daily build)
|
// version code in format yymmddb (b = daily build)
|
||||||
#define VERSION 2203012
|
#define VERSION 2203060
|
||||||
|
|
||||||
//uncomment this if you have a "my_config.h" file you'd like to use
|
//uncomment this if you have a "my_config.h" file you'd like to use
|
||||||
//#define WLED_USE_MY_CONFIG
|
//#define WLED_USE_MY_CONFIG
|
||||||
@ -26,7 +26,6 @@
|
|||||||
// You can choose some of these features to disable:
|
// You can choose some of these features to disable:
|
||||||
//#define WLED_DISABLE_ALEXA // saves 11kb
|
//#define WLED_DISABLE_ALEXA // saves 11kb
|
||||||
//#define WLED_DISABLE_BLYNK // saves 6kb
|
//#define WLED_DISABLE_BLYNK // saves 6kb
|
||||||
//#define WLED_DISABLE_CRONIXIE // saves 3kb
|
|
||||||
//#define WLED_DISABLE_HUESYNC // saves 4kb
|
//#define WLED_DISABLE_HUESYNC // saves 4kb
|
||||||
//#define WLED_DISABLE_INFRARED // there is no pin left for this on ESP8266-01, saves 12kb
|
//#define WLED_DISABLE_INFRARED // there is no pin left for this on ESP8266-01, saves 12kb
|
||||||
#ifndef WLED_DISABLE_MQTT
|
#ifndef WLED_DISABLE_MQTT
|
||||||
@ -384,18 +383,13 @@ WLED_GLOBAL bool useAMPM _INIT(false); // 12h/24h clock format
|
|||||||
WLED_GLOBAL byte currentTimezone _INIT(0); // Timezone ID. Refer to timezones array in wled10_ntp.ino
|
WLED_GLOBAL byte currentTimezone _INIT(0); // Timezone ID. Refer to timezones array in wled10_ntp.ino
|
||||||
WLED_GLOBAL int utcOffsetSecs _INIT(0); // Seconds to offset from UTC before timzone calculation
|
WLED_GLOBAL int utcOffsetSecs _INIT(0); // Seconds to offset from UTC before timzone calculation
|
||||||
|
|
||||||
WLED_GLOBAL byte overlayDefault _INIT(0); // 0: no overlay 1: analog clock 2: single-digit clock 3: cronixie
|
WLED_GLOBAL byte overlayDefault _INIT(0); // 0: no overlay 1: analog clock 2: was single-digit clock 3: was cronixie
|
||||||
WLED_GLOBAL byte overlayMin _INIT(0), overlayMax _INIT(DEFAULT_LED_COUNT - 1); // boundaries of overlay mode
|
WLED_GLOBAL byte overlayMin _INIT(0), overlayMax _INIT(DEFAULT_LED_COUNT - 1); // boundaries of overlay mode
|
||||||
|
|
||||||
WLED_GLOBAL byte analogClock12pixel _INIT(0); // The pixel in your strip where "midnight" would be
|
WLED_GLOBAL byte analogClock12pixel _INIT(0); // The pixel in your strip where "midnight" would be
|
||||||
WLED_GLOBAL bool analogClockSecondsTrail _INIT(false); // Display seconds as trail of LEDs instead of a single pixel
|
WLED_GLOBAL bool analogClockSecondsTrail _INIT(false); // Display seconds as trail of LEDs instead of a single pixel
|
||||||
WLED_GLOBAL bool analogClock5MinuteMarks _INIT(false); // Light pixels at every 5-minute position
|
WLED_GLOBAL bool analogClock5MinuteMarks _INIT(false); // Light pixels at every 5-minute position
|
||||||
|
|
||||||
#ifndef WLED_DISABLE_CRONIXIE
|
|
||||||
WLED_GLOBAL char cronixieDisplay[7] _INIT("HHMMSS"); // Cronixie Display mask. See wled13_cronixie.ino
|
|
||||||
WLED_GLOBAL bool cronixieBacklight _INIT(true); // Allow digits to be back-illuminated
|
|
||||||
#endif
|
|
||||||
|
|
||||||
WLED_GLOBAL bool countdownMode _INIT(false); // Clock will count down towards date
|
WLED_GLOBAL bool countdownMode _INIT(false); // Clock will count down towards date
|
||||||
WLED_GLOBAL byte countdownYear _INIT(20), countdownMonth _INIT(1); // Countdown target date, year is last two digits
|
WLED_GLOBAL byte countdownYear _INIT(20), countdownMonth _INIT(1); // Countdown target date, year is last two digits
|
||||||
WLED_GLOBAL byte countdownDay _INIT(1) , countdownHour _INIT(0);
|
WLED_GLOBAL byte countdownDay _INIT(1) , countdownHour _INIT(0);
|
||||||
@ -505,9 +499,6 @@ WLED_GLOBAL bool hueStoreAllowed _INIT(false), hueNewKey _INIT(false);
|
|||||||
// overlays
|
// overlays
|
||||||
WLED_GLOBAL byte overlayCurrent _INIT(overlayDefault);
|
WLED_GLOBAL byte overlayCurrent _INIT(overlayDefault);
|
||||||
|
|
||||||
// cronixie
|
|
||||||
WLED_GLOBAL byte dP[] _INIT_N(({ 255, 255, 255, 255, 255, 255 }));
|
|
||||||
|
|
||||||
// countdown
|
// countdown
|
||||||
WLED_GLOBAL unsigned long countdownTime _INIT(1514764800L);
|
WLED_GLOBAL unsigned long countdownTime _INIT(1514764800L);
|
||||||
WLED_GLOBAL bool countdownOverTriggered _INIT(true);
|
WLED_GLOBAL bool countdownOverTriggered _INIT(true);
|
||||||
|
@ -199,11 +199,6 @@ void loadSettingsFromEEPROM()
|
|||||||
countdownSec = EEPROM.read(2161);
|
countdownSec = EEPROM.read(2161);
|
||||||
setCountdown();
|
setCountdown();
|
||||||
|
|
||||||
#ifndef WLED_DISABLE_CRONIXIE
|
|
||||||
readStringFromEEPROM(2165, cronixieDisplay, 6);
|
|
||||||
cronixieBacklight = EEPROM.read(2171);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//macroBoot = EEPROM.read(2175);
|
//macroBoot = EEPROM.read(2175);
|
||||||
macroAlexaOn = EEPROM.read(2176);
|
macroAlexaOn = EEPROM.read(2176);
|
||||||
macroAlexaOff = EEPROM.read(2177);
|
macroAlexaOff = EEPROM.read(2177);
|
||||||
|
@ -581,10 +581,7 @@ void getSettingsJS(byte subPage, char* dest)
|
|||||||
sappend('v',SET_F("OM"),analogClock12pixel);
|
sappend('v',SET_F("OM"),analogClock12pixel);
|
||||||
sappend('c',SET_F("OS"),analogClockSecondsTrail);
|
sappend('c',SET_F("OS"),analogClockSecondsTrail);
|
||||||
sappend('c',SET_F("O5"),analogClock5MinuteMarks);
|
sappend('c',SET_F("O5"),analogClock5MinuteMarks);
|
||||||
#ifndef WLED_DISABLE_CRONIXIE
|
|
||||||
sappends('s',SET_F("CX"),cronixieDisplay);
|
|
||||||
sappend('c',SET_F("CB"),cronixieBacklight);
|
|
||||||
#endif
|
|
||||||
sappend('c',SET_F("CE"),countdownMode);
|
sappend('c',SET_F("CE"),countdownMode);
|
||||||
sappend('v',SET_F("CY"),countdownYear);
|
sappend('v',SET_F("CY"),countdownYear);
|
||||||
sappend('v',SET_F("CI"),countdownMonth);
|
sappend('v',SET_F("CI"),countdownMonth);
|
||||||
|
Loading…
Reference in New Issue
Block a user