Herramientas de usuario

Herramientas del sitio


otros:contacto

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
otros:contacto [2026/05/06 10:22] jesusotros:contacto [2026/05/06 17:39] (actual) jesus
Línea 2: Línea 2:
 <html> <html>
 <style> <style>
-  .pcw-page-container { background:#000b00; font-family:'Courier New', monospace; padding:20px; color:#00ff00; }+  .pcw-page-container { background:#000b00; font-family:'Courier New', monospace; padding:10px; color:#00ff00; }
      
-  /* --- MODEM AMSTRAD HARDWARE REDISEÑADO --- */+  /* --- HARDWARE MODEM PCWWIKI (RESPONSIVE) --- */
   .modem-chassis {   .modem-chassis {
-    background: #1a1a1a; /* Gris muy oscuro en lugar de negro puro */ +    background: #1a1a1a;  
-    width: 420px;  +    width: 95%; /* Ancho flexible para móvil */ 
-    margin: 0 auto 35px;  +    max-width: 440px/* Límite para PC */ 
-    border-radius: 6px;  +    margin: 0 auto 35px; border-radius: 6px; padding: 15px; position: relative; 
-    padding: 18px; +    border: 1.5px solid #333; border-top: 2px solid #444; 
-    position: relative; +    box-shadow: 0 0 1px rgba(255,255,255,0.1), 0 15px 40px rgba(0,0,0,0.9); 
-     +    display: flex; align-items: center; justify-content: space-between; gap: 10px
-    /* Efecto de contorno para destacar sobre negro */ +    box-sizingborder-box; /* Evita que el padding rompa el ancho */ 
-    border: 1.5px solid #333;  +  } 
-    border-top: 2px solid #444; /* Brillo superior */ +   
-     +  .sch-brand-white {  
-    /* Sombra y resplandor para dar volumen */ +    color: #ffffff; font-family: Arial, sans-serif; font-weight: 900;  
-    box-shadow:  +    font-size: 13px; letter-spacing: 1px; white-space: nowrap;
-      0 0 1px rgba(255,255,255,0.1), /* Perfilado luz */ +
-      0 15px 40px rgba(0,0,0,0.9),    /* Sombra base */ +
-      0 0 20px rgba(0,255,0,0.03);    /* Sutil reflejo de la pantalla */ +
- +
-    display: flex;  +
-    align-items: center;  +
-    justify-content: space-between;  +
-    gap15px;+
   }   }
  
-  /* Embellecedor frontal para los LEDs */ 
   .led-bezel {   .led-bezel {
-    background: #0a0a0a; +    background: #0a0a0a; padding: 6px 10px; border-radius: 4px; border: 1px solid #222; 
-    padding: 8px 12px; +    display: flex; gap: 10px; box-shadow: inset 0 2px 5px rgba(0,0,0,0.5);
-    border-radius: 4px; +
-    border: 1px solid #222; +
-    display: flex; +
-    gap: 12px; +
-    box-shadow: inset 0 2px 5px rgba(0,0,0,0.5);+
   }   }
  
-  .sch-brand-white {  +  .m-led { width: 10px; height: 10px; background: #200; border-radius: 50%; position: relative; border: 1px solid rgba(255,255,255,0.05);
-    color: #ffffff;  +  .m-led span { position: absolute; top: 14px; left: 50%; transform: translateX(-50%); font-size: 7px; color: #777; font-weight: bold; }
-    font-family: Arial, sans-serif;  +
-    font-weight: 900;  +
-    font-size: 15px;  +
-    letter-spacing: 1.5px;  +
-    white-space: nowrap; +
-    text-shadow: 1px 1px 2px rgba(0,0,0,0.8); +
-  } +
- +
-  .m-led {  +
-    width: 11px +
-    height: 11px +
-    background: #200;  +
-    border-radius: 50%;  +
-    position: relative;  +
-    border: 1px solid rgba(255,255,255,0.05); +
-  } +
-   +
-  .m-led span {  +
-    position: absolute;  +
-    top: 14px;  +
-    left: 50%;  +
-    transform: translateX(-50%);  +
-    font-size: 7px;  +
-    color: #777;  +
-    font-weight: bold;  +
-    letter-spacing: 0.5px; +
-  }+
      
-  /* COLORES LED */ +  .led-red { background:#f00 !important; box-shadow: 0 0 10px #f00; } 
-  .led-red { background:#f00 !important; box-shadow: 0 0 10px #f00, inset -1px -1px 3px rgba(0,0,0,0.5); } +  .led-green { background:#0f0 !important; box-shadow: 0 0 10px #0f0; } 
-  .led-green { background:#0f0 !important; box-shadow: 0 0 10px #0f0, inset -1px -1px 3px rgba(0,0,0,0.5); } +  .led-yellow { background:#ff0 !important; box-shadow: 0 0 10px #ff0; }
-  .led-yellow { background:#ff0 !important; box-shadow: 0 0 10px #ff0, inset -1px -1px 3px rgba(0,0,0,0.5); }+
  
-  /* BOTÓN POWER CON RELIEVE */ 
   .pwr-btn {    .pwr-btn { 
-    width: 42px +    width: 40px; height: 22px; background: #2a2a2a; border: 2px solid #444;  
-    height: 22px;  +    border-radius: 4px; cursor: pointer; animation: pwr-blink 1.2s infinite;  
-    background: #2a2a2a;  +    outline: none; flex-shrink: 0; /* Evita que el botón se aplaste */
-    border: 2px solid #444;  +
-    border-radius: 4px;  +
-    cursor: pointer;  +
-    animation: pwr-blink 1.2s infinite;  +
-    box-shadow: 0 2px 0 #111;+
   }   }
   @keyframes pwr-blink { 50% { border-color:#0f0; box-shadow: 0 0 12px rgba(0,255,0,0.4); } }   @keyframes pwr-blink { 50% { border-color:#0f0; box-shadow: 0 0 12px rgba(0,255,0,0.4); } }
   .active-btn { animation:none !important; border-color:#0f0 !important; background:#040 !important; box-shadow: inset 0 2px 5px rgba(0,0,0,0.5) !important; }   .active-btn { animation:none !important; border-color:#0f0 !important; background:#040 !important; box-shadow: inset 0 2px 5px rgba(0,0,0,0.5) !important; }
  
-  /* --- PANTALLA TERMINAL CRT --- */ +  /* --- TERMINAL --- */ 
-  .contact-box { +  .contact-box {  
-    border: 2px solid #004400;  +    border: 2px solid #004400; padding: 20px;  
-    padding: 35px;  +    background: rgba(0,10,0,0.9); min-height: 400px; display: none;  
-    background: rgba(0,10,0,0.9); +    word-wrapbreak-word/* Para que el texto no se salga en móvil */
-    min-height: 450px +
-    position: relative;  +
-    display: none; +
-    box-shadowinset 0 0 40px rgba(0,255,0,0.05), 0 0 15px rgba(0,255,0,0.1);+
   }   }
-  .line-in { margin-bottom: 14px; line-height: 1.6; opacity: 0; transform: translateX(-10px); transition: 0.3stext-alignjustify; }+  .line-in { opacity: 0; transform: translateX(-5px); transition: 0.2sdisplay: inline; line-height: 1.6; font-size: 14px; } 
 +  .block-line { display: block; margin-bottom12px; }
   .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: none;  
-    font-size: 1.6em +    font-weight: bold; padding: 10px 15px; border: 1px solid #0f0;  
-    text-decoration: none;  +    display: inline-block; background: rgba(0,255,0,0.1);  
-    font-weight: bold; +    text-shadow: 0 0 10px #0f0; margin-top: 15px; max-width: 100%; box-sizing: border-box; 
-    padding: 12px 25px +  } 
-    border: 1px solid #0f0;  + 
-    display: inline-block;  +  /* AJUSTE PARA PANTALLAS MUY PEQUEÑAS */ 
-    background: rgba(0,255,0,0.1); +  @media (max-width: 400px) { 
-    text-shadow: 0 0 10px #0f0;  +    .sch-brand-white { font-size11px; } 
-    margin-top: 15px;  +    .led-bezel { gap: 6px; padding: 5px 8px; } 
-    transition0.3s;+    .m-led { width: 8px; height: 8px; } 
 +    .pwr-btn { width: 35px}
   }   }
-  .email-link:hover { background: #0f0; color: #000 !important; } 
 </style> </style>
  
 <div class="pcw-page-container"> <div class="pcw-page-container">
-   
-  <!-- MODEM HARDWARE REDISEÑADO --> 
   <div class="modem-chassis">   <div class="modem-chassis">
-    <div class="sch-brand-white">AMSTRAD <span style="font-weight:100; font-size:9px; color:#aaa;">TELECOMS</span></div> +    <div class="sch-brand-white">PCWWIKI <span style="font-weight:100; font-size:8px; color:#aaa;">TELECOMS</span></div>
-    +
     <div class="led-bezel">     <div class="led-bezel">
       <div id="mr" class="m-led"><span>MR</span></div>       <div id="mr" class="m-led"><span>MR</span></div>
Línea 130: Línea 76:
       <div id="sd" class="m-led"><span>SD</span></div>       <div id="sd" class="m-led"><span>SD</span></div>
     </div>     </div>
- +    <button id="pwr" class="pwr-btn" onclick="handlePowerClick()" title="POWER / RESET"></button>
-    <button id="pwr" class="pwr-btn" onclick="bootModem()" title="POWER ON"></button+
-  </div> +
- +
-  <div id="terminal" class="contact-box"> +
-    <div id="output"></div>+
   </div>   </div>
 +  <div id="terminal" class="contact-box"><div id="output"></div></div>
 </div> </div>
  
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: "ATZ", s: "cmd"}, +  {t: "ATZ", s: "cmd", b: true}, {t: "OK", s: "status", b: true}, {t: "ATDT 914002800", s: "cmd", b: true}, 
-  {t: "OK", s: "status"}, +  {t: "CONNECT 2400/V.22bis", s: "status", b: true}, {t: "--- INCOMING DATA STREAM ---", s: "status", b: true}, 
-  {t: "ATDT 914002800...", s: "cmd"}, +  {t: "CARGANDO PROTOCOLO DE PRESERVACIÓN PCWWiki...", s: "text", b: true}, 
-  {t: "CONNECT 2400 / V.22BIS / LAP-M", s: "status"}, +  {t: "ID_SISTEMA: Z80-PCW (MADRID/STOCKPORT)", s: "text", b: true}, 
-  {t: "--- INCOMING DATA STREAM FROM PCWWiki ---", s: "status"}, +  {t: " ", s: "text", b: true}, 
-  {t: "CARGANDO PROTOCOLO DE PRESERVACIÓN HISTÓRICA...", s: "text"}, +  {t: "Si has detectado una anomalía en los datos, ", s: "text", b: false}, 
-  {t: "ID_SISTEMA: Z80-PCW (MADRID/STOCKPORT)", s: "text"}, +  {t: "posees software que no figura en nuestros registros ", s: "text", b: false}, 
-  {t: " ", s: "text"}, +  {t: "o quieres aportar documentación histórica para su preservación, ", s: "text", b: false}, 
-  {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, el sistema está listo para recibir tu transmisión.", s: "text"}, +  {t: "el sistema está listo para recibir tu transmisión.", s: "text", b: false}, 
-  {t: " ", s: "text"}, +  {t: " ", s: "text", b: true}, 
-  {t: "<a href='mailto:[email protected]' class='email-link'>📧 [email protected]</a>", s: "html"}, +  {t: "<a href='mailto:[email protected]' class='email-link'>📧 [email protected]</a>", s: "html", b: true}, 
-  {t: " ", s: "text"}, +  {t: " ", s: "text", b: true}, 
-  {t: "NO CARRIER / UPLINK TERMINATED", s: "status"}+  {t: "NO CARRIER / SESSION END", s: "status", b: true}
 ]; ];
  
-function initAudio() { +function initAudio() { if(!aCtx) aCtx = new (window.AudioContext || window.webkitAudioContext)(); } 
-    if(!aCtx) aCtx = new (window.AudioContext || window.webkitAudioContext)();+ 
 +function playDTMF(digit, start) { 
 +    if(abortComm) return; 
 +    const freqs = { 
 +        '9': [852, 1477], '1': [697, 1209], '4': [770, 1209],  
 +        '0': [941, 1336], '2': [697, 1336], '8': [852, 1336] 
 +    }; 
 +    const f = freqs[digit] || [0,0]; 
 +    f.forEach(hz => { 
 +        let o = aCtx.createOscillator(); let g = aCtx.createGain(); 
 +        o.frequency.value = hz; g.gain.setValueAtTime(0.02, start); 
 +        g.gain.exponentialRampToValueAtTime(0.001, start + 0.1); 
 +        o.connect(g); g.connect(aCtx.destination); o.start(start); o.stop(start + 0.1); 
 +    });
 } }
  
-function playRxNoise() { +function playModemChirp(dur, baseFreq, gainVal) { 
-    let osc = aCtx.createOscillator(); +    if(abortComm || !aCtx) return; 
-    let g = aCtx.createGain(); +    let now = aCtx.currentTime; 
-    osc.type = 'square'; +    let osc = aCtx.createOscillator(); let g = aCtx.createGain(); 
-    osc.frequency.setValueAtTime(1500 + Math.random(500, aCtx.currentTime); +    osc.type = 'square';  
-    g.gain.setValueAtTime(0.015aCtx.currentTime); +    osc.frequency.setValueAtTime(baseFreq, now); 
-    g.gain.exponentialRampToValueAtTime(0.001, aCtx.currentTime 0.25);+    osc.frequency.linearRampToValueAtTime(baseFreq 1.1, now + dur); 
 +    g.gain.setValueAtTime(gainValnow); 
 +    g.gain.exponentialRampToValueAtTime(0.001, now dur);
     osc.connect(g); g.connect(aCtx.destination);     osc.connect(g); g.connect(aCtx.destination);
-    osc.start(); osc.stop(aCtx.currentTime 0.25);+    osc.start(); osc.stop(now dur);
 } }
  
-function playTxNoise() { +async function simulatePacket(duration) { 
-    let osc aCtx.createOscillator(); +    let endTime Date.now() + duration
-    let g = aCtx.createGain(); +    while(Date.now() < endTime && !abortComm) { 
-    osc.type = 'sawtooth'+        document.getElementById('rd').classList.add('led-yellow'); 
-    osc.frequency.setValueAtTime(900, aCtx.currentTime); +        playModemChirp(0.061200, 0.015); 
-    g.gain.setValueAtTime(0.01aCtx.currentTime); +        await new Promise(r => setTimeout(r75)); 
-    g.gain.linearRampToValueAtTime(0aCtx.currentTime + 0.12); +        document.getElementById('rd').classList.remove('led-yellow'); 
-    osc.connect(g); g.connect(aCtx.destination); +        if(Math.random() > 0.65) { 
-    osc.start(); osc.stop(aCtx.currentTime + 0.12);+           document.getElementById('sd').classList.add('led-green'); 
 +           playModemChirp(0.04, 2400, 0.012); 
 +           await new Promise(r => setTimeout(r, 45)); 
 +           document.getElementById('sd').classList.remove('led-green'); 
 +        } 
 +        await new Promise(r => setTimeout(r, 35)); 
 +    }
 } }
  
-function playHandshake() { +function startConnectionSequence() { 
-    initAudio();+    initAudio(); if(aCtx.state === 'suspended') aCtx.resume();
     let now = aCtx.currentTime;     let now = aCtx.currentTime;
-    let carrier aCtx.createOscillator(); +    abortComm false;
-    let g = aCtx.createGain(); +
-    carrier.frequency.setValueAtTime(2100, now); +
-    g.gain.setValueAtTime(0, now); +
-    g.gain.linearRampToValueAtTime(0.03, now + 0.1); +
-    carrier.connect(g); g.connect(aCtx.destination); +
-    carrier.start(now); carrier.stop(now + 2); +
-+
- +
-function bootModem() { +
-    const pwr = document.getElementById('pwr'); +
-    if(pwr.classList.contains('active-btn')) return; +
-    pwr.classList.add('active-btn');+
     document.getElementById('mr').classList.add('led-red');     document.getElementById('mr').classList.add('led-red');
-    playHandshake(); 
          
 +    let dt1 = aCtx.createOscillator(); let dt2 = aCtx.createOscillator(); let dg = aCtx.createGain();
 +    dt1.frequency.value = 350; dt2.frequency.value = 440; dg.gain.setValueAtTime(0.015, now);
 +    dg.gain.exponentialRampToValueAtTime(0.001, now + 1);
 +    dt1.connect(dg); dt2.connect(dg); dg.connect(aCtx.destination);
 +    dt1.start(now); dt2.start(now); dt1.stop(now + 1); dt2.stop(now + 1);
 +
 +    "914002800".split('').forEach((d, i) => playDTMF(d, now + 1.2 + (i * 0.16)));
 +
 +    let car = aCtx.createOscillator(); let cg = aCtx.createGain();
 +    car.frequency.value = 2100; cg.gain.setValueAtTime(0, now + 3);
 +    cg.gain.linearRampToValueAtTime(0.03, now + 3.1);
 +    cg.gain.exponentialRampToValueAtTime(0.001, now + 5.5);
 +    car.connect(cg); cg.connect(aCtx.destination);
 +    car.start(now + 3); car.stop(now + 5.5);
 +
     setTimeout(() => {     setTimeout(() => {
 +        if(abortComm) return;
         document.getElementById('oh').classList.add('led-red');         document.getElementById('oh').classList.add('led-red');
         document.getElementById('terminal').style.display = 'block';         document.getElementById('terminal').style.display = 'block';
         processTransmission();         processTransmission();
-    }, 2200);+    }, 6000); 
 +
 + 
 +function handlePowerClick() { 
 +    const btn = document.getElementById('pwr'); 
 +    if (isFinished) { 
 +        document.getElementById('output').innerHTML = ''; 
 +        currentLine = 0; isFinished = false; 
 +        ['oh','rd','sd'].forEach(id => document.getElementById(id).className = 'm-led'); 
 +        startConnectionSequence(); 
 +    } else if (isBooting || document.getElementById('mr').classList.contains('led-red')) { 
 +        abortComm = true; isBooting = false; isFinished = false; 
 +        btn.classList.remove('active-btn'); 
 +        document.getElementById('terminal').style.display = 'none'; 
 +        document.getElementById('output').innerHTML = ''; 
 +        currentLine = 0; 
 +        ['mr','oh','rd','sd'].forEach(id => document.getElementById(id).className = 'm-led'); 
 +    } else { 
 +        isBooting = true; btn.classList.add('active-btn'); 
 +        startConnectionSequence(); 
 +    }
 } }
  
 async function processTransmission() { async function processTransmission() {
-    if (currentLine < content.length) {+    if (currentLine < content.length && !abortComm) {
         const out = document.getElementById('output');         const out = document.getElementById('output');
         const lineData = content[currentLine];         const lineData = content[currentLine];
-        const lineDiv = document.createElement('div'); +        const lineSpan = document.createElement('span'); 
-        lineDiv.className = 'line-in';+        lineSpan.className = 'line-in' + (lineData.b ? ' block-line' : '');
                  
-        if(lineData.s === "cmd"lineDiv.innerHTML = `<span style="color:#555">> ${lineData.t}</span>`; +        if(lineData.s === "cmd"lineSpan.innerHTML = `<span style="color:#555">> ${lineData.t}</span>`; 
-        else if(lineData.s === "status"lineDiv.innerHTML = `<span style="color:#fff; font-weight:bold">${lineData.t}</span>`; +        else if(lineData.s === "status"lineSpan.innerHTML = `<span style="color:#fff; font-weight:bold">${lineData.t}</span>`; 
-        else lineDiv.innerHTML = lineData.t; +        else lineSpan.innerHTML = lineData.t; 
-        out.appendChild(lineDiv); +         
- +        out.appendChild(lineSpan); 
-        document.getElementById('rd').classList.add('led-yellow'); +        let trafficTime = 150 + (lineData.t.length * 12); 
-        playRxNoise(); +        await simulatePacket(trafficTime); 
-        await new Promise(r => setTimeout(r, 450)); +        if(!abortComm{ 
-        document.getElementById('rd').classList.remove('led-yellow'); +            lineSpan.classList.add('line-visible'); 
- +            currentLine++; 
-        lineDiv.classList.add('line-visible'); +            await new Promise(r => setTimeout(r, 200 + Math.random() * 300)); 
- +            processTransmission(); 
-        await new Promise(r => setTimeout(r, 200)); +        } 
-        document.getElementById('sd').classList.add('led-green'); +    } else if (!abortComm{ 
-        playTxNoise(); +        isFinished = trueisBooting false;
-        await new Promise(r => setTimeout(r, 300)); +
-        document.getElementById('sd').classList.remove('led-green'); +
- +
-        currentLine++; +
-        setTimeout(processTransmission, lineData.s === "text" ? 900 : 400); +
-    } else {+
         document.getElementById('oh').classList.remove('led-red');         document.getElementById('oh').classList.remove('led-red');
     }     }
Línea 244: Línea 227:
 </script> </script>
 </html> </html>
 +
  
otros/contacto.1778062966.txt.gz · Última modificación: por jesus