Use usermod names from controller, consolidate JS for smaller flash size

Co-authored-by: DedeHai <6280424+DedeHai@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot]
2025-11-27 18:03:08 +00:00
parent 113cdf33ea
commit ccf0702713
2 changed files with 38 additions and 83 deletions

View File

@@ -1883,10 +1883,9 @@ function togglePins()
gId('pins').style.transform = (isPins) ? "translateY(0px)":"translateY(100%)"; gId('pins').style.transform = (isPins) ? "translateY(0px)":"translateY(100%)";
} }
function getPinOwnerName(owner, btnType) function getPinOwnerName(owner, btnType, umName)
{ {
if (!owner) return "Unknown"; if (!owner) return "Unknown";
// Owner values must match PinOwner enum in pin_manager.h
// High bit set (0x80) means built-in WLED owner // High bit set (0x80) means built-in WLED owner
if (owner & 0x80) { if (owner & 0x80) {
switch (owner) { switch (owner) {
@@ -1894,7 +1893,7 @@ function getPinOwnerName(owner, btnType)
case 0x82: return "LED Digital"; case 0x82: return "LED Digital";
case 0x83: return "LED On/Off"; case 0x83: return "LED On/Off";
case 0x84: return "LED PWM"; case 0x84: return "LED PWM";
case 0x85: return getButtonTypeName(btnType); // Button with type case 0x85: return getButtonTypeName(btnType);
case 0x86: return "IR Receiver"; case 0x86: return "IR Receiver";
case 0x87: return "Relay"; case 0x87: return "Relay";
case 0x88: return "SPI RAM"; case 0x88: return "SPI RAM";
@@ -1906,63 +1905,21 @@ function getPinOwnerName(owner, btnType)
case 0x8E: return "HUB75"; case 0x8E: return "HUB75";
} }
} }
// Usermod owners (values from USERMOD_ID_* in const.h) // Usermod owners - use name from JSON if available
switch (owner) { return umName || ("UM #" + owner);
case 0x01: return "Usermod";
case 0x02: return "UM Example";
case 0x03: return "UM Temperature";
case 0x05: return "UM PIR";
case 0x06: return "UM IMU";
case 0x07: return "UM 4Line Display";
case 0x08: return "UM Rotary Encoder";
case 0x0D: return "UM Multi Relay";
case 0x0E: return "UM Staircase";
case 0x12: return "UM Battery";
case 0x14: return "UM BH1750";
case 0x16: return "UM RGB Encoder";
case 0x17: return "UM QuinLED Penta";
case 0x1E: return "UM BME280";
case 0x20: return "UM Audio Reactive";
case 0x25: return "UM SD Card";
case 0x26: return "UM PWM Outputs";
case 0x2B: return "UM LDR Dusk Dawn";
case 0x2F: return "UM MAX17048";
case 0x31: return "UM BME68X";
case 0x35: return "UM Pixels Dice";
}
return "Owner " + owner;
} }
function getButtonTypeName(btnType) function getButtonTypeName(t)
{ {
if (typeof btnType === 'undefined') return "Button"; var n = ["None","Reserved","Push","Push High","Switch","PIR","Touch","Analog","Analog Inv","Touch Switch"];
switch (btnType) { return "Button (" + (n[t] || "?") + ")";
case 0: return "Button (None)";
case 1: return "Button (Reserved)";
case 2: return "Button (Push)";
case 3: return "Button (Push High)";
case 4: return "Button (Switch)";
case 5: return "Button (PIR)";
case 6: return "Button (Touch)";
case 7: return "Button (Analog)";
case 8: return "Button (Analog Inv)";
case 9: return "Button (Touch Switch)";
}
return "Button";
} }
function getPinCapabilities(caps) function getPinCapabilities(c)
{ {
var c = []; var r = [], f = ["In","Out","ADC","Touch","DAC","IR","I2S","PWM"];
if (caps & 0x01) c.push("In"); for (var i=0; i<8; i++) if (c & (1<<i)) r.push(f[i]);
if (caps & 0x02) c.push("Out"); return r.join(", ");
if (caps & 0x04) c.push("ADC");
if (caps & 0x08) c.push("Touch");
if (caps & 0x10) c.push("DAC");
if (caps & 0x20) c.push("IR");
if (caps & 0x40) c.push("I2S");
if (caps & 0x80) c.push("PWM");
return c.join(", ");
} }
function loadPins() function loadPins()
@@ -1984,38 +1941,19 @@ function loadPins()
function populatePins(json) function populatePins(json)
{ {
var cn=""; var cn="", pins = json.pins || [];
var pins = json.pins || []; if (!pins.length) {
if (pins.length === 0) {
cn = "No pins available."; cn = "No pins available.";
} else { } else {
cn = '<table class="infot"><tr><th>Pin</th><th>Owner</th><th>Functions</th><th>State</th></tr>'; cn = '<table class="infot"><tr><th>Pin</th><th>Owner</th><th>Functions</th><th>State</th></tr>';
for (var pin of pins) { for (var p of pins) {
var gpio = pin.p; var st = "";
var caps = pin.c || 0; if (typeof p.s !== 'undefined') {
var allocated = pin.a || false; st = '<span class="pstate" style="background:var(--c-' + (p.s ? 'g' : 'r') + ');"></span>';
var owner = pin.o || 0;
var btnType = pin.t; // button type (if button)
var mode = pin.m; // 0=input, 1=output, undefined=not simple GPIO
var state = pin.s; // 0 or 1, undefined if not readable
var pullup = pin.u; // pullup status
var stateStr = "";
if (typeof state !== 'undefined') {
// Show colored circle for state (no text)
var color = state ? "var(--c-g)" : "var(--c-r)";
stateStr = '<span class="pstate" style="background:' + color + ';"></span>';
} }
var ow = p.a ? getPinOwnerName(p.o, p.t, p.n) : '<span style="color:var(--c-g)">Available</span>';
var statusStr = allocated ? getPinOwnerName(owner, btnType) : '<span style="color:var(--c-g)">Available</span>'; if (typeof p.u !== 'undefined') ow += p.u ? ' (PU)' : ' (No PU)';
var capsStr = getPinCapabilities(caps); cn += '<tr><td>GPIO ' + p.p + '</td><td>' + ow + '</td><td>' + getPinCapabilities(p.c||0) + '</td><td>' + st + '</td></tr>';
// Add pullup indicator if present
if (typeof pullup !== 'undefined') {
statusStr += pullup ? ' (PU)' : ' (No PU)';
}
cn += '<tr><td>GPIO ' + gpio + '</td><td>' + statusStr + '</td><td>' + capsStr + '</td><td>' + stateStr + '</td></tr>';
} }
cn += '</table>'; cn += '</table>';
} }

View File

@@ -1114,7 +1114,24 @@ void serializePins(JsonObject root)
pinObj["a"] = isAllocated; // allocated status pinObj["a"] = isAllocated; // allocated status
if (isAllocated) { if (isAllocated) {
pinObj["o"] = static_cast<uint8_t>(owner); // owner ID uint8_t ownerVal = static_cast<uint8_t>(owner);
pinObj["o"] = ownerVal; // owner ID
// For usermod owners (low bit not set), try to get the usermod name
if (!(ownerVal & 0x80) && ownerVal > 0) {
Usermod* um = UsermodManager::lookup(ownerVal);
if (um) {
// Get usermod name by calling addToConfig and extracting the key
StaticJsonDocument<256> tmpDoc;
JsonObject tmpObj = tmpDoc.to<JsonObject>();
um->addToConfig(tmpObj);
// The first key in the object is the usermod name
JsonObject::iterator it = tmpObj.begin();
if (it != tmpObj.end()) {
pinObj["n"] = it->key().c_str(); // usermod name
}
}
}
} }
// For button pins, check if internal pullup/pulldown would be used and get state // For button pins, check if internal pullup/pulldown would be used and get state