nmea: parse degrees and minutes in lat/long

This commit is contained in:
Daniel 2025-05-18 18:01:56 +00:00
parent 015caf45c6
commit 36b1284996

View File

@ -54,6 +54,16 @@
nil
(tonumber s)))
(fn parse-coordinate [value sign]
(if (= value "")
nil
(let [(deg min) (string.match value "(..)(.+)")]
(print :deg value deg :min min)
(*
(+ (tonumber deg)
(/ (tonumber min) 60))
(case sign :N 1 :E 1 :S -1 :W -1)))))
(local
msg-types
{
@ -66,14 +76,9 @@
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
]
{ :lat (parse-coordinate lat latsign)
:lon (parse-coordinate lon lonsign)
: fix-quality
:total-space-vehicles (try-number total-space-vehicles)
:hdop (try-number hdop)
@ -86,39 +91,27 @@
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 "")
(let [magnetic-variation (if (= magn-var "")
nil
(* (tonumber magn-var)
(case magn-var-sign :E 1 :W -1)))]
{ : utc
: valid
:lat latf
:lon lonf
:lat (parse-coordinate lat latsign)
:lon (parse-coordinate lon lonsign)
:speed-knots (try-number knots)
:bearing-true (try-number bearing-true)
: date
: magnetic-variation
: magnetic-variation ;;; XXX probably wrong
: mode
}))
:GNS
(fn [fields]
(let [[utc lat latsign lon lonsign mode total-space-vehicles
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
hdop altitude geoidal-separation _ _ nav-status] fields]
{ :lat (parse-coordinate lat latsign)
:lon (parse-coordinate lon lonsign)
: mode
:total-space-vehicles (try-number total-space-vehicles)
:hdop (try-number hdop)
@ -150,14 +143,16 @@
(tset :talker talker))
split)))
;; XXX this is wrong. 5131.348976 is 51 degrees 31.348976 minutes
(expect=
(parse-line
"$GNGNS,111134.00,5131.348976,N,00005.551003,W,AAAANN,19,0.7,20.3,47.0,,,V*0C\n")
{:altitude 20.3
:geoidal-separation 47
:hdop 0.7
:lat 51.31348976
:lon -0.05551003
:lat 51.522482933333
:lon -0.092516716666667
:message-type "GNS"
:mode "AAAANN"
:nav-status "V"