Files
noctalia-shell/Services/Networking/BluetoothRssi.qml
T

73 lines
1.8 KiB
QML

import QtQuick
import Quickshell
import Quickshell.Io
import "../../Helpers/BluetoothUtils.js" as BluetoothUtils
QtObject {
id: root
// Controls
property bool enabled: false
property int intervalMs: 10000
property var connectedDevices: []
// Output cache and version for bindings
property var cache: ({}) // addr -> percent (0..100)
property int version: 0
// Internal rotation state
property int _index: 0
property string _currentAddr: ""
// Single process reused for RSSI queries
property Process rssiProcess: Process {
id: proc
running: false
stdout: StdioCollector {
id: out
}
onExited: function (exitCode, exitStatus) {
try {
var text = out.text || "";
var dbm = BluetoothUtils.parseRssiOutput(text);
if (root._currentAddr !== "" && dbm !== null) {
var pct = BluetoothUtils.dbmToPercent(dbm);
if (pct !== null) {
root.cache[root._currentAddr] = pct;
root.version++;
}
}
} catch (e) {} finally {
root._currentAddr = "";
}
}
}
// Periodic RSSI polling timer
property Timer rssiTimer: Timer {
interval: root.intervalMs
repeat: true
running: root.enabled
onTriggered: {
var list = root.connectedDevices || [];
if (!list || list.length === 0)
return;
if (root._index >= list.length)
root._index = 0;
var dev = list[root._index++];
if (!dev)
return;
var addr = BluetoothUtils.macFromDevice(dev);
if (!addr || addr.length < 7)
return;
if (proc.running)
return; // avoid overlap
root._currentAddr = addr;
proc.command = ["sh", "-c", `bluetoothctl info "${addr}"`];
try {
proc.running = true;
} catch (e) {}
}
}
}