+1
-104
@@ -221,9 +221,7 @@ function formatGpsAge(seconds) {
|
||||
function renderGpsStatus(status) {
|
||||
const liveBadge = document.getElementById('gps-live-badge');
|
||||
const fixDetail = document.getElementById('gps-fix-detail');
|
||||
const healthStatus = document.getElementById('pi-gps-status');
|
||||
const healthDetail = document.getElementById('pi-gps-detail');
|
||||
if (!liveBadge || !fixDetail || !healthStatus || !healthDetail) return;
|
||||
if (!liveBadge || !fixDetail) return;
|
||||
|
||||
let label = 'Unavailable';
|
||||
let badgeClass = 'text-bg-secondary';
|
||||
@@ -248,9 +246,6 @@ function renderGpsStatus(status) {
|
||||
liveBadge.className = `badge ${badgeClass}`;
|
||||
liveBadge.textContent = label;
|
||||
fixDetail.textContent = detail;
|
||||
healthStatus.textContent = label;
|
||||
healthStatus.className = `h6 fw-bold mb-0 ${label === 'Live fix' ? 'text-success' : label === 'Offline' ? 'text-danger' : 'text-warning'}`;
|
||||
healthDetail.textContent = detail;
|
||||
}
|
||||
|
||||
async function refreshGpsStatus() {
|
||||
@@ -295,112 +290,14 @@ socket.on('gps_location', function(data) {
|
||||
}
|
||||
});
|
||||
|
||||
function formatUptime(seconds) {
|
||||
const days = Math.floor(seconds / 86400);
|
||||
const hours = Math.floor((seconds % 86400) / 3600);
|
||||
const minutes = Math.floor((seconds % 3600) / 60);
|
||||
return days ? `${days}d ${hours}h` : `${hours}h ${minutes}m`;
|
||||
}
|
||||
|
||||
function setHealthValue(id, value) {
|
||||
document.getElementById(id).textContent = value;
|
||||
}
|
||||
|
||||
function healthWarningLabel(warning) {
|
||||
return {
|
||||
under_voltage: "Power supply undervoltage",
|
||||
frequency_capped: "CPU frequency capped",
|
||||
throttled: "CPU currently throttled",
|
||||
soft_temperature_limit: "CPU temperature limit active",
|
||||
high_temperature: "CPU temperature is high",
|
||||
disk_nearly_full: "Disk is nearly full",
|
||||
memory_pressure: "Memory usage is high",
|
||||
}[warning] || warning;
|
||||
}
|
||||
|
||||
function historicalHealthWarningLabel(warning) {
|
||||
return {
|
||||
under_voltage: "Power supply undervoltage",
|
||||
frequency_capped: "CPU frequency capping",
|
||||
throttled: "CPU throttling",
|
||||
soft_temperature_limit: "CPU temperature limiting",
|
||||
}[warning] || warning;
|
||||
}
|
||||
|
||||
async function refreshHealth() {
|
||||
const response = await fetch("/api/health");
|
||||
const health = await response.json();
|
||||
if (!response.ok) {
|
||||
throw new Error(health.error || "Could not load Pi health.");
|
||||
}
|
||||
|
||||
setHealthValue(
|
||||
"pi-temperature",
|
||||
health.temperature_c == null ? "Unavailable" : `${health.temperature_c.toFixed(1)} °C`
|
||||
);
|
||||
setHealthValue(
|
||||
"pi-memory",
|
||||
health.memory == null ? "Unavailable" : `${health.memory.used_percent.toFixed(1)}%`
|
||||
);
|
||||
setHealthValue(
|
||||
"pi-disk",
|
||||
health.disk == null
|
||||
? "Unavailable"
|
||||
: `${health.disk.used_percent.toFixed(1)}% · ${YarisUI.formatBytes(health.disk.free_bytes)} free`
|
||||
);
|
||||
setHealthValue(
|
||||
"pi-uptime",
|
||||
health.uptime_seconds == null ? "Unavailable" : formatUptime(health.uptime_seconds)
|
||||
);
|
||||
|
||||
const warning = document.getElementById("pi-health-warning");
|
||||
const currentWarnings = health.warnings.map(healthWarningLabel);
|
||||
const historicalWarnings = health.historical_warnings.map(
|
||||
historicalHealthWarningLabel
|
||||
);
|
||||
const warnings = currentWarnings.concat(
|
||||
historicalWarnings.length
|
||||
? [`Previously detected: ${historicalWarnings.join(", ")}`]
|
||||
: []
|
||||
);
|
||||
warning.hidden = warnings.length === 0;
|
||||
warning.textContent = warnings.join(" · ");
|
||||
|
||||
const error = document.getElementById("pi-health-error");
|
||||
const unavailable = Object.keys(health.errors);
|
||||
error.hidden = unavailable.length === 0;
|
||||
error.textContent = unavailable.length
|
||||
? `Unavailable health sources: ${unavailable.join(", ")}`
|
||||
: "";
|
||||
document.getElementById("pi-health-updated").textContent =
|
||||
`Updated ${new Date().toLocaleTimeString()}`;
|
||||
}
|
||||
|
||||
refreshHealth().catch(function (error) {
|
||||
const message = document.getElementById("pi-health-error");
|
||||
message.textContent = error.message;
|
||||
message.hidden = false;
|
||||
});
|
||||
window.setInterval(function () {
|
||||
refreshHealth().catch(function (error) {
|
||||
const message = document.getElementById("pi-health-error");
|
||||
message.textContent = error.message;
|
||||
message.hidden = false;
|
||||
});
|
||||
}, 30000);
|
||||
|
||||
refreshGpsStatus().catch(function (error) {
|
||||
renderGpsStatus({thread_alive: false, has_fix: false, fix_age_seconds: null});
|
||||
const fixDetail = document.getElementById('gps-fix-detail');
|
||||
const healthDetail = document.getElementById('pi-gps-detail');
|
||||
if (fixDetail) fixDetail.textContent = error.message;
|
||||
if (healthDetail) healthDetail.textContent = error.message;
|
||||
});
|
||||
window.setInterval(function () {
|
||||
refreshGpsStatus().catch(function (error) {
|
||||
const fixDetail = document.getElementById('gps-fix-detail');
|
||||
const healthDetail = document.getElementById('pi-gps-detail');
|
||||
if (fixDetail) fixDetail.textContent = error.message;
|
||||
if (healthDetail) healthDetail.textContent = error.message;
|
||||
});
|
||||
}, 15000);
|
||||
|
||||
Reference in New Issue
Block a user