99 lines
2.7 KiB
Luau
99 lines
2.7 KiB
Luau
local hsc = require("./lib/hsc.luau")
|
|
|
|
local warned = false
|
|
|
|
local function config()
|
|
return {
|
|
device = noctalia.getConfig("device"),
|
|
mock = noctalia.getConfig("mock"),
|
|
poll_interval = noctalia.getConfig("poll_interval"),
|
|
battery_low = noctalia.getConfig("battery_low"),
|
|
wake_sink = noctalia.getConfig("wake_sink"),
|
|
}
|
|
end
|
|
|
|
local function publishCaps(info)
|
|
if info == nil then
|
|
noctalia.state.set("caps", {})
|
|
noctalia.state.set("equalizerPresets", 0)
|
|
noctalia.state.set("error", "no_caps")
|
|
return
|
|
end
|
|
noctalia.state.set("caps", info.caps or {})
|
|
noctalia.state.set("equalizerPresets", info.equalizerPresets or 0)
|
|
noctalia.state.set("device", {
|
|
name = info.name,
|
|
product = info.product,
|
|
vendor = info.vendor,
|
|
})
|
|
noctalia.state.set("error", "")
|
|
end
|
|
|
|
local function handleStatus(status)
|
|
if status == nil then
|
|
local err = noctalia.state.get("error")
|
|
if err == "no_binary" then
|
|
return
|
|
end
|
|
noctalia.state.set("error", "unavailable")
|
|
noctalia.state.set("battery", hsc.stableBattery(nil, config().battery_low))
|
|
noctalia.state.set("chatmix", 0)
|
|
return
|
|
end
|
|
noctalia.state.set("error", "")
|
|
local low = tonumber(config().battery_low) or 20
|
|
local battery = hsc.stableBattery(status.battery, low)
|
|
noctalia.state.set("battery", battery)
|
|
noctalia.state.set("chatmix", status.chatmix or 0)
|
|
noctalia.state.set("lastUpdate", noctalia.nowMs())
|
|
if battery.level ~= nil and battery.level >= 0 and battery.status ~= "BATTERY_UNAVAILABLE" then
|
|
if battery.level <= low and not warned then
|
|
warned = true
|
|
noctalia.notifyError(
|
|
noctalia.tr("notify.battery_low.title"),
|
|
string.format(noctalia.tr("notify.battery_low.body"), battery.level)
|
|
)
|
|
elseif battery.level > low + 5 or battery.status == "BATTERY_CHARGING" or battery.status == "BATTERY_FULL" then
|
|
warned = false
|
|
end
|
|
end
|
|
end
|
|
|
|
local function poll()
|
|
hsc.fetchStatus(handleStatus)
|
|
end
|
|
|
|
local function init()
|
|
local cfg = config()
|
|
hsc.init(cfg)
|
|
warned = false
|
|
if not hsc.isMock() and not noctalia.commandExists("headsetcontrol") then
|
|
noctalia.state.set("error", "no_binary")
|
|
noctalia.state.set("caps", {})
|
|
noctalia.state.set("equalizerPresets", 0)
|
|
noctalia.state.set("battery", hsc.stableBattery(nil, cfg.battery_low))
|
|
noctalia.state.set("chatmix", 0)
|
|
noctalia.log("headsetcontrol binary not found; polling disabled")
|
|
return
|
|
end
|
|
hsc.fetchCapabilities(publishCaps)
|
|
noctalia.setUpdateInterval((cfg.poll_interval or 60) * 1000)
|
|
poll()
|
|
end
|
|
|
|
function update()
|
|
poll()
|
|
end
|
|
|
|
function onConfigChanged()
|
|
init()
|
|
end
|
|
|
|
function onIpc(event, _payload)
|
|
if event == "refresh" then
|
|
poll()
|
|
end
|
|
end
|
|
|
|
init()
|