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()
{
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++)
{
if (j > _cc_i2) j = (j % _cc_i2) + _cc_i1;
if (_cc_fs) setPixelColor(j, _color);
if (_cc_fe) setPixelColor(_cc_i2 - (j-_cc_i1), _color);
}
int num = 0;
num = ((k + i + _counter_cc_step) % _cc_i2) +_cc_i1;
if (_cc_fs) setPixelColor(num, _color);
if (_cc_fe) setPixelColor(_cc_i2 - num, _color);
}
}
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()
@ -1576,16 +1575,54 @@ void WS2812FX::mode_cc_standard()
setPixelColor(i, (_cc_i1 <= i && i <= _cc_i2) ? _color_sec : _color);
}
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
@ -1740,7 +1777,8 @@ void WS2812FX::setCCIndex1(uint8_t i1)
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;
}

View File

@ -20,8 +20,7 @@
#include "CallbackFunction.h"
//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!
@ -49,9 +48,10 @@
#endif
//eeprom Version code, enables default settings instead of 0 init on update
#define EEPVER 1
#define EEPVER 2
//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
@ -93,8 +93,10 @@ IPAddress staticsubnet(255, 255, 255, 0);
boolean useHSB = false, useHSBDefault = false;
boolean turnOnAtBoot = true;
byte col_s[]{255, 159, 0};
byte col_sec_s[]{0, 0, 0};
boolean useRGBW = false;
byte white_s = 0;
byte white_sec_s = 0;
byte bri_s = 127;
uint8_t bri_nl = 0, bri_nls;
boolean fadeTransition = true;
@ -115,6 +117,14 @@ uint8_t effectSpeedDefault = 75;
boolean ntpEnabled = false;
IPAddress ntpServerIP;
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
boolean alexaEnabled = true;

View File

@ -109,6 +109,17 @@ void saveSettingsToEEPROM()
EEPROM.write(375, apWaitTimeSecs);
EEPROM.write(376, recoveryAPDisabled);
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();
}
@ -230,7 +241,21 @@ void loadSettingsFromEEPROM()
apWaitTimeSecs = EEPROM.read(375);
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)
//400 - 899 reserved
@ -239,25 +264,46 @@ void loadSettingsFromEEPROM()
}
//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
//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
//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:(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;
uint8_t temp[20];
for (int i = 0; i < 20; i++)
uint16_t i = 400 + index*20;
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;
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()); }
pos = req.indexOf("C1="); if (pos > 0) { strip.setCCIndex1(req.substring(pos + 3).toInt()); }
pos = req.indexOf("C2="); if (pos > 0) { strip.setCCIndex2(req.substring(pos + 3).toInt()); }
pos = req.indexOf("CP="); if (pos > 0) { strip.setCCNum1(req.substring(pos + 3).toInt()); }
pos = req.indexOf("CS="); if (pos > 0) { strip.setCCNum2(req.substring(pos + 3).toInt()); }
pos = req.indexOf("CM="); if (pos > 0) { strip.setCCStep(req.substring(pos + 3).toInt()); }
pos = req.indexOf("CF="); if (pos > 0) { strip.setCCFS(req.substring(pos + 3).toInt()); }
pos = req.indexOf("CE="); if (pos > 0) { strip.setCCFE(req.substring(pos + 3).toInt()); }
//set custom chase data
bool _cc_updated = false;
pos = req.indexOf("C0="); if (pos > 0) {cc_start = (req.substring(pos + 3).toInt()); _cc_updated = true;}
pos = req.indexOf("C1="); if (pos > 0) {cc_index1 = (req.substring(pos + 3).toInt()); _cc_updated = true;}
pos = req.indexOf("C2="); if (pos > 0) {cc_index2 = (req.substring(pos + 3).toInt()); _cc_updated = true;}
pos = req.indexOf("CP="); if (pos > 0) {cc_numPrimary = (req.substring(pos + 3).toInt()); _cc_updated = true;}
pos = req.indexOf("CS="); if (pos > 0) {cc_numSecondary = (req.substring(pos + 3).toInt()); _cc_updated = true;}
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
pos = req.indexOf("IN");