mirror of
https://github.com/smittix/intercept.git
synced 2026-07-05 16:18:12 -07:00
Add agent ACARS f00b4r0 support and UI state sync
- Agent: Add _detect_acarsdec_fork() for f00b4r0/DragonOS support - Agent: Use --output json:file, --rtlsdr, -m 256 for f00b4r0 fork - UI: Add setAcarsRunning() to sync button state with agent - UI: Add 'acars' to syncModeUI uiSetters map
This commit is contained in:
+49
-4
@@ -2357,6 +2357,37 @@ class ModeManager:
|
|||||||
# ACARS MODE (acarsdec)
|
# ACARS MODE (acarsdec)
|
||||||
# -------------------------------------------------------------------------
|
# -------------------------------------------------------------------------
|
||||||
|
|
||||||
|
def _detect_acarsdec_fork(self, acarsdec_path: str) -> str:
|
||||||
|
"""Detect which acarsdec fork is installed.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
'--output' for f00b4r0 fork (DragonOS)
|
||||||
|
'-j' for TLeconte v4+
|
||||||
|
'-o' for TLeconte v3.x
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
result = subprocess.run(
|
||||||
|
[acarsdec_path],
|
||||||
|
capture_output=True,
|
||||||
|
text=True,
|
||||||
|
timeout=5
|
||||||
|
)
|
||||||
|
output = result.stdout + result.stderr
|
||||||
|
|
||||||
|
# f00b4r0 fork uses --output instead of -j/-o
|
||||||
|
if '--output' in output:
|
||||||
|
return '--output'
|
||||||
|
|
||||||
|
# Parse version for TLeconte
|
||||||
|
import re
|
||||||
|
version_match = re.search(r'acarsdec[^\d]*v?(\d+)\.(\d+)', output, re.IGNORECASE)
|
||||||
|
if version_match:
|
||||||
|
major = int(version_match.group(1))
|
||||||
|
return '-j' if major >= 4 else '-o'
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
return '-j' # Default to TLeconte v4+
|
||||||
|
|
||||||
def _start_acars(self, params: dict) -> dict:
|
def _start_acars(self, params: dict) -> dict:
|
||||||
"""Start ACARS decoding using acarsdec."""
|
"""Start ACARS decoding using acarsdec."""
|
||||||
gain = params.get('gain', '40')
|
gain = params.get('gain', '40')
|
||||||
@@ -2367,10 +2398,24 @@ class ModeManager:
|
|||||||
if not acarsdec_path:
|
if not acarsdec_path:
|
||||||
return {'status': 'error', 'message': 'acarsdec not found. Install acarsdec.'}
|
return {'status': 'error', 'message': 'acarsdec not found. Install acarsdec.'}
|
||||||
|
|
||||||
# Build command with JSON output
|
# Detect fork and build appropriate command
|
||||||
cmd = [acarsdec_path, '-j', '-r', str(device), '-g', str(gain)]
|
fork_type = self._detect_acarsdec_fork(acarsdec_path)
|
||||||
for freq in frequencies:
|
cmd = [acarsdec_path]
|
||||||
cmd.append(freq)
|
|
||||||
|
if fork_type == '--output':
|
||||||
|
# f00b4r0 fork (DragonOS): different syntax
|
||||||
|
cmd.extend(['--output', 'json:file']) # stdout
|
||||||
|
cmd.extend(['-g', str(gain)])
|
||||||
|
cmd.extend(['-m', '256']) # 3.2 MS/s for wider bandwidth
|
||||||
|
cmd.extend(['--rtlsdr', str(device)])
|
||||||
|
elif fork_type == '-j':
|
||||||
|
# TLeconte v4+
|
||||||
|
cmd.extend(['-j', '-g', str(gain), '-r', str(device)])
|
||||||
|
else:
|
||||||
|
# TLeconte v3.x
|
||||||
|
cmd.extend(['-o', '4', '-g', str(gain), '-r', str(device)])
|
||||||
|
|
||||||
|
cmd.extend(frequencies)
|
||||||
|
|
||||||
logger.info(f"Starting acarsdec: {' '.join(cmd)}")
|
logger.info(f"Starting acarsdec: {' '.join(cmd)}")
|
||||||
|
|
||||||
|
|||||||
@@ -678,7 +678,8 @@ function syncModeUI(mode, isRunning, agentId = null) {
|
|||||||
'pager': 'setPagerRunning',
|
'pager': 'setPagerRunning',
|
||||||
'adsb': 'setADSBRunning',
|
'adsb': 'setADSBRunning',
|
||||||
'wifi': 'setWiFiRunning',
|
'wifi': 'setWiFiRunning',
|
||||||
'bluetooth': 'setBluetoothRunning'
|
'bluetooth': 'setBluetoothRunning',
|
||||||
|
'acars': 'setAcarsRunning'
|
||||||
};
|
};
|
||||||
|
|
||||||
const setterName = uiSetters[mode];
|
const setterName = uiSetters[mode];
|
||||||
|
|||||||
@@ -3763,6 +3763,30 @@ sudo make install</code>
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Sync ACARS UI state (called by syncModeUI in agents.js)
|
||||||
|
function setAcarsRunning(running, agentId = null) {
|
||||||
|
isAcarsRunning = running;
|
||||||
|
const btn = document.getElementById('acarsToggleBtn');
|
||||||
|
const indicator = document.getElementById('acarsPanelIndicator');
|
||||||
|
|
||||||
|
if (running) {
|
||||||
|
acarsCurrentAgent = agentId;
|
||||||
|
btn.textContent = '■ STOP ACARS';
|
||||||
|
btn.classList.add('active');
|
||||||
|
if (indicator) indicator.classList.add('active');
|
||||||
|
// Start stream if not already running
|
||||||
|
if (!acarsEventSource && !acarsPollTimer) {
|
||||||
|
startAcarsStream(agentId !== null);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
btn.textContent = '▶ START ACARS';
|
||||||
|
btn.classList.remove('active');
|
||||||
|
if (indicator) indicator.classList.remove('active');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Expose to global scope for syncModeUI
|
||||||
|
window.setAcarsRunning = setAcarsRunning;
|
||||||
|
|
||||||
function startAcarsStream(isAgentMode = false) {
|
function startAcarsStream(isAgentMode = false) {
|
||||||
if (acarsEventSource) acarsEventSource.close();
|
if (acarsEventSource) acarsEventSource.close();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user