Added all Custom Chase functions

Added applyPreset() function
Allocated EEPROM slots for secondary colors and CC parameters
This commit is contained in:
cschwinne 2017-11-30 23:35:22 +01:00
parent e20cab74de
commit b543753263
4 changed files with 142 additions and 36 deletions

View File

@ -1553,20 +1553,19 @@ void WS2812FX::mode_circus_combustus(void) {
void WS2812FX::mode_cc_core() void WS2812FX::mode_cc_core()
{ {
for(uint16_t i=_cc_i1; i <= _cc_i2; i++) for (int k = _cc_i1; k <= _cc_i2; k = k + _cc_num1 + _cc_num2)
{ {
if(i % (_cc_num1 + _cc_num2) == _counter_cc_step) for (int i = 0; i < _cc_num1; i++)
{ {
for (uint16_t j=i; j < _cc_num1 +i; j++) int num = 0;
{ num = ((k + i + _counter_cc_step) % _cc_i2) +_cc_i1;
if (j > _cc_i2) j = (j % _cc_i2) + _cc_i1; if (_cc_fs) setPixelColor(num, _color);
if (_cc_fs) setPixelColor(j, _color); if (_cc_fe) setPixelColor(_cc_i2 - num, _color);
if (_cc_fe) setPixelColor(_cc_i2 - (j-_cc_i1), _color);
}
} }
} }
show(); show();
_counter_cc_step = (_counter_cc_step + _cc_step) % (_cc_num1 + _cc_num2); _counter_cc_step = (_counter_cc_step + _cc_step) % (_cc_i2 - _cc_i1);
_mode_delay = 10 + ((250 * (uint32_t)(SPEED_MAX - _speed)) / SPEED_MAX);
} }
void WS2812FX::mode_cc_standard() void WS2812FX::mode_cc_standard()
@ -1576,16 +1575,54 @@ void WS2812FX::mode_cc_standard()
setPixelColor(i, (_cc_i1 <= i && i <= _cc_i2) ? _color_sec : _color); setPixelColor(i, (_cc_i1 <= i && i <= _cc_i2) ? _color_sec : _color);
} }
mode_cc_core(); mode_cc_core();
_mode_delay = 20 + ((50 * (uint32_t)(SPEED_MAX - _speed)) / _led_count);
} }
void WS2812FX::mode_cc_rainbow(){} void WS2812FX::mode_cc_rainbow()
{
uint32_t color = color_wheel(_counter_mode_step);
for(uint16_t i=0; i < _led_count; i++) {
if (!_locked[i])
setPixelColor(i, color);
}
mode_cc_core();
_counter_mode_step = (_counter_mode_step + 1) % 256;
}
void WS2812FX::mode_cc_cycle(){} void WS2812FX::mode_cc_cycle()
{
for(uint16_t i=0; i < _led_count; i++) {
if (!_locked[i])
setPixelColor(i, color_wheel(((i * 256 / _led_count) + _counter_mode_step) % 256));
}
mode_cc_core();
_counter_mode_step = (_counter_mode_step + 1) % 256;
}
void WS2812FX::mode_cc_blink(){} void WS2812FX::mode_cc_blink()
{
for(uint16_t i=0; i < _led_count; i++)
{
setPixelColor(i, (_cc_i1 <= i && i <= _cc_i2) ? _color_sec : _color);
}
if (_counter_mode_step)
{
mode_cc_core();
_counter_mode_step = 0;
} else {
show();
_counter_mode_step = 1;
_mode_delay = 10 + ((250 * (uint32_t)(SPEED_MAX - _speed)) / SPEED_MAX);
}
}
void WS2812FX::mode_cc_random(){} void WS2812FX::mode_cc_random()
{
for(uint16_t i=0; i < _led_count; i++) {
if (!_locked[i])
setPixelColor(i, color_wheel(random(256)));
}
mode_cc_core();
}
//WLED specific methods //WLED specific methods
@ -1740,7 +1777,8 @@ void WS2812FX::setCCIndex1(uint8_t i1)
void WS2812FX::setCCIndex2(uint8_t i2) void WS2812FX::setCCIndex2(uint8_t i2)
{ {
if (i2 < _led_count && i2 > _cc_i1) _cc_i2 = i2; if (i2 > _cc_i1) _cc_i2 = i2;
if (_cc_i2 >= _led_count) _cc_i2 = _led_count-1;
_counter_cc_step = 0; _counter_cc_step = 0;
} }

View File

@ -20,8 +20,7 @@
#include "CallbackFunction.h" #include "CallbackFunction.h"
//version in format yymmddb (b = daily build) //version in format yymmddb (b = daily build)
#define VERSION 1711292 #define VERSION 1711302
//If you have an RGBW strip, uncomment first line in WS2812FX.h! //If you have an RGBW strip, uncomment first line in WS2812FX.h!
@ -49,9 +48,10 @@
#endif #endif
//eeprom Version code, enables default settings instead of 0 init on update //eeprom Version code, enables default settings instead of 0 init on update
#define EEPVER 1 #define EEPVER 2
//0 -> old version, default //0 -> old version, default
//1 -> 0.4p 1711271 and up //1 -> 0.4p 1711272 and up
//2 -> 0.4p 1711302 and up
/* /*
* @title WLED project sketch * @title WLED project sketch
@ -93,8 +93,10 @@ IPAddress staticsubnet(255, 255, 255, 0);
boolean useHSB = false, useHSBDefault = false; boolean useHSB = false, useHSBDefault = false;
boolean turnOnAtBoot = true; boolean turnOnAtBoot = true;
byte col_s[]{255, 159, 0}; byte col_s[]{255, 159, 0};
byte col_sec_s[]{0, 0, 0};
boolean useRGBW = false; boolean useRGBW = false;
byte white_s = 0; byte white_s = 0;
byte white_sec_s = 0;
byte bri_s = 127; byte bri_s = 127;
uint8_t bri_nl = 0, bri_nls; uint8_t bri_nl = 0, bri_nls;
boolean fadeTransition = true; boolean fadeTransition = true;
@ -115,6 +117,14 @@ uint8_t effectSpeedDefault = 75;
boolean ntpEnabled = false; boolean ntpEnabled = false;
IPAddress ntpServerIP; IPAddress ntpServerIP;
const char* ntpServerName = "time.nist.gov"; const char* ntpServerName = "time.nist.gov";
//custom chase
uint8_t cc_numPrimary = 2;
uint8_t cc_numSecondary = 4;
uint8_t cc_index1 = 0;
uint8_t cc_index2 = ledcount -1;
bool cc_fromStart = true, cc_fromEnd = false;
uint8_t cc_step = 1;
uint8_t cc_start = 0;
//alexa //alexa
boolean alexaEnabled = true; boolean alexaEnabled = true;

View File

@ -109,6 +109,17 @@ void saveSettingsToEEPROM()
EEPROM.write(375, apWaitTimeSecs); EEPROM.write(375, apWaitTimeSecs);
EEPROM.write(376, recoveryAPDisabled); EEPROM.write(376, recoveryAPDisabled);
EEPROM.write(377, EEPVER); //eeprom was updated to latest EEPROM.write(377, EEPVER); //eeprom was updated to latest
EEPROM.write(378, col_sec_s[0]);
EEPROM.write(379, col_sec_s[1]);
EEPROM.write(380, col_sec_s[2]);
EEPROM.write(381, white_sec_s);
EEPROM.write(382, cc_index1);
EEPROM.write(383, cc_index2);
EEPROM.write(384, cc_numPrimary);
EEPROM.write(385, cc_numSecondary);
EEPROM.write(386, cc_fromStart);
EEPROM.write(387, cc_fromEnd);
EEPROM.write(388, cc_step);
EEPROM.commit(); EEPROM.commit();
} }
@ -230,7 +241,21 @@ void loadSettingsFromEEPROM()
apWaitTimeSecs = EEPROM.read(375); apWaitTimeSecs = EEPROM.read(375);
recoveryAPDisabled = EEPROM.read(376); recoveryAPDisabled = EEPROM.read(376);
} }
//377-380 reserved for second color default //377 = lastEEPROMversion
if (lastEEPROMversion > 1) {
col_sec_s[0] = EEPROM.read(378);
col_sec_s[1] = EEPROM.read(379);
col_sec_s[2] = EEPROM.read(380);
white_sec_s = EEPROM.read(381);
cc_index1 = EEPROM.read(382);
cc_index2 = EEPROM.read(383);
cc_numPrimary = EEPROM.read(384);
cc_numSecondary = EEPROM.read(385);
cc_fromStart = EEPROM.read(386);
cc_fromEnd = EEPROM.read(387);
cc_step = EEPROM.read(388);
}
//favorite setting memory (25 slots/ each 20byte) //favorite setting memory (25 slots/ each 20byte)
//400 - 899 reserved //400 - 899 reserved
@ -239,25 +264,46 @@ void loadSettingsFromEEPROM()
} }
//PRESET PROTOCOL 20 bytes //PRESET PROTOCOL 20 bytes
//0: multipurpose byte, bit 0: brightness is valid, 1: col valid, 2: ecol valid, 5: cc valid, 6: ccFromStart, 7: ccFromEnd //0: (0:invalid 1: just bri 2: just col 3: just fx 4: bri/col 5: bri/fx 6: col/fx 7: all 8:i_like_pancakes >8:invalid)
//1:a 2:r 3:g 4:b 5:w 6:er 7:eg 8:eb 9:ew 10:fx 11:sx | custom chase 12:numP 13:numS 14:pStart 15-20:undefinded //1:a 2:r 3:g 4:b 5:w 6:er 7:eg 8:eb 9:ew 10:fx 11:sx | custom chase 12:numP 13:numS 14:(0:fs 1:fe 2:both) 15:step 16-19:Zeros
void loadPreset(uint8_t index, uint8_t data[]) void applyPreset(uint8_t index)
{ {
if (index > 24) return; if (index > 24) return;
uint8_t temp[20]; uint16_t i = 400 + index*20;
for (int i = 0; i < 20; i++) uint8_t m = EEPROM.read(i);
if (m == 7 || m == 1 || m == 4 || m == 5) bri = EEPROM.read(i+1);
if (m == 7 || m == 2 || m == 4 || m == 6)
{ {
data[i] = EEPROM.read(400 + index*20 + i); col[0] = EEPROM.read(i+2);
col[1] = EEPROM.read(i+3);
col[2] = EEPROM.read(i+4);
white = EEPROM.read(i+5);
col_sec[0] = EEPROM.read(i+6);
col_sec[1] = EEPROM.read(i+7);
col_sec[2] = EEPROM.read(i+8);
white_sec = EEPROM.read(i+9);
}
if (m == 3 || (m > 4 && m < 8))
{
effectCurrent = EEPROM.read(i+10);
effectSpeed = EEPROM.read(i+11);
cc_numPrimary = EEPROM.read(i+12);
cc_numSecondary = EEPROM.read(i+13);
cc_fromEnd = EEPROM.read(i+14);
cc_fromStart = (EEPROM.read(i+14)<2);
cc_step = EEPROM.read(i+15);
strip.setCustomChase(cc_index1, cc_index2, cc_start, cc_numPrimary, cc_numSecondary, cc_step, cc_fromStart, cc_fromEnd);
} }
} }
void savePreset(uint8_t index, uint8_t data[]) void savePreset(uint8_t index, uint8_t m)
{ {
if (index > 24) return; if (index > 24) return;
for (int i = 0; i < 20; i++) for (int i = 0; i < 20; i++)
{ {
EEPROM.write(400 + index*20 + i, data[i]); EEPROM.write(400 + index*20 + i, 0); //CHANGE!!!
} }
EEPROM.commit();
} }

View File

@ -413,14 +413,26 @@ boolean handleSet(String req)
} }
} }
} }
pos = req.indexOf("C0="); if (pos > 0) { strip.setCCStart(req.substring(pos + 3).toInt()); } //set custom chase data
pos = req.indexOf("C1="); if (pos > 0) { strip.setCCIndex1(req.substring(pos + 3).toInt()); } bool _cc_updated = false;
pos = req.indexOf("C2="); if (pos > 0) { strip.setCCIndex2(req.substring(pos + 3).toInt()); } pos = req.indexOf("C0="); if (pos > 0) {cc_start = (req.substring(pos + 3).toInt()); _cc_updated = true;}
pos = req.indexOf("CP="); if (pos > 0) { strip.setCCNum1(req.substring(pos + 3).toInt()); } pos = req.indexOf("C1="); if (pos > 0) {cc_index1 = (req.substring(pos + 3).toInt()); _cc_updated = true;}
pos = req.indexOf("CS="); if (pos > 0) { strip.setCCNum2(req.substring(pos + 3).toInt()); } pos = req.indexOf("C2="); if (pos > 0) {cc_index2 = (req.substring(pos + 3).toInt()); _cc_updated = true;}
pos = req.indexOf("CM="); if (pos > 0) { strip.setCCStep(req.substring(pos + 3).toInt()); } pos = req.indexOf("CP="); if (pos > 0) {cc_numPrimary = (req.substring(pos + 3).toInt()); _cc_updated = true;}
pos = req.indexOf("CF="); if (pos > 0) { strip.setCCFS(req.substring(pos + 3).toInt()); } pos = req.indexOf("CS="); if (pos > 0) {cc_numSecondary = (req.substring(pos + 3).toInt()); _cc_updated = true;}
pos = req.indexOf("CE="); if (pos > 0) { strip.setCCFE(req.substring(pos + 3).toInt()); } pos = req.indexOf("CM="); if (pos > 0) {cc_step = (req.substring(pos + 3).toInt()); _cc_updated = true;}
pos = req.indexOf("CF="); if (pos > 0) {cc_fromStart = (req.substring(pos + 3).toInt()); _cc_updated = true;}
pos = req.indexOf("CE="); if (pos > 0) {cc_fromEnd = (req.substring(pos + 3).toInt()); _cc_updated = true;}
if (_cc_updated) strip.setCustomChase(cc_index1, cc_index2, cc_start, cc_numPrimary, cc_numSecondary, cc_step, cc_fromStart, cc_fromEnd);
//set presets
pos = req.indexOf("PS="); //saves current in preset
if (pos > 0) {
savePreset(req.substring(pos + 3).toInt(), 0); //CHANGE!!!
}
pos = req.indexOf("PL="); //applies preset
if (pos > 0) {
applyPreset(req.substring(pos + 3).toInt());
}
//internal call, does not send XML response //internal call, does not send XML response
pos = req.indexOf("IN"); pos = req.indexOf("IN");