Free more than 2kB of RAM

Store Palettes in PROGMEM
F() select long and rarely used strings
Refactor hue error
This commit is contained in:
cschwinne 2020-02-25 02:19:12 +01:00
parent 1221661ae3
commit f304a6891f
11 changed files with 123 additions and 105 deletions

View File

@ -591,6 +591,7 @@ class WS2812FX {
uint8_t _brightness; uint8_t _brightness;
static uint16_t _usedSegmentData; static uint16_t _usedSegmentData;
void load_gradient_palette(uint8_t);
void handle_palette(void); void handle_palette(void);
void fill(uint32_t); void fill(uint32_t);

View File

@ -324,7 +324,7 @@ uint8_t WS2812FX::getModeCount()
uint8_t WS2812FX::getPaletteCount() uint8_t WS2812FX::getPaletteCount()
{ {
return 13 + gGradientPaletteCount; return 13 + GRADIENT_PALETTE_COUNT;
} }
//TODO transitions //TODO transitions
@ -707,6 +707,15 @@ CRGB WS2812FX::col_to_crgb(uint32_t color)
} }
void WS2812FX::load_gradient_palette(uint8_t index)
{
byte i = constrain(index, 0, GRADIENT_PALETTE_COUNT -1);
byte tcp[72]; //support gradient palettes with up to 18 entries
memcpy_P(tcp, (byte*)pgm_read_dword(&(gGradientPalettes[i])), 72);
targetPalette.loadDynamicGradientPalette(tcp);
}
/* /*
* FastLED palette modes helper function. Limitation: Due to memory reasons, multiple active segments with FastLED will disable the Palette transitions * FastLED palette modes helper function. Limitation: Due to memory reasons, multiple active segments with FastLED will disable the Palette transitions
*/ */
@ -724,13 +733,13 @@ void WS2812FX::handle_palette(void)
case 0: {//default palette. Differs depending on effect case 0: {//default palette. Differs depending on effect
switch (SEGMENT.mode) switch (SEGMENT.mode)
{ {
case FX_MODE_FIRE_2012 : targetPalette = gGradientPalettes[22]; break;//heat palette case FX_MODE_FIRE_2012 : load_gradient_palette(22); break;//heat palette
case FX_MODE_COLORWAVES : targetPalette = gGradientPalettes[13]; break;//landscape 33 case FX_MODE_COLORWAVES : load_gradient_palette(13); break;//landscape 33
case FX_MODE_FILLNOISE8 : targetPalette = OceanColors_p; break; case FX_MODE_FILLNOISE8 : targetPalette = OceanColors_p; break;
case FX_MODE_NOISE16_1 : targetPalette = gGradientPalettes[17]; break;//Drywet case FX_MODE_NOISE16_1 : load_gradient_palette(17); break;//Drywet
case FX_MODE_NOISE16_2 : targetPalette = gGradientPalettes[30]; break;//Blue cyan yellow case FX_MODE_NOISE16_2 : load_gradient_palette(30); break;//Blue cyan yellow
case FX_MODE_NOISE16_3 : targetPalette = gGradientPalettes[22]; break;//heat palette case FX_MODE_NOISE16_3 : load_gradient_palette(22); break;//heat palette
case FX_MODE_NOISE16_4 : targetPalette = gGradientPalettes[13]; break;//landscape 33 case FX_MODE_NOISE16_4 : load_gradient_palette(13); break;//landscape 33
//case FX_MODE_GLITTER : targetPalette = RainbowColors_p; break; //case FX_MODE_GLITTER : targetPalette = RainbowColors_p; break;
default: targetPalette = PartyColors_p; break;//palette, bpm default: targetPalette = PartyColors_p; break;//palette, bpm
@ -787,7 +796,7 @@ void WS2812FX::handle_palette(void)
case 12: //Rainbow stripe colors case 12: //Rainbow stripe colors
targetPalette = RainbowStripeColors_p; break; targetPalette = RainbowStripeColors_p; break;
default: //progmem palettes default: //progmem palettes
targetPalette = gGradientPalettes[constrain(SEGMENT.palette -13, 0, gGradientPaletteCount -1)]; load_gradient_palette(SEGMENT.palette -13);
} }
if (singleSegmentMode && paletteFade) //only blend if just one segment uses FastLED mode if (singleSegmentMode && paletteFade) //only blend if just one segment uses FastLED mode

View File

@ -4,7 +4,7 @@
//PIN CONFIGURATION //PIN CONFIGURATION
#ifndef LEDPIN #ifndef LEDPIN
#define LEDPIN 2 //strip pin. Any for ESP32, gpio2 or 3 is recommended for ESP8266 (gpio2/3 are labeled D4/RX on NodeMCU and Wemos) #define LEDPIN 5 //strip pin. Any for ESP32, gpio2 or 3 is recommended for ESP8266 (gpio2/3 are labeled D4/RX on NodeMCU and Wemos)
#endif #endif
//#define USE_APA102 // Uncomment for using APA102 LEDs. //#define USE_APA102 // Uncomment for using APA102 LEDs.
//#define USE_WS2801 // Uncomment for using WS2801 LEDs (make sure you have NeoPixelBus v2.5.6 or newer) //#define USE_WS2801 // Uncomment for using WS2801 LEDs (make sure you have NeoPixelBus v2.5.6 or newer)

View File

@ -61,4 +61,13 @@
#define TYPE_ANALOG_4CH 9 //analog RGBW #define TYPE_ANALOG_4CH 9 //analog RGBW
#define TYPE_ANALOG_5CH 10 //analog RGB + WW + CW #define TYPE_ANALOG_5CH 10 //analog RGB + WW + CW
//Hue error codes
#define HUE_ERROR_INACTIVE 0
#define HUE_ERROR_UNAUTHORIZED 1
#define HUE_ERROR_LIGHTID 3
#define HUE_ERROR_PUSHLINK 101
#define HUE_ERROR_JSON_PARSING 250
#define HUE_ERROR_TIMEOUT 251
#define HUE_ERROR_ACTIVE 255
#endif #endif

View File

@ -335,7 +335,7 @@ Hue Bridge IP:<br>
<input name="H3" type="number" min="0" max="255" ><br> <input name="H3" type="number" min="0" max="255" ><br>
<b>Press the pushlink button on the bridge, after that save this page!</b><br> <b>Press the pushlink button on the bridge, after that save this page!</b><br>
(when first connecting)<br> (when first connecting)<br>
Hue status: <span class="hms"> Internal ESP Error! </span><hr> Hue status: <span class="hms"> Disabled in this build </span><hr>
<button type="button" onclick="B()">Back</button><button type="submit">Save</button> <button type="button" onclick="B()">Back</button><button type="submit">Save</button>
</form> </form>
</body> </body>

View File

@ -13,7 +13,9 @@
#ifndef PalettesWLED_h #ifndef PalettesWLED_h
#define PalettesWLED_h #define PalettesWLED_h
DEFINE_GRADIENT_PALETTE( ib_jul01_gp ) { #define GRADIENT_PALETTE_COUNT 38
const byte ib_jul01_gp[] PROGMEM = {
0, 194, 1, 1, 0, 194, 1, 1,
94, 1, 29, 18, 94, 1, 29, 18,
132, 57,131, 28, 132, 57,131, 28,
@ -24,7 +26,7 @@ DEFINE_GRADIENT_PALETTE( ib_jul01_gp ) {
// converted for FastLED with gammas (2.6, 2.2, 2.5) // converted for FastLED with gammas (2.6, 2.2, 2.5)
// Size: 20 bytes of program space. // Size: 20 bytes of program space.
DEFINE_GRADIENT_PALETTE( es_vintage_57_gp ) { const byte es_vintage_57_gp[] PROGMEM = {
0, 2, 1, 1, 0, 2, 1, 1,
53, 18, 1, 0, 53, 18, 1, 0,
104, 69, 29, 1, 104, 69, 29, 1,
@ -37,7 +39,7 @@ DEFINE_GRADIENT_PALETTE( es_vintage_57_gp ) {
// converted for FastLED with gammas (2.6, 2.2, 2.5) // converted for FastLED with gammas (2.6, 2.2, 2.5)
// Size: 32 bytes of program space. // Size: 32 bytes of program space.
DEFINE_GRADIENT_PALETTE( es_vintage_01_gp ) { const byte es_vintage_01_gp[] PROGMEM = {
0, 4, 1, 1, 0, 4, 1, 1,
51, 16, 0, 1, 51, 16, 0, 1,
76, 97,104, 3, 76, 97,104, 3,
@ -53,7 +55,7 @@ DEFINE_GRADIENT_PALETTE( es_vintage_01_gp ) {
// converted for FastLED with gammas (2.6, 2.2, 2.5) // converted for FastLED with gammas (2.6, 2.2, 2.5)
// Size: 20 bytes of program space. // Size: 20 bytes of program space.
DEFINE_GRADIENT_PALETTE( es_rivendell_15_gp ) { const byte es_rivendell_15_gp[] PROGMEM = {
0, 1, 14, 5, 0, 1, 14, 5,
101, 16, 36, 14, 101, 16, 36, 14,
165, 56, 68, 30, 165, 56, 68, 30,
@ -67,7 +69,7 @@ DEFINE_GRADIENT_PALETTE( es_rivendell_15_gp ) {
// Size: 36 bytes of program space. // Size: 36 bytes of program space.
// Edited to be brighter // Edited to be brighter
DEFINE_GRADIENT_PALETTE( rgi_15_gp ) { const byte rgi_15_gp[] PROGMEM = {
0, 4, 1, 70, 0, 4, 1, 70,
31, 55, 1, 30, 31, 55, 1, 30,
63, 255, 4, 7, 63, 255, 4, 7,
@ -84,7 +86,7 @@ DEFINE_GRADIENT_PALETTE( rgi_15_gp ) {
// converted for FastLED with gammas (2.6, 2.2, 2.5) // converted for FastLED with gammas (2.6, 2.2, 2.5)
// Size: 8 bytes of program space. // Size: 8 bytes of program space.
DEFINE_GRADIENT_PALETTE( retro2_16_gp ) { const byte retro2_16_gp[] PROGMEM = {
0, 188,135, 1, 0, 188,135, 1,
255, 46, 7, 1}; 255, 46, 7, 1};
@ -94,7 +96,7 @@ DEFINE_GRADIENT_PALETTE( retro2_16_gp ) {
// converted for FastLED with gammas (2.6, 2.2, 2.5) // converted for FastLED with gammas (2.6, 2.2, 2.5)
// Size: 20 bytes of program space. // Size: 20 bytes of program space.
DEFINE_GRADIENT_PALETTE( Analogous_1_gp ) { const byte Analogous_1_gp[] PROGMEM = {
0, 3, 0,255, 0, 3, 0,255,
63, 23, 0,255, 63, 23, 0,255,
127, 67, 0,255, 127, 67, 0,255,
@ -107,7 +109,7 @@ DEFINE_GRADIENT_PALETTE( Analogous_1_gp ) {
// converted for FastLED with gammas (2.6, 2.2, 2.5) // converted for FastLED with gammas (2.6, 2.2, 2.5)
// Size: 20 bytes of program space. // Size: 20 bytes of program space.
DEFINE_GRADIENT_PALETTE( es_pinksplash_08_gp ) { const byte es_pinksplash_08_gp[] PROGMEM = {
0, 126, 11,255, 0, 126, 11,255,
127, 197, 1, 22, 127, 197, 1, 22,
175, 210,157,172, 175, 210,157,172,
@ -120,7 +122,7 @@ DEFINE_GRADIENT_PALETTE( es_pinksplash_08_gp ) {
// converted for FastLED with gammas (2.6, 2.2, 2.5) // converted for FastLED with gammas (2.6, 2.2, 2.5)
// Size: 16 bytes of program space. // Size: 16 bytes of program space.
DEFINE_GRADIENT_PALETTE( es_ocean_breeze_036_gp ) { const byte es_ocean_breeze_036_gp[] PROGMEM = {
0, 1, 6, 7, 0, 1, 6, 7,
89, 1, 99,111, 89, 1, 99,111,
153, 144,209,255, 153, 144,209,255,
@ -132,7 +134,7 @@ DEFINE_GRADIENT_PALETTE( es_ocean_breeze_036_gp ) {
// converted for FastLED with gammas (2.6, 2.2, 2.5) // converted for FastLED with gammas (2.6, 2.2, 2.5)
// Size: 88 bytes of program space. // Size: 88 bytes of program space.
DEFINE_GRADIENT_PALETTE( departure_gp ) { const byte departure_gp[] PROGMEM = {
0, 8, 3, 0, 0, 8, 3, 0,
42, 23, 7, 0, 42, 23, 7, 0,
63, 75, 38, 6, 63, 75, 38, 6,
@ -152,7 +154,7 @@ DEFINE_GRADIENT_PALETTE( departure_gp ) {
// converted for FastLED with gammas (2.6, 2.2, 2.5) // converted for FastLED with gammas (2.6, 2.2, 2.5)
// Size: 36 bytes of program space. // Size: 36 bytes of program space.
DEFINE_GRADIENT_PALETTE( es_landscape_64_gp ) { const byte es_landscape_64_gp[] PROGMEM = {
0, 0, 0, 0, 0, 0, 0, 0,
37, 2, 25, 1, 37, 2, 25, 1,
76, 15,115, 5, 76, 15,115, 5,
@ -169,7 +171,7 @@ DEFINE_GRADIENT_PALETTE( es_landscape_64_gp ) {
// converted for FastLED with gammas (2.6, 2.2, 2.5) // converted for FastLED with gammas (2.6, 2.2, 2.5)
// Size: 24 bytes of program space. // Size: 24 bytes of program space.
DEFINE_GRADIENT_PALETTE( es_landscape_33_gp ) { const byte es_landscape_33_gp[] PROGMEM = {
0, 1, 5, 0, 0, 1, 5, 0,
19, 32, 23, 1, 19, 32, 23, 1,
38, 161, 55, 1, 38, 161, 55, 1,
@ -183,7 +185,7 @@ DEFINE_GRADIENT_PALETTE( es_landscape_33_gp ) {
// converted for FastLED with gammas (2.6, 2.2, 2.5) // converted for FastLED with gammas (2.6, 2.2, 2.5)
// Size: 28 bytes of program space. // Size: 28 bytes of program space.
DEFINE_GRADIENT_PALETTE( rainbowsherbet_gp ) { const byte rainbowsherbet_gp[] PROGMEM = {
0, 255, 33, 4, 0, 255, 33, 4,
43, 255, 68, 25, 43, 255, 68, 25,
86, 255, 7, 25, 86, 255, 7, 25,
@ -198,7 +200,7 @@ DEFINE_GRADIENT_PALETTE( rainbowsherbet_gp ) {
// converted for FastLED with gammas (2.6, 2.2, 2.5) // converted for FastLED with gammas (2.6, 2.2, 2.5)
// Size: 24 bytes of program space. // Size: 24 bytes of program space.
DEFINE_GRADIENT_PALETTE( gr65_hult_gp ) { const byte gr65_hult_gp[] PROGMEM = {
0, 247,176,247, 0, 247,176,247,
48, 255,136,255, 48, 255,136,255,
89, 220, 29,226, 89, 220, 29,226,
@ -212,7 +214,7 @@ DEFINE_GRADIENT_PALETTE( gr65_hult_gp ) {
// converted for FastLED with gammas (2.6, 2.2, 2.5) // converted for FastLED with gammas (2.6, 2.2, 2.5)
// Size: 32 bytes of program space. // Size: 32 bytes of program space.
DEFINE_GRADIENT_PALETTE( gr64_hult_gp ) { const byte gr64_hult_gp[] PROGMEM = {
0, 1,124,109, 0, 1,124,109,
66, 1, 93, 79, 66, 1, 93, 79,
104, 52, 65, 1, 104, 52, 65, 1,
@ -228,7 +230,7 @@ DEFINE_GRADIENT_PALETTE( gr64_hult_gp ) {
// converted for FastLED with gammas (2.6, 2.2, 2.5) // converted for FastLED with gammas (2.6, 2.2, 2.5)
// Size: 28 bytes of program space. // Size: 28 bytes of program space.
DEFINE_GRADIENT_PALETTE( GMT_drywet_gp ) { const byte GMT_drywet_gp[] PROGMEM = {
0, 47, 30, 2, 0, 47, 30, 2,
42, 213,147, 24, 42, 213,147, 24,
84, 103,219, 52, 84, 103,219, 52,
@ -243,7 +245,7 @@ DEFINE_GRADIENT_PALETTE( GMT_drywet_gp ) {
// converted for FastLED with gammas (2.6, 2.2, 2.5) // converted for FastLED with gammas (2.6, 2.2, 2.5)
// Size: 24 bytes of program space. // Size: 24 bytes of program space.
DEFINE_GRADIENT_PALETTE( ib15_gp ) { const byte ib15_gp[] PROGMEM = {
0, 113, 91,147, 0, 113, 91,147,
72, 157, 88, 78, 72, 157, 88, 78,
89, 208, 85, 33, 89, 208, 85, 33,
@ -257,7 +259,7 @@ DEFINE_GRADIENT_PALETTE( ib15_gp ) {
// converted for FastLED with gammas (2.6, 2.2, 2.5) // converted for FastLED with gammas (2.6, 2.2, 2.5)
// Size: 20 bytes of program space. // Size: 20 bytes of program space.
DEFINE_GRADIENT_PALETTE( Tertiary_01_gp ) { const byte Tertiary_01_gp[] PROGMEM = {
0, 0, 1,255, 0, 0, 1,255,
63, 3, 68, 45, 63, 3, 68, 45,
127, 23,255, 0, 127, 23,255, 0,
@ -270,7 +272,7 @@ DEFINE_GRADIENT_PALETTE( Tertiary_01_gp ) {
// converted for FastLED with gammas (2.6, 2.2, 2.5) // converted for FastLED with gammas (2.6, 2.2, 2.5)
// Size: 52 bytes of program space. // Size: 52 bytes of program space.
DEFINE_GRADIENT_PALETTE( lava_gp ) { const byte lava_gp[] PROGMEM = {
0, 0, 0, 0, 0, 0, 0, 0,
46, 18, 0, 0, 46, 18, 0, 0,
96, 113, 0, 0, 96, 113, 0, 0,
@ -291,7 +293,7 @@ DEFINE_GRADIENT_PALETTE( lava_gp ) {
// converted for FastLED with gammas (2.6, 2.2, 2.5) // converted for FastLED with gammas (2.6, 2.2, 2.5)
// Size: 28 bytes of program space. // Size: 28 bytes of program space.
DEFINE_GRADIENT_PALETTE( fierce_ice_gp ) { const byte fierce_ice_gp[] PROGMEM = {
0, 0, 0, 0, 0, 0, 0, 0,
59, 0, 9, 45, 59, 0, 9, 45,
119, 0, 38,255, 119, 0, 38,255,
@ -306,7 +308,7 @@ DEFINE_GRADIENT_PALETTE( fierce_ice_gp ) {
// converted for FastLED with gammas (2.6, 2.2, 2.5) // converted for FastLED with gammas (2.6, 2.2, 2.5)
// Size: 44 bytes of program space. // Size: 44 bytes of program space.
DEFINE_GRADIENT_PALETTE( Colorfull_gp ) { const byte Colorfull_gp[] PROGMEM = {
0, 10, 85, 5, 0, 10, 85, 5,
25, 29,109, 18, 25, 29,109, 18,
60, 59,138, 42, 60, 59,138, 42,
@ -325,7 +327,7 @@ DEFINE_GRADIENT_PALETTE( Colorfull_gp ) {
// converted for FastLED with gammas (2.6, 2.2, 2.5) // converted for FastLED with gammas (2.6, 2.2, 2.5)
// Size: 44 bytes of program space. // Size: 44 bytes of program space.
DEFINE_GRADIENT_PALETTE( Pink_Purple_gp ) { const byte Pink_Purple_gp[] PROGMEM = {
0, 19, 2, 39, 0, 19, 2, 39,
25, 26, 4, 45, 25, 26, 4, 45,
51, 33, 6, 52, 51, 33, 6, 52,
@ -344,7 +346,7 @@ DEFINE_GRADIENT_PALETTE( Pink_Purple_gp ) {
// converted for FastLED with gammas (2.6, 2.2, 2.5) // converted for FastLED with gammas (2.6, 2.2, 2.5)
// Size: 28 bytes of program space. // Size: 28 bytes of program space.
DEFINE_GRADIENT_PALETTE( Sunset_Real_gp ) { const byte Sunset_Real_gp[] PROGMEM = {
0, 120, 0, 0, 0, 120, 0, 0,
22, 179, 22, 0, 22, 179, 22, 0,
51, 255,104, 0, 51, 255,104, 0,
@ -359,7 +361,7 @@ DEFINE_GRADIENT_PALETTE( Sunset_Real_gp ) {
// converted for FastLED with gammas (2.6, 2.2, 2.5) // converted for FastLED with gammas (2.6, 2.2, 2.5)
// Size: 44 bytes of program space. // Size: 44 bytes of program space.
DEFINE_GRADIENT_PALETTE( Sunset_Yellow_gp ) { const byte Sunset_Yellow_gp[] PROGMEM = {
0, 10, 62,123, 0, 10, 62,123,
36, 56,130,103, 36, 56,130,103,
87, 153,225, 85, 87, 153,225, 85,
@ -378,7 +380,7 @@ DEFINE_GRADIENT_PALETTE( Sunset_Yellow_gp ) {
// converted for FastLED with gammas (2.6, 2.2, 2.5) // converted for FastLED with gammas (2.6, 2.2, 2.5)
// Size: 60 bytes of program space. // Size: 60 bytes of program space.
DEFINE_GRADIENT_PALETTE( Beech_gp ) { const byte Beech_gp[] PROGMEM = {
0, 255,252,214, 0, 255,252,214,
12, 255,252,214, 12, 255,252,214,
22, 255,252,214, 22, 255,252,214,
@ -401,7 +403,7 @@ DEFINE_GRADIENT_PALETTE( Beech_gp ) {
// converted for FastLED with gammas (2.6, 2.2, 2.5) // converted for FastLED with gammas (2.6, 2.2, 2.5)
// Size: 32 bytes of program space. // Size: 32 bytes of program space.
DEFINE_GRADIENT_PALETTE( Another_Sunset_gp ) { const byte Another_Sunset_gp[] PROGMEM = {
0, 110, 49, 11, 0, 110, 49, 11,
29, 55, 34, 10, 29, 55, 34, 10,
68, 22, 22, 9, 68, 22, 22, 9,
@ -420,7 +422,7 @@ DEFINE_GRADIENT_PALETTE( Another_Sunset_gp ) {
// converted for FastLED with gammas (2.6, 2.2, 2.5) // converted for FastLED with gammas (2.6, 2.2, 2.5)
// Size: 52 bytes of program space. // Size: 52 bytes of program space.
DEFINE_GRADIENT_PALETTE( es_autumn_19_gp ) { const byte es_autumn_19_gp[] PROGMEM = {
0, 26, 1, 1, 0, 26, 1, 1,
51, 67, 4, 1, 51, 67, 4, 1,
84, 118, 14, 1, 84, 118, 14, 1,
@ -441,7 +443,7 @@ DEFINE_GRADIENT_PALETTE( es_autumn_19_gp ) {
// converted for FastLED with gammas (2.6, 2.2, 2.5) // converted for FastLED with gammas (2.6, 2.2, 2.5)
// Size: 28 bytes of program space. // Size: 28 bytes of program space.
DEFINE_GRADIENT_PALETTE( BlacK_Blue_Magenta_White_gp ) { const byte BlacK_Blue_Magenta_White_gp[] PROGMEM = {
0, 0, 0, 0, 0, 0, 0, 0,
42, 0, 0, 45, 42, 0, 0, 45,
84, 0, 0,255, 84, 0, 0,255,
@ -456,7 +458,7 @@ DEFINE_GRADIENT_PALETTE( BlacK_Blue_Magenta_White_gp ) {
// converted for FastLED with gammas (2.6, 2.2, 2.5) // converted for FastLED with gammas (2.6, 2.2, 2.5)
// Size: 20 bytes of program space. // Size: 20 bytes of program space.
DEFINE_GRADIENT_PALETTE( BlacK_Magenta_Red_gp ) { const byte BlacK_Magenta_Red_gp[] PROGMEM = {
0, 0, 0, 0, 0, 0, 0, 0,
63, 42, 0, 45, 63, 42, 0, 45,
127, 255, 0,255, 127, 255, 0,255,
@ -469,7 +471,7 @@ DEFINE_GRADIENT_PALETTE( BlacK_Magenta_Red_gp ) {
// converted for FastLED with gammas (2.6, 2.2, 2.5) // converted for FastLED with gammas (2.6, 2.2, 2.5)
// Size: 28 bytes of program space. // Size: 28 bytes of program space.
DEFINE_GRADIENT_PALETTE( BlacK_Red_Magenta_Yellow_gp ) { const byte BlacK_Red_Magenta_Yellow_gp[] PROGMEM = {
0, 0, 0, 0, 0, 0, 0, 0,
42, 42, 0, 0, 42, 42, 0, 0,
84, 255, 0, 0, 84, 255, 0, 0,
@ -484,7 +486,7 @@ DEFINE_GRADIENT_PALETTE( BlacK_Red_Magenta_Yellow_gp ) {
// converted for FastLED with gammas (2.6, 2.2, 2.5) // converted for FastLED with gammas (2.6, 2.2, 2.5)
// Size: 20 bytes of program space. // Size: 20 bytes of program space.
DEFINE_GRADIENT_PALETTE( Blue_Cyan_Yellow_gp ) { const byte Blue_Cyan_Yellow_gp[] PROGMEM = {
0, 0, 0,255, 0, 0, 0,255,
63, 0, 55,255, 63, 0, 55,255,
127, 0,255,255, 127, 0,255,255,
@ -494,7 +496,7 @@ DEFINE_GRADIENT_PALETTE( Blue_Cyan_Yellow_gp ) {
//Custom palette by Aircoookie //Custom palette by Aircoookie
DEFINE_GRADIENT_PALETTE( Orange_Teal_gp ) { const byte Orange_Teal_gp[] PROGMEM = {
0, 0,150, 92, 0, 0,150, 92,
55, 0,150, 92, 55, 0,150, 92,
200, 255, 72, 0, 200, 255, 72, 0,
@ -502,7 +504,7 @@ DEFINE_GRADIENT_PALETTE( Orange_Teal_gp ) {
//Custom palette by Aircoookie //Custom palette by Aircoookie
DEFINE_GRADIENT_PALETTE( Tiamat_gp ) { const byte Tiamat_gp[] PROGMEM = {
0, 1, 2, 14, //gc 0, 1, 2, 14, //gc
33, 2, 5, 35, //gc from 47, 61,126 33, 2, 5, 35, //gc from 47, 61,126
100, 13,135, 92, //gc from 88,242,247 100, 13,135, 92, //gc from 88,242,247
@ -517,7 +519,7 @@ DEFINE_GRADIENT_PALETTE( Tiamat_gp ) {
//Custom palette by Aircoookie //Custom palette by Aircoookie
DEFINE_GRADIENT_PALETTE( April_Night_gp ) { const byte April_Night_gp[] PROGMEM = {
0, 1, 5, 45, //deep blue 0, 1, 5, 45, //deep blue
10, 1, 5, 45, 10, 1, 5, 45,
25, 5,169,175, //light blue 25, 5,169,175, //light blue
@ -536,7 +538,7 @@ DEFINE_GRADIENT_PALETTE( April_Night_gp ) {
244, 1, 5, 45, 244, 1, 5, 45,
255, 1, 5, 45}; 255, 1, 5, 45};
DEFINE_GRADIENT_PALETTE( Orangery_gp ) { const byte Orangery_gp[] PROGMEM = {
0, 255, 95, 23, 0, 255, 95, 23,
30, 255, 82, 0, 30, 255, 82, 0,
60, 223, 13, 8, 60, 223, 13, 8,
@ -548,7 +550,7 @@ DEFINE_GRADIENT_PALETTE( Orangery_gp ) {
255, 213, 37, 4}; 255, 213, 37, 4};
//inspired by Mark Kriegsman https://gist.github.com/kriegsman/756ea6dcae8e30845b5a //inspired by Mark Kriegsman https://gist.github.com/kriegsman/756ea6dcae8e30845b5a
DEFINE_GRADIENT_PALETTE( C9_gp ) { const byte C9_gp[] PROGMEM = {
0, 184, 4, 0, //red 0, 184, 4, 0, //red
60, 184, 4, 0, 60, 184, 4, 0,
65, 144, 44, 2, //amber 65, 144, 44, 2, //amber
@ -558,14 +560,14 @@ DEFINE_GRADIENT_PALETTE( C9_gp ) {
195, 7, 7, 88, //blue 195, 7, 7, 88, //blue
255, 7, 7, 88}; 255, 7, 7, 88};
DEFINE_GRADIENT_PALETTE( Sakura_gp ) { const byte Sakura_gp[] PROGMEM = {
0, 196, 19, 10, 0, 196, 19, 10,
65, 255, 69, 45, 65, 255, 69, 45,
130, 223, 45, 72, 130, 223, 45, 72,
195, 255, 82,103, 195, 255, 82,103,
255, 223, 13, 17}; 255, 223, 13, 17};
DEFINE_GRADIENT_PALETTE( Aurora_gp ) { const byte Aurora_gp[] PROGMEM = {
0, 1, 5, 45, //deep blue 0, 1, 5, 45, //deep blue
64, 0,200, 23, 64, 0,200, 23,
128, 0,255, 0, //green 128, 0,255, 0, //green
@ -578,13 +580,7 @@ DEFINE_GRADIENT_PALETTE( Aurora_gp ) {
// This will let us programmatically choose one based on // This will let us programmatically choose one based on
// a number, rather than having to activate each explicitly // a number, rather than having to activate each explicitly
// by name every time. // by name every time.
// Since it is const, this array could also be moved const byte* const gGradientPalettes[] PROGMEM = {
// into PROGMEM to save SRAM, but for simplicity of illustration
// we'll keep it in a regular SRAM array.
//
// This list of color palettes acts as a "playlist"; you can
// add or delete, or re-arrange as you wish.
const TProgmemRGBGradientPalettePtr gGradientPalettes[] = {
Sunset_Real_gp, //13-00 Sunset Sunset_Real_gp, //13-00 Sunset
es_rivendell_15_gp, //14-01 Rivendell es_rivendell_15_gp, //14-01 Rivendell
es_ocean_breeze_036_gp, //15-02 Breeze es_ocean_breeze_036_gp, //15-02 Breeze
@ -625,9 +621,4 @@ const TProgmemRGBGradientPalettePtr gGradientPalettes[] = {
Aurora_gp, //50-37 Aurora Aurora_gp, //50-37 Aurora
}; };
// Count of how many cpt-city gradients are defined:
const uint8_t gGradientPaletteCount =
sizeof( gGradientPalettes) / sizeof( TProgmemRGBGradientPalettePtr );
#endif #endif

View File

@ -119,7 +119,7 @@
#endif #endif
//version code in format yymmddb (b = daily build) //version code in format yymmddb (b = daily build)
#define VERSION 2002243 #define VERSION 2002251
char versionString[] = "0.9.1"; char versionString[] = "0.9.1";
@ -350,7 +350,7 @@ bool udpConnected = false, udpRgbConnected = false;
bool showWelcomePage = false; bool showWelcomePage = false;
//hue //hue
char hueError[25] = "Inactive"; byte hueError = HUE_ERROR_INACTIVE;
//uint16_t hueFailCount = 0; //uint16_t hueFailCount = 0;
float hueXLast = 0, hueYLast = 0; float hueXLast = 0, hueYLast = 0;
uint16_t hueHueLast = 0, hueCtLast = 0; uint16_t hueHueLast = 0, hueCtLast = 0;

View File

@ -9,7 +9,7 @@ char* XML_response(AsyncWebServerRequest *request, char* dest = nullptr)
obuf = (dest == nullptr)? sbuf:dest; obuf = (dest == nullptr)? sbuf:dest;
olen = 0; olen = 0;
oappend("<?xml version=\"1.0\" ?><vs><ac>"); oappend((const char*)F("<?xml version=\"1.0\" ?><vs><ac>"));
oappendi((nightlightActive && nightlightFade) ? briT : bri); oappendi((nightlightActive && nightlightFade) ? briT : bri);
oappend("</ac>"); oappend("</ac>");
@ -65,7 +65,7 @@ char* XML_response(AsyncWebServerRequest *request, char* dest = nullptr)
{ {
mesg += "E1.31 mode "; mesg += "E1.31 mode ";
mesg += DMXMode; mesg += DMXMode;
mesg += " at DMX Address "; mesg += F(" at DMX Address ");
mesg += DMXAddress; mesg += DMXAddress;
mesg += " from "; mesg += " from ";
mesg += realtimeIP[0]; mesg += realtimeIP[0];
@ -85,7 +85,7 @@ char* XML_response(AsyncWebServerRequest *request, char* dest = nullptr)
mesg += realtimeIP[i]; mesg += realtimeIP[i];
} }
} else if (realtimeMode == REALTIME_MODE_ADALIGHT) { } else if (realtimeMode == REALTIME_MODE_ADALIGHT) {
mesg += "USB Adalight"; mesg += F("USB Adalight");
} else { //generic } else { //generic
mesg += "data"; mesg += "data";
} }
@ -137,11 +137,11 @@ char* URL_response(AsyncWebServerRequest *request)
obuf = sbuf; obuf = sbuf;
olen = 0; olen = 0;
oappend("<html><body><a href=\""); oappend((const char*)F("<html><body><a href=\""));
oappend(s2buf); oappend(s2buf);
oappend("\" target=\"_blank\">"); oappend((const char*)F("\" target=\"_blank\">"));
oappend(s2buf); oappend(s2buf);
oappend("</a></body></html>"); oappend((const char*)F("</a></body></html>"));
if (request != nullptr) request->send(200, "text/html", obuf); if (request != nullptr) request->send(200, "text/html", obuf);
} }
@ -355,9 +355,7 @@ void getSettingsJS(byte subPage, char* dest)
sappends('s',"MG",mqttGroupTopic); sappends('s',"MG",mqttGroupTopic);
#endif #endif
#ifdef WLED_DISABLE_HUESYNC #ifndef WLED_DISABLE_HUESYNC
sappends('m',"(\"hms\")[0]","Unsupported in build");
#else
sappend('v',"H0",hueIP[0]); sappend('v',"H0",hueIP[0]);
sappend('v',"H1",hueIP[1]); sappend('v',"H1",hueIP[1]);
sappend('v',"H2",hueIP[2]); sappend('v',"H2",hueIP[2]);
@ -368,7 +366,20 @@ void getSettingsJS(byte subPage, char* dest)
sappend('c',"HO",hueApplyOnOff); sappend('c',"HO",hueApplyOnOff);
sappend('c',"HB",hueApplyBri); sappend('c',"HB",hueApplyBri);
sappend('c',"HC",hueApplyColor); sappend('c',"HC",hueApplyColor);
sappends('m',"(\"hms\")[0]",hueError); char hueErrorString[25];
switch (hueError)
{
case HUE_ERROR_INACTIVE : strcpy(hueErrorString,(char*)F("Inactive")); break;
case HUE_ERROR_ACTIVE : strcpy(hueErrorString,(char*)F("Active")); break;
case HUE_ERROR_UNAUTHORIZED : strcpy(hueErrorString,(char*)F("Unauthorized")); break;
case HUE_ERROR_LIGHTID : strcpy(hueErrorString,(char*)F("Invalid light ID")); break;
case HUE_ERROR_PUSHLINK : strcpy(hueErrorString,(char*)F("Link button not pressed")); break;
case HUE_ERROR_JSON_PARSING : strcpy(hueErrorString,(char*)F("JSON parsing error")); break;
case HUE_ERROR_TIMEOUT : strcpy(hueErrorString,(char*)F("Timeout")); break;
default: sprintf(hueErrorString,"Bridge Error %i",hueError);
}
sappends('m',"(\"hms\")[0]",hueErrorString);
#endif #endif
} }

View File

@ -23,7 +23,7 @@ void handleHue()
reconnectHue(); reconnectHue();
} else { } else {
hueClient->close(); hueClient->close();
if (hueError[0] == 'A') strcpy(hueError,"Inactive"); if (hueError == HUE_ERROR_ACTIVE) hueError = HUE_ERROR_INACTIVE;
} }
} }
@ -44,7 +44,7 @@ void reconnectHue()
void onHueError(void* arg, AsyncClient* client, int8_t error) void onHueError(void* arg, AsyncClient* client, int8_t error)
{ {
DEBUG_PRINTLN("Hue err"); DEBUG_PRINTLN("Hue err");
strcpy(hueError,"Request timeout"); hueError = HUE_ERROR_TIMEOUT;
} }
void onHueConnect(void* arg, AsyncClient* client) void onHueConnect(void* arg, AsyncClient* client)
@ -59,15 +59,15 @@ void sendHuePoll()
String req = ""; String req = "";
if (hueAuthRequired) if (hueAuthRequired)
{ {
req += "POST /api HTTP/1.1\r\nHost: "; req += F("POST /api HTTP/1.1\r\nHost: ");
req += hueIP.toString(); req += hueIP.toString();
req += "\r\nContent-Length: 25\r\n\r\n{\"devicetype\":\"wled#esp\"}"; req += F("\r\nContent-Length: 25\r\n\r\n{\"devicetype\":\"wled#esp\"}");
} else } else
{ {
req += "GET /api/"; req += "GET /api/";
req += hueApiKey; req += hueApiKey;
req += "/lights/" + String(huePollLightId); req += "/lights/" + String(huePollLightId);
req += " HTTP/1.1\r\nHost: "; req += F(" HTTP/1.1\r\nHost: ");
req += hueIP.toString(); req += hueIP.toString();
req += "\r\n\r\n"; req += "\r\n\r\n";
} }
@ -93,21 +93,18 @@ void onHueData(void* arg, AsyncClient* client, void *data, size_t len)
auto error = deserializeJson(root, str); auto error = deserializeJson(root, str);
if (error) if (error)
{ {
strcpy(hueError,"JSON parsing error"); return; hueError = HUE_ERROR_JSON_PARSING; return;
} }
int hueErrorCode = root[0]["error"]["type"]; int hueErrorCode = root[0]["error"]["type"];
if (hueErrorCode)//hue bridge returned error if (hueErrorCode)//hue bridge returned error
{ {
hueError = hueErrorCode;
switch (hueErrorCode) switch (hueErrorCode)
{ {
case 1: strcpy(hueError,"Unauthorized"); hueAuthRequired = true; break; case 1: hueAuthRequired = true; break; //Unauthorized user
case 3: strcpy(hueError,"Invalid light ID"); huePollingEnabled = false; break; case 3: huePollingEnabled = false; break; //Invalid light ID
case 101: strcpy(hueError,"Link button not pressed"); hueAuthRequired = true; break; case 101: hueAuthRequired = true; break; //link button not presset
default:
char coerr[18];
sprintf(coerr,"Bridge Error %i",hueErrorCode);
strcpy(hueError,coerr);
} }
return; return;
} }
@ -133,7 +130,7 @@ void onHueData(void* arg, AsyncClient* client, void *data, size_t len)
auto error = deserializeJson(root, str); auto error = deserializeJson(root, str);
if (error) if (error)
{ {
strcpy(hueError,"JSON parsing error"); return; hueError = HUE_ERROR_JSON_PARSING; return;
} }
float hueX=0, hueY=0; float hueX=0, hueY=0;
@ -173,7 +170,7 @@ void onHueData(void* arg, AsyncClient* client, void *data, size_t len)
hueBri = 0; hueBri = 0;
} }
strcpy(hueError,"Active"); hueError = HUE_ERROR_ACTIVE;
//apply vals //apply vals
if (hueBri != hueBriLast) if (hueBri != hueBriLast)

View File

@ -62,44 +62,44 @@ void initServer()
}); });
server.on("/reset", HTTP_GET, [](AsyncWebServerRequest *request){ server.on("/reset", HTTP_GET, [](AsyncWebServerRequest *request){
serveMessage(request, 200,"Rebooting now...","Please wait ~10 seconds...",129); serveMessage(request, 200,"Rebooting now...",F("Please wait ~10 seconds..."),129);
doReboot = true; doReboot = true;
}); });
server.on("/settings/wifi", HTTP_POST, [](AsyncWebServerRequest *request){ server.on("/settings/wifi", HTTP_POST, [](AsyncWebServerRequest *request){
if (!(wifiLock && otaLock)) handleSettingsSet(request, 1); if (!(wifiLock && otaLock)) handleSettingsSet(request, 1);
serveMessage(request, 200,"WiFi settings saved.","Please connect to the new IP (if changed)",129); serveMessage(request, 200,F("WiFi settings saved."),F("Please connect to the new IP (if changed)"),129);
forceReconnect = true; forceReconnect = true;
}); });
server.on("/settings/leds", HTTP_POST, [](AsyncWebServerRequest *request){ server.on("/settings/leds", HTTP_POST, [](AsyncWebServerRequest *request){
handleSettingsSet(request, 2); handleSettingsSet(request, 2);
serveMessage(request, 200,"LED settings saved.","Redirecting...",1); serveMessage(request, 200,F("LED settings saved."),"Redirecting...",1);
}); });
server.on("/settings/ui", HTTP_POST, [](AsyncWebServerRequest *request){ server.on("/settings/ui", HTTP_POST, [](AsyncWebServerRequest *request){
handleSettingsSet(request, 3); handleSettingsSet(request, 3);
serveMessage(request, 200,"UI settings saved.","Redirecting...",1); serveMessage(request, 200,F("UI settings saved."),"Redirecting...",1);
}); });
server.on("/settings/dmx", HTTP_POST, [](AsyncWebServerRequest *request){ server.on("/settings/dmx", HTTP_POST, [](AsyncWebServerRequest *request){
handleSettingsSet(request, 7); handleSettingsSet(request, 7);
serveMessage(request, 200,"UI settings saved.","Redirecting...",1); serveMessage(request, 200,F("UI settings saved."),"Redirecting...",1);
}); });
server.on("/settings/sync", HTTP_POST, [](AsyncWebServerRequest *request){ server.on("/settings/sync", HTTP_POST, [](AsyncWebServerRequest *request){
handleSettingsSet(request, 4); handleSettingsSet(request, 4);
serveMessage(request, 200,"Sync settings saved.","Redirecting...",1); serveMessage(request, 200,F("Sync settings saved."),"Redirecting...",1);
}); });
server.on("/settings/time", HTTP_POST, [](AsyncWebServerRequest *request){ server.on("/settings/time", HTTP_POST, [](AsyncWebServerRequest *request){
handleSettingsSet(request, 5); handleSettingsSet(request, 5);
serveMessage(request, 200,"Time settings saved.","Redirecting...",1); serveMessage(request, 200,F("Time settings saved."),"Redirecting...",1);
}); });
server.on("/settings/sec", HTTP_POST, [](AsyncWebServerRequest *request){ server.on("/settings/sec", HTTP_POST, [](AsyncWebServerRequest *request){
handleSettingsSet(request, 6); handleSettingsSet(request, 6);
if (!doReboot) serveMessage(request, 200,"Security settings saved.","Rebooting, please wait ~10 seconds...",129); if (!doReboot) serveMessage(request, 200,F("Security settings saved."),F("Rebooting, please wait ~10 seconds..."),129);
doReboot = true; doReboot = true;
}); });
@ -148,7 +148,7 @@ void initServer()
}); });
server.on("/teapot", HTTP_GET, [](AsyncWebServerRequest *request){ server.on("/teapot", HTTP_GET, [](AsyncWebServerRequest *request){
serveMessage(request, 418, "418. I'm a teapot.", "(Tangible Embedded Advanced Project Of Twinkling)", 254); serveMessage(request, 418, F("418. I'm a teapot."), F("(Tangible Embedded Advanced Project Of Twinkling)"), 254);
}); });
//if OTA is allowed //if OTA is allowed
@ -161,7 +161,7 @@ void initServer()
#endif #endif
#else #else
server.on("/edit", HTTP_GET, [](AsyncWebServerRequest *request){ server.on("/edit", HTTP_GET, [](AsyncWebServerRequest *request){
serveMessage(request, 501, "Not implemented", "The SPIFFS editor is disabled in this build.", 254); serveMessage(request, 501, "Not implemented", F("The SPIFFS editor is disabled in this build."), 254);
}); });
#endif #endif
//init ota page //init ota page
@ -173,9 +173,9 @@ void initServer()
server.on("/update", HTTP_POST, [](AsyncWebServerRequest *request){ server.on("/update", HTTP_POST, [](AsyncWebServerRequest *request){
if (Update.hasError()) if (Update.hasError())
{ {
serveMessage(request, 500, "Failed updating firmware!", "Please check your file and retry!", 254); return; serveMessage(request, 500, F("Failed updating firmware!"), F("Please check your file and retry!"), 254); return;
} }
serveMessage(request, 200, "Successfully updated firmware!", "Please wait while the module reboots...", 131); serveMessage(request, 200, F("Successfully updated firmware!"), F("Please wait while the module reboots..."), 131);
doReboot = true; doReboot = true;
},[](AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final){ },[](AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final){
if(!index){ if(!index){
@ -197,7 +197,7 @@ void initServer()
#else #else
server.on("/update", HTTP_GET, [](AsyncWebServerRequest *request){ server.on("/update", HTTP_GET, [](AsyncWebServerRequest *request){
serveMessage(request, 501, "Not implemented", "OTA updates are disabled in this build.", 254); serveMessage(request, 501, "Not implemented", F("OTA updates are disabled in this build."), 254);
}); });
#endif #endif
} else } else
@ -217,7 +217,7 @@ void initServer()
}); });
#else #else
server.on("/dmxmap", HTTP_GET, [](AsyncWebServerRequest *request){ server.on("/dmxmap", HTTP_GET, [](AsyncWebServerRequest *request){
serveMessage(request, 501, "Not implemented", "DMX support is not enabled in this build.", 254); serveMessage(request, 501, "Not implemented", F("DMX support is not enabled in this build."), 254);
}); });
#endif #endif
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
@ -292,10 +292,10 @@ String msgProcessor(const String& var)
messageBody += "<script>setTimeout(RP," + String((optt-120)*1000) + ")</script>"; messageBody += "<script>setTimeout(RP," + String((optt-120)*1000) + ")</script>";
} else if (optt == 253) } else if (optt == 253)
{ {
messageBody += "<br><br><form action=/settings><button class=\"bt\" type=submit>Back</button></form>"; //button to settings messageBody += F("<br><br><form action=/settings><button class=\"bt\" type=submit>Back</button></form>"); //button to settings
} else if (optt == 254) } else if (optt == 254)
{ {
messageBody += "<br><br><button type=\"button\" class=\"bt\" onclick=\"B()\">Back</button>"; messageBody += F("<br><br><button type=\"button\" class=\"bt\" onclick=\"B()\">Back</button>");
} }
return messageBody; return messageBody;
} }
@ -324,7 +324,7 @@ String settingsProcessor(const String& var)
#ifdef WLED_ENABLE_DMX #ifdef WLED_ENABLE_DMX
if (var == "DMXMENU") { if (var == "DMXMENU") {
return String("<form action=/settings/dmx><button type=submit>DMX Output</button></form>"); return String(F("<form action=/settings/dmx><button type=submit>DMX Output</button></form>"));
} }
#endif #endif

View File

@ -343,7 +343,7 @@ void serveJson(AsyncWebServerRequest* request)
return; return;
} }
else if (url.length() > 6) { //not just /json else if (url.length() > 6) { //not just /json
request->send( 501, "application/json", "{\"error\":\"Not implemented\"}"); request->send( 501, "application/json", F("{\"error\":\"Not implemented\"}"));
return; return;
} }