gpmf 0.1.1.2 → 0.1.2.0
raw patch · 4 files changed
+39/−30 lines, 4 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ GoPro.GPMF.Lenses: _GComplex :: Prism' Value (String, [Value])
+ GoPro.GPMF.Lenses: _GDouble :: Prism' Value Double
+ GoPro.GPMF.Lenses: _GFloat :: Prism' Value [Float]
+ GoPro.GPMF.Lenses: _GFourCC :: Prism' Value FourCC
+ GoPro.GPMF.Lenses: _GInt16 :: Prism' Value [Int16]
+ GoPro.GPMF.Lenses: _GInt32 :: Prism' Value [Int32]
+ GoPro.GPMF.Lenses: _GInt64 :: Prism' Value [Int64]
+ GoPro.GPMF.Lenses: _GInt8 :: Prism' Value [Int8]
+ GoPro.GPMF.Lenses: _GNested :: Prism' Value (FourCC, [Value])
+ GoPro.GPMF.Lenses: _GQ32 :: Prism' Value [Word32]
+ GoPro.GPMF.Lenses: _GQ64 :: Prism' Value [Word64]
+ GoPro.GPMF.Lenses: _GString :: Prism' Value String
+ GoPro.GPMF.Lenses: _GTimestamp :: Prism' Value UTCTime
+ GoPro.GPMF.Lenses: _GUUID :: Prism' Value [Word8]
+ GoPro.GPMF.Lenses: _GUint16 :: Prism' Value [Word16]
+ GoPro.GPMF.Lenses: _GUint32 :: Prism' Value [Word32]
+ GoPro.GPMF.Lenses: _GUint64 :: Prism' Value [Word64]
+ GoPro.GPMF.Lenses: _GUint8 :: Prism' Value [Word8]
+ GoPro.GPMF.Lenses: _GUnknown :: Prism' Value (Char, Int, Int, [[Word8]])
Files
- gpmf.cabal +3/−2
- src/GoPro/DEVC.hs +26/−26
- src/GoPro/GPMF.hs +2/−2
- src/GoPro/GPMF/Lenses.hs +8/−0
gpmf.cabal view
@@ -4,10 +4,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: 7571cd9d9b95b052897d6f76314c207aa300046dabffcdf8131672c4291a2aee+-- hash: c6d29ad07f44b26f9f044367be3fffd8ca5de406a6c5228a26d694d5f3127f3a name: gpmf-version: 0.1.1.2+version: 0.1.2.0 description: Please see the README on GitHub at <https://github.com/dustin/gpmf#readme> homepage: https://github.com/dustin/gpmf#readme bug-reports: https://github.com/dustin/gpmf/issues@@ -30,6 +30,7 @@ GoPro.Command.DEVCString GoPro.DEVC GoPro.GPMF+ GoPro.GPMF.Lenses other-modules: Paths_gpmf hs-source-dirs:
src/GoPro/DEVC.hs view
@@ -29,17 +29,17 @@ Telemetry(..), tele_stmp, tele_tsmp, tele_name, tele_values ) where -import Control.Lens hiding (cons)-import Control.Monad (guard)-import Data.Foldable (fold)-import Data.List (transpose)-import Data.Map.Strict (Map)-import qualified Data.Map.Strict as Map-import Data.Maybe (fromMaybe, listToMaybe, mapMaybe)-import Data.Time.Clock (UTCTime (..))-import Data.Word (Word64)+import Control.Lens hiding (cons)+import Data.Foldable (fold)+import Data.List (transpose)+import Data.Map.Strict (Map)+import qualified Data.Map.Strict as Map+import Data.Maybe (fromMaybe, mapMaybe)+import Data.Time.Clock (UTCTime (..))+import Data.Word (Word64) import GoPro.GPMF+import GoPro.GPMF.Lenses data Accelerometer = Accelerometer { _acc_temp :: Float@@ -156,7 +156,7 @@ updTele _ o = o tvals :: TVals- tvals = (fromMaybe (TVUnknown vals) . ($ vals)) . foldr findGrokker (const Nothing) . concatMap four $ vals+ tvals = (fromMaybe (TVUnknown vals) . ($ vals)) . foldr findGrokker (const Nothing) . foldMap four $ vals where four (GNested (x, _)) = [x] four _ = []@@ -172,22 +172,23 @@ mkDEVC _ = const Nothing findVal :: FourCC -> [Value] -> Maybe [Value]-findVal f = listToMaybe . findAll f+findVal f = exactlyOne . findAll f findAll :: FourCC -> [Value] -> [[Value]]-findAll f = mapMaybe g- where- g (GNested (fc, vs)) | fc == f = Just vs- g _ = Nothing+findAll f = toListOf (folded . _GNested . filtered (\(d,_) -> d == f) . _2) +exactlyOne :: [a] -> Maybe a+exactlyOne [a] = Just a+exactlyOne _ = Nothing+ grokSens :: FourCC -> (Float -> [(Float, Float, Float)] -> a) -> [Value] -> Maybe a grokSens sens cons vals = do- GFloat templ <- listToMaybe =<< findVal "TMPC" vals- GInt16 scall <- listToMaybe =<< findVal "SCAL" vals+ GFloat templ <- exactlyOne =<< findVal "TMPC" vals+ GInt16 scall <- exactlyOne =<< findVal "SCAL" vals readings <- mapMaybe ungint <$> findVal sens vals - temp <- listToMaybe templ- scal <- realToFrac <$> listToMaybe scall+ temp <- exactlyOne templ+ scal <- realToFrac <$> exactlyOne scall scaled <- traverse (trip . fmap (\x -> realToFrac x / scal)) readings pure $ cons temp scaled@@ -215,11 +216,11 @@ grokGPS :: [Value] -> Maybe GPS grokGPS vals = do- GUint16 [gpsp] <- listToMaybe =<< findVal "GPSP" vals- GTimestamp time <- listToMaybe =<< findVal "GPSU" vals+ GUint16 [gpsp] <- exactlyOne =<< findVal "GPSP" vals+ GTimestamp time <- exactlyOne =<< findVal "GPSU" vals scals <- mapMaybe (fmap realToFrac . anInt) <$> findVal "SCAL" vals g5s <- findVal "GPS5" vals- rs <- mconcat <$> traverse (readings scals) g5s+ rs <- fold <$> traverse (readings scals) g5s pure $ GPS (fromIntegral gpsp) time rs @@ -231,13 +232,12 @@ readings _ _ = Nothing anInt (GInt32 [x]) = Just x- anInt _ = Nothing+ anInt _ = Nothing grokAudioLevel :: [Value] -> Maybe AudioLevel grokAudioLevel vals = do- alps <- transpose . mapMaybe de <$> findVal "AALP" vals- guard $ length alps == 2- pure $ AudioLevel (alps !! 0) (alps !! 1)+ [l1, l2] <- transpose . mapMaybe de <$> findVal "AALP" vals+ pure $ AudioLevel l1 l2 where de (GInt8 xs) = Just $ fmap fromIntegral xs de (GComplex _ xs) = Just . fold . mapMaybe de $ xs
src/GoPro/GPMF.hs view
@@ -9,8 +9,8 @@ A low-level parser for <https://github.com/gopro/gpmf-parser GPMF> telemetry data. -} -{-# LANGUAGE TupleSections #-} {-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE TupleSections #-} module GoPro.GPMF (parseGPMF, Value(..), FourCC(..)) where @@ -28,7 +28,7 @@ import Data.Time.Clock (UTCTime) import Data.Time.Format (defaultTimeLocale, parseTimeM) import Data.Word (Word16, Word32, Word64, Word8)-import GHC.Generics (Generic)+import GHC.Generics (Generic) {- Type Char Definition typedef Comment
+ src/GoPro/GPMF/Lenses.hs view
@@ -0,0 +1,8 @@+{-# LANGUAGE TemplateHaskell #-}++module GoPro.GPMF.Lenses where++import Control.Lens+import GoPro.GPMF++makePrisms ''Value