From 36b1284996c086c106c2e3a3c3054e6f34c1c9c1 Mon Sep 17 00:00:00 2001 From: Daniel Date: Sun, 18 May 2025 18:01:56 +0000 Subject: [PATCH] nmea: parse degrees and minutes in lat/long --- pkgs/maps/nmea.fnl | 53 +++++++++++++++++++++------------------------- 1 file changed, 24 insertions(+), 29 deletions(-) diff --git a/pkgs/maps/nmea.fnl b/pkgs/maps/nmea.fnl index fe999c5..d3516b2 100644 --- 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"