otros:contacto
Diferencias
Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
| otros:contacto [2026/05/06 10:22] – jesus | otros:contacto [2026/05/06 17:39] (actual) – jesus | ||
|---|---|---|---|
| Línea 2: | Línea 2: | ||
| < | < | ||
| < | < | ||
| - | .pcw-page-container { background:# | + | .pcw-page-container { background:# |
| | | ||
| - | /* --- MODEM AMSTRAD | + | /* --- HARDWARE |
| .modem-chassis { | .modem-chassis { | ||
| - | background: #1a1a1a; /* Gris muy oscuro en lugar de negro puro */ | + | background: #1a1a1a; |
| - | width: | + | width: 95%; /* Ancho flexible para móvil |
| - | margin: 0 auto 35px; | + | |
| - | | + | margin: 0 auto 35px; border-radius: |
| - | | + | border: 1.5px solid #333; border-top: 2px solid #444; |
| - | | + | box-shadow: 0 0 1px rgba(255, |
| - | + | display: flex; align-items: | |
| - | /* Efecto de contorno para destacar sobre negro */ | + | |
| - | border: 1.5px solid #333; | + | } |
| - | | + | |
| - | + | .sch-brand-white { | |
| - | /* Sombra y resplandor para dar volumen */ | + | color: #ffffff; font-family: |
| - | box-shadow: | + | font-size: 13px; letter-spacing: |
| - | | + | |
| - | | + | |
| - | 0 0 20px rgba(0, | + | |
| - | + | ||
| - | display: flex; | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| } | } | ||
| - | /* Embellecedor frontal para los LEDs */ | ||
| .led-bezel { | .led-bezel { | ||
| - | background: #0a0a0a; | + | background: #0a0a0a; padding: |
| - | | + | display: flex; gap: 10px; box-shadow: inset 0 2px 5px rgba(0, |
| - | | + | |
| - | | + | |
| - | display: flex; | + | |
| - | | + | |
| - | | + | |
| } | } | ||
| - | | + | .m-led { width: |
| - | color: #ffffff; | + | .m-led span { position: absolute; top: 14px; left: 50%; transform: translateX(-50%); |
| - | font-family: | + | |
| - | font-weight: | + | |
| - | font-size: 15px; | + | |
| - | letter-spacing: | + | |
| - | white-space: | + | |
| - | text-shadow: | + | |
| - | } | + | |
| - | + | ||
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | .m-led span { | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | letter-spacing: | + | |
| - | | + | |
| | | ||
| - | | + | .led-red { background:# |
| - | | + | .led-green { background:# |
| - | .led-green { background:# | + | .led-yellow { background:# |
| - | .led-yellow { background:# | + | |
| - | /* BOTÓN POWER CON RELIEVE */ | ||
| .pwr-btn { | .pwr-btn { | ||
| - | width: | + | width: |
| - | | + | border-radius: |
| - | | + | |
| - | | + | |
| - | border-radius: | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| } | } | ||
| @keyframes pwr-blink { 50% { border-color:# | @keyframes pwr-blink { 50% { border-color:# | ||
| .active-btn { animation: | .active-btn { animation: | ||
| - | /* --- PANTALLA | + | /* --- TERMINAL --- */ |
| - | .contact-box { | + | .contact-box { |
| - | border: 2px solid # | + | border: 2px solid #004400; padding: |
| - | | + | background: rgba(0, |
| - | background: rgba(0, | + | |
| - | | + | |
| - | position: relative; | + | |
| - | | + | |
| - | | + | |
| } | } | ||
| - | .line-in { margin-bottom: | + | .line-in { opacity: 0; transform: translateX(-5px); transition: 0.2s; display: inline; line-height: 1.6; font-size: 14px; } |
| + | .block-line { display: block; margin-bottom: 12px; } | ||
| .line-visible { opacity: 1 !important; transform: translateX(0) !important; } | .line-visible { opacity: 1 !important; transform: translateX(0) !important; } | ||
| | | ||
| - | .email-link { | + | .email-link { |
| - | color: #fff !important; | + | color: #fff !important; font-size: 1.2em; text-decoration: |
| - | | + | font-weight: |
| - | | + | display: inline-block; |
| - | font-weight: | + | text-shadow: |
| - | | + | } |
| - | | + | |
| - | display: inline-block; | + | /* AJUSTE PARA PANTALLAS MUY PEQUEÑAS */ |
| - | | + | @media (max-width: 400px) { |
| - | text-shadow: | + | |
| - | | + | |
| - | | + | .m-led { width: 8px; height: 8px; } |
| + | .pwr-btn { width: 35px; } | ||
| } | } | ||
| - | .email-link: | ||
| </ | </ | ||
| <div class=" | <div class=" | ||
| - | | ||
| - | <!-- MODEM HARDWARE REDISEÑADO --> | ||
| <div class=" | <div class=" | ||
| - | <div class=" | + | <div class=" |
| - | | + | |
| <div class=" | <div class=" | ||
| <div id=" | <div id=" | ||
| Línea 130: | Línea 76: | ||
| <div id=" | <div id=" | ||
| </ | </ | ||
| - | + | | |
| - | | + | |
| - | </ | + | |
| - | + | ||
| - | <div id=" | + | |
| - | <div id=" | + | |
| </ | </ | ||
| + | <div id=" | ||
| </ | </ | ||
| Línea 142: | Línea 84: | ||
| let aCtx = null; | let aCtx = null; | ||
| let currentLine = 0; | let currentLine = 0; | ||
| + | let isBooting = false; | ||
| + | let isFinished = false; | ||
| + | let abortComm = false; | ||
| const content = [ | const content = [ | ||
| - | {t: " | + | {t: " |
| - | | + | {t: " |
| - | | + | {t: " |
| - | {t: " | + | {t: " |
| - | | + | {t: " ", s: " |
| - | {t: " | + | {t: "Si has detectado una anomalía en los datos, |
| - | {t: " | + | {t: "posees software que no figura en nuestros registros |
| - | {t: " ", s: " | + | {t: "o quieres aportar documentación histórica para su preservación, |
| - | {t: "Si has detectado una anomalía en los datos, posees software que no figura en nuestros registros o quieres aportar documentación histórica para su preservación, | + | {t: "el sistema está listo para recibir tu transmisión.", |
| - | {t: " ", s: " | + | {t: " ", s: " |
| - | {t: "<a href=' | + | {t: "<a href=' |
| - | {t: " ", s: " | + | {t: " ", s: " |
| - | {t: "NO CARRIER / UPLINK TERMINATED", s: " | + | {t: "NO CARRIER / SESSION END", s: " |
| ]; | ]; | ||
| - | function initAudio() { | + | function initAudio() { if(!aCtx) aCtx = new (window.AudioContext || window.webkitAudioContext)(); } |
| - | | + | |
| + | function playDTMF(digit, | ||
| + | if(abortComm) return; | ||
| + | const freqs = { | ||
| + | ' | ||
| + | ' | ||
| + | }; | ||
| + | const f = freqs[digit] || [0,0]; | ||
| + | f.forEach(hz => { | ||
| + | let o = aCtx.createOscillator(); | ||
| + | o.frequency.value = hz; g.gain.setValueAtTime(0.02, | ||
| + | g.gain.exponentialRampToValueAtTime(0.001, | ||
| + | o.connect(g); | ||
| + | }); | ||
| } | } | ||
| - | function | + | function |
| - | let osc = aCtx.createOscillator(); | + | if(abortComm || !aCtx) return; |
| - | | + | let now = aCtx.currentTime; |
| - | osc.type = ' | + | let osc = aCtx.createOscillator(); |
| - | osc.frequency.setValueAtTime(1500 + Math.random() * 500, aCtx.currentTime); | + | osc.type = ' |
| - | g.gain.setValueAtTime(0.015, aCtx.currentTime); | + | osc.frequency.setValueAtTime(baseFreq, now); |
| - | g.gain.exponentialRampToValueAtTime(0.001, | + | osc.frequency.linearRampToValueAtTime(baseFreq |
| + | g.gain.setValueAtTime(gainVal, now); | ||
| + | g.gain.exponentialRampToValueAtTime(0.001, | ||
| osc.connect(g); | osc.connect(g); | ||
| - | osc.start(); | + | osc.start(); |
| } | } | ||
| - | function | + | async function |
| - | let osc = aCtx.createOscillator(); | + | let endTime |
| - | | + | |
| - | osc.type = 'sawtooth'; | + | |
| - | osc.frequency.setValueAtTime(900, aCtx.currentTime); | + | |
| - | | + | await new Promise(r => setTimeout(r, 75)); |
| - | | + | document.getElementById(' |
| - | osc.connect(g); g.connect(aCtx.destination); | + | |
| - | osc.start(); osc.stop(aCtx.currentTime + 0.12); | + | |
| + | playModemChirp(0.04, 2400, 0.012); | ||
| + | await new Promise(r => setTimeout(r, | ||
| + | | ||
| + | } | ||
| + | await new Promise(r => setTimeout(r, | ||
| + | } | ||
| } | } | ||
| - | function | + | function |
| - | initAudio(); | + | initAudio(); if(aCtx.state === ' |
| let now = aCtx.currentTime; | let now = aCtx.currentTime; | ||
| - | | + | |
| - | let g = aCtx.createGain(); | + | |
| - | carrier.frequency.setValueAtTime(2100, | + | |
| - | g.gain.setValueAtTime(0, | + | |
| - | g.gain.linearRampToValueAtTime(0.03, | + | |
| - | carrier.connect(g); | + | |
| - | carrier.start(now); | + | |
| - | } | + | |
| - | + | ||
| - | function bootModem() { | + | |
| - | const pwr = document.getElementById(' | + | |
| - | if(pwr.classList.contains(' | + | |
| - | pwr.classList.add(' | + | |
| document.getElementById(' | document.getElementById(' | ||
| - | playHandshake(); | ||
| | | ||
| + | let dt1 = aCtx.createOscillator(); | ||
| + | dt1.frequency.value = 350; dt2.frequency.value = 440; dg.gain.setValueAtTime(0.015, | ||
| + | dg.gain.exponentialRampToValueAtTime(0.001, | ||
| + | dt1.connect(dg); | ||
| + | dt1.start(now); | ||
| + | |||
| + | " | ||
| + | |||
| + | let car = aCtx.createOscillator(); | ||
| + | car.frequency.value = 2100; cg.gain.setValueAtTime(0, | ||
| + | cg.gain.linearRampToValueAtTime(0.03, | ||
| + | cg.gain.exponentialRampToValueAtTime(0.001, | ||
| + | car.connect(cg); | ||
| + | car.start(now + 3); car.stop(now + 5.5); | ||
| + | |||
| setTimeout(() => { | setTimeout(() => { | ||
| + | if(abortComm) return; | ||
| document.getElementById(' | document.getElementById(' | ||
| document.getElementById(' | document.getElementById(' | ||
| processTransmission(); | processTransmission(); | ||
| - | }, 2200); | + | }, 6000); |
| + | } | ||
| + | |||
| + | function handlePowerClick() { | ||
| + | const btn = document.getElementById(' | ||
| + | if (isFinished) { | ||
| + | document.getElementById(' | ||
| + | currentLine = 0; isFinished = false; | ||
| + | [' | ||
| + | startConnectionSequence(); | ||
| + | } else if (isBooting || document.getElementById(' | ||
| + | abortComm = true; isBooting = false; isFinished = false; | ||
| + | btn.classList.remove(' | ||
| + | document.getElementById(' | ||
| + | document.getElementById(' | ||
| + | currentLine = 0; | ||
| + | [' | ||
| + | } else { | ||
| + | isBooting = true; btn.classList.add(' | ||
| + | startConnectionSequence(); | ||
| + | } | ||
| } | } | ||
| async function processTransmission() { | async function processTransmission() { | ||
| - | if (currentLine < content.length) { | + | if (currentLine < content.length |
| const out = document.getElementById(' | const out = document.getElementById(' | ||
| const lineData = content[currentLine]; | const lineData = content[currentLine]; | ||
| - | const lineDiv | + | const lineSpan |
| - | | + | |
| | | ||
| - | if(lineData.s === " | + | if(lineData.s === " |
| - | else if(lineData.s === " | + | else if(lineData.s === " |
| - | else lineDiv.innerHTML = lineData.t; | + | else lineSpan.innerHTML = lineData.t; |
| - | out.appendChild(lineDiv); | + | |
| - | + | out.appendChild(lineSpan); | |
| - | | + | |
| - | playRxNoise(); | + | await simulatePacket(trafficTime); |
| - | await new Promise(r => setTimeout(r, | + | |
| - | | + | |
| - | + | | |
| - | lineDiv.classList.add(' | + | await new Promise(r => setTimeout(r, |
| - | + | | |
| - | await new Promise(r => setTimeout(r, | + | |
| - | document.getElementById(' | + | } else if (!abortComm) { |
| - | | + | |
| - | | + | |
| - | | + | |
| - | + | ||
| - | | + | |
| - | setTimeout(processTransmission, | + | |
| - | } else { | + | |
| document.getElementById(' | document.getElementById(' | ||
| } | } | ||
| Línea 244: | Línea 227: | ||
| </ | </ | ||
| </ | </ | ||
| + | |||
otros/contacto.1778062966.txt.gz · Última modificación: por jesus
