mirror of
https://github.com/wled/WLED.git
synced 2025-07-22 18:26:32 +00:00
Add PWM frequency selection in settings
This commit is contained in:
parent
4a6c78aaf3
commit
26837645ac
@ -256,10 +256,11 @@
|
|||||||
#define TYPE_NET_ARTNET_RGB 82 //network ArtNet RGB bus (master broadcast bus, unused)
|
#define TYPE_NET_ARTNET_RGB 82 //network ArtNet RGB bus (master broadcast bus, unused)
|
||||||
#define TYPE_NET_DDP_RGBW 88 //network DDP RGBW bus (master broadcast bus)
|
#define TYPE_NET_DDP_RGBW 88 //network DDP RGBW bus (master broadcast bus)
|
||||||
|
|
||||||
#define IS_DIGITAL(t) ((t) & 0x10) //digital are 16-31 and 48-63
|
#define IS_DIGITAL(t) ((t) < 80 && ((t) & 0x10)) //digital are 16-31 and 48-63
|
||||||
#define IS_PWM(t) ((t) > 40 && (t) < 46)
|
#define IS_PWM(t) ((t) > 40 && (t) < 46)
|
||||||
#define NUM_PWM_PINS(t) ((t) - 40) //for analog PWM 41-45 only
|
#define NUM_PWM_PINS(t) ((t) - 40) //for analog PWM 41-45 only
|
||||||
#define IS_2PIN(t) ((t) > 47)
|
#define IS_2PIN(t) ((t) > 47)
|
||||||
|
#define IS_VIRTUAL(t) ((t) >= 80)
|
||||||
|
|
||||||
//Color orders
|
//Color orders
|
||||||
#define COL_ORDER_GRB 0 //GRB(w),defaut
|
#define COL_ORDER_GRB 0 //GRB(w),defaut
|
||||||
|
@ -16,6 +16,11 @@
|
|||||||
function B(){window.open(getURL("/settings"),"_self");}
|
function B(){window.open(getURL("/settings"),"_self");}
|
||||||
function gId(n){return d.getElementById(n);}
|
function gId(n){return d.getElementById(n);}
|
||||||
function off(n){d.getElementsByName(n)[0].value = -1;}
|
function off(n){d.getElementsByName(n)[0].value = -1;}
|
||||||
|
function isPWM(t) { return t > 40 && t < 46; } // is PWM type
|
||||||
|
function isAna(t) { return t == 40 || isPWM(t); } // is analog type
|
||||||
|
function isDig(t) { return t < 80 && (t & 0x10); }// is digital type
|
||||||
|
function isD2P(t) { return t > 47 && t < 64; } // is digital 2 pin type
|
||||||
|
function isVir(t) { return t >= 80; } // is virtual type
|
||||||
// https://www.educative.io/edpresso/how-to-dynamically-load-a-js-file-in-javascript
|
// https://www.educative.io/edpresso/how-to-dynamically-load-a-js-file-in-javascript
|
||||||
function loadJS(FILE_URL, async = true) {
|
function loadJS(FILE_URL, async = true) {
|
||||||
let scE = d.createElement("script");
|
let scE = d.createElement("script");
|
||||||
@ -132,7 +137,7 @@
|
|||||||
d.Sf.querySelectorAll("#mLC input[name^=MA]").forEach((i,n)=>{
|
d.Sf.querySelectorAll("#mLC input[name^=MA]").forEach((i,n)=>{
|
||||||
gId("PSU"+n).style.display = ppl ? "inline" : "none";
|
gId("PSU"+n).style.display = ppl ? "inline" : "none";
|
||||||
const t = parseInt(d.Sf["LT"+n].value); // LED type SELECT
|
const t = parseInt(d.Sf["LT"+n].value); // LED type SELECT
|
||||||
i.min = ppl && !((t >= 80 && t < 96) || (t >= 40 && t < 48)) ? 250 : 0;
|
i.min = ppl && !(isVir(t) || isAna(t)) ? 250 : 0;
|
||||||
if (!abl) i.value = 0;
|
if (!abl) i.value = 0;
|
||||||
else if (ppl) sumMA += parseInt(i.value,10);
|
else if (ppl) sumMA += parseInt(i.value,10);
|
||||||
});
|
});
|
||||||
@ -143,11 +148,10 @@
|
|||||||
const t = parseInt(d.Sf["LT"+n].value); // LED type SELECT
|
const t = parseInt(d.Sf["LT"+n].value); // LED type SELECT
|
||||||
gId('LAdis'+n).style.display = s.selectedIndex==5 ? "inline" : "none";
|
gId('LAdis'+n).style.display = s.selectedIndex==5 ? "inline" : "none";
|
||||||
d.Sf["LA"+n].value = s.value==="0" ? 55 : s.value;
|
d.Sf["LA"+n].value = s.value==="0" ? 55 : s.value;
|
||||||
d.Sf["LA"+n].min = ((t >= 80 && t < 96) || (t >= 40 && t < 48)) ? 0 : 1;
|
d.Sf["LA"+n].min = (isVir(t) || isAna(t)) ? 0 : 1;
|
||||||
}
|
}
|
||||||
function setABL()
|
function setABL()
|
||||||
{
|
{
|
||||||
console.log(d.Sf.MA.value);
|
|
||||||
d.Sf.ABL.checked = parseInt(d.Sf.MA.value) > 0;
|
d.Sf.ABL.checked = parseInt(d.Sf.MA.value) > 0;
|
||||||
// check if ABL is enabled (max mA entered per output)
|
// check if ABL is enabled (max mA entered per output)
|
||||||
d.Sf.querySelectorAll("#mLC input[name^=MA]").forEach((i,n)=>{
|
d.Sf.querySelectorAll("#mLC input[name^=MA]").forEach((i,n)=>{
|
||||||
@ -205,12 +209,9 @@
|
|||||||
// is the field a LED type?
|
// is the field a LED type?
|
||||||
var n = s.name.substring(2);
|
var n = s.name.substring(2);
|
||||||
var t = parseInt(s.value);
|
var t = parseInt(s.value);
|
||||||
let isDig = ((t >= 16 && t < 32) || (t >= 50 && t < 64));
|
gId("p0d"+n).innerHTML = isVir(t) ? "IP address:" : isD2P(t) ? "Data GPIO:" : (t > 41) ? "GPIOs:" : "GPIO:";
|
||||||
let isVir = (t >= 80 && t < 96);
|
gId("p1d"+n).innerHTML = isD2P(t) ? "Clk GPIO:" : "";
|
||||||
let isPwm = (t >= 40 && t < 48);
|
gId("abl"+n).style.display = (!ablEN || isVir(t) || isAna(t)) ? "none" : "inline";
|
||||||
gId("p0d"+n).innerHTML = (t>=80 && t<96) ? "IP address:" : (t > 49) ? "Data GPIO:" : (t > 41) ? "GPIOs:" : "GPIO:";
|
|
||||||
gId("p1d"+n).innerHTML = (t> 49 && t<64) ? "Clk GPIO:" : "";
|
|
||||||
gId("abl"+n).style.display = ((t >= 80 && t < 96) || (t >= 40 && t < 48)) ? "none" : "inline";
|
|
||||||
//var LK = d.getElementsByName("L1"+n)[0]; // clock pin
|
//var LK = d.getElementsByName("L1"+n)[0]; // clock pin
|
||||||
|
|
||||||
memu += getMem(t, n); // calc memory
|
memu += getMem(t, n); // calc memory
|
||||||
@ -219,7 +220,7 @@
|
|||||||
for (p=1; p<5; p++) {
|
for (p=1; p<5; p++) {
|
||||||
var LK = d.Sf["L"+p+n]; // secondary pins
|
var LK = d.Sf["L"+p+n]; // secondary pins
|
||||||
if (!LK) continue;
|
if (!LK) continue;
|
||||||
if (((t>=80 && t<96) && p<4) || (t>49 && p==1) || (t>41 && t < 50 && (p+40 < t))) // TYPE_xxxx values from const.h
|
if ((isVir(t) && p<4) || (isD2P(t) && p==1) || (isPWM(t) && (p+40 < t))) // TYPE_xxxx values from const.h
|
||||||
{
|
{
|
||||||
// display pin field
|
// display pin field
|
||||||
LK.style.display = "inline";
|
LK.style.display = "inline";
|
||||||
@ -233,24 +234,24 @@
|
|||||||
}
|
}
|
||||||
if (change) {
|
if (change) {
|
||||||
gId("rf"+n).checked = (gId("rf"+n).checked || t == 31); // LEDs require data in off state
|
gId("rf"+n).checked = (gId("rf"+n).checked || t == 31); // LEDs require data in off state
|
||||||
if (t > 31 && t < 48) d.Sf["LC"+n].value = 1; // for sanity change analog count just to 1 LED
|
if (isAna(t)) d.Sf["LC"+n].value = 1; // for sanity change analog count just to 1 LED
|
||||||
d.Sf["LA"+n].min = ((t >= 80 && t < 96) || (t >= 40 && t < 48)) ? 0 : 1;
|
d.Sf["LA"+n].min = (isVir(t) || isAna(t)) ? 0 : 1;
|
||||||
d.Sf["MA"+n].min = ((t >= 80 && t < 96) || (t >= 40 && t < 48)) ? 0 : 250;
|
d.Sf["MA"+n].min = (isVir(t) || isAna(t)) ? 0 : 250;
|
||||||
}
|
}
|
||||||
gId("rf"+n).onclick = (t == 31) ? (()=>{return false}) : (()=>{}); // prevent change for TM1814
|
gId("rf"+n).onclick = (t == 31) ? (()=>{return false}) : (()=>{}); // prevent change for TM1814
|
||||||
gRGBW |= isRGBW = ((t > 17 && t < 22) || (t > 28 && t < 32) || (t > 40 && t < 46 && t != 43) || t == 88); // RGBW checkbox, TYPE_xxxx values from const.h
|
gRGBW |= isRGBW = ((t > 17 && t < 22) || (t > 28 && t < 32) || (t > 40 && t < 46 && t != 43) || t == 88); // RGBW checkbox, TYPE_xxxx values from const.h
|
||||||
gId("co"+n).style.display = ((t >= 80 && t < 96) || (t >= 40 && t < 48)) ? "none":"inline"; // hide color order for PWM
|
gId("co"+n).style.display = (isVir(t) || isAna(t)) ? "none":"inline"; // hide color order for PWM
|
||||||
gId("dig"+n+"w").style.display = (t > 28 && t < 32) ? "inline":"none"; // show swap channels dropdown
|
gId("dig"+n+"w").style.display = (isDig(t) && isRGBW) ? "inline":"none"; // show swap channels dropdown
|
||||||
if (!(t > 28 && t < 32)) d.Sf["WO"+n].value = 0; // reset swapping
|
if (!(isDig(t) && isRGBW)) d.Sf["WO"+n].value = 0; // reset swapping
|
||||||
gId("dig"+n+"c").style.display = (t >= 40 && t < 48) ? "none":"inline"; // hide count for analog
|
gId("dig"+n+"c").style.display = (isAna(t)) ? "none":"inline"; // hide count for analog
|
||||||
gId("dig"+n+"r").style.display = (t >= 80 && t < 96) ? "none":"inline"; // hide reversed for virtual
|
gId("dig"+n+"r").style.display = (isVir(t)) ? "none":"inline"; // hide reversed for virtual
|
||||||
gId("dig"+n+"s").style.display = ((t >= 80 && t < 96) || (t >= 40 && t < 48)) ? "none":"inline"; // hide skip 1st for virtual & analog
|
gId("dig"+n+"s").style.display = (isVir(t) || isAna(t)) ? "none":"inline"; // hide skip 1st for virtual & analog
|
||||||
gId("dig"+n+"f").style.display = ((t >= 16 && t < 32) || (t >= 50 && t < 64)) ? "inline":"none"; // hide refresh
|
gId("dig"+n+"f").style.display = (isDig(t)) ? "inline":"none"; // hide refresh
|
||||||
gId("dig"+n+"a").style.display = (isRGBW && t != 40) ? "inline":"none"; // auto calculate white
|
gId("dig"+n+"a").style.display = (isRGBW) ? "inline":"none"; // auto calculate white
|
||||||
gId("dig"+n+"l").style.display = (t > 48 && t < 64) ? "inline":"none"; // bus clock speed
|
gId("dig"+n+"l").style.display = (isD2P(t) || isPWM(t)) ? "inline":"none"; // bus clock speed / PWM speed (relative) (not On/Off)
|
||||||
gId("rev"+n).innerHTML = (t >= 40 && t < 48) ? "Inverted output":"Reversed (rotated 180°)"; // change reverse text for analog
|
gId("rev"+n).innerHTML = isAna(t) ? "Inverted output":"Reversed (rotated 180°)"; // change reverse text for analog
|
||||||
gId("psd"+n).innerHTML = (t >= 40 && t < 48) ? "Index:":"Start:"; // change analog start description
|
//gId("psd"+n).innerHTML = isAna(t) ? "Index:":"Start:"; // change analog start description
|
||||||
if (ablEN && pplEN && !((t >= 80 && t < 96) || (t >= 40 && t < 48))) {
|
if (ablEN && pplEN && !(isVir(t) || isAna(t))) {
|
||||||
sumMA += parseInt(d.Sf["MA"+n].value); // summarize PPL ABL limit (fields)
|
sumMA += parseInt(d.Sf["MA"+n].value); // summarize PPL ABL limit (fields)
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -275,9 +276,9 @@
|
|||||||
let s = parseInt(gId("ls"+n).value); //start value
|
let s = parseInt(gId("ls"+n).value); //start value
|
||||||
if (s+c > sLC) sLC = s+c; //update total count
|
if (s+c > sLC) sLC = s+c; //update total count
|
||||||
if (c > maxLC) maxLC = c; //max per output
|
if (c > maxLC) maxLC = c; //max per output
|
||||||
if (t < 80) sPC += c; //virtual out busses do not count towards physical LEDs
|
if (!isVir(t)) sPC += c; //virtual out busses do not count towards physical LEDs
|
||||||
//if (!((t >= 80 && t < 96) || (t >= 40 && t < 48))) sDI += c;
|
//if (!(isVir(t) || isPWM(t))) sDI += c;
|
||||||
if (!((t >= 80 && t < 96) || (t >= 40 && t < 48))) {
|
if (!(isVir(t) || isAna(t))) {
|
||||||
sDI += c; // summarize digital LED count
|
sDI += c; // summarize digital LED count
|
||||||
let maPL = parseInt(d.Sf["LA"+n].value);
|
let maPL = parseInt(d.Sf["LA"+n].value);
|
||||||
if (maPL == 255) maPL = 12;
|
if (maPL == 255) maPL = 12;
|
||||||
@ -292,7 +293,7 @@
|
|||||||
}
|
}
|
||||||
// ignore IP address (stored in pins for virtual busses)
|
// ignore IP address (stored in pins for virtual busses)
|
||||||
if (nm=="L0" || nm=="L1" || nm=="L2" || nm=="L3") {
|
if (nm=="L0" || nm=="L1" || nm=="L2" || nm=="L3") {
|
||||||
if (t>=80) {
|
if (isVir(t)) {
|
||||||
LC.max = 255;
|
LC.max = 255;
|
||||||
LC.min = 0;
|
LC.min = 0;
|
||||||
LC.style.color="#fff";
|
LC.style.color="#fff";
|
||||||
@ -314,7 +315,7 @@
|
|||||||
if (n2.substring(0,1)==="L") {
|
if (n2.substring(0,1)==="L") {
|
||||||
let m = nList[j].name.substring(2);
|
let m = nList[j].name.substring(2);
|
||||||
let t2 = parseInt(d.Sf["LT"+m].value, 10);
|
let t2 = parseInt(d.Sf["LT"+m].value, 10);
|
||||||
if (t2 >= 80) continue;
|
if (isVir(t2)) continue;
|
||||||
}
|
}
|
||||||
if (nList[j].value!="" && nList[j].value!="-1") p.push(parseInt(nList[j].value,10)); // add current pin
|
if (nList[j].value!="" && nList[j].value!="-1") p.push(parseInt(nList[j].value,10)); // add current pin
|
||||||
}
|
}
|
||||||
@ -328,7 +329,7 @@
|
|||||||
d.Sf.querySelectorAll("#mLC input[name^=LC]").forEach((s,n)=>{
|
d.Sf.querySelectorAll("#mLC input[name^=LC]").forEach((s,n)=>{
|
||||||
let c = parseInt(s.value,10); //get LED count
|
let c = parseInt(s.value,10); //get LED count
|
||||||
let t = parseInt(d.Sf["LT"+n].value); //get LED type
|
let t = parseInt(d.Sf["LT"+n].value); //get LED type
|
||||||
if (!ablEN || (t >= 80 && t < 96) || (t >= 40 && t < 48)) {
|
if (!ablEN || isVir(t) || isAna(t)) {
|
||||||
// virtual and analog LEDs have no limiter
|
// virtual and analog LEDs have no limiter
|
||||||
d.Sf["MA"+n].value = 0;
|
d.Sf["MA"+n].value = 0;
|
||||||
return;
|
return;
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -146,30 +146,30 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
|
|||||||
break; // no parameter
|
break; // no parameter
|
||||||
}
|
}
|
||||||
awmode = request->arg(aw).toInt();
|
awmode = request->arg(aw).toInt();
|
||||||
uint16_t freqHz = request->arg(sp).toInt();
|
uint16_t freq = request->arg(sp).toInt();
|
||||||
if (type > TYPE_ONOFF && type < 49) {
|
if (IS_PWM(type)) {
|
||||||
switch (freqHz) {
|
switch (freq) {
|
||||||
case 0 : freqHz = WLED_PWM_FREQ/3; break;
|
case 0 : freq = WLED_PWM_FREQ/3; break;
|
||||||
case 1 : freqHz = WLED_PWM_FREQ/2; break;
|
case 1 : freq = WLED_PWM_FREQ/2; break;
|
||||||
default:
|
default:
|
||||||
case 2 : freqHz = WLED_PWM_FREQ; break;
|
case 2 : freq = WLED_PWM_FREQ; break;
|
||||||
case 3 : freqHz = WLED_PWM_FREQ*2; break;
|
case 3 : freq = WLED_PWM_FREQ*4/3; break;
|
||||||
case 4 : freqHz = WLED_PWM_FREQ*3; break;
|
case 4 : freq = WLED_PWM_FREQ*2; break;
|
||||||
}
|
}
|
||||||
} else if (type > 48 && type < 64) {
|
} else if (IS_DIGITAL(type) && IS_2PIN(type)) {
|
||||||
switch (freqHz) {
|
switch (freq) {
|
||||||
default:
|
default:
|
||||||
case 0 : freqHz = 1000; break;
|
case 0 : freq = 1000; break;
|
||||||
case 1 : freqHz = 2000; break;
|
case 1 : freq = 2000; break;
|
||||||
case 2 : freqHz = 5000; break;
|
case 2 : freq = 5000; break;
|
||||||
case 3 : freqHz = 10000; break;
|
case 3 : freq = 10000; break;
|
||||||
case 4 : freqHz = 20000; break;
|
case 4 : freq = 20000; break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
freqHz = 0;
|
freq = 0;
|
||||||
}
|
}
|
||||||
channelSwap = Bus::hasWhite(type) ? request->arg(wo).toInt() : 0;
|
channelSwap = Bus::hasWhite(type) ? request->arg(wo).toInt() : 0;
|
||||||
if ((type > TYPE_TM1814 && type < TYPE_WS2801) || type >= TYPE_NET_DDP_RGB) { // analog and virtual
|
if (type == TYPE_ONOFF || IS_PWM(type) || IS_VIRTUAL(type)) { // analog and virtual
|
||||||
maPerLed = 0;
|
maPerLed = 0;
|
||||||
maMax = 0;
|
maMax = 0;
|
||||||
} else {
|
} else {
|
||||||
@ -180,7 +180,7 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage)
|
|||||||
// actual finalization is done in WLED::loop() (removing old busses and adding new)
|
// actual finalization is done in WLED::loop() (removing old busses and adding new)
|
||||||
// this may happen even before this loop is finished so we do "doInitBusses" after the loop
|
// this may happen even before this loop is finished so we do "doInitBusses" after the loop
|
||||||
if (busConfigs[s] != nullptr) delete busConfigs[s];
|
if (busConfigs[s] != nullptr) delete busConfigs[s];
|
||||||
busConfigs[s] = new BusConfig(type, pins, start, length, colorOrder | (channelSwap<<4), request->hasArg(cv), skip, awmode, freqHz, useGlobalLedBuffer, maPerLed, maMax);
|
busConfigs[s] = new BusConfig(type, pins, start, length, colorOrder | (channelSwap<<4), request->hasArg(cv), skip, awmode, freq, useGlobalLedBuffer, maPerLed, maMax);
|
||||||
busesChanged = true;
|
busesChanged = true;
|
||||||
}
|
}
|
||||||
//doInitBusses = busesChanged; // we will do that below to ensure all input data is processed
|
//doInitBusses = busesChanged; // we will do that below to ensure all input data is processed
|
||||||
|
@ -377,7 +377,7 @@ void getSettingsJS(byte subPage, char* dest)
|
|||||||
uint8_t nPins = bus->getPins(pins);
|
uint8_t nPins = bus->getPins(pins);
|
||||||
for (uint8_t i = 0; i < nPins; i++) {
|
for (uint8_t i = 0; i < nPins; i++) {
|
||||||
lp[1] = 48+i;
|
lp[1] = 48+i;
|
||||||
if (pinManager.isPinOk(pins[i]) || bus->getType()>=TYPE_NET_DDP_RGB) sappend('v',lp,pins[i]);
|
if (pinManager.isPinOk(pins[i]) || IS_VIRTUAL(bus->getType())) sappend('v',lp,pins[i]);
|
||||||
}
|
}
|
||||||
sappend('v',lc,bus->getLength());
|
sappend('v',lc,bus->getLength());
|
||||||
sappend('v',lt,bus->getType());
|
sappend('v',lt,bus->getType());
|
||||||
@ -389,16 +389,16 @@ void getSettingsJS(byte subPage, char* dest)
|
|||||||
sappend('v',aw,bus->getAutoWhiteMode());
|
sappend('v',aw,bus->getAutoWhiteMode());
|
||||||
sappend('v',wo,bus->getColorOrder() >> 4);
|
sappend('v',wo,bus->getColorOrder() >> 4);
|
||||||
uint16_t speed = bus->getFrequency();
|
uint16_t speed = bus->getFrequency();
|
||||||
if (bus->getType() > TYPE_ONOFF && bus->getType() < 48) {
|
if (IS_PWM(bus->getType())) {
|
||||||
switch (speed) {
|
switch (speed) {
|
||||||
case WLED_PWM_FREQ/3 : speed = 0; break;
|
case WLED_PWM_FREQ/3 : speed = 0; break;
|
||||||
case WLED_PWM_FREQ/2 : speed = 1; break;
|
case WLED_PWM_FREQ/2 : speed = 1; break;
|
||||||
default:
|
default:
|
||||||
case WLED_PWM_FREQ : speed = 2; break;
|
case WLED_PWM_FREQ : speed = 2; break;
|
||||||
case WLED_PWM_FREQ*2 : speed = 3; break;
|
case WLED_PWM_FREQ*4/3 : speed = 3; break;
|
||||||
case WLED_PWM_FREQ*3 : speed = 4; break;
|
case WLED_PWM_FREQ*2 : speed = 4; break;
|
||||||
}
|
}
|
||||||
} else {
|
} else if (IS_DIGITAL(bus->getType()) && IS_2PIN(bus->getType())) {
|
||||||
switch (speed) {
|
switch (speed) {
|
||||||
case 1000 : speed = 0; break;
|
case 1000 : speed = 0; break;
|
||||||
case 2000 : speed = 1; break;
|
case 2000 : speed = 1; break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user