Files
headsetcontrol-noctalia-plugin/headsetcontrol/service.luau
T

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()