Incrementing & random effect, palette via JSON API
Moved utility functions to util.cpp
This commit is contained in:
parent
b07bbab069
commit
20d03cb817
@ -201,13 +201,9 @@ inline void saveTemporaryPreset() {savePreset(255, false);};
|
|||||||
void deletePreset(byte index);
|
void deletePreset(byte index);
|
||||||
|
|
||||||
//set.cpp
|
//set.cpp
|
||||||
void _setRandomColor(bool _sec,bool fromButton=false);
|
|
||||||
bool isAsterisksOnly(const char* str, byte maxLen);
|
bool isAsterisksOnly(const char* str, byte maxLen);
|
||||||
void handleSettingsSet(AsyncWebServerRequest *request, byte subPage);
|
void handleSettingsSet(AsyncWebServerRequest *request, byte subPage);
|
||||||
bool handleSet(AsyncWebServerRequest *request, const String& req, bool apply=true);
|
bool handleSet(AsyncWebServerRequest *request, const String& req, bool apply=true);
|
||||||
int getNumVal(const String* req, uint16_t pos);
|
|
||||||
void parseNumber(const char* str, byte* val, byte minv=0, byte maxv=255);
|
|
||||||
bool updateVal(const String* req, const char* key, byte* val, byte minv=0, byte maxv=255);
|
|
||||||
|
|
||||||
//udp.cpp
|
//udp.cpp
|
||||||
void notify(byte callMode, bool followUp=false);
|
void notify(byte callMode, bool followUp=false);
|
||||||
@ -272,12 +268,16 @@ void userConnected();
|
|||||||
void userLoop();
|
void userLoop();
|
||||||
|
|
||||||
//util.cpp
|
//util.cpp
|
||||||
|
int getNumVal(const String* req, uint16_t pos);
|
||||||
|
void parseNumber(const char* str, byte* val, byte minv=0, byte maxv=255);
|
||||||
|
bool getVal(JsonVariant elem, byte* val, byte minv=0, byte maxv=255);
|
||||||
|
bool updateVal(const String* req, const char* key, byte* val, byte minv=0, byte maxv=255);
|
||||||
bool oappend(const char* txt); // append new c string to temp buffer efficiently
|
bool oappend(const char* txt); // append new c string to temp buffer efficiently
|
||||||
bool oappendi(int i); // append new number to temp buffer efficiently
|
bool oappendi(int i); // append new number to temp buffer efficiently
|
||||||
void sappend(char stype, const char* key, int val);
|
void sappend(char stype, const char* key, int val);
|
||||||
void sappends(char stype, const char* key, char* val);
|
void sappends(char stype, const char* key, char* val);
|
||||||
void prepareHostname(char* hostname);
|
void prepareHostname(char* hostname);
|
||||||
void _setRandomColor(bool _sec, bool fromButton);
|
void _setRandomColor(bool _sec,bool fromButton=false);
|
||||||
bool isAsterisksOnly(const char* str, byte maxLen);
|
bool isAsterisksOnly(const char* str, byte maxLen);
|
||||||
bool requestJSONBufferLock(uint8_t module=255);
|
bool requestJSONBufferLock(uint8_t module=255);
|
||||||
void releaseJSONBufferLock();
|
void releaseJSONBufferLock();
|
||||||
|
@ -6,20 +6,6 @@
|
|||||||
* JSON API (De)serialization
|
* JSON API (De)serialization
|
||||||
*/
|
*/
|
||||||
|
|
||||||
bool getVal(JsonVariant elem, byte* val, byte vmin=0, byte vmax=255) {
|
|
||||||
if (elem.is<int>()) {
|
|
||||||
*val = elem;
|
|
||||||
return true;
|
|
||||||
} else if (elem.is<const char*>()) {
|
|
||||||
const char* str = elem;
|
|
||||||
size_t len = strnlen(str, 12);
|
|
||||||
if (len == 0 || len > 10) return false;
|
|
||||||
parseNumber(str, val, vmin, vmax);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false; //key does not exist
|
|
||||||
}
|
|
||||||
|
|
||||||
void deserializeSegment(JsonObject elem, byte it, byte presetId)
|
void deserializeSegment(JsonObject elem, byte it, byte presetId)
|
||||||
{
|
{
|
||||||
byte id = elem["id"] | it;
|
byte id = elem["id"] | it;
|
||||||
@ -153,21 +139,21 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId)
|
|||||||
|
|
||||||
//temporary, strip object gets updated via colorUpdated()
|
//temporary, strip object gets updated via colorUpdated()
|
||||||
if (id == strip.getMainSegmentId()) {
|
if (id == strip.getMainSegmentId()) {
|
||||||
byte effectPrev = effectCurrent;
|
if (getVal(elem["fx"], &effectCurrent, 1, strip.getModeCount())) { //load effect ('r' random, '~' inc/dec, 1-255 exact value)
|
||||||
effectCurrent = elem["fx"] | effectCurrent;
|
if (!presetId) unloadPlaylist(); //stop playlist if active and FX changed manually
|
||||||
if (!presetId && effectCurrent != effectPrev) unloadPlaylist(); //stop playlist if active and FX changed manually
|
}
|
||||||
effectSpeed = elem[F("sx")] | effectSpeed;
|
effectSpeed = elem[F("sx")] | effectSpeed;
|
||||||
effectIntensity = elem[F("ix")] | effectIntensity;
|
effectIntensity = elem[F("ix")] | effectIntensity;
|
||||||
effectPalette = elem["pal"] | effectPalette;
|
getVal(elem["pal"], &effectPalette, 1, strip.getPaletteCount());
|
||||||
} else { //permanent
|
} else { //permanent
|
||||||
byte fx = elem["fx"] | seg.mode;
|
byte fx = seg.mode;
|
||||||
if (fx != seg.mode && fx < strip.getModeCount()) {
|
if (getVal(elem["fx"], &fx, 1, strip.getModeCount())) { //load effect ('r' random, '~' inc/dec, 1-255 exact value)
|
||||||
strip.setMode(id, fx);
|
strip.setMode(id, fx);
|
||||||
if (!presetId) unloadPlaylist(); //stop playlist if active and FX changed manually
|
if (!presetId) unloadPlaylist(); //stop playlist if active and FX changed manually
|
||||||
}
|
}
|
||||||
seg.speed = elem[F("sx")] | seg.speed;
|
seg.speed = elem[F("sx")] | seg.speed;
|
||||||
seg.intensity = elem[F("ix")] | seg.intensity;
|
seg.intensity = elem[F("ix")] | seg.intensity;
|
||||||
seg.palette = elem["pal"] | seg.palette;
|
getVal(elem["pal"], &seg.palette, 1, strip.getPaletteCount());
|
||||||
}
|
}
|
||||||
|
|
||||||
JsonArray iarr = elem[F("i")]; //set individual LEDs
|
JsonArray iarr = elem[F("i")]; //set individual LEDs
|
||||||
|
@ -502,62 +502,6 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//helper to get int value at a position in string
|
|
||||||
int getNumVal(const String* req, uint16_t pos)
|
|
||||||
{
|
|
||||||
return req->substring(pos+3).toInt();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//helper to get int value with in/decrementing support via ~ syntax
|
|
||||||
void parseNumber(const char* str, byte* val, byte minv, byte maxv)
|
|
||||||
{
|
|
||||||
if (str == nullptr || str[0] == '\0') return;
|
|
||||||
if (str[0] == 'r') {*val = random8(minv,maxv); return;}
|
|
||||||
if (str[0] == '~') {
|
|
||||||
int out = atoi(str +1);
|
|
||||||
if (out == 0)
|
|
||||||
{
|
|
||||||
if (str[1] == '0') return;
|
|
||||||
if (str[1] == '-')
|
|
||||||
{
|
|
||||||
*val = (int)(*val -1) < (int)minv ? maxv : min((int)maxv,(*val -1)); //-1, wrap around
|
|
||||||
} else {
|
|
||||||
*val = (int)(*val +1) > (int)maxv ? minv : max((int)minv,(*val +1)); //+1, wrap around
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
out += *val;
|
|
||||||
if (out > maxv) out = maxv;
|
|
||||||
if (out < minv) out = minv;
|
|
||||||
*val = out;
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
{
|
|
||||||
byte p1 = atoi(str);
|
|
||||||
const char* str2 = strchr(str,'~'); //min/max range (for preset cycle, e.g. "1~5~")
|
|
||||||
if (str2) {
|
|
||||||
byte p2 = atoi(str2+1);
|
|
||||||
presetCycMin = p1; presetCycMax = p2;
|
|
||||||
while (isdigit((str2+1)[0])) str2++;
|
|
||||||
parseNumber(str2+1, val, p1, p2);
|
|
||||||
} else {
|
|
||||||
*val = p1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool updateVal(const String* req, const char* key, byte* val, byte minv, byte maxv)
|
|
||||||
{
|
|
||||||
int pos = req->indexOf(key);
|
|
||||||
if (pos < 1) return false;
|
|
||||||
if (req->length() < (unsigned int)(pos + 4)) return false;
|
|
||||||
parseNumber(req->c_str() + pos +3, val, minv, maxv);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//HTTP API request parser
|
//HTTP API request parser
|
||||||
bool handleSet(AsyncWebServerRequest *request, const String& req, bool apply)
|
bool handleSet(AsyncWebServerRequest *request, const String& req, bool apply)
|
||||||
{
|
{
|
||||||
|
@ -3,6 +3,76 @@
|
|||||||
#include "const.h"
|
#include "const.h"
|
||||||
|
|
||||||
|
|
||||||
|
//helper to get int value at a position in string
|
||||||
|
int getNumVal(const String* req, uint16_t pos)
|
||||||
|
{
|
||||||
|
return req->substring(pos+3).toInt();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//helper to get int value with in/decrementing support via ~ syntax
|
||||||
|
void parseNumber(const char* str, byte* val, byte minv, byte maxv)
|
||||||
|
{
|
||||||
|
if (str == nullptr || str[0] == '\0') return;
|
||||||
|
if (str[0] == 'r') {*val = random8(minv,maxv); return;}
|
||||||
|
if (str[0] == '~') {
|
||||||
|
int out = atoi(str +1);
|
||||||
|
if (out == 0)
|
||||||
|
{
|
||||||
|
if (str[1] == '0') return;
|
||||||
|
if (str[1] == '-')
|
||||||
|
{
|
||||||
|
*val = (int)(*val -1) < (int)minv ? maxv : min((int)maxv,(*val -1)); //-1, wrap around
|
||||||
|
} else {
|
||||||
|
*val = (int)(*val +1) > (int)maxv ? minv : max((int)minv,(*val +1)); //+1, wrap around
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
out += *val;
|
||||||
|
if (out > maxv) out = maxv;
|
||||||
|
if (out < minv) out = minv;
|
||||||
|
*val = out;
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
byte p1 = atoi(str);
|
||||||
|
const char* str2 = strchr(str,'~'); //min/max range (for preset cycle, e.g. "1~5~")
|
||||||
|
if (str2) {
|
||||||
|
byte p2 = atoi(str2+1);
|
||||||
|
presetCycMin = p1; presetCycMax = p2;
|
||||||
|
while (isdigit((str2+1)[0])) str2++;
|
||||||
|
parseNumber(str2+1, val, p1, p2);
|
||||||
|
} else {
|
||||||
|
*val = p1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool getVal(JsonVariant elem, byte* val, byte vmin, byte vmax) {
|
||||||
|
if (elem.is<int>()) {
|
||||||
|
*val = elem;
|
||||||
|
return true;
|
||||||
|
} else if (elem.is<const char*>()) {
|
||||||
|
const char* str = elem;
|
||||||
|
size_t len = strnlen(str, 12);
|
||||||
|
if (len == 0 || len > 10) return false;
|
||||||
|
parseNumber(str, val, vmin, vmax);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false; //key does not exist
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool updateVal(const String* req, const char* key, byte* val, byte minv, byte maxv)
|
||||||
|
{
|
||||||
|
int pos = req->indexOf(key);
|
||||||
|
if (pos < 1) return false;
|
||||||
|
if (req->length() < (unsigned int)(pos + 4)) return false;
|
||||||
|
parseNumber(req->c_str() + pos +3, val, minv, maxv);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//append a numeric setting to string buffer
|
//append a numeric setting to string buffer
|
||||||
void sappend(char stype, const char* key, int val)
|
void sappend(char stype, const char* key, int val)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user