Mulipin select compiles

Need to work on JS and set.cpp next
This commit is contained in:
cschwinne 2021-01-21 01:21:16 +01:00
parent 94471c0d1c
commit c105f3b970
13 changed files with 821 additions and 922 deletions

View File

@ -97,19 +97,14 @@ class UsermodTemperature : public Usermod {
}
void loop() {
if (disabled || strip.isUpdating()) {
return;
}
if (disabled || strip.isUpdating()) return;
unsigned long now = millis();
// check to see if we are due for taking a measurement
// lastMeasurement will not be updated until the conversion
// is complete the the reading is finished
if (now - lastMeasurement < USERMOD_DALLASTEMPERATURE_MEASUREMENT_INTERVAL)
{
return;
}
if (now - lastMeasurement < USERMOD_DALLASTEMPERATURE_MEASUREMENT_INTERVAL) return;
// we are due for a measurement, if we are not already waiting
// for a conversion to complete, then make a new request for temps
@ -142,9 +137,7 @@ class UsermodTemperature : public Usermod {
void addToJsonInfo(JsonObject& root) {
// dont add temperature to info if we are disabled
if (disabled) {
return;
}
if (disabled) return;
JsonObject user = root[F("u")];
if (user.isNull()) user = root.createNestedObject(F("u"));
@ -173,32 +166,6 @@ class UsermodTemperature : public Usermod {
#endif
}
/**
* addToJsonState() can be used to add custom entries to the /json/state part of the JSON API (state object).
* Values in the state object may be modified by connected clients
* Add "pin_Temperature" to json state. This can be used to check which GPIO pin usermod uses.
*/
void addToJsonState(JsonObject &root)
{
root[F("pin_Temperature")] = TEMPERATURE_PIN;
}
/**
* readFromJsonState() can be used to receive data clients send to the /json/state part of the JSON API (state object).
* Values in the state object may be modified by connected clients
* Read "pin_Temperature" from json state and and change GPIO pin used.
*/
void readFromJsonState(JsonObject &root)
{
/*
if (root[F("pin_Temperature")] != nullptr)
{
if (pinManager.allocatePin((int)root[F("pin_Temperature")],false))
temperaturePin = (int)root["PIRenabled"];
}
*/
}
uint16_t getId()
{
return USERMOD_ID_TEMPERATURE;

View File

@ -29,12 +29,6 @@
#ifndef WS2812FX_h
#define WS2812FX_h
#ifdef ESP32_MULTISTRIP
#include "../usermods/esp32_multistrip/NpbWrapper.h"
#else
#include "bus_manager.h"
#endif
#include "const.h"
#define FASTLED_INTERNAL //remove annoying pragma messages
@ -586,7 +580,6 @@ class WS2812FX {
ablMilliampsMax = 850;
currentMilliamps = 0;
timebase = 0;
busses = new BusManager();
resetSegments();
}
@ -804,8 +797,6 @@ class WS2812FX {
mode_dynamic_smooth(void);
private:
BusManager *busses;
uint32_t crgb_to_col(CRGB fastled);
CRGB col_to_crgb(uint32_t);
CRGBPalette16 currentPalette;

View File

@ -62,11 +62,11 @@ void WS2812FX::init(bool supportWhite, uint16_t countPixels, bool skipFirst)
_lengthRaw += LED_SKIP_AMOUNT;
}
uint8_t pins[] = {LEDPIN};
uint8_t pins[] = {2};
while (!busses->canAllShow()) yield();
busses->removeAll();
busses->add(supportWhite? TYPE_SK6812_RGBW : TYPE_WS2812_RGB, pins, 0, countPixels, COL_ORDER_GRB);
while (!busses.canAllShow()) yield();
busses.removeAll();
busses.add(supportWhite? TYPE_SK6812_RGBW : TYPE_WS2812_RGB, pins, 0, countPixels, COL_ORDER_GRB);
_segments[0].start = 0;
_segments[0].stop = _length;
@ -74,8 +74,8 @@ void WS2812FX::init(bool supportWhite, uint16_t countPixels, bool skipFirst)
setBrightness(_brightness);
#ifdef ESP8266
for (uint8_t i = 0; i < busses->getNumBusses(); i++) {
Bus* b = busses->getBus(i);
for (uint8_t i = 0; i < busses.getNumBusses(); i++) {
Bus* b = busses.getBus(i);
if ((!IS_DIGITAL(b->getType()) || IS_2PIN(b->getType()))) continue;
uint8_t pins[5];
b->getPins(pins);
@ -205,12 +205,12 @@ void WS2812FX::setPixelColor(uint16_t i, byte r, byte g, byte b, byte w)
if (indexSet < customMappingSize) indexSet = customMappingTable[indexSet];
#endif
if (indexSetRev >= SEGMENT.start && indexSetRev < SEGMENT.stop) {
busses->setPixelColor(indexSet + skip, col);
busses.setPixelColor(indexSet + skip, col);
if (IS_MIRROR) { //set the corresponding mirrored pixel
if (reverseMode) {
busses->setPixelColor(REV(SEGMENT.start) - indexSet + skip + REV(SEGMENT.stop) + 1, col);
busses.setPixelColor(REV(SEGMENT.start) - indexSet + skip + REV(SEGMENT.stop) + 1, col);
} else {
busses->setPixelColor(SEGMENT.stop - indexSet + skip + SEGMENT.start - 1, col);
busses.setPixelColor(SEGMENT.stop - indexSet + skip + SEGMENT.start - 1, col);
}
}
}
@ -221,11 +221,11 @@ void WS2812FX::setPixelColor(uint16_t i, byte r, byte g, byte b, byte w)
if (i < customMappingSize) i = customMappingTable[i];
#endif
uint32_t col = ((w << 24) | (r << 16) | (g << 8) | (b));
busses->setPixelColor(i + skip, col);
busses.setPixelColor(i + skip, col);
}
if (skip && i == 0) {
for (uint16_t j = 0; j < skip; j++) {
busses->setPixelColor(j, BLACK);
busses.setPixelColor(j, BLACK);
}
}
}
@ -276,7 +276,7 @@ void WS2812FX::show(void) {
for (uint16_t i = 0; i < _length; i++) //sum up the usage of each LED
{
RgbwColor c = busses->getPixelColor(i);
RgbwColor c = busses.getPixelColor(i);
if(useWackyWS2815PowerModel)
{
@ -305,24 +305,24 @@ void WS2812FX::show(void) {
uint16_t scaleI = scale * 255;
uint8_t scaleB = (scaleI > 255) ? 255 : scaleI;
uint8_t newBri = scale8(_brightness, scaleB);
busses->setBrightness(newBri);
busses.setBrightness(newBri);
currentMilliamps = (powerSum0 * newBri) / puPerMilliamp;
} else
{
currentMilliamps = powerSum / puPerMilliamp;
busses->setBrightness(_brightness);
busses.setBrightness(_brightness);
}
currentMilliamps += MA_FOR_ESP; //add power of ESP back to estimate
currentMilliamps += _length; //add standby power back to estimate
} else {
currentMilliamps = 0;
busses->setBrightness(_brightness);
busses.setBrightness(_brightness);
}
// some buses send asynchronously and this method will return before
// all of the data has been sent.
// See https://github.com/Makuna/NeoPixelBus/wiki/ESP32-NeoMethods#neoesp32rmt-methods
busses->show();
busses.show();
_lastShow = millis();
}
@ -331,7 +331,7 @@ void WS2812FX::show(void) {
* On some hardware (ESP32), strip updates are done asynchronously.
*/
bool WS2812FX::isUpdating() {
return !busses->canAllShow();
return !busses.canAllShow();
}
/**
@ -492,7 +492,7 @@ uint32_t WS2812FX::getPixelColor(uint16_t i)
if (i >= _lengthRaw) return 0;
return busses->getPixelColor(i);
return busses.getPixelColor(i);
}
WS2812FX::Segment& WS2812FX::getSegment(uint8_t id) {

View File

@ -292,8 +292,11 @@ class BusManager {
return numBusses -1;
}
//do not call this method from system context (network callback)
void removeAll() {
//Serial.println("Removing all.");
//prevents crashes due to deleting busses while in use.
while (!canAllShow()) yield();
for (uint8_t i = 0; i < numBusses; i++) delete busses[i];
numBusses = 0;
}
@ -346,6 +349,12 @@ class BusManager {
return numBusses;
}
static bool isRgbw(uint8_t type) {
if (type == TYPE_SK6812_RGBW || type == TYPE_TM1814) return true;
if (type > TYPE_ONOFF && type <= TYPE_ANALOG_5CH && type != TYPE_ANALOG_3CH) return true;
return false;
}
private:
uint8_t numBusses = 0;
Bus* busses[WLED_MAX_BUSSES];

View File

@ -94,13 +94,9 @@ void handleIO()
{
if (!offMode) {
#ifdef ESP8266
for (uint8_t s=0; s<strip.numStrips; s++) {
if (strip.getStripPin(s)==LED_BUILTIN) {
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);
break;
}
}
//turn off built-in LED if strip is turned off
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);
#endif
if (rlyPin>=0) {
pinMode(rlyPin, OUTPUT);

View File

@ -92,8 +92,9 @@ void deserializeConfig() {
// initialize LED pins and lengths prior to other HW
JsonObject hw_led = hw[F("led")];
// CJSON(ledCount, hw_led[F("total")]);
ledCount = 0;
CJSON(ledCount, hw_led[F("total")]);
if (ledCount > MAX_LEDS) ledCount = MAX_LEDS;
CJSON(strip.ablMilliampsMax, hw_led[F("maxpwr")]);
CJSON(strip.milliampsPerLed, hw_led[F("ledma")]);
CJSON(strip.reverseMode, hw_led[F("rev")]);
@ -104,32 +105,40 @@ void deserializeConfig() {
// some safety measures here?
} else {
JsonArray elms = strVar.as<JsonArray>();
uint8_t s=0;
for ( JsonObject elm : elms ) {
if (s>=WLED_MAX_BUSSES) break;
int8_t pins[2] = {-1,-1};
pins[0] = elm[F("pin")][0];
if (pins[0] >= 0 && pinManager.allocatePin(pins[0])) {
if (elm[F("pin")].size()==2) {
pins[1] = elm[F("pin")][1];
if (pins[1] >= 0)
if (!pinManager.allocatePin(pins[1])) {
pinManager.deallocatePin(pins[0]);
break; // pin not ok
}
}
} else {
break; // pin not ok
uint8_t s = 0;
useRGBW = false;
busses.removeAll();
for (JsonObject elm : elms) {
if (s >= WLED_MAX_BUSSES) break;
uint8_t pins[5] = {255, 255, 255, 255, 255};
JsonArray pinArr = elm[F("pin")];
if (pinArr.size() == 0) continue;
pins[0] = pinArr[0];
uint8_t i = 0;
for (int p : pinArr) {
pins[i] = p;
i++;
if (i>4) break;
}
uint16_t length = elm[F("len")]);
if (length==0) break;
uint16_t length = elm[F("len")];
if (length==0) continue;
uint8_t colorOrder = (int)elm[F("order")];
uint8_t skipFirstLed = elm[F("skip")]; // 0
uint8_t ledType = elm[F("type")];
uint8_t useRGBW = ((ledType == TYPE_SK6812_RGBW) || ledType == TYPE_TM1814);
ledCount += length;
busses->add(ledType? TYPE_SK6812_RGBW : TYPE_WS2812_RGB, pins, 0, ledCount, colorOrder);
//only use skip from the first strip (this shouldn't have been in ins obj. but remains here for compatibility)
if (s==0) skipFirstLed = elm[F("skip")];
uint16_t start = elm[F("start")] | 0;
if (start >= ledCount) continue;
//limit length of strip if it would exceed total configured LEDs
if (start + length > ledCount) length = ledCount - start;
uint8_t ledType = elm[F("type")] | TYPE_WS2812_RGB;
bool reversed = elm[F("rev")];
//RGBW mode is enabled if at least one of the strips is RGBW
useRGBW = (useRGBW || BusManager::isRgbw(ledType));
busses.add(ledType, pins, start, ledCount, colorOrder, reversed);
}
//if no bus inited successfully (empty cfg or invalid), init default
uint8_t defPin[] = {LEDPIN};
busses.add(TYPE_WS2812_RGB, defPin, 0, ledCount, COL_ORDER_GRB);
}
if (ledCount > MAX_LEDS) ledCount = MAX_LEDS;
@ -446,21 +455,21 @@ void serializeConfig() {
JsonArray hw_led_ins = hw_led.createNestedArray("ins");
uint16_t start = 0;
for (uint8_t s=0; s<busses->getNumBusses(); s++) {
Bus *bus = busses->getBus(s);
for (uint8_t s = 0; s < busses.getNumBusses(); s++) {
Bus *bus = busses.getBus(s);
if (!bus || bus->getLength()==0) break;
JsonObject hw_led_ins_0 = hw_led_ins.createNestedObject();
hw_led_ins_0[F("en")] = true;
hw_led_ins_0[F("start")] = start;
start += bus->getLength();
hw_led_ins_0[F("len")] = bus->getLength();
JsonArray hw_led_ins_0_pin = hw_led_ins_0.createNestedArray("pin");
hw_led_ins_0_pin.add(bus->getBusPins(s)[0]);
if (bus->getBusPins(s)[1]>=0) hw_led_ins_0_pin.add(bus->getBusPins(s)[1]);
hw_led_ins_0[F("order")] = bus->getColorOrder();
hw_led_ins_0[F("rev")] = false;
hw_led_ins_0[F("skip")] = skipFirstLed ? 1 : 0;
hw_led_ins_0[F("type")] = bus->getType();
JsonObject ins = hw_led_ins.createNestedObject();
ins[F("en")] = true;
ins[F("start")] = bus->getStart();
ins[F("len")] = bus->getLength();
JsonArray ins_pin = ins.createNestedArray("pin");
uint8_t pins[5];
uint8_t nPins = bus->getPins(pins);
for (uint8_t i = 0; i < nPins; i++) ins_pin.add(pins[i]);
ins[F("order")] = bus->getColorOrder();
ins[F("rev")] = bus->reversed;
ins[F("skip")] = (skipFirstLed && s == 0) ? 1 : 0;
ins[F("type")] = bus->getType();
}
JsonObject hw_btn = hw.createNestedObject("btn");

View File

@ -205,4 +205,9 @@
#define JSON_BUFFER_SIZE 16384
#endif
//this is merely a default now and can be changed at runtime
#ifndef LEDPIN
#define LEDPIN 2
#endif
#endif

View File

@ -46,10 +46,11 @@
}
function UI()
{
var isRGBW = false; //TODO check all strips for rgbw (old d.getElementById('rgbw').checked)
var myC = d.querySelectorAll('.wc'),
l = myC.length;
for (i = 0; i < l; i++) {
myC[i].style.display = (d.getElementById('rgbw').checked) ? 'inline':'none';
myC[i].style.display = (isRGBW) ? 'inline':'none';
}
d.getElementById('ampwarning').style.display = (d.Sf.MA.value > 7200) ? 'inline':'none';
@ -59,8 +60,8 @@
var s = d.getElementsByTagName("select");
for (i=0; i<s.length; i++) {
if (s[i].name.substring(0,5)=="LTsel") {
n=s[i].name.substring(5);
if (s[i].name.substring(0,2)=="LT") {
n=s[i].name.substring(3);
d.getElementsByName("EW"+n)[0].checked = (parseInt(s[i].value)==30||parseInt(s[i].value)==54); // TYPE_xxxx values from const.h
var LK = d.getElementsByName("LK"+n)[0];
var o = d.getElementsByName("iLK");
@ -127,7 +128,7 @@
var o = d.getElementsByName("iST");
var i = o.length;
if ((n==1 && i>=d.maxST) || (n==-1 && i<=1)) return;
if ((n==1 && i>=d.maxST) || (n==-1 && i==0)) return;
var f = d.getElementById("mLC");
if (n==1) {
@ -137,7 +138,7 @@
t.appendChild(d.createTextNode((i+1)+": "));
s = d.createElement("select");
s.setAttribute("name","LTsel"+i);
s.setAttribute("name","LT"+i);
s.onchange = function(){UI()}
o = d.createElement("option"); o.text = "WS281x"; o.value = "22"; s.add(o);
o = d.createElement("option"); o.text = "SK6812"; o.value = "30"; s.add(o);
@ -177,7 +178,7 @@
b.appendChild(d.createTextNode(" clk:"));
e = d.createElement("input");
e.type = "number"; e.value = ""; e.name = "LK"+i; e.min=0; e.max=40; e.onchange=function(){UI()};
if (d.getElementsByName("LTsel")[0].value>49) e.required = true;
//if (d.getElementsByName("LT"+i)[0].value>49) e.required = true;
b.appendChild(e);
t.appendChild(b);
@ -214,34 +215,12 @@
<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 &amp; HW setup</h2>
Total LED count: <input name="LC" type="number" min="1" max="1500" oninput="UI()" required><br>
LED strips
<button type="button" id="+" onclick="addLEDs(1)" style="display:none;">+</button><button type="button" id="-" onclick="addLEDs(-1)" style="display:none;">-</button><br>
<button type="button" id="+" onclick="addLEDs(1)" style="display:none;">+</button><button type="button" id="-" onclick="addLEDs(-1)" style="display:none;"> - </button><br>
<div id="mLC">
<div name="iST">
1:
<select name="LTsel" onchange="UI()">
<option value="22">WS281x</option><!--TYPE_WS2812_RGB-->
<option value="30">SK6812</option><!--TYPE_WS2812_RGB-->
<option value="50">WS2801</option><!--TYPE_WS2801-->
<option value="51">APA102</option><!--TYPE_APA102-->
<option value="52">LPD8806</option><!--TYPE_LPD8806-->
<option value="53">P9813</option><!--TYPE_P9813-->
<option value="54">TM1814</option><!--TYPE_TM1814-->
</select>
CO:
<select name="CO">
<option value=0>GRB</option>
<option value=1>RGB</option>
<option value=2>BRG</option>
<option value=3>RBG</option>
<option value=4>BGR</option>
<option value=5>GBR</option>
</select>
RGBW: <input type="checkbox" name="EW" onchange=UI() id="rgbw"><br>
pin:<input name="LP" type="number" min="0" max="40" required onchange="UI()">
<div name="iLK" style="display:inline;">clk:<input name="LK" type="number" min="0" max="40" onchange="UI()"></div>
count:<input name="LC" type="number" min="1" max="1500" oninput="UI()" required>
</div>
Loading...
</div><hr>
Relay pin: <input type="number" min="-1" max="40" name="RL" onchange="UI()"> Active high? <input type="checkbox" name="RM"><br>
Button pin: <input type="number" min="-1" max="40" name="BT" onchange="UI()"><br>

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -75,85 +75,50 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
//LED SETTINGS
if (subPage == 2)
{
String LC=F("LC"), LP=F("LP"), LK=F("LK"), CO=F("CO"), LTsel=F("LTsel");
int8_t pin;
int t;
int t = 0;
// deallocate all pins
for (uint8_t s=0; s<busses->getNumBuses(); s++) {
Bus *bus = busses->getBus(s);
pinManager.deallocatePin(bus->getPins()[0]);
pinManager.deallocatePin(bus->getPins()[1]);
}
if (rlyPin>=0 && pinManager.isPinAllocated(rlyPin)) pinManager.deallocatePin(rlyPin);
#ifndef WLED_DISABLE_INFRARED
if (irPin>=0 && pinManager.isPinAllocated(irPin)) pinManager.deallocatePin(irPin);
#endif
if (btnPin>=0 && pinManager.isPinAllocated(btnPin)) pinManager.deallocatePin(btnPin);
// remove all busses
busses->removeAll();
//TODO remove all busses, but not in this system call
//busses->removeAll();
// initial bus
uint8_t colorOrder, type;
uint8_t ledType = request->arg(LTsel).toInt();
uint16_t length;
int8_t pins[2] = {-1,-1};
pins[0] = request->arg(LP).toInt();
if (pinManager.allocatePin(pins[0])) {
t = length = request->arg(LC).toInt();
if ( request->hasArg(LK.c_str()) ) {
pins[1] = (request->arg(LK)).length() > 0 ? request->arg(LK).toInt() : -1;
if (pinManager.allocatePin(pins[1])) {
} else {
// fallback
pins[1] = -1;
}
}
colorOrder = request->arg(CO).toInt();
type = request->arg(LTsel).toInt();
uint8_t pins[2] = {255, 255};
busses->add(type? TYPE_SK6812_RGBW : TYPE_WS2812_RGB, pins, 0, length, colorOrder);
} else {
// fallback
}
// secondary busses
for (uint8_t i=1; i<WLED_MAX_BUSSES; i++) {
if ( request->hasArg((LP+i).c_str()) ) {
pins[0] = request->arg((LP+i).c_str()).toInt();
if (pinManager.allocatePin(pins[0])) {
if ( request->hasArg((LK+i).c_str()) ) {
pins[1] = (request->arg(LK+i)).length() > 0 ? request->arg((LK+i).c_str()).toInt() : -1;
if (pins[1]>=0) {
pinManager.allocatePin(pins[1]);
}
}
} else {
DEBUG_PRINTLN(F("Pin not ok."));
type = TYPE_NONE;
break; // pin not ok
}
type = request->arg((LTsel+i).c_str()).toInt();
} else {
DEBUG_PRINTLN("No data.");
type = TYPE_NONE;
break; // no parameter
for (uint8_t s = 0; s < WLED_MAX_BUSSES; s++) {
char lp[4] = "LP"; lp[2] = 48+s; lp[3] = 0; //ascii 0-9
char lk[4] = "LK"; lk[2] = 48+s; lk[3] = 0;
char lc[4] = "LC"; lc[2] = 48+s; lc[3] = 0;
char co[4] = "CO"; co[2] = 48+s; co[3] = 0;
char lt[4] = "LT"; lt[2] = 48+s; lt[3] = 0;
char ls[4] = "LS"; ls[2] = 48+s; ls[3] = 0;
char cv[4] = "CV"; cv[2] = 48+s; cv[3] = 0;
if (!request->hasArg(lp)) {
DEBUG_PRINTLN("No data."); break;
}
if ( request->hasArg((LC+i).c_str()) && request->arg((LC+i).c_str()).toInt() > 0 ) {
t += lenght = request->arg((LC+i).c_str()).toInt();
pins[0] = request->arg(lp).toInt();
if ( request->hasArg(lk) ) {
pins[1] = (request->arg(lk).length() > 0) ? request->arg(lk).toInt() : 255;
}
type = request->arg(lt).toInt();
if (request->hasArg(lc) && request->arg(lc).toInt() > 0) {
length = request->arg(lc).toInt();
} else {
type = TYPE_NONE;
break; // no parameter
}
colorOrder = request->arg((CO+i).c_str()).toInt();
busses->add(type? TYPE_SK6812_RGBW : TYPE_WS2812_RGB, pins, 0, length, colorOrder);
colorOrder = request->arg(co).toInt();
//busses.add(type, pins, 0, length, colorOrder, request->hasArg(cv));
}
// what to do with these?
ledCount = request->arg(F("LC")).toInt();
if (t > 0 && t <= MAX_LEDS) ledCount = t;
#ifdef ESP8266
if ( pinManager.isPinAllocated(3) && ledCount > MAX_LEDS_DMA) ledCount = MAX_LEDS_DMA; //DMA method uses too much ram
#endif
//DMA method uses too much ram, TODO: limit!
// upate other pins
#ifndef WLED_DISABLE_INFRARED

View File

@ -116,6 +116,7 @@
#include "ir_codes.h"
#include "const.h"
#include "pin_manager.h"
#include "bus_manager.h"
#ifndef CLIENT_SSID
#define CLIENT_SSID DEFAULT_CLIENT_SSID
@ -549,14 +550,13 @@ WLED_GLOBAL ESPAsyncE131 e131 _INIT_N(((handleE131Packet)));
WLED_GLOBAL bool e131NewData _INIT(false);
// led fx library object
WLED_GLOBAL BusManager busses _INIT(BusManager());
WLED_GLOBAL WS2812FX strip _INIT(WS2812FX());
WLED_GLOBAL bool doInitStrip _INIT(false);
// Usermod manager
WLED_GLOBAL UsermodManager usermods _INIT(UsermodManager());
WLED_GLOBAL PinManagerClass pinManager _INIT(PinManagerClass());
// Status LED
#if STATUSLED
WLED_GLOBAL unsigned long ledStatusLastMillis _INIT(0);

View File

@ -256,7 +256,7 @@ void getSettingsJS(byte subPage, char* dest)
if (subPage == 2) {
char nS[3];
// add usermod pins as d.um_p array
// add usermod pins as d.um_p array (TODO: usermod config shouldn't use state. instead we should load "um" object from cfg.json)
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
JsonObject mods = doc.createNestedObject(F("mods"));
usermods.addToJsonState(mods);
@ -278,7 +278,6 @@ void getSettingsJS(byte subPage, char* dest)
oappend(SET_F(");"));
#endif
Bus *bus = busses->getBus(0);
oappend(SET_F("d.Sf.LC.max=")); //TODO Formula for max LEDs on ESP8266 depending on types. 500 DMA or 1500 UART (about 4kB mem usage)
#if defined(ESP8266) && LEDPIN == 3
oappendi(MAX_LEDS_DMA);
@ -288,34 +287,22 @@ void getSettingsJS(byte subPage, char* dest)
oappend(";");
sappend('v',SET_F("LC"),ledCount);
//sappend('v',SET_F("LC"),ledCount);
sappend('v',SET_F("LP"),bus->getPins()[0]);
if (bus->getPins()[1]>=0) sappend('v',SET_F("LK"),bus->getPins()[1]);
sappend('v',SET_F("LC"),bus->getLength());
sappend('v',SET_F("LTsel"),bus->getType());
sappend('v',SET_F("CO"),bus->getColorOrder());
for (uint8_t s=1; s<busses->getNumBusses(); s++){
bus = busses->getBus(s);
String LP = F("LP"), LK = F("LK"), LC = F("LC"), CO = F("CO"), LTsel = F("LTsel");
LP += s; LK += s; LC += s; CO += s; LTsel += s;
for (uint8_t s=0; s < busses.getNumBusses(); s++){
Bus* bus = busses.getBus(s);
char lp[4] = "LP"; lp[2] = 48+s; lp[3] = 0; //ascii 0-9
char lk[4] = "LK"; lk[2] = 48+s; lp[3] = 0;
char lc[4] = "LC"; lc[2] = 48+s; lp[3] = 0;
char co[4] = "CO"; co[2] = 48+s; lp[3] = 0;
char lt[4] = "LT"; lt[2] = 48+s; lp[3] = 0;
oappend(SET_F("addLEDs(1);"));
sappend('v',LP.c_str(),bus->getPins()[0]);
if (bus->getPins()[1]>=0) sappend('v',LK.c_str(),bus->getPins()[1]);
sappend('v',LC.c_str(),bus->getLength());
#ifdef ESP8266
if (bus->getPins()[0]==3) {
oappend(SET_F("d.Sf."));
oappend(LC.c_str());
oappend(SET_F(".max=500;"));
} else {
oappend(SET_F("d.Sf."));
oappend(LC.c_str());
oappend(SET_F(".max=1500;"));
}
#endif
sappend('v',LTsel.c_str(),bus->getType());
sappend('v',CO.c_str(),bus->getColorOrder());
uint8_t pins[5];
uint8_t nPins = bus->getPins(pins);
sappend('v', lp, pins[0]);
if (pinManager.isPinOk(pins[1])) sappend('v', lk, pins[1]);
sappend('v', lc, bus->getLength());
sappend('v',lt,bus->getType());
sappend('v',co,bus->getColorOrder());
}
sappend('v',SET_F("MA"),strip.ablMilliampsMax);
sappend('v',SET_F("LA"),strip.milliampsPerLed);
@ -329,7 +316,7 @@ void getSettingsJS(byte subPage, char* dest)
sappend('v',SET_F("CA"),briS);
sappend('c',SET_F("EW"),useRGBW);
sappend('i',SET_F("CO"),strip.getColorOrder());
//sappend('i',SET_F("CO"),strip.getColorOrder());
sappend('v',SET_F("AW"),strip.rgbwMode);
sappend('c',SET_F("BO"),turnOnAtBoot);