Mulipin select compiles
Need to work on JS and set.cpp next
This commit is contained in:
parent
94471c0d1c
commit
c105f3b970
@ -97,19 +97,14 @@ class UsermodTemperature : public Usermod {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
if (disabled || strip.isUpdating()) {
|
if (disabled || strip.isUpdating()) return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned long now = millis();
|
unsigned long now = millis();
|
||||||
|
|
||||||
// check to see if we are due for taking a measurement
|
// check to see if we are due for taking a measurement
|
||||||
// lastMeasurement will not be updated until the conversion
|
// lastMeasurement will not be updated until the conversion
|
||||||
// is complete the the reading is finished
|
// is complete the the reading is finished
|
||||||
if (now - lastMeasurement < USERMOD_DALLASTEMPERATURE_MEASUREMENT_INTERVAL)
|
if (now - lastMeasurement < USERMOD_DALLASTEMPERATURE_MEASUREMENT_INTERVAL) return;
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// we are due for a measurement, if we are not already waiting
|
// we are due for a measurement, if we are not already waiting
|
||||||
// for a conversion to complete, then make a new request for temps
|
// for a conversion to complete, then make a new request for temps
|
||||||
@ -142,9 +137,7 @@ class UsermodTemperature : public Usermod {
|
|||||||
|
|
||||||
void addToJsonInfo(JsonObject& root) {
|
void addToJsonInfo(JsonObject& root) {
|
||||||
// dont add temperature to info if we are disabled
|
// dont add temperature to info if we are disabled
|
||||||
if (disabled) {
|
if (disabled) return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
JsonObject user = root[F("u")];
|
JsonObject user = root[F("u")];
|
||||||
if (user.isNull()) user = root.createNestedObject(F("u"));
|
if (user.isNull()) user = root.createNestedObject(F("u"));
|
||||||
@ -173,32 +166,6 @@ class UsermodTemperature : public Usermod {
|
|||||||
#endif
|
#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()
|
uint16_t getId()
|
||||||
{
|
{
|
||||||
return USERMOD_ID_TEMPERATURE;
|
return USERMOD_ID_TEMPERATURE;
|
||||||
|
@ -29,12 +29,6 @@
|
|||||||
#ifndef WS2812FX_h
|
#ifndef WS2812FX_h
|
||||||
#define WS2812FX_h
|
#define WS2812FX_h
|
||||||
|
|
||||||
#ifdef ESP32_MULTISTRIP
|
|
||||||
#include "../usermods/esp32_multistrip/NpbWrapper.h"
|
|
||||||
#else
|
|
||||||
#include "bus_manager.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "const.h"
|
#include "const.h"
|
||||||
|
|
||||||
#define FASTLED_INTERNAL //remove annoying pragma messages
|
#define FASTLED_INTERNAL //remove annoying pragma messages
|
||||||
@ -586,7 +580,6 @@ class WS2812FX {
|
|||||||
ablMilliampsMax = 850;
|
ablMilliampsMax = 850;
|
||||||
currentMilliamps = 0;
|
currentMilliamps = 0;
|
||||||
timebase = 0;
|
timebase = 0;
|
||||||
busses = new BusManager();
|
|
||||||
resetSegments();
|
resetSegments();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -804,8 +797,6 @@ class WS2812FX {
|
|||||||
mode_dynamic_smooth(void);
|
mode_dynamic_smooth(void);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
BusManager *busses;
|
|
||||||
|
|
||||||
uint32_t crgb_to_col(CRGB fastled);
|
uint32_t crgb_to_col(CRGB fastled);
|
||||||
CRGB col_to_crgb(uint32_t);
|
CRGB col_to_crgb(uint32_t);
|
||||||
CRGBPalette16 currentPalette;
|
CRGBPalette16 currentPalette;
|
||||||
|
@ -62,11 +62,11 @@ void WS2812FX::init(bool supportWhite, uint16_t countPixels, bool skipFirst)
|
|||||||
_lengthRaw += LED_SKIP_AMOUNT;
|
_lengthRaw += LED_SKIP_AMOUNT;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t pins[] = {LEDPIN};
|
uint8_t pins[] = {2};
|
||||||
|
|
||||||
while (!busses->canAllShow()) yield();
|
while (!busses.canAllShow()) yield();
|
||||||
busses->removeAll();
|
busses.removeAll();
|
||||||
busses->add(supportWhite? TYPE_SK6812_RGBW : TYPE_WS2812_RGB, pins, 0, countPixels, COL_ORDER_GRB);
|
busses.add(supportWhite? TYPE_SK6812_RGBW : TYPE_WS2812_RGB, pins, 0, countPixels, COL_ORDER_GRB);
|
||||||
|
|
||||||
_segments[0].start = 0;
|
_segments[0].start = 0;
|
||||||
_segments[0].stop = _length;
|
_segments[0].stop = _length;
|
||||||
@ -74,8 +74,8 @@ void WS2812FX::init(bool supportWhite, uint16_t countPixels, bool skipFirst)
|
|||||||
setBrightness(_brightness);
|
setBrightness(_brightness);
|
||||||
|
|
||||||
#ifdef ESP8266
|
#ifdef ESP8266
|
||||||
for (uint8_t i = 0; i < busses->getNumBusses(); i++) {
|
for (uint8_t i = 0; i < busses.getNumBusses(); i++) {
|
||||||
Bus* b = busses->getBus(i);
|
Bus* b = busses.getBus(i);
|
||||||
if ((!IS_DIGITAL(b->getType()) || IS_2PIN(b->getType()))) continue;
|
if ((!IS_DIGITAL(b->getType()) || IS_2PIN(b->getType()))) continue;
|
||||||
uint8_t pins[5];
|
uint8_t pins[5];
|
||||||
b->getPins(pins);
|
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];
|
if (indexSet < customMappingSize) indexSet = customMappingTable[indexSet];
|
||||||
#endif
|
#endif
|
||||||
if (indexSetRev >= SEGMENT.start && indexSetRev < SEGMENT.stop) {
|
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 (IS_MIRROR) { //set the corresponding mirrored pixel
|
||||||
if (reverseMode) {
|
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 {
|
} 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];
|
if (i < customMappingSize) i = customMappingTable[i];
|
||||||
#endif
|
#endif
|
||||||
uint32_t col = ((w << 24) | (r << 16) | (g << 8) | (b));
|
uint32_t col = ((w << 24) | (r << 16) | (g << 8) | (b));
|
||||||
busses->setPixelColor(i + skip, col);
|
busses.setPixelColor(i + skip, col);
|
||||||
}
|
}
|
||||||
if (skip && i == 0) {
|
if (skip && i == 0) {
|
||||||
for (uint16_t j = 0; j < skip; j++) {
|
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
|
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)
|
if(useWackyWS2815PowerModel)
|
||||||
{
|
{
|
||||||
@ -305,24 +305,24 @@ void WS2812FX::show(void) {
|
|||||||
uint16_t scaleI = scale * 255;
|
uint16_t scaleI = scale * 255;
|
||||||
uint8_t scaleB = (scaleI > 255) ? 255 : scaleI;
|
uint8_t scaleB = (scaleI > 255) ? 255 : scaleI;
|
||||||
uint8_t newBri = scale8(_brightness, scaleB);
|
uint8_t newBri = scale8(_brightness, scaleB);
|
||||||
busses->setBrightness(newBri);
|
busses.setBrightness(newBri);
|
||||||
currentMilliamps = (powerSum0 * newBri) / puPerMilliamp;
|
currentMilliamps = (powerSum0 * newBri) / puPerMilliamp;
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
currentMilliamps = powerSum / puPerMilliamp;
|
currentMilliamps = powerSum / puPerMilliamp;
|
||||||
busses->setBrightness(_brightness);
|
busses.setBrightness(_brightness);
|
||||||
}
|
}
|
||||||
currentMilliamps += MA_FOR_ESP; //add power of ESP back to estimate
|
currentMilliamps += MA_FOR_ESP; //add power of ESP back to estimate
|
||||||
currentMilliamps += _length; //add standby power back to estimate
|
currentMilliamps += _length; //add standby power back to estimate
|
||||||
} else {
|
} else {
|
||||||
currentMilliamps = 0;
|
currentMilliamps = 0;
|
||||||
busses->setBrightness(_brightness);
|
busses.setBrightness(_brightness);
|
||||||
}
|
}
|
||||||
|
|
||||||
// some buses send asynchronously and this method will return before
|
// some buses send asynchronously and this method will return before
|
||||||
// all of the data has been sent.
|
// all of the data has been sent.
|
||||||
// See https://github.com/Makuna/NeoPixelBus/wiki/ESP32-NeoMethods#neoesp32rmt-methods
|
// See https://github.com/Makuna/NeoPixelBus/wiki/ESP32-NeoMethods#neoesp32rmt-methods
|
||||||
busses->show();
|
busses.show();
|
||||||
_lastShow = millis();
|
_lastShow = millis();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -331,7 +331,7 @@ void WS2812FX::show(void) {
|
|||||||
* On some hardware (ESP32), strip updates are done asynchronously.
|
* On some hardware (ESP32), strip updates are done asynchronously.
|
||||||
*/
|
*/
|
||||||
bool WS2812FX::isUpdating() {
|
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;
|
if (i >= _lengthRaw) return 0;
|
||||||
|
|
||||||
return busses->getPixelColor(i);
|
return busses.getPixelColor(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
WS2812FX::Segment& WS2812FX::getSegment(uint8_t id) {
|
WS2812FX::Segment& WS2812FX::getSegment(uint8_t id) {
|
||||||
|
@ -292,8 +292,11 @@ class BusManager {
|
|||||||
return numBusses -1;
|
return numBusses -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//do not call this method from system context (network callback)
|
||||||
void removeAll() {
|
void removeAll() {
|
||||||
//Serial.println("Removing all.");
|
//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];
|
for (uint8_t i = 0; i < numBusses; i++) delete busses[i];
|
||||||
numBusses = 0;
|
numBusses = 0;
|
||||||
}
|
}
|
||||||
@ -346,6 +349,12 @@ class BusManager {
|
|||||||
return numBusses;
|
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:
|
private:
|
||||||
uint8_t numBusses = 0;
|
uint8_t numBusses = 0;
|
||||||
Bus* busses[WLED_MAX_BUSSES];
|
Bus* busses[WLED_MAX_BUSSES];
|
||||||
|
@ -94,13 +94,9 @@ void handleIO()
|
|||||||
{
|
{
|
||||||
if (!offMode) {
|
if (!offMode) {
|
||||||
#ifdef ESP8266
|
#ifdef ESP8266
|
||||||
for (uint8_t s=0; s<strip.numStrips; s++) {
|
//turn off built-in LED if strip is turned off
|
||||||
if (strip.getStripPin(s)==LED_BUILTIN) {
|
|
||||||
pinMode(LED_BUILTIN, OUTPUT);
|
pinMode(LED_BUILTIN, OUTPUT);
|
||||||
digitalWrite(LED_BUILTIN, HIGH);
|
digitalWrite(LED_BUILTIN, HIGH);
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
if (rlyPin>=0) {
|
if (rlyPin>=0) {
|
||||||
pinMode(rlyPin, OUTPUT);
|
pinMode(rlyPin, OUTPUT);
|
||||||
|
@ -92,8 +92,9 @@ void deserializeConfig() {
|
|||||||
// initialize LED pins and lengths prior to other HW
|
// initialize LED pins and lengths prior to other HW
|
||||||
JsonObject hw_led = hw[F("led")];
|
JsonObject hw_led = hw[F("led")];
|
||||||
|
|
||||||
// CJSON(ledCount, hw_led[F("total")]);
|
CJSON(ledCount, hw_led[F("total")]);
|
||||||
ledCount = 0;
|
if (ledCount > MAX_LEDS) ledCount = MAX_LEDS;
|
||||||
|
|
||||||
CJSON(strip.ablMilliampsMax, hw_led[F("maxpwr")]);
|
CJSON(strip.ablMilliampsMax, hw_led[F("maxpwr")]);
|
||||||
CJSON(strip.milliampsPerLed, hw_led[F("ledma")]);
|
CJSON(strip.milliampsPerLed, hw_led[F("ledma")]);
|
||||||
CJSON(strip.reverseMode, hw_led[F("rev")]);
|
CJSON(strip.reverseMode, hw_led[F("rev")]);
|
||||||
@ -104,32 +105,40 @@ void deserializeConfig() {
|
|||||||
// some safety measures here?
|
// some safety measures here?
|
||||||
} else {
|
} else {
|
||||||
JsonArray elms = strVar.as<JsonArray>();
|
JsonArray elms = strVar.as<JsonArray>();
|
||||||
uint8_t s=0;
|
uint8_t s = 0;
|
||||||
for ( JsonObject elm : elms ) {
|
useRGBW = false;
|
||||||
if (s>=WLED_MAX_BUSSES) break;
|
busses.removeAll();
|
||||||
int8_t pins[2] = {-1,-1};
|
for (JsonObject elm : elms) {
|
||||||
pins[0] = elm[F("pin")][0];
|
if (s >= WLED_MAX_BUSSES) break;
|
||||||
if (pins[0] >= 0 && pinManager.allocatePin(pins[0])) {
|
uint8_t pins[5] = {255, 255, 255, 255, 255};
|
||||||
if (elm[F("pin")].size()==2) {
|
JsonArray pinArr = elm[F("pin")];
|
||||||
pins[1] = elm[F("pin")][1];
|
if (pinArr.size() == 0) continue;
|
||||||
if (pins[1] >= 0)
|
pins[0] = pinArr[0];
|
||||||
if (!pinManager.allocatePin(pins[1])) {
|
uint8_t i = 0;
|
||||||
pinManager.deallocatePin(pins[0]);
|
for (int p : pinArr) {
|
||||||
break; // pin not ok
|
pins[i] = p;
|
||||||
|
i++;
|
||||||
|
if (i>4) break;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
} else {
|
uint16_t length = elm[F("len")];
|
||||||
break; // pin not ok
|
if (length==0) continue;
|
||||||
}
|
|
||||||
uint16_t length = elm[F("len")]);
|
|
||||||
if (length==0) break;
|
|
||||||
uint8_t colorOrder = (int)elm[F("order")];
|
uint8_t colorOrder = (int)elm[F("order")];
|
||||||
uint8_t skipFirstLed = elm[F("skip")]; // 0
|
//only use skip from the first strip (this shouldn't have been in ins obj. but remains here for compatibility)
|
||||||
uint8_t ledType = elm[F("type")];
|
if (s==0) skipFirstLed = elm[F("skip")];
|
||||||
uint8_t useRGBW = ((ledType == TYPE_SK6812_RGBW) || ledType == TYPE_TM1814);
|
uint16_t start = elm[F("start")] | 0;
|
||||||
ledCount += length;
|
if (start >= ledCount) continue;
|
||||||
busses->add(ledType? TYPE_SK6812_RGBW : TYPE_WS2812_RGB, pins, 0, ledCount, colorOrder);
|
//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;
|
if (ledCount > MAX_LEDS) ledCount = MAX_LEDS;
|
||||||
|
|
||||||
@ -446,21 +455,21 @@ void serializeConfig() {
|
|||||||
JsonArray hw_led_ins = hw_led.createNestedArray("ins");
|
JsonArray hw_led_ins = hw_led.createNestedArray("ins");
|
||||||
|
|
||||||
uint16_t start = 0;
|
uint16_t start = 0;
|
||||||
for (uint8_t s=0; s<busses->getNumBusses(); s++) {
|
for (uint8_t s = 0; s < busses.getNumBusses(); s++) {
|
||||||
Bus *bus = busses->getBus(s);
|
Bus *bus = busses.getBus(s);
|
||||||
if (!bus || bus->getLength()==0) break;
|
if (!bus || bus->getLength()==0) break;
|
||||||
JsonObject hw_led_ins_0 = hw_led_ins.createNestedObject();
|
JsonObject ins = hw_led_ins.createNestedObject();
|
||||||
hw_led_ins_0[F("en")] = true;
|
ins[F("en")] = true;
|
||||||
hw_led_ins_0[F("start")] = start;
|
ins[F("start")] = bus->getStart();
|
||||||
start += bus->getLength();
|
ins[F("len")] = bus->getLength();
|
||||||
hw_led_ins_0[F("len")] = bus->getLength();
|
JsonArray ins_pin = ins.createNestedArray("pin");
|
||||||
JsonArray hw_led_ins_0_pin = hw_led_ins_0.createNestedArray("pin");
|
uint8_t pins[5];
|
||||||
hw_led_ins_0_pin.add(bus->getBusPins(s)[0]);
|
uint8_t nPins = bus->getPins(pins);
|
||||||
if (bus->getBusPins(s)[1]>=0) hw_led_ins_0_pin.add(bus->getBusPins(s)[1]);
|
for (uint8_t i = 0; i < nPins; i++) ins_pin.add(pins[i]);
|
||||||
hw_led_ins_0[F("order")] = bus->getColorOrder();
|
ins[F("order")] = bus->getColorOrder();
|
||||||
hw_led_ins_0[F("rev")] = false;
|
ins[F("rev")] = bus->reversed;
|
||||||
hw_led_ins_0[F("skip")] = skipFirstLed ? 1 : 0;
|
ins[F("skip")] = (skipFirstLed && s == 0) ? 1 : 0;
|
||||||
hw_led_ins_0[F("type")] = bus->getType();
|
ins[F("type")] = bus->getType();
|
||||||
}
|
}
|
||||||
|
|
||||||
JsonObject hw_btn = hw.createNestedObject("btn");
|
JsonObject hw_btn = hw.createNestedObject("btn");
|
||||||
|
@ -205,4 +205,9 @@
|
|||||||
#define JSON_BUFFER_SIZE 16384
|
#define JSON_BUFFER_SIZE 16384
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
//this is merely a default now and can be changed at runtime
|
||||||
|
#ifndef LEDPIN
|
||||||
|
#define LEDPIN 2
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -46,10 +46,11 @@
|
|||||||
}
|
}
|
||||||
function UI()
|
function UI()
|
||||||
{
|
{
|
||||||
|
var isRGBW = false; //TODO check all strips for rgbw (old d.getElementById('rgbw').checked)
|
||||||
var myC = d.querySelectorAll('.wc'),
|
var myC = d.querySelectorAll('.wc'),
|
||||||
l = myC.length;
|
l = myC.length;
|
||||||
for (i = 0; i < l; i++) {
|
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';
|
d.getElementById('ampwarning').style.display = (d.Sf.MA.value > 7200) ? 'inline':'none';
|
||||||
@ -59,8 +60,8 @@
|
|||||||
|
|
||||||
var s = d.getElementsByTagName("select");
|
var s = d.getElementsByTagName("select");
|
||||||
for (i=0; i<s.length; i++) {
|
for (i=0; i<s.length; i++) {
|
||||||
if (s[i].name.substring(0,5)=="LTsel") {
|
if (s[i].name.substring(0,2)=="LT") {
|
||||||
n=s[i].name.substring(5);
|
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
|
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 LK = d.getElementsByName("LK"+n)[0];
|
||||||
var o = d.getElementsByName("iLK");
|
var o = d.getElementsByName("iLK");
|
||||||
@ -127,7 +128,7 @@
|
|||||||
var o = d.getElementsByName("iST");
|
var o = d.getElementsByName("iST");
|
||||||
var i = o.length;
|
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");
|
var f = d.getElementById("mLC");
|
||||||
if (n==1) {
|
if (n==1) {
|
||||||
@ -137,7 +138,7 @@
|
|||||||
t.appendChild(d.createTextNode((i+1)+": "));
|
t.appendChild(d.createTextNode((i+1)+": "));
|
||||||
|
|
||||||
s = d.createElement("select");
|
s = d.createElement("select");
|
||||||
s.setAttribute("name","LTsel"+i);
|
s.setAttribute("name","LT"+i);
|
||||||
s.onchange = function(){UI()}
|
s.onchange = function(){UI()}
|
||||||
o = d.createElement("option"); o.text = "WS281x"; o.value = "22"; s.add(o);
|
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);
|
o = d.createElement("option"); o.text = "SK6812"; o.value = "30"; s.add(o);
|
||||||
@ -177,7 +178,7 @@
|
|||||||
b.appendChild(d.createTextNode(" clk:"));
|
b.appendChild(d.createTextNode(" clk:"));
|
||||||
e = d.createElement("input");
|
e = d.createElement("input");
|
||||||
e.type = "number"; e.value = ""; e.name = "LK"+i; e.min=0; e.max=40; e.onchange=function(){UI()};
|
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);
|
b.appendChild(e);
|
||||||
t.appendChild(b);
|
t.appendChild(b);
|
||||||
|
|
||||||
@ -214,34 +215,12 @@
|
|||||||
<div class="helpB"><button type="button" onclick="H()">?</button></div>
|
<div class="helpB"><button type="button" onclick="H()">?</button></div>
|
||||||
<button type="button" onclick="B()">Back</button><button type="submit">Save</button><hr>
|
<button type="button" onclick="B()">Back</button><button type="submit">Save</button><hr>
|
||||||
<h2>LED & HW setup</h2>
|
<h2>LED & HW setup</h2>
|
||||||
|
Total LED count: <input name="LC" type="number" min="1" max="1500" oninput="UI()" required><br>
|
||||||
|
|
||||||
LED strips
|
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 id="mLC">
|
||||||
<div name="iST">
|
Loading...
|
||||||
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>
|
|
||||||
</div><hr>
|
</div><hr>
|
||||||
Relay pin: <input type="number" min="-1" max="40" name="RL" onchange="UI()"> Active high? <input type="checkbox" name="RM"><br>
|
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>
|
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
1345
wled00/html_ui.h
1345
wled00/html_ui.h
File diff suppressed because it is too large
Load Diff
@ -75,85 +75,50 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
|
|||||||
//LED SETTINGS
|
//LED SETTINGS
|
||||||
if (subPage == 2)
|
if (subPage == 2)
|
||||||
{
|
{
|
||||||
String LC=F("LC"), LP=F("LP"), LK=F("LK"), CO=F("CO"), LTsel=F("LTsel");
|
int t = 0;
|
||||||
int8_t pin;
|
|
||||||
int t;
|
|
||||||
|
|
||||||
// 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);
|
if (rlyPin>=0 && pinManager.isPinAllocated(rlyPin)) pinManager.deallocatePin(rlyPin);
|
||||||
#ifndef WLED_DISABLE_INFRARED
|
#ifndef WLED_DISABLE_INFRARED
|
||||||
if (irPin>=0 && pinManager.isPinAllocated(irPin)) pinManager.deallocatePin(irPin);
|
if (irPin>=0 && pinManager.isPinAllocated(irPin)) pinManager.deallocatePin(irPin);
|
||||||
#endif
|
#endif
|
||||||
if (btnPin>=0 && pinManager.isPinAllocated(btnPin)) pinManager.deallocatePin(btnPin);
|
if (btnPin>=0 && pinManager.isPinAllocated(btnPin)) pinManager.deallocatePin(btnPin);
|
||||||
// remove all busses
|
//TODO remove all busses, but not in this system call
|
||||||
busses->removeAll();
|
//busses->removeAll();
|
||||||
|
|
||||||
// initial bus
|
|
||||||
uint8_t colorOrder, type;
|
uint8_t colorOrder, type;
|
||||||
uint8_t ledType = request->arg(LTsel).toInt();
|
|
||||||
uint16_t length;
|
uint16_t length;
|
||||||
int8_t pins[2] = {-1,-1};
|
uint8_t pins[2] = {255, 255};
|
||||||
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();
|
|
||||||
|
|
||||||
busses->add(type? TYPE_SK6812_RGBW : TYPE_WS2812_RGB, pins, 0, length, colorOrder);
|
for (uint8_t s = 0; s < WLED_MAX_BUSSES; s++) {
|
||||||
} else {
|
char lp[4] = "LP"; lp[2] = 48+s; lp[3] = 0; //ascii 0-9
|
||||||
// fallback
|
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;
|
||||||
}
|
}
|
||||||
|
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();
|
||||||
|
|
||||||
// secondary busses
|
if (request->hasArg(lc) && request->arg(lc).toInt() > 0) {
|
||||||
for (uint8_t i=1; i<WLED_MAX_BUSSES; i++) {
|
length = request->arg(lc).toInt();
|
||||||
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
|
|
||||||
}
|
|
||||||
if ( request->hasArg((LC+i).c_str()) && request->arg((LC+i).c_str()).toInt() > 0 ) {
|
|
||||||
t += lenght = request->arg((LC+i).c_str()).toInt();
|
|
||||||
} else {
|
} else {
|
||||||
type = TYPE_NONE;
|
type = TYPE_NONE;
|
||||||
break; // no parameter
|
break; // no parameter
|
||||||
}
|
}
|
||||||
colorOrder = request->arg((CO+i).c_str()).toInt();
|
colorOrder = request->arg(co).toInt();
|
||||||
busses->add(type? TYPE_SK6812_RGBW : TYPE_WS2812_RGB, pins, 0, length, colorOrder);
|
//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;
|
if (t > 0 && t <= MAX_LEDS) ledCount = t;
|
||||||
#ifdef ESP8266
|
//DMA method uses too much ram, TODO: limit!
|
||||||
if ( pinManager.isPinAllocated(3) && ledCount > MAX_LEDS_DMA) ledCount = MAX_LEDS_DMA; //DMA method uses too much ram
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// upate other pins
|
// upate other pins
|
||||||
#ifndef WLED_DISABLE_INFRARED
|
#ifndef WLED_DISABLE_INFRARED
|
||||||
|
@ -116,6 +116,7 @@
|
|||||||
#include "ir_codes.h"
|
#include "ir_codes.h"
|
||||||
#include "const.h"
|
#include "const.h"
|
||||||
#include "pin_manager.h"
|
#include "pin_manager.h"
|
||||||
|
#include "bus_manager.h"
|
||||||
|
|
||||||
#ifndef CLIENT_SSID
|
#ifndef CLIENT_SSID
|
||||||
#define CLIENT_SSID DEFAULT_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);
|
WLED_GLOBAL bool e131NewData _INIT(false);
|
||||||
|
|
||||||
// led fx library object
|
// led fx library object
|
||||||
|
WLED_GLOBAL BusManager busses _INIT(BusManager());
|
||||||
WLED_GLOBAL WS2812FX strip _INIT(WS2812FX());
|
WLED_GLOBAL WS2812FX strip _INIT(WS2812FX());
|
||||||
WLED_GLOBAL bool doInitStrip _INIT(false);
|
WLED_GLOBAL bool doInitStrip _INIT(false);
|
||||||
|
|
||||||
// Usermod manager
|
// Usermod manager
|
||||||
WLED_GLOBAL UsermodManager usermods _INIT(UsermodManager());
|
WLED_GLOBAL UsermodManager usermods _INIT(UsermodManager());
|
||||||
|
|
||||||
WLED_GLOBAL PinManagerClass pinManager _INIT(PinManagerClass());
|
|
||||||
|
|
||||||
// Status LED
|
// Status LED
|
||||||
#if STATUSLED
|
#if STATUSLED
|
||||||
WLED_GLOBAL unsigned long ledStatusLastMillis _INIT(0);
|
WLED_GLOBAL unsigned long ledStatusLastMillis _INIT(0);
|
||||||
|
@ -256,7 +256,7 @@ void getSettingsJS(byte subPage, char* dest)
|
|||||||
if (subPage == 2) {
|
if (subPage == 2) {
|
||||||
char nS[3];
|
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);
|
DynamicJsonDocument doc(JSON_BUFFER_SIZE);
|
||||||
JsonObject mods = doc.createNestedObject(F("mods"));
|
JsonObject mods = doc.createNestedObject(F("mods"));
|
||||||
usermods.addToJsonState(mods);
|
usermods.addToJsonState(mods);
|
||||||
@ -278,7 +278,6 @@ void getSettingsJS(byte subPage, char* dest)
|
|||||||
oappend(SET_F(");"));
|
oappend(SET_F(");"));
|
||||||
#endif
|
#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)
|
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
|
#if defined(ESP8266) && LEDPIN == 3
|
||||||
oappendi(MAX_LEDS_DMA);
|
oappendi(MAX_LEDS_DMA);
|
||||||
@ -288,34 +287,22 @@ void getSettingsJS(byte subPage, char* dest)
|
|||||||
oappend(";");
|
oappend(";");
|
||||||
|
|
||||||
sappend('v',SET_F("LC"),ledCount);
|
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++){
|
for (uint8_t s=0; s < busses.getNumBusses(); s++){
|
||||||
bus = busses->getBus(s);
|
Bus* bus = busses.getBus(s);
|
||||||
String LP = F("LP"), LK = F("LK"), LC = F("LC"), CO = F("CO"), LTsel = F("LTsel");
|
char lp[4] = "LP"; lp[2] = 48+s; lp[3] = 0; //ascii 0-9
|
||||||
LP += s; LK += s; LC += s; CO += s; LTsel += s;
|
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);"));
|
oappend(SET_F("addLEDs(1);"));
|
||||||
sappend('v',LP.c_str(),bus->getPins()[0]);
|
uint8_t pins[5];
|
||||||
if (bus->getPins()[1]>=0) sappend('v',LK.c_str(),bus->getPins()[1]);
|
uint8_t nPins = bus->getPins(pins);
|
||||||
sappend('v',LC.c_str(),bus->getLength());
|
sappend('v', lp, pins[0]);
|
||||||
#ifdef ESP8266
|
if (pinManager.isPinOk(pins[1])) sappend('v', lk, pins[1]);
|
||||||
if (bus->getPins()[0]==3) {
|
sappend('v', lc, bus->getLength());
|
||||||
oappend(SET_F("d.Sf."));
|
sappend('v',lt,bus->getType());
|
||||||
oappend(LC.c_str());
|
sappend('v',co,bus->getColorOrder());
|
||||||
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());
|
|
||||||
}
|
}
|
||||||
sappend('v',SET_F("MA"),strip.ablMilliampsMax);
|
sappend('v',SET_F("MA"),strip.ablMilliampsMax);
|
||||||
sappend('v',SET_F("LA"),strip.milliampsPerLed);
|
sappend('v',SET_F("LA"),strip.milliampsPerLed);
|
||||||
@ -329,7 +316,7 @@ void getSettingsJS(byte subPage, char* dest)
|
|||||||
|
|
||||||
sappend('v',SET_F("CA"),briS);
|
sappend('v',SET_F("CA"),briS);
|
||||||
sappend('c',SET_F("EW"),useRGBW);
|
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('v',SET_F("AW"),strip.rgbwMode);
|
||||||
|
|
||||||
sappend('c',SET_F("BO"),turnOnAtBoot);
|
sappend('c',SET_F("BO"),turnOnAtBoot);
|
||||||
|
Loading…
Reference in New Issue
Block a user