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 @@
-
+
+
+
+
+
+
+
+
Anunciar Parada
- 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 @@
-
+
@@ -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); }