chore: Bump version to v2.18.0

Bluetooth enhancements (service data inspector, appearance codes, MAC
cluster tracking, behavioral flags, IRK badges, distance estimation),
ACARS SoapySDR multi-backend support, dump1090 stale process cleanup,
GPS error state, and proximity radar/signal card UI improvements.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Smittix
2026-02-16 15:12:10 +00:00
parent 2a73318457
commit 99d52eafe7
28 changed files with 1212 additions and 169 deletions
+6 -2
View File
@@ -3869,7 +3869,9 @@ sudo make install</code>
}
function startAcars() {
const device = document.getElementById('acarsDeviceSelect').value;
const acarsSelect = document.getElementById('acarsDeviceSelect');
const device = acarsSelect.value;
const sdr_type = acarsSelect.selectedOptions[0]?.dataset.sdrType || 'rtlsdr';
const frequencies = getAcarsRegionFreqs();
// Check if using agent mode
@@ -3895,7 +3897,7 @@ sudo make install</code>
fetch(endpoint, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ device, frequencies, gain: '40' })
body: JSON.stringify({ device, frequencies, gain: '40', sdr_type })
})
.then(r => r.json())
.then(data => {
@@ -4101,6 +4103,7 @@ sudo make install</code>
devices.forEach((d, i) => {
const opt = document.createElement('option');
opt.value = d.index || i;
opt.dataset.sdrType = d.sdr_type || 'rtlsdr';
opt.textContent = `SDR ${d.index || i}: ${d.name || d.type || 'SDR'}`;
select.appendChild(opt);
});
@@ -4880,6 +4883,7 @@ sudo make install</code>
devices.forEach(device => {
const opt = document.createElement('option');
opt.value = device.index;
opt.dataset.sdrType = device.sdr_type || 'rtlsdr';
opt.textContent = `SDR ${device.index}: ${device.name || device.type || 'SDR'}`;
select.appendChild(opt);
});
+56 -2
View File
@@ -216,6 +216,10 @@
<span class="mode-icon icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="6.5 6.5 17.5 17.5 12 22 12 2 17.5 6.5 6.5 17.5"/></svg></span>
<span class="mode-name">Bluetooth</span>
</button>
<button class="mode-card mode-card-sm" onclick="selectMode('bt_locate')">
<span class="mode-icon icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="10" r="3"/><path d="M12 21.7C17.3 17 20 13 20 10a8 8 0 1 0-16 0c0 3 2.7 7 8 11.7z"/><path d="M9.5 8.5l3 3 2-4-2 4-3 3"/></svg></span>
<span class="mode-name">BT Locate</span>
</button>
</div>
</div>
@@ -439,6 +443,7 @@
<label style="font-size: 11px; color: #888; margin-bottom: 4px;">Hardware Type</label>
<select id="sdrTypeSelect" onchange="onSDRTypeChanged()">
<option value="rtlsdr">RTL-SDR</option>
<option value="sdrplay">SDRplay</option>
<option value="limesdr">LimeSDR</option>
<option value="hackrf">HackRF</option>
<option value="airspy">Airspy</option>
@@ -790,7 +795,10 @@
<div class="bt-detail-top-row">
<div class="bt-detail-identity">
<div class="bt-detail-name" id="btDetailName">Device Name</div>
<div class="bt-detail-address" id="btDetailAddress">00:00:00:00:00:00</div>
<div class="bt-detail-address">
<span id="btDetailAddress">00:00:00:00:00:00</span>
<span class="bt-mac-cluster-badge" id="btDetailMacCluster" style="display:none;"></span>
</div>
</div>
<div class="bt-detail-rssi-display">
<span class="bt-detail-rssi-value" id="btDetailRssi">--</span>
@@ -831,8 +839,36 @@
<span class="bt-detail-stat-label">Mfr ID</span>
<span class="bt-detail-stat-value" id="btDetailMfrId">--</span>
</div>
<div class="bt-detail-stat">
<span class="bt-detail-stat-label">TX Power</span>
<span class="bt-detail-stat-value" id="btDetailTxPower">--</span>
</div>
<div class="bt-detail-stat">
<span class="bt-detail-stat-label">Seen Rate</span>
<span class="bt-detail-stat-value" id="btDetailSeenRate">--</span>
</div>
<div class="bt-detail-stat">
<span class="bt-detail-stat-label">Stability</span>
<span class="bt-detail-stat-value" id="btDetailStability">--</span>
</div>
<div class="bt-detail-stat">
<span class="bt-detail-stat-label">Distance</span>
<span class="bt-detail-stat-value" id="btDetailDistance">--</span>
</div>
</div>
<!-- Service Data Inspector (collapsible) -->
<div class="bt-detail-service-inspector" id="btDetailServiceInspector" style="display:none;">
<div class="bt-inspector-toggle" onclick="BluetoothMode.toggleServiceInspector()">
<span class="bt-inspector-arrow" id="btInspectorArrow">&#9656;</span> Raw Data
</div>
<div class="bt-inspector-content" id="btInspectorContent" style="display:none;">
</div>
</div>
<div class="bt-detail-bottom-row">
<div class="bt-detail-irk" id="btDetailIrk" style="display: none;">
<span class="bt-irk-badge">IRK</span>
<span class="bt-detail-irk-value" id="btDetailIrkValue" style="font-size:10px;color:var(--text-dim);font-family:var(--font-mono);margin-left:6px;word-break:break-all;"></span>
</div>
<div class="bt-detail-services" id="btDetailServices" style="display: none;">
<span class="bt-detail-services-list" id="btDetailServicesList"></span>
</div>
@@ -4942,8 +4978,10 @@
// SDR hardware capabilities
const sdrCapabilities = {
'rtlsdr': { name: 'RTL-SDR', freq_min: 24, freq_max: 1766, gain_min: 0, gain_max: 50 },
'sdrplay': { name: 'SDRplay', freq_min: 0.001, freq_max: 2000, gain_min: 0, gain_max: 59 },
'limesdr': { name: 'LimeSDR', freq_min: 0.1, freq_max: 3800, gain_min: 0, gain_max: 73 },
'hackrf': { name: 'HackRF', freq_min: 1, freq_max: 6000, gain_min: 0, gain_max: 62 }
'hackrf': { name: 'HackRF', freq_min: 1, freq_max: 6000, gain_min: 0, gain_max: 62 },
'airspy': { name: 'Airspy', freq_min: 24, freq_max: 1800, gain_min: 0, gain_max: 21 }
};
// Current device list with SDR type info
@@ -10170,6 +10208,20 @@
let gpsReconnectTimeout = null;
// GPS subscriber callbacks - modules can register to receive GPS stream data
const gpsStreamSubscribers = [];
function addGpsStreamSubscriber(fn) {
if (!gpsStreamSubscribers.includes(fn)) {
gpsStreamSubscribers.push(fn);
}
}
function removeGpsStreamSubscriber(fn) {
const idx = gpsStreamSubscribers.indexOf(fn);
if (idx !== -1) gpsStreamSubscribers.splice(idx, 1);
}
function startGpsStream() {
if (gpsEventSource) {
gpsEventSource.close();
@@ -10187,6 +10239,8 @@
gpsLastPosition = data;
updateLocationFromGps(data);
}
// Dispatch to all subscribers (e.g. GPS mode UI)
gpsStreamSubscribers.forEach(fn => fn(data));
} catch (e) {
console.error('GPS parse error:', e);
}
+1
View File
@@ -26,6 +26,7 @@
<option value="bleak">Bleak Library</option>
<option value="hcitool">hcitool (Linux)</option>
<option value="bluetoothctl">bluetoothctl (Linux)</option>
<option value="ubertooth" id="btScanModeUbertooth" style="display:none;">Ubertooth One</option>
</select>
</div>
<div class="form-group">