Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4c9dc739ae | ||
|
|
a665607fac | ||
|
|
7f5671f975 | ||
|
|
ee6676cd89 | ||
|
|
df05754872 | ||
|
|
72223c7e42 |
@@ -1,22 +1,7 @@
|
||||
### Where are the new binaries?
|
||||
## Where are the new binaries?
|
||||
|
||||
From v0.5.0 on forward, the GitHub [releases](https://github.com/Aircoookie/WLED/releases) system will be used for binaries.
|
||||
|
||||
### What binary should I choose?
|
||||
|
||||
Currently WLED supports the ESP8266 and a very early, experimental version of ESP32 support.
|
||||
Be sure to choose the correct binary for your platform and LED type.
|
||||
|
||||
- Do you have a standard RGB WS2812B NeoPixel strip?
|
||||
--> Use wled05dev_XXXXXXX_RGB_PLATFORM.bin
|
||||
|
||||
- Do you have an RGBW SK6812 strip (half of the LED is white)?
|
||||
--> Use wled05dev_XXXXXXX_RGBW_PLATFORM.bin
|
||||
|
||||
- Do you have a Cronixie clock set by Diamex?
|
||||
--> Use wled05dev_XXXXXXX_CRONIXIE_PLATFORM.bin
|
||||
|
||||
|
||||
### What about wled03 and wled04?
|
||||
|
||||
These are legacy releases only for the ESP8266. They don't include the latest features and may have unfixed bugs - only use them if the new wled05dev test builds don't work for you!
|
||||
You should always try to use the binaries from the release page. This directory is for legacy purposes only!
|
||||
10
readme.md
10
readme.md
@@ -1,9 +1,8 @@
|
||||
## Welcome to my project WLED!
|
||||
|
||||
WLED is a fast and (relatively) secure implementation of an ESP8266 webserver to control NeoPixel (WS2812B) LEDs!
|
||||
Now also with experimental ESP32 support.
|
||||
WLED is a fast and (relatively) secure implementation of an ESP8266/ESP32 webserver to control NeoPixel (WS2812B) LEDs!
|
||||
|
||||
### Features: (V0.6.1)
|
||||
### Features: (V0.6.3)
|
||||
- RGB, HSB, and brightness sliders
|
||||
- Settings page - configuration over network
|
||||
- Access Point and station mode - automatic failsafe AP
|
||||
@@ -12,18 +11,19 @@ Now also with experimental ESP32 support.
|
||||
- Alexa smart home device server (including dimming)
|
||||
- Beta syncronization to Philips hue lights
|
||||
- Support for RGBW strips
|
||||
- 25 user presets! Save your favorite colors and effects and apply them easily!
|
||||
- 25 user presets! Save your favorite colors and effects and apply them easily! Now supports cycling through them.
|
||||
- HTTP request API for simple integration
|
||||
- Macro functions to automatically execute API calls
|
||||
- Nightlight function (gradually dims down)
|
||||
- Notifier function (multiple ESPs sync color via UDP broadcast)
|
||||
- Support for power pushbutton
|
||||
- Custom Theater Chase
|
||||
- Support for the Adalight serial ambilight protocol!
|
||||
- Full OTA software update capability (HTTP and ArduinoOTA)
|
||||
- Password protected OTA page for added security (OTA lock)
|
||||
- NTP and configurable analog clock function
|
||||
- Support for the Cronixie Clock kit by Diamex
|
||||
- Realtime UDP Packet Control (WARLS) possible
|
||||
- Realtime UDP Packet Control (WARLS, DRGB, DRGBW) possible
|
||||
- Client HTML UI controlled, customizable themes
|
||||
|
||||
### Quick start guide and documentation:
|
||||
|
||||
176
wled00/NpbWrapper.h
Normal file
176
wled00/NpbWrapper.h
Normal file
@@ -0,0 +1,176 @@
|
||||
//this code is a modified version of https://github.com/Makuna/NeoPixelBus/issues/103
|
||||
|
||||
#define WORKAROUND_ESP32_BITBANG
|
||||
//see https://github.com/Aircoookie/WLED/issues/2 for flicker free ESP32 support
|
||||
|
||||
//uncomment this if red and green are swapped
|
||||
//#define SWAPRG
|
||||
|
||||
//automatically uses the right driver method for each platform
|
||||
#ifdef ARDUINO_ARCH_ESP32
|
||||
#ifdef WORKAROUND_ESP32_BITBANG
|
||||
#define PIXELMETHOD NeoEsp32BitBangWs2813Method
|
||||
#else
|
||||
#define PIXELMETHOD NeoEsp32RmtWS2813_V3Method
|
||||
#endif
|
||||
#else
|
||||
#define PIXELMETHOD NeoEsp8266Uart800KbpsMethod
|
||||
#endif
|
||||
//handle swapping Red and Green automatically
|
||||
#ifdef SWAPRG
|
||||
#define PIXELFEATURE3 NeoRgbFeature
|
||||
#define PIXELFEATURE4 NeoRgbwFeature
|
||||
#else
|
||||
#define PIXELFEATURE3 NeoGrbFeature
|
||||
#define PIXELFEATURE4 NeoGrbwFeature
|
||||
#endif
|
||||
|
||||
#include <NeoPixelBrightnessBus.h>
|
||||
|
||||
enum NeoPixelType
|
||||
{
|
||||
NeoPixelType_None = 0,
|
||||
NeoPixelType_Grb = 1,
|
||||
NeoPixelType_Grbw = 2,
|
||||
NeoPixelType_End = 3
|
||||
};
|
||||
|
||||
class NeoPixelWrapper
|
||||
{
|
||||
public:
|
||||
NeoPixelWrapper() :
|
||||
// initialize each member to null
|
||||
_pGrb(NULL),
|
||||
_pGrbw(NULL),
|
||||
_type(NeoPixelType_None)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
~NeoPixelWrapper()
|
||||
{
|
||||
cleanup();
|
||||
}
|
||||
|
||||
void Begin(NeoPixelType type, uint16_t countPixels, uint8_t pin)
|
||||
{
|
||||
cleanup();
|
||||
_type = type;
|
||||
|
||||
switch (_type) {
|
||||
|
||||
case NeoPixelType_Grb:
|
||||
_pGrb = new NeoPixelBrightnessBus<PIXELFEATURE3,PIXELMETHOD>(countPixels, pin);
|
||||
_pGrb->Begin();
|
||||
break;
|
||||
|
||||
case NeoPixelType_Grbw:
|
||||
_pGrbw = new NeoPixelBrightnessBus<PIXELFEATURE4,PIXELMETHOD>(countPixels, pin);
|
||||
_pGrbw->Begin();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void Show()
|
||||
{
|
||||
#ifdef ARDUINO_ARCH_ESP32
|
||||
#ifdef WORKAROUND_ESP32_BITBANG
|
||||
delay(1);
|
||||
portDISABLE_INTERRUPTS(); //this is a workaround to prevent flickering (see https://github.com/adafruit/Adafruit_NeoPixel/issues/139)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
switch (_type) {
|
||||
case NeoPixelType_Grb: _pGrb->Show(); break;
|
||||
case NeoPixelType_Grbw: _pGrbw->Show(); break;
|
||||
}
|
||||
|
||||
#ifdef ARDUINO_ARCH_ESP32
|
||||
#ifdef WORKAROUND_ESP32_BITBANG
|
||||
portENABLE_INTERRUPTS();
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
bool CanShow() const
|
||||
{
|
||||
switch (_type) {
|
||||
case NeoPixelType_Grb: _pGrb->CanShow(); break;
|
||||
case NeoPixelType_Grbw: _pGrbw->CanShow(); break;
|
||||
}
|
||||
}
|
||||
|
||||
void SetPixelColor(uint16_t indexPixel, RgbColor color)
|
||||
{
|
||||
switch (_type) {
|
||||
case NeoPixelType_Grb: _pGrb->SetPixelColor(indexPixel, color); break;
|
||||
case NeoPixelType_Grbw:_pGrbw->SetPixelColor(indexPixel, color); break;
|
||||
}
|
||||
}
|
||||
|
||||
void SetPixelColor(uint16_t indexPixel, RgbwColor color)
|
||||
{
|
||||
switch (_type) {
|
||||
case NeoPixelType_Grb: _pGrbw->SetPixelColor(indexPixel, color); break;
|
||||
case NeoPixelType_Grbw: _pGrbw->SetPixelColor(indexPixel, color); break;
|
||||
}
|
||||
}
|
||||
|
||||
void SetBrightness(byte b)
|
||||
{
|
||||
switch (_type) {
|
||||
case NeoPixelType_Grb: _pGrb->SetBrightness(b); break;
|
||||
case NeoPixelType_Grbw:_pGrbw->SetBrightness(b); break;
|
||||
}
|
||||
}
|
||||
|
||||
RgbColor GetPixelColor(uint16_t indexPixel) const
|
||||
{
|
||||
switch (_type) {
|
||||
case NeoPixelType_Grb: return _pGrb->GetPixelColor(indexPixel); break;
|
||||
case NeoPixelType_Grbw: /*doesn't support it so we don't return it*/ break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// NOTE: Due to feature differences, some support RGBW but the method name
|
||||
// here needs to be unique, thus GetPixeColorRgbw
|
||||
RgbwColor GetPixelColorRgbw(uint16_t indexPixel) const
|
||||
{
|
||||
switch (_type) {
|
||||
case NeoPixelType_Grb: return _pGrb->GetPixelColor(indexPixel); break;
|
||||
case NeoPixelType_Grbw: return _pGrbw->GetPixelColor(indexPixel); break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void ClearTo(RgbColor color)
|
||||
{
|
||||
switch (_type) {
|
||||
case NeoPixelType_Grb: _pGrb->ClearTo(color); break;
|
||||
case NeoPixelType_Grbw:_pGrbw->ClearTo(color); break;
|
||||
}
|
||||
}
|
||||
|
||||
void ClearTo(RgbwColor color)
|
||||
{
|
||||
switch (_type) {
|
||||
case NeoPixelType_Grb: break;
|
||||
case NeoPixelType_Grbw:_pGrbw->ClearTo(color); break;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
NeoPixelType _type;
|
||||
|
||||
// have a member for every possible type
|
||||
NeoPixelBrightnessBus<PIXELFEATURE3,PIXELMETHOD>* _pGrb;
|
||||
NeoPixelBrightnessBus<PIXELFEATURE4,PIXELMETHOD>* _pGrbw;
|
||||
|
||||
void cleanup()
|
||||
{
|
||||
switch (_type) {
|
||||
case NeoPixelType_Grb: delete _pGrb ; _pGrb = NULL; break;
|
||||
case NeoPixelType_Grbw: delete _pGrbw; _pGrbw = NULL; break;
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -37,9 +37,9 @@
|
||||
|
||||
#define CALL_MODE(n) (this->*_mode[n])();
|
||||
|
||||
void WS2812FX::init() {
|
||||
void WS2812FX::init(bool supportWhite, uint16_t countPixels, uint8_t pin) {
|
||||
begin(supportWhite,countPixels,pin);
|
||||
for (int i=0; i < _led_count; i++) _locked[i] = false;
|
||||
begin();
|
||||
WS2812FX::setBrightness(_brightness);
|
||||
show();
|
||||
}
|
||||
@@ -66,6 +66,7 @@ void WS2812FX::start() {
|
||||
_counter_mode_step = 0;
|
||||
_mode_last_call_time = 0;
|
||||
_running = true;
|
||||
show();
|
||||
}
|
||||
|
||||
void WS2812FX::stop() {
|
||||
@@ -85,11 +86,8 @@ void WS2812FX::setMode(byte m) {
|
||||
}
|
||||
|
||||
void WS2812FX::setSpeed(byte s) {
|
||||
_counter_mode_call = 0;
|
||||
_counter_mode_step = 0;
|
||||
_mode_last_call_time = 0;
|
||||
_speed = constrain(s, SPEED_MIN, SPEED_MAX);
|
||||
strip_off_respectLock();
|
||||
}
|
||||
|
||||
void WS2812FX::increaseSpeed(byte s) {
|
||||
@@ -322,31 +320,35 @@ void WS2812FX::mode_random_color(void) {
|
||||
|
||||
|
||||
/*
|
||||
* Lights every LED in a random color. Changes one random LED after the other
|
||||
* to another random color.
|
||||
* Lights some pastel colors
|
||||
*/
|
||||
void WS2812FX::mode_single_dynamic(void) {
|
||||
if(_counter_mode_call == 0) {
|
||||
for(uint16_t i=0; i < _led_count; i++) {
|
||||
if (!_locked[i])
|
||||
setPixelColor(i, color_wheel(random(256)));
|
||||
}
|
||||
}
|
||||
int ran = random(_led_count);
|
||||
if (!_locked[ran])
|
||||
setPixelColor(ran, color_wheel(random(256)));
|
||||
show();
|
||||
_mode_delay = 10 + ((5000 * (uint32_t)(SPEED_MAX - _speed)) / SPEED_MAX);
|
||||
void WS2812FX::mode_easter(void) {
|
||||
//uint32_t cols[]{0x00F7ECC5,0x00F8D5C7,0x00F9E2E7,0x00BED9D4,0x00F7ECC5,0x00F8D5C7,0x00F9E2E7};
|
||||
uint32_t cols[]{0x00FF8040,0x00E5D241,0x0077FF77,0x0077F0F0,0x00FF8040,0x00E5D241,0x0077FF77};
|
||||
mode_colorful_internal(cols);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Lights multiple random leds in a random color (higher intensity, more updates)
|
||||
*/
|
||||
void WS2812FX::mode_multi_dynamic(void) {
|
||||
for(uint16_t i=0; i < _led_count; i++) {
|
||||
if (!_locked[i] && random(256)<=_intensity)
|
||||
setPixelColor(i, color_wheel(random(256)));
|
||||
void WS2812FX::mode_dynamic(void) {
|
||||
if(_counter_mode_call == 0) {
|
||||
for(uint16_t i=0; i < _led_count; i++) {
|
||||
if (!_locked[i])
|
||||
setPixelColor(i, color_wheel(random(256)));
|
||||
}
|
||||
}
|
||||
if (_intensity > 0) //multi dynamic
|
||||
{
|
||||
for(uint16_t i=0; i < _led_count; i++) {
|
||||
if (!_locked[i] && random(256)<_intensity)
|
||||
setPixelColor(i, color_wheel(random(256)));
|
||||
}
|
||||
} else { //single dynamic
|
||||
int ran = random(_led_count);
|
||||
if (!_locked[ran])
|
||||
setPixelColor(ran, color_wheel(random(256)));
|
||||
}
|
||||
show();
|
||||
_mode_delay = 100 + ((5000 * (uint32_t)(SPEED_MAX - _speed)) / SPEED_MAX);
|
||||
@@ -384,7 +386,7 @@ void WS2812FX::mode_breath(void) {
|
||||
setPixelColor(i, _color); // set all LEDs to selected color
|
||||
}
|
||||
int b = map(breath_brightness, 0, 255, 0, _brightness); // keep brightness below brightness set by user
|
||||
NeoPixelBrightnessBus::SetBrightness(b); // set new brightness to leds
|
||||
bus->SetBrightness(b); // set new brightness to leds
|
||||
show();
|
||||
|
||||
_mode_color = breath_brightness; // we use _mode_color to store the brightness
|
||||
@@ -1024,14 +1026,20 @@ void WS2812FX::mode_chase_rainbow_white(void) {
|
||||
_mode_delay = 10 + ((30 * (uint32_t)(SPEED_MAX - _speed)) / _led_count);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Red - Amber - Green - Blue lights running
|
||||
*/
|
||||
void WS2812FX::mode_colorful(void) {
|
||||
uint32_t cols[]{0x00FF0000,0x00EEBB00,0x0000EE00,0x000077CC,0x00FF0000,0x00EEBB00,0x0000EE00};
|
||||
mode_colorful_internal(cols);
|
||||
}
|
||||
|
||||
/*
|
||||
* Common function for 4-color-running (Colorful, easter)
|
||||
*/
|
||||
void WS2812FX::mode_colorful_internal(uint32_t cols[]) {
|
||||
int i = 0;
|
||||
for (i; i < _led_count-3 ; i+=4)
|
||||
for (i; i < _led_count ; i+=4)
|
||||
{
|
||||
if(!_locked[i])setPixelColor(i, cols[_counter_mode_step]);
|
||||
if(!_locked[i+1])setPixelColor(i+1, cols[_counter_mode_step+1]);
|
||||
@@ -1057,7 +1065,7 @@ void WS2812FX::mode_colorful(void) {
|
||||
show();
|
||||
if (_speed > SPEED_MIN) _counter_mode_step++; //static if lowest speed
|
||||
if (_counter_mode_step >3) _counter_mode_step = 0;
|
||||
_mode_delay = 100 + (25 * (uint32_t)(SPEED_MAX - _speed));
|
||||
_mode_delay = 50 + (15 * (uint32_t)(SPEED_MAX - _speed));
|
||||
}
|
||||
|
||||
|
||||
@@ -1888,11 +1896,6 @@ void WS2812FX::unlockAll()
|
||||
_locked[x] = false;
|
||||
}
|
||||
|
||||
void WS2812FX::setLedCount(uint16_t i)
|
||||
{
|
||||
_led_count = i;
|
||||
}
|
||||
|
||||
void WS2812FX::setFastUpdateMode(bool y)
|
||||
{
|
||||
_fastStandard = y;
|
||||
@@ -1922,16 +1925,12 @@ void WS2812FX::setCronixieDigits(byte d[])
|
||||
}
|
||||
}
|
||||
|
||||
double WS2812FX::getPowerEstimate(byte leds, uint32_t c, byte b)
|
||||
double WS2812FX::getPowerEstimate(uint16_t leds, uint32_t c, byte b)
|
||||
{
|
||||
double _mARequired = 100; //ESP power
|
||||
double _mul = (double)b/255;
|
||||
double _sum = ((c & 0xFF000000) >> 24) + ((c & 0x00FF0000) >> 16) + ((c & 0x0000FF00) >> 8) + ((c & 0x000000FF) >> 0);
|
||||
#ifdef RGBW
|
||||
_sum /= 1024;
|
||||
#else
|
||||
_sum /= 768;
|
||||
#endif
|
||||
_sum /= (_rgbwMode)? 1024:768;
|
||||
double _mAPerLed = 50*(_mul*_sum);
|
||||
_mARequired += leds*_mAPerLed;
|
||||
return _mARequired;
|
||||
@@ -1942,7 +1941,7 @@ double WS2812FX::getPowerEstimate(byte leds, uint32_t c, byte b)
|
||||
//It is NOT guaranteed to stay within the safeAmps margin.
|
||||
//Stay safe with high amperage and have a reasonable safety margin!
|
||||
//I am NOT to be held liable for burned down garages!
|
||||
double WS2812FX::getSafePowerMultiplier(double safeMilliAmps, byte leds, uint32_t c, byte b)
|
||||
double WS2812FX::getSafePowerMultiplier(double safeMilliAmps, uint16_t leds, uint32_t c, byte b)
|
||||
{
|
||||
double _mARequired = getPowerEstimate(leds,c,b);
|
||||
if (_mARequired > safeMilliAmps)
|
||||
@@ -1959,7 +1958,7 @@ void WS2812FX::setCCIndex1(byte i1)
|
||||
_counter_ccStep = 0;
|
||||
}
|
||||
|
||||
void WS2812FX::setCCIndex2(byte i2)
|
||||
void WS2812FX::setCCIndex2(uint16_t i2)
|
||||
{
|
||||
if (i2 > _cc_i1) _cc_i2 = i2;
|
||||
if (_cc_i2 >= _led_count) _cc_i2 = _led_count-1;
|
||||
@@ -2004,7 +2003,7 @@ void WS2812FX::setCCFE(bool fe)
|
||||
_counter_ccStep = 0;
|
||||
}
|
||||
|
||||
void WS2812FX::setCustomChase(byte i1, byte i2, byte is, byte np, byte ns, byte stp, bool fs, bool fe)
|
||||
void WS2812FX::setCustomChase(byte i1, uint16_t i2, byte is, byte np, byte ns, byte stp, bool fs, bool fe)
|
||||
{
|
||||
setCCIndex1(i1);
|
||||
setCCIndex2(i2);
|
||||
@@ -2019,11 +2018,13 @@ void WS2812FX::setCustomChase(byte i1, byte i2, byte is, byte np, byte ns, byte
|
||||
//Added for quick NeoPixelBus compatibility with Adafruit syntax
|
||||
void WS2812FX::setPixelColorRaw(uint16_t i, byte r, byte g, byte b, byte w)
|
||||
{
|
||||
#ifdef RGBW
|
||||
NeoPixelBrightnessBus::SetPixelColor(i, RgbwColor(r,g,b,w));
|
||||
#else
|
||||
NeoPixelBrightnessBus::SetPixelColor(i, RgbColor(r,g,b));
|
||||
#endif
|
||||
if (_rgbwMode)
|
||||
{
|
||||
bus->SetPixelColor(i, RgbwColor(r,g,b,w));
|
||||
} else
|
||||
{
|
||||
bus->SetPixelColor(i, RgbColor(r,g,b));
|
||||
}
|
||||
}
|
||||
|
||||
void WS2812FX::setPixelColor(uint16_t i, byte r, byte g, byte b, byte w)
|
||||
@@ -2031,11 +2032,13 @@ void WS2812FX::setPixelColor(uint16_t i, byte r, byte g, byte b, byte w)
|
||||
if (_reverseMode) i = _led_count - 1 -i;
|
||||
if (!_cronixieMode)
|
||||
{
|
||||
#ifdef RGBW
|
||||
NeoPixelBrightnessBus::SetPixelColor(i, RgbwColor(r,g,b,w));
|
||||
#else
|
||||
NeoPixelBrightnessBus::SetPixelColor(i, RgbColor(r,g,b));
|
||||
#endif
|
||||
if (_rgbwMode)
|
||||
{
|
||||
bus->SetPixelColor(i, RgbwColor(r,g,b,w));
|
||||
} else
|
||||
{
|
||||
bus->SetPixelColor(i, RgbColor(r,g,b));
|
||||
}
|
||||
} else {
|
||||
if(i>6)return;
|
||||
byte o = 10*i;
|
||||
@@ -2104,62 +2107,55 @@ uint32_t WS2812FX::getPixelColor(uint16_t i)
|
||||
default: return 0;
|
||||
}
|
||||
}
|
||||
#ifdef RGBW
|
||||
RgbwColor lColor = NeoPixelBrightnessBus::GetPixelColor(i);
|
||||
return lColor.W*16777216 + lColor.R*65536 + lColor.G*256 + lColor.B;
|
||||
#else
|
||||
RgbColor lColor = NeoPixelBrightnessBus::GetPixelColor(i);
|
||||
return lColor.R*65536 + lColor.G*256 + lColor.B;
|
||||
#endif
|
||||
if (_rgbwMode)
|
||||
{
|
||||
RgbwColor lColor = bus->GetPixelColorRgbw(i);
|
||||
return lColor.W*16777216 + lColor.R*65536 + lColor.G*256 + lColor.B;
|
||||
} else {
|
||||
RgbColor lColor = bus->GetPixelColor(i);
|
||||
return lColor.R*65536 + lColor.G*256 + lColor.B;
|
||||
}
|
||||
}
|
||||
|
||||
void WS2812FX::setBrightness(byte b)
|
||||
{
|
||||
_brightness = constrain(b, BRIGHTNESS_MIN, BRIGHTNESS_MAX);
|
||||
NeoPixelBrightnessBus::SetBrightness(_brightness);
|
||||
show();
|
||||
bus->SetBrightness(_brightness);
|
||||
if (_mode_last_call_time + _mode_delay > millis()+50 || b == 0) show(); //only update right away if long time until next refresh
|
||||
}
|
||||
|
||||
void WS2812FX::show()
|
||||
{
|
||||
#ifdef ARDUINO_ARCH_ESP32
|
||||
#ifdef WORKAROUND_ESP32_BITBANG
|
||||
delay(1);
|
||||
portDISABLE_INTERRUPTS(); //this is a workaround to prevent flickering (see https://github.com/adafruit/Adafruit_NeoPixel/issues/139)
|
||||
#endif
|
||||
#endif
|
||||
NeoPixelBrightnessBus::Show();
|
||||
|
||||
#ifdef ARDUINO_ARCH_ESP32
|
||||
#ifdef WORKAROUND_ESP32_BITBANG
|
||||
portENABLE_INTERRUPTS();
|
||||
#endif
|
||||
#endif
|
||||
bus->Show();
|
||||
}
|
||||
|
||||
void WS2812FX::clear()
|
||||
{
|
||||
#ifdef RGBW
|
||||
NeoPixelBrightnessBus::ClearTo(RgbwColor(0));
|
||||
#else
|
||||
NeoPixelBrightnessBus::ClearTo(RgbColor(0));
|
||||
#endif
|
||||
bus->ClearTo(RgbColor(0));
|
||||
}
|
||||
|
||||
void WS2812FX::begin()
|
||||
void WS2812FX::begin(bool supportWhite, uint16_t countPixels, uint8_t pin)
|
||||
{
|
||||
NeoPixelBrightnessBus::Begin();
|
||||
if (supportWhite == _rgbwMode && countPixels == _led_count && _locked != NULL) return;
|
||||
_rgbwMode = supportWhite;
|
||||
_led_count = countPixels;
|
||||
_cc_i2 = _led_count -1;
|
||||
uint8_t ty = 1;
|
||||
if (supportWhite) ty =2;
|
||||
bus->Begin((NeoPixelType)ty, countPixels, pin);
|
||||
if (_locked != NULL) delete _locked;
|
||||
_locked = new bool[countPixels];
|
||||
}
|
||||
|
||||
//For some reason min and max are not declared here
|
||||
|
||||
byte WS2812FX::minval (byte v, byte w)
|
||||
uint16_t WS2812FX::minval (uint16_t v, uint16_t w)
|
||||
{
|
||||
if (w > v) return v;
|
||||
return w;
|
||||
}
|
||||
|
||||
byte WS2812FX::maxval (byte v, byte w)
|
||||
uint16_t WS2812FX::maxval (uint16_t v, uint16_t w)
|
||||
{
|
||||
if (w > v) return w;
|
||||
return v;
|
||||
|
||||
@@ -1,25 +1,4 @@
|
||||
//#define RGBW
|
||||
#define PIN 2 //strip pin. Only change for ESP32
|
||||
#define WORKAROUND_ESP32_BITBANG
|
||||
//see https://github.com/Aircoookie/WLED/issues/2 for flicker free ESP32 support
|
||||
|
||||
//automatically uses the right driver method for each platform
|
||||
#ifdef ARDUINO_ARCH_ESP32
|
||||
#ifdef WORKAROUND_ESP32_BITBANG
|
||||
#define PIXELMETHOD NeoEsp32BitBangWs2813Method
|
||||
#else
|
||||
#define PIXELMETHOD NeoEsp32RmtWS2813_V3Method
|
||||
#endif
|
||||
#else
|
||||
#define PIXELMETHOD NeoEsp8266Uart800KbpsMethod
|
||||
#endif
|
||||
|
||||
//selects correct feature for RGB/RGBW
|
||||
#ifdef RGBW
|
||||
#define PIXELFEATURE NeoGrbwFeature
|
||||
#else
|
||||
#define PIXELFEATURE NeoGrbFeature
|
||||
#endif
|
||||
//pixelmethod now in NpbWrapper.h
|
||||
|
||||
/*
|
||||
WS2812FX.h - Library for WS2812 LED effects.
|
||||
@@ -50,14 +29,14 @@
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
Modified to work with WLED - differs from Github WS2812FX
|
||||
Heavily modified to work with WLED - differs from Github WS2812FX
|
||||
*/
|
||||
|
||||
#ifndef WS2812FX_h
|
||||
#define WS2812FX_h
|
||||
|
||||
#include "Arduino.h"
|
||||
#include <NeoPixelBrightnessBus.h>
|
||||
#include "NpbWrapper.h"
|
||||
|
||||
#define DEFAULT_BRIGHTNESS 50
|
||||
#define DEFAULT_MODE 0
|
||||
@@ -78,8 +57,8 @@
|
||||
#define FX_MODE_COLOR_WIPE 3
|
||||
#define FX_MODE_COLOR_WIPE_RANDOM 4
|
||||
#define FX_MODE_RANDOM_COLOR 5
|
||||
#define FX_MODE_SINGLE_DYNAMIC 6
|
||||
#define FX_MODE_MULTI_DYNAMIC 7
|
||||
#define FX_MODE_EASTER 6
|
||||
#define FX_MODE_DYNAMIC 7
|
||||
#define FX_MODE_RAINBOW 8
|
||||
#define FX_MODE_RAINBOW_CYCLE 9
|
||||
#define FX_MODE_SCAN 10
|
||||
@@ -132,10 +111,10 @@
|
||||
#define FX_MODE_CC_RANDOM 57
|
||||
|
||||
|
||||
class WS2812FX : public NeoPixelBrightnessBus<PIXELFEATURE, PIXELMETHOD> {
|
||||
class WS2812FX {
|
||||
typedef void (WS2812FX::*mode_ptr)(void);
|
||||
public:
|
||||
WS2812FX(uint16_t n) : NeoPixelBrightnessBus<PIXELFEATURE, PIXELMETHOD>(n,PIN) {
|
||||
WS2812FX(){
|
||||
|
||||
_mode[FX_MODE_STATIC] = &WS2812FX::mode_static;
|
||||
_mode[FX_MODE_BLINK] = &WS2812FX::mode_blink;
|
||||
@@ -143,8 +122,8 @@ class WS2812FX : public NeoPixelBrightnessBus<PIXELFEATURE, PIXELMETHOD> {
|
||||
_mode[FX_MODE_COLOR_WIPE] = &WS2812FX::mode_color_wipe;
|
||||
_mode[FX_MODE_COLOR_WIPE_RANDOM] = &WS2812FX::mode_color_wipe_random;
|
||||
_mode[FX_MODE_RANDOM_COLOR] = &WS2812FX::mode_random_color;
|
||||
_mode[FX_MODE_SINGLE_DYNAMIC] = &WS2812FX::mode_single_dynamic;
|
||||
_mode[FX_MODE_MULTI_DYNAMIC] = &WS2812FX::mode_multi_dynamic;
|
||||
_mode[FX_MODE_EASTER] = &WS2812FX::mode_easter;
|
||||
_mode[FX_MODE_DYNAMIC] = &WS2812FX::mode_dynamic;
|
||||
_mode[FX_MODE_RAINBOW] = &WS2812FX::mode_rainbow;
|
||||
_mode[FX_MODE_RAINBOW_CYCLE] = &WS2812FX::mode_rainbow_cycle;
|
||||
_mode[FX_MODE_SCAN] = &WS2812FX::mode_scan;
|
||||
@@ -200,7 +179,7 @@ class WS2812FX : public NeoPixelBrightnessBus<PIXELFEATURE, PIXELMETHOD> {
|
||||
_speed = DEFAULT_SPEED;
|
||||
_brightness = DEFAULT_BRIGHTNESS;
|
||||
_running = false;
|
||||
_led_count = n;
|
||||
_led_count = 255;
|
||||
_mode_last_call_time = 0;
|
||||
_mode_delay = 0;
|
||||
_color = DEFAULT_COLOR;
|
||||
@@ -211,7 +190,7 @@ class WS2812FX : public NeoPixelBrightnessBus<PIXELFEATURE, PIXELMETHOD> {
|
||||
_cc_fe = false;
|
||||
_cc_is = 0;
|
||||
_cc_i1 = 0;
|
||||
_cc_i2 = n-1;
|
||||
_cc_i2 = 254;
|
||||
_cc_num1 = 5;
|
||||
_cc_num2 = 5;
|
||||
_ccStep = 1;
|
||||
@@ -220,21 +199,23 @@ class WS2812FX : public NeoPixelBrightnessBus<PIXELFEATURE, PIXELMETHOD> {
|
||||
_counter_ccStep = 0;
|
||||
_fastStandard = false;
|
||||
_reverseMode = false;
|
||||
_locked = new bool[n];
|
||||
_locked = NULL;
|
||||
_cronixieDigits = new byte[6];
|
||||
bus = new NeoPixelWrapper();
|
||||
}
|
||||
|
||||
void
|
||||
show(void),
|
||||
setPixelColor(uint16_t i, byte r, byte g, byte b),
|
||||
init(void),
|
||||
setPixelColor(uint16_t i, byte r, byte g, byte b, byte w),
|
||||
init(bool supportWhite, uint16_t countPixels, uint8_t pin),
|
||||
service(void),
|
||||
start(void),
|
||||
stop(void),
|
||||
setMode(byte m),
|
||||
setCustomChase(byte i1, byte i2, byte is, byte np, byte ns, byte stp, bool fs, bool fe),
|
||||
setCustomChase(byte i1, uint16_t i2, byte is, byte np, byte ns, byte stp, bool fs, bool fe),
|
||||
setCCIndex1(byte i1),
|
||||
setCCIndex2(byte i2),
|
||||
setCCIndex2(uint16_t i2),
|
||||
setCCStart(byte is),
|
||||
setCCNum1(byte np),
|
||||
setCCNum2(byte ns),
|
||||
@@ -270,7 +251,6 @@ class WS2812FX : public NeoPixelBrightnessBus<PIXELFEATURE, PIXELMETHOD> {
|
||||
unlockAll(void),
|
||||
setFastUpdateMode(bool b),
|
||||
trigger(void),
|
||||
setLedCount(uint16_t i),
|
||||
setFade(int sp);
|
||||
|
||||
bool
|
||||
@@ -290,16 +270,16 @@ class WS2812FX : public NeoPixelBrightnessBus<PIXELFEATURE, PIXELMETHOD> {
|
||||
getColor(void);
|
||||
|
||||
double
|
||||
getPowerEstimate(byte leds, uint32_t c, byte b),
|
||||
getSafePowerMultiplier(double safeMilliAmps, byte leds, uint32_t c, byte b);
|
||||
getPowerEstimate(uint16_t leds, uint32_t c, byte b),
|
||||
getSafePowerMultiplier(double safeMilliAmps, uint16_t leds, uint32_t c, byte b);
|
||||
|
||||
private:
|
||||
NeoPixelWrapper *bus;
|
||||
|
||||
void
|
||||
begin(void),
|
||||
begin(bool supportWhite, uint16_t countPixels, uint8_t pin),
|
||||
clear(void),
|
||||
setPixelColor(uint16_t i, uint32_t c),
|
||||
setPixelColor(uint16_t i, byte r, byte g, byte b, byte w),
|
||||
setPixelColorRaw(uint16_t i, byte r, byte g, byte b, byte w),
|
||||
dofade(void),
|
||||
strip_off(void),
|
||||
@@ -309,8 +289,8 @@ class WS2812FX : public NeoPixelBrightnessBus<PIXELFEATURE, PIXELMETHOD> {
|
||||
mode_color_wipe(void),
|
||||
mode_color_wipe_random(void),
|
||||
mode_random_color(void),
|
||||
mode_single_dynamic(void),
|
||||
mode_multi_dynamic(void),
|
||||
mode_easter(void),
|
||||
mode_dynamic(void),
|
||||
mode_breath(void),
|
||||
mode_fade(void),
|
||||
mode_scan(void),
|
||||
@@ -339,6 +319,7 @@ class WS2812FX : public NeoPixelBrightnessBus<PIXELFEATURE, PIXELMETHOD> {
|
||||
mode_chase_flash_random(void),
|
||||
mode_chase_rainbow_white(void),
|
||||
mode_colorful(void),
|
||||
mode_colorful_internal(uint32_t*),
|
||||
mode_traffic_light(void),
|
||||
mode_color_sweep_random(void),
|
||||
mode_running_color(void),
|
||||
@@ -366,6 +347,7 @@ class WS2812FX : public NeoPixelBrightnessBus<PIXELFEATURE, PIXELMETHOD> {
|
||||
|
||||
bool
|
||||
_triggered,
|
||||
_rgbwMode,
|
||||
_fastStandard,
|
||||
_reverseMode,
|
||||
_cronixieMode,
|
||||
@@ -378,13 +360,10 @@ class WS2812FX : public NeoPixelBrightnessBus<PIXELFEATURE, PIXELMETHOD> {
|
||||
_locked;
|
||||
|
||||
byte
|
||||
minval(byte v, byte w),
|
||||
maxval(byte v, byte w),
|
||||
_mode_index,
|
||||
_speed,
|
||||
_intensity,
|
||||
_cc_i1,
|
||||
_cc_i2,
|
||||
_cc_is,
|
||||
_cc_num1,
|
||||
_cc_num2,
|
||||
@@ -395,6 +374,9 @@ class WS2812FX : public NeoPixelBrightnessBus<PIXELFEATURE, PIXELMETHOD> {
|
||||
_cronixieDigits;
|
||||
|
||||
uint16_t
|
||||
minval(uint16_t v, uint16_t w),
|
||||
maxval(uint16_t v, uint16_t w),
|
||||
_cc_i2,
|
||||
_led_count;
|
||||
|
||||
uint32_t
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<html>
|
||||
<head><meta charset="utf-8">
|
||||
<link rel='shortcut icon' type='image/x-icon' href='/favicon.ico'/>
|
||||
<title>WLED 0.6.1</title>
|
||||
<title>WLED 0.6.4</title>
|
||||
<script>
|
||||
var d=document;
|
||||
var w=window.getComputedStyle(d.querySelector("html"));
|
||||
@@ -75,7 +75,7 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
request.open("GET", "win/" +resp +nocache, true);
|
||||
request.open("GET", "win" +resp +nocache, true);
|
||||
request.send(null);
|
||||
resp="";
|
||||
}
|
||||
@@ -214,8 +214,8 @@
|
||||
function SwitchPS(x)
|
||||
{
|
||||
d.Cf.FF.value = parseInt(d.Cf.FF.value) +x;
|
||||
if (d.Cf.FF.value < 0) d.Cf.FF.value = 0;
|
||||
if (d.Cf.FF.value > 24) d.Cf.FF.value = 24;
|
||||
if (d.Cf.FF.value < 1) d.Cf.FF.value = 1;
|
||||
if (d.Cf.FF.value > 25) d.Cf.FF.value = 25;
|
||||
}
|
||||
function PSIO(sv)
|
||||
{
|
||||
@@ -335,6 +335,21 @@
|
||||
}
|
||||
GIO();
|
||||
}
|
||||
function uCY()
|
||||
{
|
||||
resp+=(d.Cf.CY.checked)?"&CY=1":"&CY=0";
|
||||
resp+="&P1=" + Cf.P1.value;
|
||||
resp+="&P2=" + Cf.P2.value;
|
||||
resp+="&PT=" + Cf.PT.value;
|
||||
if(d.Cf.BC.checked){resp+="&PA";}
|
||||
if(d.Cf.CC.checked){resp+="&PC";}
|
||||
if(d.Cf.FC.checked){resp+="&PX";}
|
||||
GIO();
|
||||
}
|
||||
function R()
|
||||
{
|
||||
resp+="&PL=0";GIO();
|
||||
}
|
||||
</script>
|
||||
<style>
|
||||
:root {
|
||||
@@ -575,14 +590,14 @@
|
||||
<svg id="fmf" onclick="SwFX(1)"><use xlink:href="#lnr-arrow-right-circle"></use></svg>
|
||||
<svg id="fof" onclick="SwFX(99)"><use xlink:href="#lnr-rocket"></use></svg><br><br>
|
||||
<select name="TX" onchange="GX()">
|
||||
<option value="0" selected>Static (0)</option>
|
||||
<option value="0" selected>Solid (0)</option>
|
||||
<option value="1">Blink (1)</option>
|
||||
<option value="2">Breath (2)</option>
|
||||
<option value="3">Wipe (3)</option>
|
||||
<option value="4">Wipe Random (4)</option>
|
||||
<option value="5">Color R (5)</option>
|
||||
<option value="6">Single Dynamic (6)</option>
|
||||
<option value="7">All Dynamic (7)</option>
|
||||
<option value="6">Easter (6)</option>
|
||||
<option value="7">Dynamic (7)</option>
|
||||
<option value="8">Colorloop (8)</option>
|
||||
<option value="9">Rainbow (9)</option>
|
||||
<option value="10">Scan (10)</option>
|
||||
@@ -659,9 +674,10 @@
|
||||
<svg id="psp" onclick="SwitchPS(-1)"><use xlink:href="#lnr-arrow-left-circle"></use></svg>
|
||||
<svg id="psn" onclick="SwitchPS(1)"><use xlink:href="#lnr-arrow-right-circle"></use></svg>
|
||||
<svg id="pss" onclick="PSIO(true)"><use xlink:href="#lnr-arrow-down-circle"></use></svg>
|
||||
<br><input id="psI" name = "FF" type="number" value="0" min="0" max="25" step="1"><br><br>
|
||||
Click checkmark to apply <input type="checkbox" checked="true" name="BC"> brightness, <input type="checkbox" checked="true" name="CC"> color and <input type="checkbox" checked="true" name="FC"> effects.<br>
|
||||
Effect 0 is the configuration when the light is powered up.
|
||||
<br><input id="psI" name = "FF" type="number" value="1" min="1" max="25" step="1"><br><br>
|
||||
Click checkmark to apply <input type="checkbox" checked="true" name="BC"> brightness, <input type="checkbox" checked="true" name="CC"> color and <input type="checkbox" checked="true" name="FC"> effects.<br><br>
|
||||
Cycle through presets <input id="cy1" name="P1" type="number" value="1" min="1" max="25" step="1"> to <input id="cy2" name="P2" type="number" value="5" min="1" max="25" step="1">, keep each for <input id="cyT" name="PT" type="number" value="1250" min="50" max="65501" step="1">ms: <input type="checkbox" name="CY" onclick="uCY()"><br><br>
|
||||
<button type="button" onclick="R()">Apply boot config</button><br>
|
||||
</div>
|
||||
<div id="tlN" class="tools">
|
||||
Timed Light<br><br>
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
@@ -85,19 +85,18 @@ const char PAGE_settings_leds1[] PROGMEM = R"=====(
|
||||
<div class="helpB"><button type="button" onclick="H()">?</button></div>
|
||||
<button type="button" onclick="B()">Back</button><button type="submit">Save</button><hr>
|
||||
<h2>LED setup</h2>
|
||||
LED count (max. 255): <input name="LC" type="number" min="1" max="255" required><br>
|
||||
<i>The default boot color is always saved in preset slot 0.</i><br>
|
||||
Alternatively, apply preset <input name="BP" type="number" min="0" max="25" required> at boot<br>
|
||||
LED count: <input name="LC" type="number" min="1" max="1200" required><br>
|
||||
LEDs are 4-channel type (RGBW): <input type="checkbox" name="EW"><br>
|
||||
Apply preset <input name="BP" type="number" min="0" max="25" required> at boot (0 uses defaults)<br>
|
||||
Default RGB color:
|
||||
<input name="CR" type="number" min="0" max="255" required>
|
||||
<input name="CG" type="number" min="0" max="255" required>
|
||||
<input name="CB" type="number" min="0" max="255" required><br>
|
||||
Default white value (only RGBW): <input name="CW" type="number" min="0" max="255" required><br>
|
||||
Default brightness: <input name="CA" type="number" min="0" max="255" required> (0-255)<br>
|
||||
Default white value (only RGBW, -1 to disable): <input name="CW" type="number" min="-1" max="255" required><br>
|
||||
Default effect ID: <input name="FX" type="number" min="0" max="57" required> <br>
|
||||
Default effect speed: <input name="SX" type="number" min="0" max="255" required> <br>
|
||||
Default effect intensity: <input name="IX" type="number" min="0" max="255" required> <br>
|
||||
Default secondary RGB(W):<br>
|
||||
Default effect ID: <input name="FX" type="number" min="0" max="57" required><br>
|
||||
Default effect speed: <input name="SX" type="number" min="0" max="255" required><br>
|
||||
Default effect intensity: <input name="IX" type="number" min="0" max="255" required><br>
|
||||
<input name="SR" type="number" min="0" max="255" required>
|
||||
<input name="SG" type="number" min="0" max="255" required>
|
||||
<input name="SB" type="number" min="0" max="255" required>
|
||||
@@ -110,7 +109,7 @@ Brightness factor: <input name="BF" type="number" min="0" max="255" required> %
|
||||
<h3>Transitions</h3>
|
||||
Fade: <input type="checkbox" name="TF"><br>
|
||||
Sweep: <input type="checkbox" name="TS"> Invert direction: <input type="checkbox" name="TI"><br>
|
||||
Transition Delay: <input name="TD" maxlength="5" size="2"> ms
|
||||
Transition Time: <input name="TD" maxlength="5" size="2"> ms
|
||||
<h3>Timed light</h3>
|
||||
Default Duration: <input name="TL" type="number" min="1" max="255" required> min<br>
|
||||
Default Target brightness: <input name="TB" type="number" min="0" max="255" required><br>
|
||||
@@ -155,7 +154,7 @@ Color Theme:
|
||||
<option value="9">Nixie</option>
|
||||
<option value="10">Terminal</option>
|
||||
<option value="11">C64</option>
|
||||
<option value="12">Placeholder</option>
|
||||
<option value="12">Easter</option>
|
||||
<option value="13">Placeholder</option>
|
||||
<option value="14">The End</option>
|
||||
<option value="15" id="co">Custom</option>
|
||||
@@ -248,6 +247,7 @@ Time zone:
|
||||
<option value="10">JST(KST)</option>
|
||||
<option value="11">AEST/AEDT</option>
|
||||
<option value="12">NZST/NZDT</option>
|
||||
<option value="13">North Korea</option>
|
||||
</select><br>
|
||||
UTC offset: <input name="UO" type="number" min="-65500" max="65500" required> seconds (max. 18 hours)<br>
|
||||
Current local time is <span class="times">unknown</span>.
|
||||
@@ -335,7 +335,7 @@ HTTP traffic is unencrypted. An attacker in the same network can intercept form
|
||||
<button type="button" onclick="U()">Manual OTA Update</button><br>
|
||||
Enable ArduinoOTA: <input type="checkbox" name="AO"><br>
|
||||
<h3>About</h3>
|
||||
<a href="https://github.com/Aircoookie/WLED">WLED</a> version 0.6.1<br>
|
||||
<a href="https://github.com/Aircoookie/WLED">WLED</a> version 0.6.4<br>
|
||||
(c) 2016-2018 Christian Schwinne <br>
|
||||
<i>Licensed under the MIT license</i><br><br>
|
||||
<i>Uses libraries:</i><br>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
*/
|
||||
/*
|
||||
* @title WLED project sketch
|
||||
* @version 0.6.1
|
||||
* @version 0.6.4
|
||||
* @author Christian Schwinne
|
||||
*/
|
||||
|
||||
@@ -33,16 +33,13 @@
|
||||
#include "WS2812FX.h"
|
||||
|
||||
//version in format yymmddb (b = daily build)
|
||||
#define VERSION 1803182
|
||||
const String versionString = "0.6.1";
|
||||
#define VERSION 1804151
|
||||
const String versionString = "0.6.4";
|
||||
|
||||
//AP and OTA default passwords (change them!)
|
||||
String apPass = "wled1234";
|
||||
String otaPass = "wledota";
|
||||
|
||||
//If you have an RGBW strip, also uncomment first line in WS2812FX.h!
|
||||
bool useRGBW = false;
|
||||
|
||||
//spiffs FS only useful for debug (only ESP8266)
|
||||
//#define USEFS
|
||||
|
||||
@@ -50,7 +47,7 @@ bool useRGBW = false;
|
||||
//#define DEBUG
|
||||
|
||||
//Hardware-settings (only changeble via code)
|
||||
#define LEDCOUNT 255 //maximum, exact count set-able via settings
|
||||
#define PIN 2 //strip pin. Only change for ESP32
|
||||
byte buttonPin = 0; //needs pull-up
|
||||
byte auxPin = 15; //use e.g. for external relay
|
||||
byte auxDefaultState = 0; //0: input 1: high 2: low
|
||||
@@ -62,7 +59,7 @@ byte currentTheme = 0;
|
||||
String clientSSID = "Your_Network";
|
||||
String clientPass = "";
|
||||
String cmDNS = "led";
|
||||
byte ledCount = 10; //lowered to prevent accidental overcurrent
|
||||
uint16_t ledCount = 10; //lowered to prevent accidental overcurrent
|
||||
String apSSID = ""; //AP off by default (unless setup)
|
||||
byte apChannel = 1;
|
||||
byte apHide = 0;
|
||||
@@ -72,7 +69,7 @@ IPAddress staticIP(0, 0, 0, 0);
|
||||
IPAddress staticGateway(0, 0, 0, 0);
|
||||
IPAddress staticSubnet(255, 255, 255, 0);
|
||||
IPAddress staticDNS(8, 8, 8, 8); //only for NTP
|
||||
bool useHSB = false, useHSBDefault = false;
|
||||
bool useHSB = true, useHSBDefault = true, useRGBW = false;
|
||||
bool turnOnAtBoot = true;
|
||||
bool initLedsLast = false;
|
||||
byte bootPreset = 0;
|
||||
@@ -84,7 +81,7 @@ byte briS = 127;
|
||||
byte nightlightTargetBri = 0;
|
||||
bool fadeTransition = true;
|
||||
bool sweepTransition = false, sweepDirection = true;
|
||||
uint16_t transitionDelay = 1200;
|
||||
uint16_t transitionDelay = 1200, transitionDelayDefault = transitionDelay;
|
||||
bool reverseMode = false;
|
||||
bool otaLock = false, wifiLock = false;
|
||||
bool aOtaEnabled = true;
|
||||
@@ -105,7 +102,7 @@ String ntpServerName = "0.wled.pool.ntp.org";
|
||||
byte ccNumPrimary = 2;
|
||||
byte ccNumSecondary = 4;
|
||||
byte ccIndex1 = 0;
|
||||
byte ccIndex2 = ledCount -1;
|
||||
uint16_t ccIndex2 = ledCount -1;
|
||||
bool ccFromStart = true, ccFromEnd = false;
|
||||
byte ccStep = 1;
|
||||
byte ccStart = 0;
|
||||
@@ -120,8 +117,6 @@ byte macroButton = 0, macroCountdown = 0, macroLongPress = 0;
|
||||
|
||||
unsigned long countdownTime = 1514764800L;
|
||||
|
||||
double transitionResolution = 0.011;
|
||||
|
||||
//hue
|
||||
bool huePollingEnabled = false, hueAttempt = false;
|
||||
uint16_t huePollIntervalMs = 2500;
|
||||
@@ -208,8 +203,15 @@ bool cronixieBacklight = true;
|
||||
bool countdownMode = false;
|
||||
bool cronixieInit = false;
|
||||
|
||||
bool presetCyclingEnabled = false;
|
||||
byte presetCycleMin = 1, presetCycleMax = 5;
|
||||
uint16_t presetCycleTime = 1250;
|
||||
unsigned long presetCycledTime = 0; byte presetCycCurr = presetCycleMin;
|
||||
bool presetCycleBri, presetCycleCol, presetCycleFx;
|
||||
|
||||
uint32_t arlsTimeoutMillis = 2500;
|
||||
bool arlsTimeout = false;
|
||||
bool receiveDirect = true;
|
||||
unsigned long arlsTimeoutTime;
|
||||
byte auxTime = 0;
|
||||
unsigned long auxStartTime;
|
||||
@@ -247,7 +249,7 @@ byte ntpPacketBuffer[NTP_PACKET_SIZE];
|
||||
unsigned long ntpLastSyncTime = 999000000L;
|
||||
unsigned long ntpPacketSentTime = 999000000L;
|
||||
|
||||
WS2812FX strip = WS2812FX(LEDCOUNT);
|
||||
WS2812FX strip = WS2812FX();
|
||||
|
||||
#ifdef DEBUG
|
||||
#define DEBUG_PRINT(x) Serial.print (x)
|
||||
@@ -314,6 +316,7 @@ void setup() {
|
||||
|
||||
void loop() {
|
||||
server.handleClient();
|
||||
handleSerial();
|
||||
handleNotifications();
|
||||
handleTransitions();
|
||||
userLoop();
|
||||
@@ -323,7 +326,7 @@ void loop() {
|
||||
if (!otaLock && aOtaEnabled) ArduinoOTA.handle();
|
||||
handleAlexa();
|
||||
handleOverlays();
|
||||
if (!arlsTimeout) //block stuff if WARLS is enabled
|
||||
if (!arlsTimeout) //block stuff if WARLS/Adalight is enabled
|
||||
{
|
||||
if (dnsActive) dnsServer.processNextRequest();
|
||||
handleHue();
|
||||
|
||||
@@ -61,7 +61,7 @@ void saveSettingsToEEPROM()
|
||||
EEPROM.write(226, notifyDirectDefault);
|
||||
EEPROM.write(227, apChannel);
|
||||
EEPROM.write(228, apHide);
|
||||
EEPROM.write(229, ledCount);
|
||||
EEPROM.write(229, (ledCount >> 0) & 0xFF);
|
||||
EEPROM.write(230, notifyButton);
|
||||
EEPROM.write(231, notifyTwice);
|
||||
EEPROM.write(232, buttonEnabled);
|
||||
@@ -85,8 +85,8 @@ void saveSettingsToEEPROM()
|
||||
EEPROM.write(250, receiveNotificationBrightness);
|
||||
EEPROM.write(251, fadeTransition);
|
||||
EEPROM.write(252, reverseMode);
|
||||
EEPROM.write(253, (transitionDelay >> 0) & 0xFF);
|
||||
EEPROM.write(254, (transitionDelay >> 8) & 0xFF);
|
||||
EEPROM.write(253, (transitionDelayDefault >> 0) & 0xFF);
|
||||
EEPROM.write(254, (transitionDelayDefault >> 8) & 0xFF);
|
||||
EEPROM.write(255, briMultiplier);
|
||||
//255,250,231,230,226 notifier bytes
|
||||
for (int i = 256; i < 288; ++i)
|
||||
@@ -147,6 +147,7 @@ void saveSettingsToEEPROM()
|
||||
EEPROM.write(395, (abs(utcOffsetSecs) >> 8) & 0xFF);
|
||||
EEPROM.write(396, (utcOffsetSecs<0)); //is negative
|
||||
EEPROM.write(397, initLedsLast);
|
||||
EEPROM.write(398, (ledCount >> 8) & 0xFF);
|
||||
|
||||
for (int k=0;k<6;k++){
|
||||
int in = 900+k*8;
|
||||
@@ -259,7 +260,7 @@ void loadSettingsFromEEPROM(bool first)
|
||||
if (apChannel > 13 || apChannel < 1) apChannel = 1;
|
||||
apHide = EEPROM.read(228);
|
||||
if (apHide > 1) apHide = 1;
|
||||
ledCount = EEPROM.read(229); if (ledCount > LEDCOUNT) ledCount = LEDCOUNT;
|
||||
ledCount = ((EEPROM.read(229) << 0) & 0xFF) + ((EEPROM.read(398) << 8) & 0xFF00); if (ledCount > 1200) ledCount = 10;
|
||||
notifyButton = EEPROM.read(230);
|
||||
notifyTwice = EEPROM.read(231);
|
||||
buttonEnabled = EEPROM.read(232);
|
||||
@@ -286,7 +287,8 @@ void loadSettingsFromEEPROM(bool first)
|
||||
receiveNotificationBrightness = EEPROM.read(250);
|
||||
fadeTransition = EEPROM.read(251);
|
||||
reverseMode = EEPROM.read(252);
|
||||
transitionDelay = ((EEPROM.read(253) << 0) & 0xFF) + ((EEPROM.read(254) << 8) & 0xFF00);
|
||||
transitionDelayDefault = ((EEPROM.read(253) << 0) & 0xFF) + ((EEPROM.read(254) << 8) & 0xFF00);
|
||||
transitionDelay = transitionDelayDefault;
|
||||
briMultiplier = EEPROM.read(255);
|
||||
otaPass = "";
|
||||
for (int i = 256; i < 288; ++i)
|
||||
@@ -471,6 +473,7 @@ void applyPreset(byte index, bool loadBri, bool loadCol, bool loadFX)
|
||||
}
|
||||
if (loadFX)
|
||||
{
|
||||
byte lastfx = effectCurrent;
|
||||
effectCurrent = EEPROM.read(i+10);
|
||||
effectSpeed = EEPROM.read(i+11);
|
||||
effectIntensity = EEPROM.read(i+16);
|
||||
@@ -480,7 +483,7 @@ void applyPreset(byte index, bool loadBri, bool loadCol, bool loadFX)
|
||||
ccFromStart = (EEPROM.read(i+14)<2);
|
||||
ccStep = EEPROM.read(i+15);
|
||||
strip.setCustomChase(ccIndex1, ccIndex2, ccStart, ccNumPrimary, ccNumSecondary, ccStep, ccFromStart, ccFromEnd);
|
||||
strip.setMode(effectCurrent);
|
||||
if (lastfx != effectCurrent) strip.setMode(effectCurrent);
|
||||
strip.setSpeed(effectSpeed);
|
||||
strip.setIntensity(effectIntensity);
|
||||
}
|
||||
|
||||
@@ -141,11 +141,8 @@ String getSettings(byte subPage)
|
||||
resp += ds + "CG" + v + colS[1] +";";
|
||||
resp += ds + "CB" + v + colS[2] +";";
|
||||
resp += ds + "CA" + v + briS +";";
|
||||
if (useRGBW) {
|
||||
resp += ds + "CW" + v + whiteS +";";
|
||||
} else {
|
||||
resp += ds + "CW" + v + "-1;";
|
||||
}
|
||||
resp += ds + "EW" + c + useRGBW +";";
|
||||
resp += ds + "CW" + v + whiteS +";";
|
||||
resp += ds + "SR" + v + colSecS[0] +";";
|
||||
resp += ds + "SG" + v + colSecS[1] +";";
|
||||
resp += ds + "SB" + v + colSecS[2] +";";
|
||||
|
||||
@@ -115,9 +115,13 @@ void handleSettingsSet(byte subPage)
|
||||
if (server.hasArg("LC"))
|
||||
{
|
||||
int i = server.arg("LC").toInt();
|
||||
if (i >= 0 && i <= LEDCOUNT) ledCount = i;
|
||||
strip.setLedCount(ledCount);
|
||||
if (i > 0 && i <= 1200) ledCount = i;
|
||||
//RMT eats up too much RAM
|
||||
#ifdef ARDUINO_ARCH_ESP32
|
||||
if (ledCount > 600) ledCount = 600;
|
||||
#endif
|
||||
}
|
||||
useRGBW = server.hasArg("EW");
|
||||
if (server.hasArg("IS")) //ignore settings and save current brightness, colors and fx as default
|
||||
{
|
||||
colS[0] = col[0];
|
||||
@@ -166,14 +170,7 @@ void handleSettingsSet(byte subPage)
|
||||
if (server.hasArg("CW"))
|
||||
{
|
||||
int i = server.arg("CW").toInt();
|
||||
if (i >= 0 && i <= 255)
|
||||
{
|
||||
useRGBW = true;
|
||||
whiteS = i;
|
||||
} else {
|
||||
useRGBW = false;
|
||||
whiteS = 0;
|
||||
}
|
||||
if (i >= 0 && i <= 255) whiteS = i;
|
||||
}
|
||||
if (server.hasArg("CA"))
|
||||
{
|
||||
@@ -383,8 +380,8 @@ void handleSettingsSet(byte subPage)
|
||||
aOtaEnabled = server.hasArg("AO");
|
||||
}
|
||||
}
|
||||
|
||||
saveSettingsToEEPROM();
|
||||
if (subPage == 2) strip.init(useRGBW,ledCount,PIN);
|
||||
}
|
||||
|
||||
bool handleSet(String req)
|
||||
@@ -642,6 +639,8 @@ bool handleSet(String req)
|
||||
}
|
||||
}
|
||||
//toggle nightlight mode
|
||||
bool aNlDef = false;
|
||||
if (req.indexOf("&ND") > 0) aNlDef = true;
|
||||
pos = req.indexOf("NL=");
|
||||
if (pos > 0)
|
||||
{
|
||||
@@ -651,9 +650,13 @@ bool handleSet(String req)
|
||||
bri = briT;
|
||||
} else {
|
||||
nightlightActive = true;
|
||||
nightlightDelayMins = req.substring(pos + 3).toInt();
|
||||
if (!aNlDef) nightlightDelayMins = req.substring(pos + 3).toInt();
|
||||
nightlightStartTime = millis();
|
||||
}
|
||||
} else if (aNlDef)
|
||||
{
|
||||
nightlightActive = true;
|
||||
nightlightStartTime = millis();
|
||||
}
|
||||
//set nightlight target brightness
|
||||
pos = req.indexOf("NT=");
|
||||
@@ -679,6 +682,10 @@ bool handleSet(String req)
|
||||
auxActive = true;
|
||||
if (auxTime == 0) auxActive = false;
|
||||
}
|
||||
pos = req.indexOf("TT=");
|
||||
if (pos > 0) {
|
||||
transitionDelay = req.substring(pos + 3).toInt();
|
||||
}
|
||||
//main toggle on/off
|
||||
pos = req.indexOf("&T=");
|
||||
if (pos > 0) {
|
||||
@@ -718,9 +725,51 @@ bool handleSet(String req)
|
||||
pos = req.indexOf("CM="); if (pos > 0) {ccStep = (req.substring(pos + 3).toInt()); _cc_updated = true;}
|
||||
pos = req.indexOf("CF="); if (pos > 0) {ccFromStart = (req.substring(pos + 3).toInt()); _cc_updated = true;}
|
||||
pos = req.indexOf("CE="); if (pos > 0) {ccFromEnd = (req.substring(pos + 3).toInt()); _cc_updated = true;}
|
||||
if (ccIndex2 == 255) ccIndex2 = ledCount-1;
|
||||
if (_cc_updated) strip.setCustomChase(ccIndex1, ccIndex2, ccStart, ccNumPrimary, ccNumSecondary, ccStep, ccFromStart, ccFromEnd);
|
||||
|
||||
//set presets
|
||||
if (req.indexOf("CY=") > 0) //preset cycle
|
||||
{
|
||||
presetCyclingEnabled = true;
|
||||
if (req.indexOf("CY=0") > 0)
|
||||
{
|
||||
presetCyclingEnabled = false;
|
||||
}
|
||||
bool all = true;
|
||||
if (req.indexOf("&PA") > 0)
|
||||
{
|
||||
presetCycleBri = true;
|
||||
all = false;
|
||||
}
|
||||
if (req.indexOf("&PC") > 0)
|
||||
{
|
||||
presetCycleCol = true;
|
||||
all = false;
|
||||
}
|
||||
if (req.indexOf("&PX") > 0)
|
||||
{
|
||||
presetCycleFx = true;
|
||||
all = false;
|
||||
}
|
||||
if (all)
|
||||
{
|
||||
presetCycleBri = true;
|
||||
presetCycleCol = true;
|
||||
presetCycleFx = true;
|
||||
}
|
||||
}
|
||||
pos = req.indexOf("PT="); //sets cycle time in ms
|
||||
if (pos > 0) {
|
||||
int v = req.substring(pos + 3).toInt();
|
||||
if (v > 49) presetCycleTime = v;
|
||||
}
|
||||
pos = req.indexOf("P1="); //sets first preset for cycle
|
||||
if (pos > 0) presetCycleMin = req.substring(pos + 3).toInt();
|
||||
|
||||
pos = req.indexOf("P2="); //sets last preset for cycle
|
||||
if (pos > 0) presetCycleMax = req.substring(pos + 3).toInt();
|
||||
|
||||
pos = req.indexOf("PS="); //saves current in preset
|
||||
if (pos > 0) {
|
||||
savePreset(req.substring(pos + 3).toInt());
|
||||
|
||||
@@ -1,6 +1,46 @@
|
||||
/*
|
||||
* Utility for SPIFFS filesystem
|
||||
* Utility for SPIFFS filesystem & Serial console
|
||||
*/
|
||||
void handleSerial()
|
||||
{
|
||||
if (Serial.available() > 0) //support for Adalight protocol to high-speed control LEDs over serial (gamma correction done by PC)
|
||||
{
|
||||
if (Serial.find("Ada"))
|
||||
{
|
||||
if (!arlsTimeout){
|
||||
if (bri == 0) strip.setBrightness(briLast);
|
||||
strip.setRange(0, ledCount-1, 0);
|
||||
strip.setMode(0);
|
||||
}
|
||||
arlsTimeout = true;
|
||||
arlsTimeoutTime = millis() + 4900;
|
||||
delay(1);
|
||||
byte hi = Serial.read();
|
||||
byte ledc = Serial.read();
|
||||
byte chk = Serial.read();
|
||||
if(chk != (hi ^ ledc ^ 0x55)) return;
|
||||
if (ledCount < ledc) ledc = ledCount;
|
||||
byte sc[3]; int t =-1; int to = 0;
|
||||
for (int i=0; i < ledc; i++)
|
||||
{
|
||||
for (byte j=0; j<3; j++)
|
||||
{
|
||||
while (Serial.peek()<0) //no data yet available
|
||||
{
|
||||
delay(1);
|
||||
to++;
|
||||
if (to>5) {strip.show(); return;} //unexpected end of transmission
|
||||
}
|
||||
to = 0;
|
||||
sc[j] = Serial.read();
|
||||
}
|
||||
strip.setPixelColor(i,sc[0],sc[1],sc[2],0);
|
||||
}
|
||||
strip.show();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef USEFS
|
||||
|
||||
String formatBytes(size_t bytes){
|
||||
|
||||
@@ -3,11 +3,17 @@
|
||||
*/
|
||||
|
||||
void wledInit()
|
||||
{
|
||||
{
|
||||
EEPROM.begin(EEPSIZE);
|
||||
if (!EEPROM.read(397)) strip.init(); //quick init
|
||||
|
||||
ledCount = ((EEPROM.read(229) << 0) & 0xFF) + ((EEPROM.read(398) << 8) & 0xFF00); if (ledCount > 1200) ledCount = 10;
|
||||
//RMT eats up too much RAM
|
||||
#ifdef ARDUINO_ARCH_ESP32
|
||||
if (ledCount > 600) ledCount = 600;
|
||||
#endif
|
||||
if (!EEPROM.read(397)) strip.init(EEPROM.read(372),ledCount,PIN); //quick init
|
||||
|
||||
Serial.begin(115200);
|
||||
Serial.setTimeout(50);
|
||||
|
||||
#ifdef USEFS
|
||||
SPIFFS.begin();
|
||||
@@ -16,32 +22,11 @@ void wledInit()
|
||||
DEBUG_PRINTLN("Load EEPROM");
|
||||
loadSettingsFromEEPROM(true);
|
||||
if (!initLedsLast) initStrip();
|
||||
DEBUG_PRINT("C-SSID: ");
|
||||
DEBUG_PRINT("CSSID: ");
|
||||
DEBUG_PRINT(clientSSID);
|
||||
buildCssColorString();
|
||||
userBeginPreConnection();
|
||||
|
||||
WiFi.disconnect(); //close old connections
|
||||
|
||||
if (staticIP[0] != 0)
|
||||
{
|
||||
WiFi.config(staticIP, staticGateway, staticSubnet, staticDNS);
|
||||
} else
|
||||
{
|
||||
WiFi.config(0U, 0U, 0U);
|
||||
}
|
||||
|
||||
if (apSSID.length()>0)
|
||||
{
|
||||
DEBUG_PRINT("USING AP");
|
||||
DEBUG_PRINTLN(apSSID.length());
|
||||
initAP();
|
||||
} else
|
||||
{
|
||||
DEBUG_PRINTLN("NO AP");
|
||||
WiFi.softAPdisconnect(true);
|
||||
}
|
||||
|
||||
initCon();
|
||||
|
||||
DEBUG_PRINTLN("");
|
||||
@@ -76,7 +61,7 @@ void wledInit()
|
||||
dnsServer.start(53, "*", WiFi.softAPIP());
|
||||
dnsActive = true;
|
||||
}
|
||||
|
||||
if (!initLedsLast) strip.service();
|
||||
//SERVER INIT
|
||||
//settings page
|
||||
server.on("/settings", HTTP_GET, [](){
|
||||
@@ -185,6 +170,10 @@ void wledInit()
|
||||
server.on("/freeheap", HTTP_GET, [](){
|
||||
server.send(200, "text/plain", (String)ESP.getFreeHeap());
|
||||
});
|
||||
|
||||
server.on("/pdebug", HTTP_GET, [](){
|
||||
server.send(200, "text/plain", (String)presetCycleTime);
|
||||
});
|
||||
|
||||
server.on("/power", HTTP_GET, [](){
|
||||
String val = (String)(int)strip.getPowerEstimate(ledCount,strip.getColor(),strip.getBrightness());
|
||||
@@ -197,38 +186,7 @@ void wledInit()
|
||||
});
|
||||
|
||||
server.on("/build", HTTP_GET, [](){
|
||||
String info = "hard-coded build info:\r\n\n";
|
||||
#ifdef ARDUINO_ARCH_ESP32
|
||||
info += "platform: esp32\r\n";
|
||||
#else
|
||||
info += "platform: esp8266\r\n";
|
||||
#endif
|
||||
info += "version: " + versionString + "\r\n";
|
||||
info += "build: " + (String)VERSION + "\r\n";
|
||||
info += "eepver: " + String(EEPVER) + "\r\n";
|
||||
#ifdef RGBW
|
||||
info += "rgbw: true\r\n";
|
||||
#else
|
||||
info += "rgbw: false\r\n";
|
||||
#endif
|
||||
info += "max-leds: " + (String)LEDCOUNT + "\r\n";
|
||||
#ifdef USEFS
|
||||
info += "spiffs: true\r\n";
|
||||
#else
|
||||
info += "spiffs: false\r\n";
|
||||
#endif
|
||||
#ifdef DEBUG
|
||||
info += "debug: true\r\n";
|
||||
#else
|
||||
info += "debug: false\r\n";
|
||||
#endif
|
||||
info += "button-pin: gpio" + String(buttonPin) + "\r\n";
|
||||
#ifdef ARDUINO_ARCH_ESP32
|
||||
info += "strip-pin: gpio" + String(PIN) + "\r\n";
|
||||
#else
|
||||
info += "strip-pin: gpio2\r\n";
|
||||
#endif
|
||||
server.send(200, "text/plain", info);
|
||||
server.send(200, "text/plain", getBuildInfo());
|
||||
});
|
||||
//if OTA is allowed
|
||||
if (!otaLock){
|
||||
@@ -273,6 +231,7 @@ void wledInit()
|
||||
server.send(404, "text/plain", "Not Found");
|
||||
}
|
||||
});
|
||||
if (!initLedsLast) strip.service();
|
||||
//init Alexa hue emulation
|
||||
if (alexaEnabled) alexaInit();
|
||||
|
||||
@@ -296,13 +255,13 @@ void wledInit()
|
||||
if (initLedsLast) initStrip();
|
||||
userBegin();
|
||||
if (macroBoot>0) applyMacro(macroBoot);
|
||||
Serial.println("Ada");
|
||||
}
|
||||
|
||||
void initStrip()
|
||||
{
|
||||
// Initialize NeoPixel Strip and button
|
||||
if (initLedsLast) strip.init();
|
||||
strip.setLedCount(ledCount);
|
||||
if (initLedsLast) strip.init(useRGBW,ledCount,PIN);
|
||||
strip.setReverseMode(reverseMode);
|
||||
strip.setColor(0);
|
||||
strip.setBrightness(255);
|
||||
@@ -324,6 +283,26 @@ void initAP(){
|
||||
|
||||
void initCon()
|
||||
{
|
||||
WiFi.disconnect(); //close old connections
|
||||
|
||||
if (staticIP[0] != 0)
|
||||
{
|
||||
WiFi.config(staticIP, staticGateway, staticSubnet, staticDNS);
|
||||
} else
|
||||
{
|
||||
WiFi.config(0U, 0U, 0U);
|
||||
}
|
||||
|
||||
if (apSSID.length()>0)
|
||||
{
|
||||
DEBUG_PRINT("USING AP");
|
||||
DEBUG_PRINTLN(apSSID.length());
|
||||
initAP();
|
||||
} else
|
||||
{
|
||||
DEBUG_PRINTLN("NO AP");
|
||||
WiFi.softAPdisconnect(true);
|
||||
}
|
||||
int fail_count = 0;
|
||||
if (clientSSID.length() <1 || clientSSID.equals("Your_Network")) fail_count = apWaitTimeSecs*2;
|
||||
WiFi.begin(clientSSID.c_str(), clientPass.c_str());
|
||||
@@ -341,7 +320,6 @@ void initCon()
|
||||
}
|
||||
if (millis()-lastTry > 499) {
|
||||
con = (WiFi.status() == WL_CONNECTED);
|
||||
if (con) DEBUG_PRINTLN("rofl");
|
||||
lastTry = millis();
|
||||
DEBUG_PRINTLN("C_NC");
|
||||
if (!recoveryAPDisabled && fail_count > apWaitTimeSecs*2)
|
||||
@@ -374,6 +352,7 @@ void buildCssColorString()
|
||||
case 9: cs[0]="f70"; cs[1]="421"; cs[2]="221"; cs[3]="a50"; cs[4]="f70"; cs[5]="f70"; break;//nixie
|
||||
case 10: cs[0]="2d2"; cs[1]="010"; cs[2]="121"; cs[3]="060"; cs[4]="040"; cs[5]="3f3"; break; //terminal
|
||||
case 11: cs[0]="867ADE"; cs[1]="4033A3"; cs[2]="483AAA"; cs[3]="483AAA"; cs[4]=""; cs[5]="867ADE"; break; //c64
|
||||
case 12: cs[0]="fbe8a6"; cs[1]="d2fdff"; cs[2]="b4dfe5"; cs[3]="f4976c"; cs[4]=""; cs[5]="303c6c"; break; //c64
|
||||
case 14: cs[0]="fc7"; cs[1]="49274a"; cs[2]="94618e"; cs[3]="f4decb"; cs[4]="0008"; cs[5]="f4decb"; break; //end
|
||||
case 15: for (int i=0;i<6;i++)cs[i]=cssCol[i];//custom
|
||||
}
|
||||
@@ -508,6 +487,36 @@ void serveSettings(byte subPage)
|
||||
}
|
||||
}
|
||||
|
||||
String getBuildInfo()
|
||||
{
|
||||
String info = "hard-coded build info:\r\n\n";
|
||||
#ifdef ARDUINO_ARCH_ESP32
|
||||
info += "platform: esp32\r\n";
|
||||
#else
|
||||
info += "platform: esp8266\r\n";
|
||||
#endif
|
||||
info += "version: " + versionString + "\r\n";
|
||||
info += "build: " + (String)VERSION + "\r\n";
|
||||
info += "eepver: " + String(EEPVER) + "\r\n";
|
||||
#ifdef USEFS
|
||||
info += "spiffs: true\r\n";
|
||||
#else
|
||||
info += "spiffs: false\r\n";
|
||||
#endif
|
||||
#ifdef DEBUG
|
||||
info += "debug: true\r\n";
|
||||
#else
|
||||
info += "debug: false\r\n";
|
||||
#endif
|
||||
info += "button-pin: gpio" + String(buttonPin) + "\r\n";
|
||||
#ifdef ARDUINO_ARCH_ESP32
|
||||
info += "strip-pin: gpio" + String(PIN) + "\r\n";
|
||||
#else
|
||||
info += "strip-pin: gpio2\r\n";
|
||||
#endif
|
||||
info += "build-type: src\r\n";
|
||||
return info;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -9,11 +9,13 @@ void notify(byte callMode, bool followUp=false)
|
||||
if (!udpConnected) return;
|
||||
switch (callMode)
|
||||
{
|
||||
case 0: return;
|
||||
case 1: if (!notifyDirect) return; break;
|
||||
case 2: if (!notifyButton) return; break;
|
||||
case 4: if (!notifyDirect) return; break;
|
||||
case 6: if (!notifyDirect) return; break; //fx change
|
||||
case 7: if (!notifyHue) return; break;
|
||||
case 8: if (!notifyDirect) return; break;
|
||||
default: return;
|
||||
}
|
||||
byte udpOut[WLEDPACKETSIZE];
|
||||
@@ -54,14 +56,14 @@ void handleNotifications()
|
||||
notify(notificationSentCallMode,true);
|
||||
}
|
||||
|
||||
if(udpConnected && receiveNotifications){
|
||||
if(udpConnected && (receiveNotifications || receiveDirect)){
|
||||
uint16_t packetSize = notifierUdp.parsePacket();
|
||||
if (packetSize > 1026) return;
|
||||
if(packetSize && notifierUdp.remoteIP() != WiFi.localIP()) //don't process broadcasts we send ourselves
|
||||
{
|
||||
byte udpIn[packetSize];
|
||||
notifierUdp.read(udpIn, packetSize);
|
||||
if (udpIn[0] == 0 && !arlsTimeout) //wled notifier, block if realtime packets active
|
||||
if (udpIn[0] == 0 && !arlsTimeout && receiveNotifications) //wled notifier, block if realtime packets active
|
||||
{
|
||||
if (receiveNotificationColor)
|
||||
{
|
||||
@@ -105,7 +107,7 @@ void handleNotifications()
|
||||
if (receiveNotificationBrightness) bri = udpIn[2];
|
||||
colorUpdated(3);
|
||||
}
|
||||
} else if (udpIn[0] == 1) //warls
|
||||
} else if (udpIn[0] > 0 && udpIn[0] < 4) //1 warls //2 drgb //3 drgbw
|
||||
{
|
||||
if (packetSize > 1) {
|
||||
if (udpIn[1] == 0)
|
||||
@@ -119,26 +121,56 @@ void handleNotifications()
|
||||
arlsTimeout = true;
|
||||
arlsTimeoutTime = millis() + 1000*udpIn[1];
|
||||
}
|
||||
for (int i = 2; i < packetSize -3; i += 4)
|
||||
if (udpIn[0] == 1) //warls
|
||||
{
|
||||
if (udpIn[i] + arlsOffset < ledCount && udpIn[i] + arlsOffset >= 0)
|
||||
if (useGammaCorrectionRGB)
|
||||
for (int i = 2; i < packetSize -3; i += 4)
|
||||
{
|
||||
strip.setPixelColor(udpIn[i] + arlsOffset, gamma8[udpIn[i+1]], gamma8[udpIn[i+2]], gamma8[udpIn[i+3]]);
|
||||
} else {
|
||||
strip.setPixelColor(udpIn[i] + arlsOffset, udpIn[i+1], udpIn[i+2], udpIn[i+3]);
|
||||
if (udpIn[i] + arlsOffset < ledCount && udpIn[i] + arlsOffset >= 0)
|
||||
if (useGammaCorrectionRGB)
|
||||
{
|
||||
strip.setPixelColor(udpIn[i] + arlsOffset, gamma8[udpIn[i+1]], gamma8[udpIn[i+2]], gamma8[udpIn[i+3]]);
|
||||
} else {
|
||||
strip.setPixelColor(udpIn[i] + arlsOffset, udpIn[i+1], udpIn[i+2], udpIn[i+3]);
|
||||
}
|
||||
}
|
||||
} else if (udpIn[0] == 2 && receiveDirect) //drgb
|
||||
{
|
||||
int id = 0;
|
||||
for (int i = 2; i < packetSize -2; i += 3)
|
||||
{
|
||||
if (useGammaCorrectionRGB)
|
||||
{
|
||||
strip.setPixelColor(id, gamma8[udpIn[i]], gamma8[udpIn[i+1]], gamma8[udpIn[i+2]]);
|
||||
} else {
|
||||
strip.setPixelColor(id, udpIn[i+0], udpIn[i+1], udpIn[i+2]);
|
||||
}
|
||||
id++; if (id >= ledCount) break;
|
||||
}
|
||||
} else if (udpIn[0] == 3 && receiveDirect) //drgbw
|
||||
{
|
||||
int id = 0;
|
||||
for (int i = 2; i < packetSize -3; i += 4)
|
||||
{
|
||||
if (useGammaCorrectionRGB)
|
||||
{
|
||||
strip.setPixelColor(id, gamma8[udpIn[i]], gamma8[udpIn[i+1]], gamma8[udpIn[i+2]], gamma8[udpIn[i+3]]);
|
||||
} else {
|
||||
strip.setPixelColor(id, udpIn[i+0], udpIn[i+1], udpIn[i+2], udpIn[i+3]);
|
||||
}
|
||||
id++; if (id >= ledCount) break;
|
||||
}
|
||||
}
|
||||
strip.show();
|
||||
}
|
||||
}
|
||||
}
|
||||
if (arlsTimeout && millis() > arlsTimeoutTime)
|
||||
{
|
||||
strip.unlockAll();
|
||||
arlsTimeout = false;
|
||||
strip.setMode(effectCurrent);
|
||||
}
|
||||
}
|
||||
if (arlsTimeout && millis() > arlsTimeoutTime)
|
||||
{
|
||||
strip.unlockAll();
|
||||
if (bri == 0) strip.setBrightness(0);
|
||||
arlsTimeout = false;
|
||||
strip.setMode(effectCurrent);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -51,7 +51,7 @@ bool colorChanged()
|
||||
|
||||
void colorUpdated(int callMode)
|
||||
{
|
||||
//call for notifier -> 0: init 1: direct change 2: button 3: notification 4: nightlight 5: other (NN)6: fx changed 7: hue
|
||||
//call for notifier -> 0: init 1: direct change 2: button 3: notification 4: nightlight 5: other (NN)6: fx changed 7: hue 8: preset cycle
|
||||
if (!colorChanged())
|
||||
{
|
||||
if (callMode == 6) notify(6);
|
||||
@@ -78,6 +78,7 @@ void colorUpdated(int callMode)
|
||||
{
|
||||
//set correct delay if not using notification delay
|
||||
if (callMode != 3) transitionDelayTemp = transitionDelay;
|
||||
if (transitionDelayTemp == 0) {setLedsStandard();strip.trigger();return;}
|
||||
|
||||
if (transitionActive)
|
||||
{
|
||||
@@ -112,7 +113,7 @@ void handleTransitions()
|
||||
strip.setFastUpdateMode(false);
|
||||
return;
|
||||
}
|
||||
if (tper - tperLast < transitionResolution)
|
||||
if (tper - tperLast < 0.004)
|
||||
{
|
||||
return;
|
||||
}
|
||||
@@ -176,4 +177,14 @@ void handleNightlight()
|
||||
{
|
||||
nightlightActiveOld = false;
|
||||
}
|
||||
|
||||
//also handle preset cycle here
|
||||
if (presetCyclingEnabled && (millis() - presetCycledTime > presetCycleTime))
|
||||
{
|
||||
applyPreset(presetCycCurr,presetCycleBri,presetCycleCol,presetCycleFx);
|
||||
presetCycCurr++; if (presetCycCurr > presetCycleMax) presetCycCurr = presetCycleMin;
|
||||
if (presetCycCurr > 25) presetCycCurr = 1;
|
||||
colorUpdated(8);
|
||||
presetCycledTime = millis();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,7 +49,10 @@ TimeChangeRule NZDT = {Second, Sun, Sep, 2, 780 }; //Daylight time = UTC + 13
|
||||
TimeChangeRule NZST = {First, Sun, Apr, 3, 720 }; //Standard time = UTC + 12 hours
|
||||
Timezone tzNZ(NZDT, NZST);
|
||||
|
||||
Timezone* timezones[] = { &tzUTC, &tzUK, &tzEUCentral, &tzEUEastern, &tzUSEastern, &tzUSCentral, &tzUSMountain, &tzUSArizona, &tzUSPacific, &tzChina, &tzJapan, &tzAUEastern, &tzNZ};
|
||||
TimeChangeRule NKST = {Last, Sun, Mar, 1, 510}; //Pyongyang Time = UTC + 8.5 hours
|
||||
Timezone tzNK(NKST, NKST);
|
||||
|
||||
Timezone* timezones[] = {&tzUTC, &tzUK, &tzEUCentral, &tzEUEastern, &tzUSEastern, &tzUSCentral, &tzUSMountain, &tzUSArizona, &tzUSPacific, &tzChina, &tzJapan, &tzAUEastern, &tzNZ, &tzNK};
|
||||
|
||||
void handleNetworkTime()
|
||||
{
|
||||
@@ -106,7 +109,7 @@ bool checkNTPResponse()
|
||||
unsigned long secsSince1900 = highWord << 16 | lowWord;
|
||||
|
||||
DEBUG_PRINT("Unix time = ");
|
||||
unsigned long epoch = secsSince1900 - 2208988800UL; //subtract 70 years
|
||||
unsigned long epoch = secsSince1900 - 2208988799UL; //subtract 70 years -1sec (on avg. more precision)
|
||||
setTime(epoch);
|
||||
DEBUG_PRINTLN(epoch);
|
||||
if (countdownTime - now() > 0) countdownOverTriggered = false;
|
||||
|
||||
Reference in New Issue
Block a user