mirror of
https://github.com/smittix/intercept.git
synced 2026-04-24 06:40:00 -07:00
Add drone ops mode and retire DMR support
This commit is contained in:
@@ -1,114 +0,0 @@
|
||||
<!-- DMR / DIGITAL VOICE MODE -->
|
||||
<div id="dmrMode" class="mode-content">
|
||||
<div class="section">
|
||||
<h3>Digital Voice</h3>
|
||||
<div class="alpha-mode-notice">
|
||||
ALPHA: Digital Voice decoding is still in active development. Expect occasional decode instability and false protocol locks.
|
||||
</div>
|
||||
|
||||
<!-- Dependency Warning -->
|
||||
<div id="dmrToolsWarning" style="display: none; background: rgba(255, 100, 100, 0.1); border: 1px solid var(--accent-red); border-radius: 4px; padding: 10px; margin-bottom: 10px;">
|
||||
<p style="color: var(--accent-red); margin: 0; font-size: 0.85em;">
|
||||
<strong>Missing:</strong><br>
|
||||
<span id="dmrToolsWarningText"></span>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label>Frequency (MHz)</label>
|
||||
<input type="number" id="dmrFrequency" value="462.5625" step="0.0001" style="width: 100%;">
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label>Protocol</label>
|
||||
<select id="dmrProtocol">
|
||||
<option value="auto" selected>Auto Detect (DMR/P25/D-STAR)</option>
|
||||
<option value="dmr">DMR</option>
|
||||
<option value="p25">P25</option>
|
||||
<option value="nxdn">NXDN</option>
|
||||
<option value="dstar">D-STAR</option>
|
||||
<option value="provoice">ProVoice</option>
|
||||
</select>
|
||||
<span style="font-size: 0.75em; color: var(--text-muted); display: block; margin-top: 2px;">
|
||||
For NXDN and ProVoice, use manual protocol selection for best lock reliability
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label>Gain</label>
|
||||
<input type="number" id="dmrGain" value="40" min="0" max="50" style="width: 100%;">
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label>PPM Correction</label>
|
||||
<input type="number" id="dmrPPM" value="0" min="-200" max="200" step="1" style="width: 100%;"
|
||||
title="Frequency error correction for your RTL-SDR dongle. Digital voice is very sensitive to frequency offset.">
|
||||
</div>
|
||||
|
||||
<div class="form-group" style="margin-top: 4px;">
|
||||
<label style="display: flex; align-items: center; gap: 8px; cursor: pointer;">
|
||||
<input type="checkbox" id="dmrRelaxCrc" style="width: auto; accent-color: var(--accent-cyan);">
|
||||
<span>Relax CRC (weak signals)</span>
|
||||
</label>
|
||||
<span style="font-size: 0.75em; color: var(--text-muted); display: block; margin-top: 2px;">
|
||||
Allows more frames through on marginal signals at the cost of occasional errors
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Bookmarks -->
|
||||
<div class="section" style="margin-top: 8px;">
|
||||
<h3>Bookmarks</h3>
|
||||
<div style="display: flex; gap: 4px; margin-bottom: 6px;">
|
||||
<input type="number" id="dmrBookmarkFreq" placeholder="Freq MHz" step="0.0001"
|
||||
style="flex: 1; font-size: 11px; padding: 4px 6px;">
|
||||
<button class="preset-btn" onclick="addDmrBookmark()" style="font-size: 10px; padding: 4px 8px;"
|
||||
title="Add bookmark">+</button>
|
||||
</div>
|
||||
<div style="display: flex; gap: 4px; margin-bottom: 6px;">
|
||||
<input type="text" id="dmrBookmarkLabel" placeholder="Label (optional)"
|
||||
style="flex: 1; font-size: 11px; padding: 4px 6px;">
|
||||
<button class="preset-btn" onclick="addCurrentDmrFreqBookmark()" style="font-size: 9px; padding: 4px 6px;"
|
||||
title="Save current frequency">Save current</button>
|
||||
</div>
|
||||
<div id="dmrBookmarksList" style="max-height: 150px; overflow-y: auto;">
|
||||
<div style="color: var(--text-muted); text-align: center; padding: 10px; font-size: 11px;">No bookmarks saved</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Current Call -->
|
||||
<div class="section" style="margin-top: 12px;">
|
||||
<h3>Current Call</h3>
|
||||
<div id="dmrCurrentCall" style="background: rgba(0,0,0,0.3); border-radius: 6px; padding: 10px; font-size: 11px;">
|
||||
<div style="color: var(--text-muted); text-align: center;">No active call</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Status -->
|
||||
<div class="section" style="margin-top: 12px;">
|
||||
<h3>Status</h3>
|
||||
<div style="background: rgba(0,0,0,0.3); border-radius: 6px; padding: 10px;">
|
||||
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 6px;">
|
||||
<span style="font-size: 10px; color: var(--text-muted); text-transform: uppercase;">Status</span>
|
||||
<span id="dmrStatus" style="font-size: 11px; color: var(--accent-cyan);">IDLE</span>
|
||||
</div>
|
||||
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 6px;">
|
||||
<span style="font-size: 10px; color: var(--text-muted); text-transform: uppercase;">Protocol</span>
|
||||
<span id="dmrActiveProtocol" style="font-size: 11px; color: var(--text-primary);">--</span>
|
||||
</div>
|
||||
<div style="display: flex; justify-content: space-between; align-items: center;">
|
||||
<span style="font-size: 10px; color: var(--text-muted); text-transform: uppercase;">Calls</span>
|
||||
<span id="dmrCallCount" style="font-size: 14px; font-weight: bold; color: var(--accent-green);">0</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mode-actions-bottom">
|
||||
<button class="run-btn" id="startDmrBtn" onclick="startDmr()">
|
||||
Start Decoder
|
||||
</button>
|
||||
<button class="stop-btn" id="stopDmrBtn" onclick="stopDmr()" style="display: none;">
|
||||
Stop Decoder
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
152
templates/partials/modes/droneops.html
Normal file
152
templates/partials/modes/droneops.html
Normal file
@@ -0,0 +1,152 @@
|
||||
<!-- DRONE OPS MODE -->
|
||||
<div id="droneOpsMode" class="mode-content">
|
||||
<div class="section">
|
||||
<h3 class="section-header collapsible" onclick="toggleSection(this)">
|
||||
<span>Drone Ops Status</span>
|
||||
<span class="collapse-icon">▼</span>
|
||||
</h3>
|
||||
<div class="section-content">
|
||||
<div class="droneops-status-grid" id="droneOpsStatusGrid">
|
||||
<div class="droneops-status-card">
|
||||
<div class="droneops-status-label">Session</div>
|
||||
<div class="droneops-status-value" id="droneOpsSessionValue">Idle</div>
|
||||
</div>
|
||||
<div class="droneops-status-card">
|
||||
<div class="droneops-status-label">Armed</div>
|
||||
<div class="droneops-status-value" id="droneOpsArmedValue">No</div>
|
||||
</div>
|
||||
<div class="droneops-status-card">
|
||||
<div class="droneops-status-label">Detections</div>
|
||||
<div class="droneops-status-value" id="droneOpsDetectionCount">0</div>
|
||||
</div>
|
||||
<div class="droneops-status-card">
|
||||
<div class="droneops-status-label">Open Incidents</div>
|
||||
<div class="droneops-status-value" id="droneOpsIncidentCount">0</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="droneops-row droneops-row--actions">
|
||||
<button class="preset-btn" onclick="DroneOps.startSession('passive')">Start Passive Session</button>
|
||||
<button class="preset-btn" onclick="DroneOps.startSession('active')">Start Active Session</button>
|
||||
<button class="clear-btn" onclick="DroneOps.stopSession()">Stop Session</button>
|
||||
</div>
|
||||
|
||||
<div class="droneops-row droneops-row--actions">
|
||||
<label class="droneops-check">
|
||||
<input id="droneOpsDetectWifi" type="checkbox" checked>
|
||||
<span>WiFi</span>
|
||||
</label>
|
||||
<label class="droneops-check">
|
||||
<input id="droneOpsDetectBluetooth" type="checkbox" checked>
|
||||
<span>Bluetooth</span>
|
||||
</label>
|
||||
<button class="preset-btn" onclick="DroneOps.startDetection()">Start Detection</button>
|
||||
<button class="clear-btn" onclick="DroneOps.stopDetection()">Stop Detection</button>
|
||||
</div>
|
||||
|
||||
<div class="droneops-source-block">
|
||||
<div class="droneops-source-title">Detection Sources</div>
|
||||
<div class="droneops-row droneops-row--sources">
|
||||
<label class="droneops-field">
|
||||
<span class="droneops-field-label">WiFi Interface</span>
|
||||
<select id="droneOpsWifiInterfaceSelect" class="droneops-input" title="WiFi source interface">
|
||||
<option value="">Auto WiFi source</option>
|
||||
</select>
|
||||
</label>
|
||||
<label class="droneops-field">
|
||||
<span class="droneops-field-label">Bluetooth Adapter</span>
|
||||
<select id="droneOpsBtAdapterSelect" class="droneops-input" title="Bluetooth source adapter">
|
||||
<option value="">Auto Bluetooth source</option>
|
||||
</select>
|
||||
</label>
|
||||
<button class="preset-btn droneops-source-refresh" onclick="DroneOps.refreshDetectionSources()">Refresh Sources</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="droneops-subtext">Sensors: <span id="droneOpsSensorsState">Idle</span></div>
|
||||
|
||||
<div class="droneops-row droneops-row--actions">
|
||||
<input id="droneOpsArmIncident" class="droneops-input" type="number" placeholder="Incident ID" min="1">
|
||||
<input id="droneOpsArmReason" class="droneops-input" type="text" placeholder="Arming reason">
|
||||
<button class="preset-btn" onclick="DroneOps.arm()">Arm Actions</button>
|
||||
<button class="clear-btn" onclick="DroneOps.disarm()">Disarm</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="section">
|
||||
<h3 class="section-header collapsible" onclick="toggleSection(this)">
|
||||
<span>Detections</span>
|
||||
<span class="collapse-icon">▼</span>
|
||||
</h3>
|
||||
<div class="section-content">
|
||||
<div class="droneops-row">
|
||||
<select id="droneOpsSourceFilter" class="droneops-input" onchange="DroneOps.refreshDetections()">
|
||||
<option value="">All Sources</option>
|
||||
<option value="wifi">WiFi</option>
|
||||
<option value="bluetooth">Bluetooth</option>
|
||||
<option value="rf">RF</option>
|
||||
</select>
|
||||
<input id="droneOpsConfidenceFilter" class="droneops-input" type="number" min="0" max="1" step="0.05" value="0.5" placeholder="Min confidence">
|
||||
<button class="preset-btn" onclick="DroneOps.refreshDetections()">Refresh</button>
|
||||
</div>
|
||||
<div id="droneOpsDetections" class="droneops-list">
|
||||
<div class="droneops-empty">No detections yet</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="section">
|
||||
<h3 class="section-header collapsible" onclick="toggleSection(this)">
|
||||
<span>Incidents</span>
|
||||
<span class="collapse-icon">▼</span>
|
||||
</h3>
|
||||
<div class="section-content">
|
||||
<div class="droneops-row">
|
||||
<input id="droneOpsIncidentTitle" class="droneops-input" type="text" placeholder="Incident title">
|
||||
<select id="droneOpsIncidentSeverity" class="droneops-input">
|
||||
<option value="low">Low</option>
|
||||
<option value="medium" selected>Medium</option>
|
||||
<option value="high">High</option>
|
||||
<option value="critical">Critical</option>
|
||||
</select>
|
||||
<button class="preset-btn" onclick="DroneOps.createIncident()">Create Incident</button>
|
||||
</div>
|
||||
<div id="droneOpsIncidents" class="droneops-list">
|
||||
<div class="droneops-empty">No incidents</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="section">
|
||||
<h3 class="section-header collapsible" onclick="toggleSection(this)">
|
||||
<span>Actions</span>
|
||||
<span class="collapse-icon">▼</span>
|
||||
</h3>
|
||||
<div class="section-content">
|
||||
<div class="droneops-row">
|
||||
<input id="droneOpsActionIncident" class="droneops-input" type="number" placeholder="Incident ID" min="1">
|
||||
<input id="droneOpsActionType" class="droneops-input" type="text" placeholder="Action type (e.g. wifi_deauth_test)">
|
||||
<button class="preset-btn" onclick="DroneOps.requestAction()">Request Action</button>
|
||||
</div>
|
||||
<div id="droneOpsActions" class="droneops-list">
|
||||
<div class="droneops-empty">No action requests</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="section">
|
||||
<h3 class="section-header collapsible" onclick="toggleSection(this)">
|
||||
<span>Evidence</span>
|
||||
<span class="collapse-icon">▼</span>
|
||||
</h3>
|
||||
<div class="section-content">
|
||||
<div class="droneops-row">
|
||||
<input id="droneOpsManifestIncident" class="droneops-input" type="number" placeholder="Incident ID" min="1">
|
||||
<button class="preset-btn" onclick="DroneOps.generateManifest()">Generate Manifest</button>
|
||||
</div>
|
||||
<div id="droneOpsManifests" class="droneops-list">
|
||||
<div class="droneops-empty">No manifests</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
Reference in New Issue
Block a user