99 lines
2.5 KiB
Fennel
99 lines
2.5 KiB
Fennel
; (local { : view } (require :fennel))
|
|
(local { : fdopen } (require :posix.stdio))
|
|
(local nmea (require :nmea))
|
|
|
|
(local {
|
|
: Gtk
|
|
: OsmGpsMap
|
|
: Gdk
|
|
: Gio
|
|
: GLib
|
|
}
|
|
(require :lgi))
|
|
|
|
(local CSS "
|
|
label.readout {
|
|
font: 48px \"Noto Sans\";
|
|
margin: 10px;
|
|
padding: 5px;
|
|
background-color: rgba(0, 0, 0, 0.2);
|
|
}
|
|
")
|
|
|
|
(fn styles []
|
|
(let [style_provider (Gtk.CssProvider)]
|
|
(Gtk.StyleContext.add_provider_for_screen
|
|
(Gdk.Screen.get_default)
|
|
style_provider
|
|
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
|
|
)
|
|
(style_provider:load_from_data CSS)))
|
|
|
|
(local window (Gtk.Window {
|
|
:title "Map"
|
|
:name "toplevel"
|
|
:default_width 720
|
|
:default_height 800
|
|
|
|
:on_destroy Gtk.main_quit
|
|
}))
|
|
|
|
(fn osm-widget []
|
|
(doto (OsmGpsMap.Map {})
|
|
(tset :map-source OsmGpsMap.MapSource_t.OPENSTREETMAP)
|
|
(: :set_center_and_zoom 52.595 -0.1 14)
|
|
(: :layer_add (OsmGpsMap.MapOsd {
|
|
:show_copyright true
|
|
; :show_coordinates true
|
|
:show_scale true
|
|
}))
|
|
))
|
|
|
|
(fn readout [text]
|
|
(doto (Gtk.Label {:label text})
|
|
(-> (: :get_style_context) (: :add_class :readout))))
|
|
|
|
(fn readouts []
|
|
(doto (Gtk.Box
|
|
{
|
|
:orientation Gtk.Orientation.VERTICAL
|
|
:halign Gtk.Align.END
|
|
})
|
|
(-> (: :get_style_context) (: :add_class :readouts))
|
|
(: :add (readout "21:05:00"))
|
|
(: :add (readout "00:00"))
|
|
(: :add (readout "25 km/h"))))
|
|
(local socket-path (or (. arg 1) "/var/run/gnss-share.sock"))
|
|
|
|
(local gnss-socket
|
|
(let [addr (Gio.UnixSocketAddress {
|
|
:path socket-path
|
|
})]
|
|
(: (Gio.SocketClient) :connect addr nil)))
|
|
|
|
(fn read-gnss [socket]
|
|
(each [l #(socket:read "l")]
|
|
; (print "gnss" l)
|
|
(if (not (= l ""))
|
|
(print (view (nmea.parse l)))))
|
|
|
|
true)
|
|
|
|
(let [sock (gnss-socket:get_socket)
|
|
fd (sock:get_fd)
|
|
events [ GLib.IOCondition.IN GLib.IOCondition.HUP]
|
|
channel (GLib.IOChannel.unix_new fd)
|
|
handle (fdopen fd :r)]
|
|
(GLib.io_add_watch channel 0 events #(read-gnss handle)))
|
|
|
|
|
|
(window:add
|
|
(doto (Gtk.Overlay {})
|
|
(: :add (osm-widget))
|
|
(: :add_overlay (readouts))
|
|
))
|
|
|
|
(window:show_all)
|
|
(styles)
|
|
(Gtk:main)
|