vehicle totals

This commit is contained in:
cjdenio committed 2026-01-03 17:46:34 -07:00
1 parent 8b6f755893
commit 3c858e054b
2 files changed
+47 -7

No files matched your search

+13 -1
View File
@@ -57,7 +57,7 @@
<div id="map" style="height: 100vh; flex-grow: 1"></div> <div id="map" style="height: 100vh; flex-grow: 1"></div>
<div id="sidebar"> <div id="sidebar">
<h1>Every Transit Vehicle in Salt Lake City*</h1> <h1>Every Transit Vehicle in Salt Lake City*</h1>
<small>*with a tracker</small> <small>*or at least most of them</small>
<hr /> <hr />
@@ -112,6 +112,18 @@
<hr> <hr>
<div>
<p>There are...</p>
<ul>
<li><strong id="count-bus">-</strong> bus(es)</li>
<li><strong id="count-trax">-</strong> TRAX train(s)</li>
<li><strong id="count-frontrunner">-</strong> FrontRunner train(s)</li>
</ul>
<p>...out and about</p>
</div>
<hr>
<div> <div>
last updated: <span id="last-updated">-</span> last updated: <span id="last-updated">-</span>
</div> </div>
+34 -6
View File
@@ -1,12 +1,11 @@
import * as shapes from "./shapes.js"; import * as shapes from "./shapes.js";
import protobuf from "https://cdn.jsdelivr.net/npm/protobufjs@8.0.0/dist/protobuf.js/+esm"; import protobuf from "https://cdn.jsdelivr.net/npm/protobufjs@8.0.0/dist/protobuf.js/+esm";
import * as L from "https://unpkg.com/leaflet@1.9.4/dist/leaflet-src.esm.js"; import * as L from "https://cdn.jsdelivr.net/npm/leaflet@1.9.4/dist/leaflet-src.esm.js";
let lastUpdated; let lastUpdated;
function displayLastUpdated() { function displayLastUpdated() {
document.getElementById("last-updated").innerText = `${Math.floor((Date.now() - (lastUpdated * 1000)) / 1000)}s ago` document.getElementById("last-updated").innerText = `${Math.floor((Date.now() - (lastUpdated * 1000)) / 1000)}s ago`
console.log("yeah")
} }
setInterval(displayLastUpdated, 1000) setInterval(displayLastUpdated, 1000)
@@ -60,17 +59,46 @@ protobuf.load("/schema.proto").then((root) => {
} }
} }
function populateTotals(vehicles) {
const totals = {
bus: 0,
trax: 0,
frontrunner: 0,
}
for (const vehicle of vehicles) {
switch(vehicle.route.type) {
case RouteType.BUS:
totals.bus++;
break;
case RouteType.TRAM:
totals.trax++;
break;
case RouteType.RAIL:
totals.frontrunner++;
break;
}
}
document.getElementById("count-bus").innerText = totals.bus.toString()
document.getElementById("count-trax").innerText = totals.trax.toString()
document.getElementById("count-frontrunner").innerText = totals.frontrunner.toString()
}
async function reload() { async function reload() {
const bin = await fetch("/api").then((r) => r.arrayBuffer()); const bin = await fetch("/api").then((r) => r.arrayBuffer());
const { vehicles, info } = root const { vehicles, info } = root
.lookupType("VehicleFeed") .lookupType("VehicleFeed")
.decode(new Uint8Array(bin)); .decode(new Uint8Array(bin));
clearMap();
lastUpdated = info.lastUpdate lastUpdated = info.lastUpdate
displayLastUpdated() displayLastUpdated()
populateTotals(vehicles)
// render vehicles on map
clearMap();
vehicles.forEach((vehicle) => { vehicles.forEach((vehicle) => {
L.marker([vehicle.lat, vehicle.lon], { L.marker([vehicle.lat, vehicle.lon], {
zIndexOffset: zIndexOffset:
@@ -115,10 +143,10 @@ protobuf.load("/schema.proto").then((root) => {
: busLayer : busLayer
) )
.bindPopup( .bindPopup(
`${routeDesignator(vehicle.route)} to ${vehicle.headsign.replace( `<b>${routeDesignator(vehicle.route)}</b> to <b>${vehicle.headsign.replace(
/^to /i, /^to /i,
"" ""
)}<br />@ ${vehicle.nearestStation?.name}` )}</b>${vehicle.nearestStation ? `<br />@ ${vehicle.nearestStation?.name}` : ""}<br /><br /><small>vehicle #: ${vehicle.id}</small>`
); );
}); });
} }