commit 36b1284996c086c106c2e3a3c3054e6f34c1c9c1
parent 015caf45c6735e3950ead2b12ec574cb59095d9c
Author: Daniel <dan@telent.net>
Date: Sun, 18 May 2025 18:01:56 +0000
nmea: parse degrees and minutes in lat/long
Diffstat:
1 file changed, 24 insertions(+), 29 deletions(-)
diff --git a/pkgs/maps/nmea.fnl b/pkgs/maps/nmea.fnl
@@ -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"