Compare commits

...

3 Commits

Author SHA1 Message Date
bf7eac5fac parse nmea from socket 2025-05-17 23:23:32 +00:00
59c7b53022 nmea: add GGA, RMC 2025-05-17 23:22:37 +00:00
a687c946d2 nmea: convert empty fields to nil 2025-05-17 23:20:55 +00:00
2 changed files with 81 additions and 16 deletions

View File

@ -1,5 +1,6 @@
; (local { : view } (require :fennel))
(local { : fdopen } (require :posix.stdio))
(local nmea (require :nmea))
(local {
: Gtk
@ -71,7 +72,10 @@ label.readout {
(fn read-gnss [socket]
(each [l #(socket:read "l")]
(print "gnss" l))
; (print "gnss" l)
(if (not (= l ""))
(print (view (nmea.parse l)))))
true)
(let [sock (gnss-socket:get_socket)

View File

@ -3,9 +3,8 @@
;; 3-5 are the message type
;; fields are comma-delimited
;; we assume that we can parse the message based only on type
;; (i.e. that the same type should always be parsed the same way no
;; matter who the talker)
;; we can parse the message based only on type (i.e. the same type is
;; always parsed the same way no matter who the talker)
;; outline: split message into lines, extract values between
;; $ and * as talker, type, fields
@ -50,32 +49,92 @@
}
)
(local latlon-signs { :N 1 :S -1 :W -1 :E 1 } )
(fn try-number [s]
(if (= s "")
nil
(tonumber s)))
(local
msg-types
{
:GGA
(fn [fields]
(let [[utc lat latsign lon lonsign
fix-quality
total-space-vehicles
hdop
altitude _
geoidal-separation _
_ _ ] fields
latf (if (= lat "")
nil
(* (tonumber lat) 0.01 (case latsign :N 1 :S -1)))
lonf (if (= lon "")
nil
(* (tonumber lon) 0.01 (case lonsign :E 1 :W -1)))]
{ :lat latf
:lon lonf
: fix-quality
:total-space-vehicles (try-number total-space-vehicles)
:hdop (try-number hdop)
:altitude (try-number altitude)
:geoidal-separation (try-number geoidal-separation)
}))
:RMC
(fn [[utc valid lat latsign lon lonsign
knots bearing-true date
magn-var magn-var-sign
mode nav-status &as fields]]
(let [latf (if (= lat "")
nil
(* (tonumber lat) 0.01 (case latsign :N 1 :S -1)))
lonf (if (= lon "")
nil
(* (tonumber lon) 0.01 (case lonsign :E 1 :W -1)))
magnetic-variation (if (= magn-var "")
nil
(* (tonumber magn-var)
(case magn-var-sign :E 1 :W -1)))]
{ : utc
: valid
:lat latf
:lon lonf
:speed-knots (try-number knots)
:bearing-true (try-number bearing-true)
: date
: magnetic-variation
: mode
}))
:GNS
(fn [fields]
(let [[utc lat latsign lon lonsign mode total-space-vehicles
hdop altitude geoidal-separation _ _ nav-status] fields]
{ :lat (* (/ (tonumber lat) 100) (. latlon-signs latsign))
:lon (* (/ (tonumber lon) 100) (. latlon-signs lonsign))
hdop altitude geoidal-separation _ _ nav-status] fields
latf (if (= lat "")
nil
(* (tonumber lat) 0.01 (case latsign :N 1 :S -1)))
lonf (if (= lon "")
nil
(* (tonumber lon) 0.01 (case lonsign :E 1 :W -1)))]
{ :lat latf
:lon lonf
: mode
:total-space-vehicles (tonumber total-space-vehicles)
:hdop (tonumber hdop)
:altitude (tonumber altitude)
:geoidal-separation (tonumber geoidal-separation)
:total-space-vehicles (try-number total-space-vehicles)
:hdop (try-number hdop)
:altitude (try-number altitude)
:geoidal-separation (try-number geoidal-separation)
: nav-status
}
))
:VTG
(fn [[bearing-true _ bearing-mag _ knots _ kmh _ mode]]
{
:bearing-true (tonumber bearing-true)
:bearing-magnetic (tonumber bearing-mag)
:speed-knots (tonumber knots)
:speed-kmh (tonumber kmh)
:bearing-true (try-number bearing-true)
:bearing-magnetic (try-number bearing-mag)
:speed-knots (try-number knots)
:speed-kmh (try-number kmh)
: mode
}
)
@ -117,3 +176,5 @@
:speed-kmh 2.9
:mode :A
})
{ :parse parse-line }