import network from "../data/network.json"; import * as simulation from "../data/simulation.js"; import Map from "./map/index.js"; // Run courses simulation const simstate = simulation.start(); // Create display panel const panel = document.querySelector("#panel"); const timeFormat = new Intl.DateTimeFormat("fr-FR", { timeZone: "Europe/Paris", timeStyle: "medium", }); const timeToHTML = time => { const delta = Math.ceil((time - Date.now()) / 1000); if (delta <= 0) { return `Imminent`; } else if (delta < 60) { return `${delta} s`; } else { return `${Math.floor(delta / 60)} min ${delta % 60} s`; } }; const updatePanel = () => { const vehicleCount = Object.values(simstate.courses).length; const movingVehicles = Object.values(simstate.courses).filter( course => course.properties.speed > 0 ).length; let html = `
Heure locale
${timeFormat.format(Date.now())}
Véhicules sur la carte
${movingVehicles} en mouvement, ${vehicleCount - movingVehicles} à l’arrêt
`; if (map.selectedCourse !== null && map.selectedCourse in simstate.courses) { const course = simstate.courses[map.selectedCourse].properties; const stopToHTML = stopId => stopId in network.stops ? network.stops[stopId].properties.name : 'Arrêt inconnu'; const passingsToHTML = passings => passings.map(([stopId, time]) => ` ${stopToHTML(stopId)} ${timeFormat.format(time)} `).join("\n"); const state = ( course.traveledDistance === 0 && course.speed === 0 ? "stopped" : "moving" ); let prevPassings = course.prevPassings; if (state === "moving") { prevPassings = prevPassings.concat([[course.departureStop, course.departureTime]]); } html += `

Véhicule

ID
${map.selectedCourse}
Ligne
${course.line}
Destination
${stopToHTML(course.finalStop)}
État
${state === "moving" ? `Entre ${stopToHTML(course.departureStop)} et ${stopToHTML(course.arrivalStop)}` : `À l’arrêt ${stopToHTML(course.departureStop)}`}
${state === "moving" ? `
Arrivée dans
${timeToHTML(course.arrivalTime - 10000)}
Distance parcourue
${Math.ceil(course.traveledDistance)} m
Vitesse
${Math.ceil(course.speed * 3600)} km/h
` : `
Départ dans
${timeToHTML(course.departureTime)}
`}

Arrêts précédents

${passingsToHTML(prevPassings)}

Arrêts suivants

${passingsToHTML(course.nextPassings)}
`; } panel.innerHTML = html; }; setInterval(updatePanel, 1000); const map = new Map("map", simstate, { onVehicleClick(courses) { courses = [...courses]; courses.sort(); const index = courses.indexOf(map.selectedCourse); if (courses.length === 0) { map.select(null); } else if (index === -1) { map.select(courses[0]); } else { map.select(courses[(index + 1) % courses.length]); } updatePanel(); } }); // Reference as globals to facilitate debugging window.__map = map; window.__simstate = simstate.courses; window.__network = network;