mirror of
https://github.com/smittix/intercept.git
synced 2026-04-23 22:30:00 -07:00
Replace IBM Plex Mono, Space Mono, and JetBrains Mono with Roboto Condensed across all CSS variables, inline styles, canvas ctx.font references, and Google Fonts CDN links. Updates 28 files covering templates, stylesheets, and JS modules for consistent typography. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
176 lines
9.0 KiB
HTML
176 lines
9.0 KiB
HTML
<!-- SUBGHZ TRANSCEIVER MODE -->
|
|
<div id="subghzMode" class="mode-content">
|
|
<div class="section">
|
|
<h3>SubGHz Transceiver</h3>
|
|
<p class="info-text" style="font-size: 11px; color: var(--text-dim); margin-bottom: 12px;">
|
|
HackRF One SubGHz transceiver. Capture raw signals, replay saved bursts,
|
|
and scan wideband activity with frequency analysis.
|
|
</p>
|
|
</div>
|
|
|
|
<!-- Device -->
|
|
<div class="section">
|
|
<h3>HackRF Device</h3>
|
|
<div class="subghz-device-status" id="subghzDeviceStatus">
|
|
<div class="subghz-device-row">
|
|
<span class="subghz-device-dot" id="subghzDeviceDot"></span>
|
|
<span class="subghz-device-label" id="subghzDeviceLabel">Checking...</span>
|
|
</div>
|
|
<div class="subghz-device-tools" id="subghzDeviceTools">
|
|
<span class="subghz-tool-badge" id="subghzToolHackrf" title="hackrf_transfer">HackRF</span>
|
|
<span class="subghz-tool-badge" id="subghzToolSweep" title="hackrf_sweep">Sweep</span>
|
|
</div>
|
|
</div>
|
|
<div class="form-group" style="margin-top: 8px;">
|
|
<label>Device Serial <span style="color: var(--text-dim); font-weight: normal;">(optional)</span></label>
|
|
<input type="text" id="subghzDeviceSerial" placeholder="auto-detect" style="font-family: 'Roboto Condensed', 'Arial Narrow', sans-serif; font-size: 11px;">
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Status -->
|
|
<div class="subghz-status-row" id="subghzStatusRow">
|
|
<div class="subghz-status-dot" id="subghzStatusDot"></div>
|
|
<span class="subghz-status-text" id="subghzStatusText">Idle</span>
|
|
<span class="subghz-status-timer" id="subghzStatusTimer"></span>
|
|
</div>
|
|
|
|
<!-- Frequency -->
|
|
<div class="section">
|
|
<h3>Frequency</h3>
|
|
<div class="form-group">
|
|
<label>Frequency (MHz)</label>
|
|
<input type="number" id="subghzFrequency" value="433.92" step="0.001" min="1" max="6000">
|
|
</div>
|
|
<div class="subghz-preset-btns">
|
|
<button class="subghz-preset-btn" onclick="SubGhz.setFreq(315)">315M</button>
|
|
<button class="subghz-preset-btn" onclick="SubGhz.setFreq(433.92)">433.92M</button>
|
|
<button class="subghz-preset-btn" onclick="SubGhz.setFreq(868)">868M</button>
|
|
<button class="subghz-preset-btn" onclick="SubGhz.setFreq(915)">915M</button>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Gain -->
|
|
<div class="section">
|
|
<h3>Gain</h3>
|
|
<div class="form-group">
|
|
<label>LNA Gain (0-40 dB)</label>
|
|
<input type="range" id="subghzLnaGain" min="0" max="40" value="24" step="8" oninput="document.getElementById('subghzLnaVal').textContent=this.value">
|
|
<span id="subghzLnaVal" style="font-family: 'Roboto Condensed', 'Arial Narrow', sans-serif; font-size: 11px; color: var(--text-secondary);">24</span>
|
|
</div>
|
|
<div class="form-group">
|
|
<label>VGA Gain (0-62 dB)</label>
|
|
<input type="range" id="subghzVgaGain" min="0" max="62" value="20" step="2" oninput="document.getElementById('subghzVgaVal').textContent=this.value">
|
|
<span id="subghzVgaVal" style="font-family: 'Roboto Condensed', 'Arial Narrow', sans-serif; font-size: 11px; color: var(--text-secondary);">20</span>
|
|
</div>
|
|
<div class="form-group">
|
|
<label>Sample Rate</label>
|
|
<select id="subghzSampleRate" class="mode-select">
|
|
<option value="2000000" selected>2 MHz</option>
|
|
<option value="4000000">4 MHz</option>
|
|
<option value="8000000">8 MHz</option>
|
|
<option value="10000000">10 MHz</option>
|
|
<option value="20000000">20 MHz</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Tabs: Receive RAW / Sweep -->
|
|
<div class="section">
|
|
<div class="subghz-tabs">
|
|
<button class="subghz-tab active" data-tab="rx" onclick="SubGhz.switchTab('rx')">Read RAW</button>
|
|
<button class="subghz-tab" data-tab="sweep" onclick="SubGhz.switchTab('sweep')">Sweep</button>
|
|
</div>
|
|
|
|
<!-- RX Tab -->
|
|
<div class="subghz-tab-content active" id="subghzTabRx">
|
|
<p style="font-size: 11px; color: var(--text-dim); margin-bottom: 10px;">
|
|
Capture raw IQ data to file. Saved captures can be replayed or analyzed.
|
|
</p>
|
|
<div class="subghz-trigger-box">
|
|
<label class="subghz-trigger-toggle">
|
|
<input type="checkbox" id="subghzTriggerEnabled" onchange="SubGhz.syncTriggerControls()">
|
|
Smart Trigger Capture
|
|
</label>
|
|
<div class="subghz-trigger-grid">
|
|
<label>Pre-roll (ms)</label>
|
|
<input type="number" id="subghzTriggerPreMs" min="50" max="5000" step="50" value="350">
|
|
<label>Post-roll (ms)</label>
|
|
<input type="number" id="subghzTriggerPostMs" min="100" max="10000" step="50" value="700">
|
|
</div>
|
|
<p class="subghz-trigger-help">Auto-stops after burst + post-roll and trims capture window.</p>
|
|
</div>
|
|
<div class="subghz-btn-row">
|
|
<button class="subghz-btn start" id="subghzRxStartBtn" onclick="SubGhz.startRx()">Start Capture</button>
|
|
<button class="subghz-btn stop" id="subghzRxStopBtn" onclick="SubGhz.stopRx()" disabled>Stop Capture</button>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Sweep Tab -->
|
|
<div class="subghz-tab-content" id="subghzTabSweep">
|
|
<p style="font-size: 11px; color: var(--text-dim); margin-bottom: 10px;">
|
|
Wideband spectrum analyzer using hackrf_sweep.
|
|
</p>
|
|
<div class="form-group">
|
|
<label>Frequency Range (MHz)</label>
|
|
<div class="subghz-sweep-range">
|
|
<input type="number" id="subghzSweepStart" value="300" min="1" max="6000" step="1">
|
|
<span>to</span>
|
|
<input type="number" id="subghzSweepEnd" value="928" min="1" max="6000" step="1">
|
|
</div>
|
|
</div>
|
|
<div class="subghz-btn-row">
|
|
<button class="subghz-btn start" id="subghzSweepStartBtn" onclick="SubGhz.startSweep()">Start Sweep</button>
|
|
<button class="subghz-btn stop" id="subghzSweepStopBtn" onclick="SubGhz.stopSweep()" disabled>Stop Sweep</button>
|
|
</div>
|
|
<div style="margin-top: 10px;">
|
|
<label style="font-size: 10px; color: var(--text-dim); text-transform: uppercase; letter-spacing: 0.5px;">Detected Peaks</label>
|
|
<div class="subghz-peak-list" id="subghzPeakList"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- TX Settings (collapsible) -->
|
|
<div class="section">
|
|
<h3 style="cursor: pointer;" onclick="document.getElementById('subghzTxSection').classList.toggle('active')">
|
|
Transmit Settings <span style="font-size: 10px; color: var(--text-dim);">▼</span>
|
|
</h3>
|
|
<div id="subghzTxSection" style="display: none;">
|
|
<div class="subghz-tx-warning">
|
|
WARNING: Transmitting radio signals may be illegal without proper authorization.
|
|
Only transmit on frequencies you are licensed for and within ISM band limits.
|
|
TX is restricted to ISM bands: 300-348, 387-464, 779-928 MHz.
|
|
</div>
|
|
<div class="form-group">
|
|
<label>TX VGA Gain (0-47 dB)</label>
|
|
<input type="range" id="subghzTxGain" min="0" max="47" value="20" step="1" oninput="document.getElementById('subghzTxGainVal').textContent=this.value">
|
|
<span id="subghzTxGainVal" style="font-family: 'Roboto Condensed', 'Arial Narrow', sans-serif; font-size: 11px; color: var(--text-secondary);">20</span>
|
|
</div>
|
|
<div class="form-group">
|
|
<label>Max Duration (seconds)</label>
|
|
<input type="number" id="subghzTxMaxDuration" value="10" min="1" max="30" step="1">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Saved Signals Library -->
|
|
<div class="section">
|
|
<h3>Saved Signals</h3>
|
|
<div class="subghz-captures-list" id="subghzSidebarCaptures" style="max-height: 220px; overflow-y: auto;">
|
|
<div class="subghz-empty" id="subghzSidebarCapturesEmpty">No saved captures yet</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<script>
|
|
// Toggle TX section visibility
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
const h3 = document.querySelector('#subghzTxSection')?.previousElementSibling;
|
|
if (h3) {
|
|
h3.addEventListener('click', function() {
|
|
const section = document.getElementById('subghzTxSection');
|
|
if (section) section.style.display = section.style.display === 'none' ? 'block' : 'none';
|
|
});
|
|
}
|
|
});
|
|
</script>
|