mirror of
https://github.com/logicog/RTLPlayground.git
synced 2026-08-30 14:52:51 +08:00
When device has no LOS pin and module has no extended status, the RX LOS value will not be shown. When both are present, the equality check is performed. When only one is present, the present value will be shown. json from the switch, will still contain the field, but can be null for when pin is not available.
164 lines
5.7 KiB
JavaScript
164 lines
5.7 KiB
JavaScript
var txG = new BigInt64Array(10);
|
|
var txB = new BigInt64Array(10);
|
|
var rxG = new BigInt64Array(10);
|
|
var rxB = new BigInt64Array(10);
|
|
const linkS = ["Disabled", "Down", "10M", "100M", "1000M", "500M", "10G", "2.5G", "5G"];
|
|
var pState = new Int8Array(10);
|
|
var pIsSFP = new Int8Array(10);
|
|
var pAdvertised = new Int8Array(10);
|
|
var numPorts = 0;
|
|
var logToPhysPort = new Int8Array(10);
|
|
var physToLogPort = new Int8Array(10);
|
|
var currentRequests = [];
|
|
var currentCallback;
|
|
function drawPorts() {
|
|
var f = document.getElementById('ports');
|
|
console.log("DRAWING PORTS: ", numPorts);
|
|
for (let i = 0; i < numPorts; i++) {
|
|
console.log("DRAWING isSFP: ", pIsSFP[i]);
|
|
const d = document.createElement("div");
|
|
d.classList.add('tooltip');
|
|
const s = document.createElement("span");
|
|
s.classList.add("tooltiptext");
|
|
s.innerHTML = "Tooltip text";
|
|
s.id="tt_" + (i+1);
|
|
const l = document.createElement("object");
|
|
d.appendChild(l);
|
|
d.appendChild(s);
|
|
l.type = "image/svg+xml";
|
|
if (!pIsSFP[i]) {
|
|
l.data = "port.svg";
|
|
l.width ="40";
|
|
l.height ="40";
|
|
} else {
|
|
l.data = "sfp.svg";
|
|
l.width = "60";
|
|
l.height = "60";
|
|
}
|
|
l.id="port" + (i+1);
|
|
f.appendChild(d);
|
|
}
|
|
}
|
|
|
|
function update(callback) {
|
|
var xhttp = new XMLHttpRequest();
|
|
xhttp.onreadystatechange = function() {
|
|
console.log("IN UPDATE ");
|
|
if (this.readyState == 4 && this.status == 401)
|
|
document.location = "/login.html"
|
|
if (this.readyState == 4 && this.status == 200) {
|
|
const s = JSON.parse(xhttp.responseText);
|
|
if (!numPorts) {
|
|
numPorts = s.length;
|
|
for (let i = 0; i < s.length; i++)
|
|
pIsSFP[s[i].portNum-1] = s[i].isSFP;
|
|
drawPorts();
|
|
}
|
|
console.log("RES:", JSON.stringify(s));
|
|
for (let i = 0; i < s.length; i++) {
|
|
p = s[i];
|
|
let n = p.portNum;
|
|
logToPhysPort[p.logPort] = n;
|
|
physToLogPort[n-1] = p.logPort;
|
|
let pid = "port" + n;
|
|
let ttid = "tt_" + n;
|
|
n--;
|
|
txG[n] = BigInt(p.txG); txB[n] = BigInt(p.txB); rxG[n] = BigInt(p.rxG); rxB[n] = BigInt(p.rxB);
|
|
var psvg = document.getElementById(pid);
|
|
var tt = document.getElementById(ttid);
|
|
if (psvg == null || !psvg.contentDocument)
|
|
continue;
|
|
var bgs = psvg.contentDocument.getElementsByClassName("bg");
|
|
var leds = psvg.contentDocument.getElementsByClassName("led");
|
|
if (p.enabled == 0) {
|
|
pState[n] = -1;
|
|
bgs[0].style.fill = "red";
|
|
leds[0].style.fill = "black"; leds[1].style.fill = "black";
|
|
psvg.style.opacity = 0.4;
|
|
tt.innerHTML = "Not enabled.";
|
|
} else {
|
|
psvg.style.opacity = 1.0;
|
|
pState[n] = p.link;
|
|
if (p.link == 4 || p.link == 5 || p.link == 6) {
|
|
leds[0].style.fill = "green"; leds[1].style.fill = "orange";
|
|
} else if (p.link == 1 || p.link == 2 || p.link == 3) {
|
|
leds[0].style.fill = "green"; leds[1].style.fill = "green";
|
|
} else {
|
|
leds[0].style.fill = "black"; leds[1].style.fill = "black";
|
|
psvg.style.opacity = 0.4
|
|
}
|
|
var iHTML = "<table border=\"0\" class=\"tt_table\">";
|
|
iHTML += "<tr><td align=\"left\">Link speed</td><td>:</td><td>" + linkS[p.link + 1] + "</td></tr>";
|
|
if (p.isSFP) {
|
|
pAdvertised[n] = 0;
|
|
const hasExtendedStatus = p.sfp_options & 0x40;
|
|
iHTML += "<tr><td>Vendor</td><td>:</td><td>" + p.sfp_vendor + "</td></tr>";
|
|
iHTML += "<tr><td>Model</td><td>:</td><td>" + p.sfp_model + "</td></tr>";
|
|
iHTML += "<tr><td>Serial</td><td>:</td><td>" + p.sfp_serial + "</td></tr>";
|
|
if (hasExtendedStatus) {
|
|
iHTML += "<tr><td>Temp</td><td>:</td><td>" + (Number(p.sfp_temp) >> 8) + "." + ((Number(p.sfp_temp) & 0xff)/256.0 * 100).toFixed(0) + " ℃</td></tr>";
|
|
iHTML += "<tr><td>Vcc</td><td>:</td><td>" + (Number(p.sfp_vcc) / 10000.0).toFixed(2) + " V</td></tr>";
|
|
iHTML += "<tr><td>TX-Fault</td><td>:</td><td>" + (Boolean(Number(p.sfp_state) & 0x4)) + "</td></tr>";
|
|
iHTML += "<tr><td>TX-Disabled</td><td>:</td><td>" + (Boolean(Number(p.sfp_state) & 0x80)) + "</td></tr>";
|
|
iHTML += "<tr><td>TX-Bias</td><td>:</td><td>" + (Number(p.sfp_txbias) / 500.0).toFixed(1) + " mA</td></tr>";
|
|
iHTML += "<tr><td>TX-Power</td><td>:</td><td>" + (Number(p.sfp_txpower) / 10.0).toFixed(0) + " mW</td></tr>";
|
|
iHTML += "<tr><td>RX-Power</td><td>:</td><td>" + (Number(p.sfp_rxpower) / 10.0).toFixed(0) + " mW</td></tr>";
|
|
}
|
|
// Not all devices & modules have LOS pin...
|
|
const rx_los_pin = p.sfp_los !== null ? Boolean(Number(p.sfp_los)) : null;
|
|
const rx_los_module = hasExtendedStatus ? Boolean(Number(p.sfp_state) & 0x2) : null;
|
|
if (rx_los_module !== null || rx_los_pin !== null) {
|
|
iHTML += `<tr><td>RX-LOS</td><td>:</td><td>${rxLosHTML(rx_los_pin, rx_los_module)}</td></tr>`;
|
|
}
|
|
} else {
|
|
pAdvertised[n] = parseInt(p.adv, 2);
|
|
};
|
|
iHTML += "</table>";
|
|
tt.innerHTML = iHTML;
|
|
}}
|
|
if (callback)
|
|
callback();
|
|
}};
|
|
xhttp.open("GET", "/status.json", true);
|
|
xhttp.timeout = 5000;
|
|
sendXHTTP(xhttp);
|
|
}
|
|
|
|
function rxLosHTML(pinStatus, moduleStatus) {
|
|
if (moduleStatus !== null && pinStatus !== null && moduleStatus !== pinStatus) {
|
|
return `pin=${pinStatus}<br/>mod=${moduleStatus}<br/>❗❗❗❗`;
|
|
}
|
|
|
|
// Returns first non null value
|
|
return moduleStatus ?? pinStatus;
|
|
}
|
|
|
|
function callbackXHTTP()
|
|
{
|
|
x = currentRequests.shift();
|
|
x.onreadystatechange = currentCallback;
|
|
x.onreadystatechange();
|
|
if (currentRequests.length === 0)
|
|
return;
|
|
x = currentRequests[0];
|
|
currentCallback = x.onreadystatechange;
|
|
x.onreadystatechange = callbackXHTTP;
|
|
setTimeout(() => {
|
|
x.send();
|
|
}, 20);
|
|
}
|
|
|
|
function sendXHTTP(x)
|
|
{
|
|
console.log("sendXHTTP ", x);
|
|
if (currentRequests.length === 0) {
|
|
currentRequests.push(x);
|
|
currentCallback = x.onreadystatechange;
|
|
x.onreadystatechange = callbackXHTTP;
|
|
x.send();
|
|
return;
|
|
}
|
|
currentRequests.push(x);
|
|
}
|
|
|