Compare commits
No commits in common. "e15c42ff4a274db387e0af843c226f1e59021bb9" and "2befb534a17c45cc8d1a6541362efe0db421ca25" have entirely different histories.
e15c42ff4a
...
2befb534a1
63
lib/Track.hs
63
lib/Track.hs
@ -17,7 +17,6 @@ import Control.Exception
|
|||||||
import Data.List as List
|
import Data.List as List
|
||||||
import Data.List qualified
|
import Data.List qualified
|
||||||
import Data.Map as Map
|
import Data.Map as Map
|
||||||
import Data.Maybe
|
|
||||||
import Data.Text qualified
|
import Data.Text qualified
|
||||||
import Data.Text.Lazy as T
|
import Data.Text.Lazy as T
|
||||||
import Data.Time
|
import Data.Time
|
||||||
@ -53,12 +52,16 @@ gpxNS localName =
|
|||||||
tpxNS localName =
|
tpxNS localName =
|
||||||
Name localName (Just "http://www.garmin.com/xmlschemas/TrackPointExtension/v2") Nothing
|
Name localName (Just "http://www.garmin.com/xmlschemas/TrackPointExtension/v2") Nothing
|
||||||
|
|
||||||
|
mkPoint pos =
|
||||||
|
Point
|
||||||
|
pos
|
||||||
|
Nothing
|
||||||
|
(UTCTime (toEnum 60631) 43200)
|
||||||
|
Nothing
|
||||||
|
Nothing
|
||||||
|
Nothing
|
||||||
|
|
||||||
data BadFile = BadFile deriving (Show)
|
elToPoint :: Cursor -> Point
|
||||||
|
|
||||||
instance Exception BadFile
|
|
||||||
|
|
||||||
elToPoint :: Cursor -> Either SomeException Point
|
|
||||||
elToPoint c =
|
elToPoint c =
|
||||||
case node c of
|
case node c of
|
||||||
NodeElement (Element _ attrs _) ->
|
NodeElement (Element _ attrs _) ->
|
||||||
@ -82,27 +85,37 @@ elToPoint c =
|
|||||||
>>= element (Name "PowerInWatts" (Just "http://www.garmin.com/xmlschemas/PowerExtension/v1") Nothing)
|
>>= element (Name "PowerInWatts" (Just "http://www.garmin.com/xmlschemas/PowerExtension/v1") Nothing)
|
||||||
>>= child
|
>>= child
|
||||||
>>= content
|
>>= content
|
||||||
parsedTime =
|
in Point
|
||||||
listToMaybe ts
|
(Pos lat lon)
|
||||||
>>= (Data.Time.ISO8601.parseISO8601 . Data.Text.unpack)
|
( case ele of
|
||||||
in case parsedTime of
|
[e] -> Just $ asFloat e
|
||||||
Nothing -> Left (toException BadFile)
|
_ -> Nothing
|
||||||
Just utime ->
|
)
|
||||||
Right $
|
( case ts of
|
||||||
Point
|
[e] -> case Data.Time.ISO8601.parseISO8601 (Data.Text.unpack e) of
|
||||||
(Pos lat lon)
|
Just utime -> utime
|
||||||
(listToMaybe ele >>= return . asFloat)
|
_ -> UTCTime (toEnum 0) 0
|
||||||
utime
|
_ -> UTCTime (toEnum 0) 0
|
||||||
(listToMaybe cadence >>= return . asInt)
|
)
|
||||||
(listToMaybe power >>= return . asInt)
|
( case cadence of
|
||||||
Nothing
|
[e] -> Just (asInt e)
|
||||||
|
_ -> Nothing
|
||||||
|
)
|
||||||
|
( case power of
|
||||||
|
[e] -> Just (asInt e)
|
||||||
|
_ -> Nothing
|
||||||
|
)
|
||||||
|
Nothing
|
||||||
where
|
where
|
||||||
asFloat v = (read (Data.Text.unpack v) :: Float)
|
asFloat v = (read (Data.Text.unpack v) :: Float)
|
||||||
asInt v = (read (Data.Text.unpack v) :: Int)
|
asInt v = (read (Data.Text.unpack v) :: Int)
|
||||||
getAttr name = maybe 0 asFloat (Map.lookup name attrs)
|
getAttr name =
|
||||||
_ -> Left (toException BadFile)
|
case Map.lookup name attrs of
|
||||||
|
Just v -> asFloat v
|
||||||
|
_ -> 0
|
||||||
|
_ -> mkPoint (Pos 0 0)
|
||||||
|
|
||||||
getPoints :: Cursor -> Either SomeException [Point]
|
getPoints :: Cursor -> [Point]
|
||||||
getPoints c =
|
getPoints c =
|
||||||
let trkpts =
|
let trkpts =
|
||||||
element (gpxNS "gpx") c
|
element (gpxNS "gpx") c
|
||||||
@ -110,12 +123,12 @@ getPoints c =
|
|||||||
>>= element (gpxNS "trk")
|
>>= element (gpxNS "trk")
|
||||||
>>= descendant
|
>>= descendant
|
||||||
>>= element (gpxNS "trkpt")
|
>>= element (gpxNS "trkpt")
|
||||||
in traverse elToPoint trkpts
|
in List.map elToPoint trkpts
|
||||||
|
|
||||||
parse :: String -> Either SomeException [Point]
|
parse :: String -> Either SomeException [Point]
|
||||||
parse str = do
|
parse str = do
|
||||||
gpx <- parseText def (T.pack str)
|
gpx <- parseText def (T.pack str)
|
||||||
getPoints (fromDocument gpx)
|
return (getPoints (fromDocument gpx))
|
||||||
|
|
||||||
length :: Track -> Int
|
length :: Track -> Int
|
||||||
length = Data.List.length
|
length = Data.List.length
|
||||||
|
@ -34,9 +34,7 @@ onepoint =
|
|||||||
wrap
|
wrap
|
||||||
[r|
|
[r|
|
||||||
<trk> <trkseg>
|
<trk> <trkseg>
|
||||||
<trkpt lat="51" lon="-0.1">
|
<trkpt lat="51" lon="-0.1"> </trkpt>
|
||||||
<time>2024-10-23T08:34:59.779+01:00</time>
|
|
||||||
</trkpt>
|
|
||||||
</trkseg> </trk>
|
</trkseg> </trk>
|
||||||
|]
|
|]
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user