eufon/blinkenlicht/modem.fnl

47 lines
1.2 KiB
Fennel

(local { : GLib } (require :lgi))
(local dbus (require :dbus_proxy))
(local { : view } (require :fennel))
(local GV GLib.Variant)
(local variant dbus.variant)
;; https://www.freedesktop.org/software/ModemManager/api/latest/ref-dbus.html
(fn modem-manager []
(dbus.Proxy:new
{
:bus dbus.Bus.SYSTEM
:name "org.freedesktop.ModemManager1"
:interface "org.freedesktop.DBus.ObjectManager"
:path "/org/freedesktop/ModemManager1"
}))
;; this is a function because the path to the modem may change
;; (e.g. due to suspend/resume cycles causing services to be stopped
;; and started)
(fn modem-interface [manager]
(let [modem-path (next (: (assert manager) :GetManagedObjects))]
(dbus.Proxy:new
{
:bus dbus.Bus.SYSTEM
:name "org.freedesktop.ModemManager1"
:interface "org.freedesktop.ModemManager1.Modem.Simple"
:path modem-path
})))
(fn new-modem-status []
(let [manager (modem-manager)]
{
:read #(let [m (modem-interface manager)]
(variant.strip (m:GetStatus)))
}))
(comment
(let [ctx (: (GLib.MainLoop) :get_context)
s (new-modem-status)]
(while true
(ctx:iteration)
(print (view (s:value) )))))
{ :new new-modem-status }