diff --git a/index.html b/index.html index d800ff6..41e3307 100644 --- a/index.html +++ b/index.html @@ -1,12 +1,17 @@ + Megafonías TsSAEx + + + +
@@ -23,21 +28,29 @@
- +
meeting_roomPanel Interior
+
+ +
+ + +
+ Anunciar Parada
campaignExterior
-

Configuración de letrero y megafonía externa para paradas.

+

Configuración de letrero y megafonía externa para paradas. +

open_in_newConfigurar Exterior @@ -74,7 +87,8 @@
- addAñadir Parada + addAñadir + Parada Exportar JSON

@@ -88,7 +102,8 @@
           
           
           
-          
volume_downVolumen Exterior
+
volume_downVolumen Exterior +
@@ -101,4 +116,5 @@ + \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 20c8b45..3aa9cee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -735,6 +735,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, diff --git a/public/audio/correspondencia_linea.wav b/public/audio/correspondencia_linea.wav new file mode 100644 index 0000000..c12ff45 Binary files /dev/null and b/public/audio/correspondencia_linea.wav differ diff --git a/public/audio/correspondencia_lineas.wav b/public/audio/correspondencia_lineas.wav new file mode 100644 index 0000000..5f5c3a9 Binary files /dev/null and b/public/audio/correspondencia_lineas.wav differ diff --git a/public/audio/correspondencia_todas_las_lineas.wav b/public/audio/correspondencia_todas_las_lineas.wav new file mode 100644 index 0000000..aaffe63 Binary files /dev/null and b/public/audio/correspondencia_todas_las_lineas.wav differ diff --git a/public/audio/exterior/autobus_315.wav b/public/audio/exterior/autobus_315.wav new file mode 100644 index 0000000..c74b785 Binary files /dev/null and b/public/audio/exterior/autobus_315.wav differ diff --git a/public/audio/exterior/autobus_316.wav b/public/audio/exterior/autobus_316.wav new file mode 100644 index 0000000..97a6a2c Binary files /dev/null and b/public/audio/exterior/autobus_316.wav differ diff --git a/public/audio/exterior/autobus_317.wav b/public/audio/exterior/autobus_317.wav new file mode 100644 index 0000000..e567e77 Binary files /dev/null and b/public/audio/exterior/autobus_317.wav differ diff --git a/public/audio/exterior/autobus_318.wav b/public/audio/exterior/autobus_318.wav new file mode 100644 index 0000000..0c2cf9c Binary files /dev/null and b/public/audio/exterior/autobus_318.wav differ diff --git a/public/audio/exterior/autobus_319.wav b/public/audio/exterior/autobus_319.wav new file mode 100644 index 0000000..6cf17a7 Binary files /dev/null and b/public/audio/exterior/autobus_319.wav differ diff --git a/public/audio/exterior/autobus_320.wav b/public/audio/exterior/autobus_320.wav new file mode 100644 index 0000000..ed7ddc4 Binary files /dev/null and b/public/audio/exterior/autobus_320.wav differ diff --git a/public/audio/exterior/autobus_321.wav b/public/audio/exterior/autobus_321.wav new file mode 100644 index 0000000..13874fd Binary files /dev/null and b/public/audio/exterior/autobus_321.wav differ diff --git a/public/audio/exterior/autobus_322.wav b/public/audio/exterior/autobus_322.wav new file mode 100644 index 0000000..4486d45 Binary files /dev/null and b/public/audio/exterior/autobus_322.wav differ diff --git a/public/audio/exterior/autobus_323.wav b/public/audio/exterior/autobus_323.wav new file mode 100644 index 0000000..f5ea2cb Binary files /dev/null and b/public/audio/exterior/autobus_323.wav differ diff --git a/public/audio/exterior/autobus_324.wav b/public/audio/exterior/autobus_324.wav new file mode 100644 index 0000000..176654a Binary files /dev/null and b/public/audio/exterior/autobus_324.wav differ diff --git a/public/audio/exterior/autobus_325.wav b/public/audio/exterior/autobus_325.wav new file mode 100644 index 0000000..b3162ed Binary files /dev/null and b/public/audio/exterior/autobus_325.wav differ diff --git a/public/audio/exterior/autobus_326.wav b/public/audio/exterior/autobus_326.wav new file mode 100644 index 0000000..8dbedbe Binary files /dev/null and b/public/audio/exterior/autobus_326.wav differ diff --git a/public/audio/exterior/autobus_327.wav b/public/audio/exterior/autobus_327.wav new file mode 100644 index 0000000..c0c0b22 Binary files /dev/null and b/public/audio/exterior/autobus_327.wav differ diff --git a/public/audio/exterior/autobus_328.wav b/public/audio/exterior/autobus_328.wav new file mode 100644 index 0000000..e6ed6ea Binary files /dev/null and b/public/audio/exterior/autobus_328.wav differ diff --git a/public/audio/exterior/autobus_329.wav b/public/audio/exterior/autobus_329.wav new file mode 100644 index 0000000..71c0f61 Binary files /dev/null and b/public/audio/exterior/autobus_329.wav differ diff --git a/public/audio/exterior/autobus_330.wav b/public/audio/exterior/autobus_330.wav new file mode 100644 index 0000000..4222135 Binary files /dev/null and b/public/audio/exterior/autobus_330.wav differ diff --git a/public/audio/exterior/autobus_331.wav b/public/audio/exterior/autobus_331.wav new file mode 100644 index 0000000..d38cd25 Binary files /dev/null and b/public/audio/exterior/autobus_331.wav differ diff --git a/public/audio/exterior/autobus_332.wav b/public/audio/exterior/autobus_332.wav new file mode 100644 index 0000000..6135016 Binary files /dev/null and b/public/audio/exterior/autobus_332.wav differ diff --git a/public/audio/exterior/autobus_333.wav b/public/audio/exterior/autobus_333.wav new file mode 100644 index 0000000..fa74b44 Binary files /dev/null and b/public/audio/exterior/autobus_333.wav differ diff --git a/public/audio/exterior/autobus_334.wav b/public/audio/exterior/autobus_334.wav new file mode 100644 index 0000000..653ee1b Binary files /dev/null and b/public/audio/exterior/autobus_334.wav differ diff --git a/public/audio/exterior/autobus_400.wav b/public/audio/exterior/autobus_400.wav new file mode 100644 index 0000000..fb78c1d Binary files /dev/null and b/public/audio/exterior/autobus_400.wav differ diff --git a/public/audio/exterior/autobus_401.wav b/public/audio/exterior/autobus_401.wav new file mode 100644 index 0000000..b1f9f2e Binary files /dev/null and b/public/audio/exterior/autobus_401.wav differ diff --git a/public/audio/exterior/autobus_402.wav b/public/audio/exterior/autobus_402.wav new file mode 100644 index 0000000..5d5d4b1 Binary files /dev/null and b/public/audio/exterior/autobus_402.wav differ diff --git a/public/audio/exterior/autobus_403.wav b/public/audio/exterior/autobus_403.wav new file mode 100644 index 0000000..3ce89a1 Binary files /dev/null and b/public/audio/exterior/autobus_403.wav differ diff --git a/public/audio/exterior/autobus_404.wav b/public/audio/exterior/autobus_404.wav new file mode 100644 index 0000000..e64f8ab Binary files /dev/null and b/public/audio/exterior/autobus_404.wav differ diff --git a/public/audio/exterior/autobus_405.wav b/public/audio/exterior/autobus_405.wav new file mode 100644 index 0000000..522dcad Binary files /dev/null and b/public/audio/exterior/autobus_405.wav differ diff --git a/public/audio/exterior/autobus_406.wav b/public/audio/exterior/autobus_406.wav new file mode 100644 index 0000000..d7f25e8 Binary files /dev/null and b/public/audio/exterior/autobus_406.wav differ diff --git a/public/audio/exterior/autobus_407.wav b/public/audio/exterior/autobus_407.wav new file mode 100644 index 0000000..9227204 Binary files /dev/null and b/public/audio/exterior/autobus_407.wav differ diff --git a/public/audio/exterior/autobus_408.wav b/public/audio/exterior/autobus_408.wav new file mode 100644 index 0000000..ea93eb3 Binary files /dev/null and b/public/audio/exterior/autobus_408.wav differ diff --git a/public/audio/exterior/autobus_409.wav b/public/audio/exterior/autobus_409.wav new file mode 100644 index 0000000..6eb59a6 Binary files /dev/null and b/public/audio/exterior/autobus_409.wav differ diff --git a/public/audio/exterior/destino.wav b/public/audio/exterior/destino.wav new file mode 100644 index 0000000..9242f6e Binary files /dev/null and b/public/audio/exterior/destino.wav differ diff --git a/public/audio/exterior/destino_hospital_jrj.wav b/public/audio/exterior/destino_hospital_jrj.wav new file mode 100644 index 0000000..f70766b Binary files /dev/null and b/public/audio/exterior/destino_hospital_jrj.wav differ diff --git a/public/audio/exterior/destino_zafra.wav b/public/audio/exterior/destino_zafra.wav new file mode 100644 index 0000000..1973946 Binary files /dev/null and b/public/audio/exterior/destino_zafra.wav differ diff --git a/public/audio/exterior/linea_L1.wav b/public/audio/exterior/linea_L1.wav new file mode 100644 index 0000000..256027b Binary files /dev/null and b/public/audio/exterior/linea_L1.wav differ diff --git a/public/audio/exterior/linea_L2.wav b/public/audio/exterior/linea_L2.wav new file mode 100644 index 0000000..2b837b7 Binary files /dev/null and b/public/audio/exterior/linea_L2.wav differ diff --git a/public/audio/exterior/zafra.wav b/public/audio/exterior/zafra.wav new file mode 100644 index 0000000..3d34f36 Binary files /dev/null and b/public/audio/exterior/zafra.wav differ diff --git a/public/audio/parada_regulacion.wav b/public/audio/parada_regulacion.wav new file mode 100644 index 0000000..4c65169 Binary files /dev/null and b/public/audio/parada_regulacion.wav differ diff --git a/public/data/exterior.json b/public/data/exterior.json index 6ef35f3..e7e2e0e 100644 --- a/public/data/exterior.json +++ b/public/data/exterior.json @@ -7,6 +7,10 @@ "L2": { "nombre": "Línea 2", "destinos": ["Zafra", "Hospital JRJ"] + }, + "L3": { + "nombre": "Línea 3", + "destinos": ["Zafra", "Orden Baja"] } } } \ No newline at end of file diff --git a/src/main.js b/src/main.js index b2921d7..78cf84c 100644 --- a/src/main.js +++ b/src/main.js @@ -1,118 +1,151 @@ -import '@material/web/all.js'; -import "@fontsource/roboto"; +import 'https://cdn.jsdelivr.net/npm/@material/web/all.js/+esm'; -let dbInt = {}, dbExt = {}; -let audio = null; +let dbInt = {}; +let dbExt = { lineas: {} }; // Base de datos exterior inicializada +let audioActual = null; const get = (id) => document.getElementById(id); +// --- 1. INICIO DEL SISTEMA --- async function init() { try { - const [rI, rE] = await Promise.all([ - fetch('/data/lineas.json'), - fetch('/data/exterior.json') + const [resInt, resExt] = await Promise.all([ + fetch('data/lineas.json'), + fetch('data/exterior.json') ]); - dbInt = await rI.json(); - dbExt = await rE.json(); - - // 1. Rellenar Líneas (Interior y Exterior) - const lineas = Object.keys(dbInt); - const opts = lineas.map(id => `
${id}
`).join(''); - if(get('int-linea')) get('int-linea').innerHTML = opts; - if(get('ext-linea')) get('ext-linea').innerHTML = opts; + if (!resInt.ok || !resExt.ok) throw new Error("Error cargando archivos JSON"); + + dbInt = await resInt.json(); + dbExt = await resExt.json(); - // 2. Generar Coches - let coches = []; - for (let i = 315; i <= 334; i++) coches.push(i); - for (let i = 400; i <= 409; i++) coches.push(i); - if(get('ext-coche')) { - get('ext-coche').innerHTML = coches.map(c => `
${c}
`).join(''); + const lineasHTML = Object.keys(dbInt).map(id => + `
${id}
` + ).join(''); + + if (get('int-linea')) get('int-linea').innerHTML = lineasHTML; + if (get('ext-linea')) get('ext-linea').innerHTML = lineasHTML; + + // Generar números de coche de Huelva (315-334 y 400-409) + const coches = [...Array(20).keys()].map(i => i + 315).concat([...Array(10).keys()].map(i => i + 400)); + if (get('ext-coche')) { + get('ext-coche').innerHTML = coches.map(c => + `
${c}
` + ).join(''); } - } catch (e) { - console.error("Error cargando TsSAEx:", e); - } - - // Quitar Splash - setTimeout(() => { + } catch (err) { + console.error("Error cargando DB:", err); + } finally { const splash = get('loading-screen'); - if(splash) splash.style.opacity = '0'; - setTimeout(() => { - if(splash) splash.style.display = 'none'; - const app = get('app'); - if(app) app.style.display = 'flex'; - }, 500); - }, 2000); + if (splash) { + splash.style.opacity = '0'; + setTimeout(() => { + splash.style.display = 'none'; + get('app').style.display = 'flex'; + }, 500); + } + } } -// REPRODUCTOR -function play(lista, volumen) { - if (audio) { audio.pause(); audio.currentTime = 0; } - if (!lista || lista.length === 0) return; - const file = lista.shift(); - audio = new Audio(`${file}?t=${Date.now()}`); - audio.volume = volumen; - audio.play().catch(() => play(lista, volumen)); - audio.onended = () => play(lista, volumen); +// --- 2. MOTOR DE AUDIO --- +function play(cola, volId = 'vol') { + if (audioActual) { audioActual.pause(); audioActual.currentTime = 0; } + if (!cola || cola.length === 0) return; + + const item = cola.shift(); + audioActual = new Audio(`${item.file}?cb=${Date.now()}`); + + // Usar el slider correspondiente (interior o exterior) + const slider = get(volId); + audioActual.volume = slider ? slider.value : 0.8; + + audioActual.play().catch(e => console.warn("Audio no encontrado:", item.file)); + audioActual.onended = () => setTimeout(() => play(cola, volId), item.gap || 400); } -// --- EVENTO CLAVE: CAMBIO DE LÍNEA INTERIOR --- +// --- 3. EVENTOS PANEL INTERIOR --- get('int-linea')?.addEventListener('change', (e) => { - const lineaSeleccionada = e.target.value; - const paradas = dbInt[lineaSeleccionada] || []; - const selectorParadas = get('int-parada'); - - if (selectorParadas) { - // Insertar nuevas paradas - selectorParadas.innerHTML = paradas.map(p => + const linea = dbInt[e.target.value]; + const selParada = get('int-parada'); + if (linea && selParada) { + selParada.innerHTML = linea.paradas.map(p => `
${p.nombre}
` ).join(''); - - // IMPORTANTE: Resetear valor y habilitar - selectorParadas.value = ""; - selectorParadas.disabled = false; + selParada.disabled = false; + selParada.value = ""; } + get('container-regulacion').style.display = 'none'; +}); + +get('int-parada')?.addEventListener('change', (e) => { + const paradasReg = ['zafra', 'orden_baja', 'hospital_jrj']; + const esReg = paradasReg.includes(e.target.value); + get('container-regulacion').style.display = esReg ? 'flex' : 'none'; + if (!esReg) get('chk-regulacion').checked = false; }); -// BOTÓN ANUNCIAR get('btn-int')?.addEventListener('click', () => { - const lineaId = get('int-linea').value; - const paradaId = get('int-parada').value; - const tipo = document.querySelector('md-radio[name="tipo"][checked]')?.value || "actual"; - - if(!lineaId || !paradaId) return alert("Selecciona línea y parada"); + const lId = get('int-linea').value, pId = get('int-parada').value; + if (!lId || !pId) return; - const p = dbInt[lineaId]?.find(x => x.id === paradaId); - if (!p) return; + const paradaData = dbInt[lId].paradas.find(p => p.id === pId); + const tipo = document.querySelector('md-radio[value="siguiente"]')?.checked ? "siguiente" : "actual"; - let cola = [`/audio/parada_${tipo}.wav`, `/audio/${p.id}.wav` ]; - if (p.enlaces?.length > 0) { - cola.push(`/audio/correspondencia.wav`); - p.enlaces.includes("todas") ? cola.push(`/audio/todas_las_lineas.wav`) : p.enlaces.forEach(e => cola.push(`/audio/linea_${e}.wav`)); + let cola = [ + { file: `audio/parada_${tipo}.wav`, gap: 400 }, + { file: `audio/${pId}.wav`, gap: 600 } + ]; + + if (paradaData.enlaces?.length > 0) { + const enlaces = paradaData.enlaces.filter(en => en.trim() !== ""); + if (enlaces.includes("todas")) { + cola.push({ file: `audio/correspondencia_todas_las_lineas.wav`, gap: 400 }); + } else if (enlaces.length > 0) { + cola.push({ file: `audio/${enlaces.length === 1 ? 'correspondencia_linea' : 'correspondencia_lineas'}.wav`, gap: 300 }); + enlaces.forEach(en => cola.push({ file: `audio/linea_${en}.wav`, gap: 300 })); + } } - play(cola, get('vol').value); + + if (get('chk-regulacion')?.checked) cola.push({ file: `audio/parada_regulacion.wav`, gap: 400 }); + play(cola, 'vol'); }); -// LOGICA EXTERIOR (POPUP) +// --- 4. LÓGICA EXTERIOR (RESTAURADA) --- get('btn-abrir-exterior').onclick = () => get('dialog-exterior').show(); get('ext-linea')?.addEventListener('change', (e) => { - const d = dbExt.lineas[e.target.value]?.destinos || []; - get('ext-destino').innerHTML = d.map(x => `
${x}
`).join(''); - get('ext-destino').disabled = false; + const lineaId = e.target.value; + const destinos = dbExt.lineas[lineaId]?.destinos || []; + const selDest = get('ext-destino'); + if (selDest) { + selDest.innerHTML = destinos.map(d => `
${d}
`).join(''); + selDest.disabled = false; + } }); -get('btn-reproducir-ext').onclick = () => { - const c = get('ext-coche').value, l = get('ext-linea').value, d = get('ext-destino').value; - if (!c || !l || !d) return; - const destFile = d.toLowerCase().replace(/ /g, "_"); - play(['/audio/linea.wav', `/audio/${l}.wav`, '/audio/autobus.wav', `/audio/${c}.wav`, '/audio/destino.wav', `/audio/${destFile}.wav`], get('vol-ext').value); -}; +get('btn-reproducir-ext')?.addEventListener('click', () => { + const linea = get('ext-linea').value; + const destino = get('ext-destino').value; + const coche = get('ext-coche').value; -// BOTONES ESPECIALES -get('btn-colision').onclick = () => play(['/audio/colision.wav'], get('vol').value); -get('btn-hora').onclick = () => play(['/audio/hora_salida.wav'], get('vol').value); -get('btn-saldo').onclick = () => play(['/audio/atencion_saldo.wav'], get('vol').value); -get('btn-insuficiente').onclick = () => play(['/audio/saldo_insuficiente.wav'], get('vol').value); + if (!linea || !destino || !coche) return; + + const destFile = destino.toLowerCase().replace(/ /g, "_"); + + // Cola exterior: Línea X -> Autobús XXX -> Destino YYY + const colaExt = [ + { file: `audio/exterior/linea_${linea}.wav`, gap: 300 }, + { file: `audio/exterior/autobus_${coche}.wav`, gap: 500 }, + { file: `audio/exterior/destino_${destFile}.wav`, gap: 300 } + ]; + + play(colaExt, 'vol-ext'); +}); + +// --- 5. ESPECIALES --- +get('btn-colision').onclick = () => play([{ file: `audio/colision.wav` }]); +get('btn-hora').onclick = () => play([{ file: `audio/hora_salida.wav` }]); +get('btn-saldo').onclick = () => play([{ file: `audio/atencion_saldo.wav` }]); +get('btn-insuficiente').onclick = () => play([{ file: `audio/saldo_insuficiente.wav` }]); init(); \ No newline at end of file diff --git a/src/style.css b/src/style.css index e7bd88e..d8847bb 100644 --- a/src/style.css +++ b/src/style.css @@ -110,6 +110,22 @@ md-icon { font-family: 'Material Symbols Outlined' !important; } } .radio-container label { display: flex; align-items: center; gap: 12px; cursor: pointer; } +/* --- ESTILOS REGULACIÓN --- */ +#container-regulacion { + /* display: none; El JS lo cambia a flex */ + background: rgba(109, 94, 0, 0.08); /* Uso del color primary con baja opacidad */ + padding: 12px 16px; + border-radius: 20px; + border: 1px dashed var(--md-sys-color-primary); + animation: slideIn 0.3s ease-out; +} + +@keyframes slideIn { + from { opacity: 0; transform: translateY(-10px); } + to { opacity: 1; transform: translateY(0); } +} + +/* --- BOTONES Y ESPECIALES --- */ .button-grid-specials { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; } .danger-btn { --md-filled-tonal-button-container-color: var(--md-sys-color-error-container); }