fix(airband): parse composite device value and send sdr_type to backend

The airband start function was calling parseInt() directly on composite
device selector values like "rtlsdr:0", which always returned NaN and
fell back to device 0. This also meant sdr_type was never sent to the
backend, and could result in int(None) TypeError on the server.

Now properly splits the composite value (matching ADS-B/ACARS/VDL2
pattern) and sends both device index and sdr_type. Also hardened
backend int() parsing to use explicit None checks.

Fixes: "Airband Error: Invalid parameter: int() argument must be a
string, a bytes-like object or a real number, not 'NoneType'"

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Smittix
2026-03-07 19:37:22 +00:00
parent 4ea64bd7ef
commit 0fbb446209
2 changed files with 9 additions and 6 deletions

View File

@@ -1311,9 +1311,9 @@ def start_audio() -> Response:
try: try:
frequency = float(data.get('frequency', 0)) frequency = float(data.get('frequency', 0))
modulation = normalize_modulation(data.get('modulation', 'wfm')) modulation = normalize_modulation(data.get('modulation', 'wfm'))
squelch = int(data.get('squelch') or 0) squelch = int(data['squelch']) if data.get('squelch') is not None else 0
gain = int(data.get('gain') or 40) gain = int(data['gain']) if data.get('gain') is not None else 40
device = int(data.get('device') or 0) device = int(data['device']) if data.get('device') is not None else 0
sdr_type = str(data.get('sdr_type', 'rtlsdr')).lower() sdr_type = str(data.get('sdr_type', 'rtlsdr')).lower()
request_token_raw = data.get('request_token') request_token_raw = data.get('request_token')
request_token = int(request_token_raw) if request_token_raw is not None else None request_token = int(request_token_raw) if request_token_raw is not None else None

View File

@@ -3652,10 +3652,12 @@ sudo make install</code>
async function startAirband() { async function startAirband() {
const frequency = getAirbandFrequency(); const frequency = getAirbandFrequency();
const device = parseInt(document.getElementById('airbandDeviceSelect').value) || 0; const compositeVal = document.getElementById('airbandDeviceSelect').value || 'rtlsdr:0';
const [sdr_type, deviceIdx] = compositeVal.includes(':') ? compositeVal.split(':') : ['rtlsdr', compositeVal];
const device = parseInt(deviceIdx) || 0;
const squelch = parseInt(document.getElementById('airbandSquelch').value) || 0; const squelch = parseInt(document.getElementById('airbandSquelch').value) || 0;
console.log('[AIRBAND] Starting with device:', device, 'freq:', frequency, 'squelch:', squelch); console.log('[AIRBAND] Starting with device:', device, 'sdr_type:', sdr_type, 'freq:', frequency, 'squelch:', squelch);
// Check if ADS-B tracking is using this device // Check if ADS-B tracking is using this device
if (isTracking && adsbActiveDevice !== null && device === adsbActiveDevice) { if (isTracking && adsbActiveDevice !== null && device === adsbActiveDevice) {
@@ -3682,7 +3684,8 @@ sudo make install</code>
modulation: 'am', // Airband uses AM modulation: 'am', // Airband uses AM
squelch: squelch, squelch: squelch,
gain: 40, gain: 40,
device: device device: device,
sdr_type: sdr_type
}) })
}); });