mirror of
https://github.com/smittix/intercept.git
synced 2026-04-24 06:40:00 -07:00
Add .gitignore entry for data/subghz/captures/ to prevent large IQ recording files from being committed. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
176 lines
8.9 KiB
HTML
176 lines
8.9 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: 'JetBrains Mono', monospace; 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: 'JetBrains Mono', monospace; 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: 'JetBrains Mono', monospace; 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: 'JetBrains Mono', monospace; 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>
|