module GoPro.Command.DEVCString where import qualified Data.ByteString.Lazy as BL import qualified Data.ByteString.Lazy.Char8 as BC import Data.Foldable (toList) import qualified Data.Map.Strict as Map import GoPro.DEVC import GoPro.GPMF fourcc :: FourCC -> BL.ByteString fourcc :: FourCC -> ByteString fourcc (FourCC (Char a,Char b,Char c,Char d)) = ByteString "4cc:" forall a. Semigroup a => a -> a -> a <> [Char] -> ByteString BC.pack [Char a,Char b,Char c,Char d] cval :: Value -> BL.ByteString cval :: Value -> ByteString cval (GFourCC FourCC f) = FourCC -> ByteString fourcc FourCC f cval Value x = forall a. Show a => a -> ByteString tshow Value x showValues :: Int -> [Value] -> BL.ByteString showValues :: Int -> [Value] -> ByteString showValues Int n = forall (f :: * -> *) a. Foldable f => (a -> ByteString) -> f a -> ByteString joinMap Value -> ByteString showValue where showValue :: Value -> ByteString showValue (GNested (FourCC, [Value]) x) = Int -> (FourCC, [Value]) -> ByteString showTelemetry (Int n forall a. Num a => a -> a -> a + Int 2) (FourCC, [Value]) x showValue (GFourCC FourCC f) = ([Char] -> ByteString BC.pack forall a b. (a -> b) -> a -> b $ forall a. Int -> a -> [a] replicate Int n Char ' ') forall a. Semigroup a => a -> a -> a <> FourCC -> ByteString fourcc FourCC f showValue (GComplex [Char] f [Value] v) = ([Char] -> ByteString BC.pack forall a b. (a -> b) -> a -> b $ forall a. Int -> a -> [a] replicate Int n Char ' ') forall a. Semigroup a => a -> a -> a <> ByteString "Complex: " forall a. Semigroup a => a -> a -> a <> [Char] -> ByteString BC.pack [Char] f forall a. Semigroup a => a -> a -> a <> ByteString ": " forall a. Semigroup a => a -> a -> a <> ByteString -> [ByteString] -> ByteString BL.intercalate ByteString ", " (forall a b. (a -> b) -> [a] -> [b] map Value -> ByteString cval [Value] v) showValue Value x = ([Char] -> ByteString BC.pack forall a b. (a -> b) -> a -> b $ forall a. Int -> a -> [a] replicate Int n Char ' ') forall a. Semigroup a => a -> a -> a <> forall a. Show a => a -> ByteString tshow Value x showTelemetry :: Int -> (FourCC, [Value]) -> BL.ByteString showTelemetry :: Int -> (FourCC, [Value]) -> ByteString showTelemetry Int n (FourCC (Char a,Char b,Char c,Char d),[Value] vs) = ([Char] -> ByteString BC.pack forall a b. (a -> b) -> a -> b $ (forall a. Int -> a -> [a] replicate Int n Char ' ') forall a. Semigroup a => a -> a -> a <> [Char a,Char b,Char c,Char d]) forall a. Semigroup a => a -> a -> a <> ByteString "\n" forall a. Semigroup a => a -> a -> a <> Int -> [Value] -> ByteString showValues (Int nforall a. Num a => a -> a -> a +Int 2) [Value] vs tshow :: Show a => a -> BL.ByteString tshow :: forall a. Show a => a -> ByteString tshow = [Char] -> ByteString BC.pack forall b c a. (b -> c) -> (a -> b) -> a -> c . forall a. Show a => a -> [Char] show joinMap :: Foldable f => (a -> BL.ByteString) -> f a -> BL.ByteString joinMap :: forall (f :: * -> *) a. Foldable f => (a -> ByteString) -> f a -> ByteString joinMap a -> ByteString f = ByteString -> [ByteString] -> ByteString BL.intercalate ByteString "\n" forall b c a. (b -> c) -> (a -> b) -> a -> c . forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap a -> ByteString f forall b c a. (b -> c) -> (a -> b) -> a -> c . forall (t :: * -> *) a. Foldable t => t a -> [a] toList showDEVC :: DEVC -> BL.ByteString showDEVC :: DEVC -> ByteString showDEVC DEVC{Int [Char] Map [Char] Telemetry _dev_telems :: DEVC -> Map [Char] Telemetry _dev_name :: DEVC -> [Char] _dev_id :: DEVC -> Int _dev_telems :: Map [Char] Telemetry _dev_name :: [Char] _dev_id :: Int ..} = ByteString "Device " forall a. Semigroup a => a -> a -> a <> forall a. Show a => a -> ByteString tshow Int _dev_id forall a. Semigroup a => a -> a -> a <> ByteString ": " forall a. Semigroup a => a -> a -> a <> [Char] -> ByteString BC.pack [Char] _dev_name forall a. Semigroup a => a -> a -> a <> ByteString "\n" forall a. Semigroup a => a -> a -> a <> forall (f :: * -> *) a. Foldable f => (a -> ByteString) -> f a -> ByteString joinMap Telemetry -> ByteString showT Map [Char] Telemetry _dev_telems where showT :: Telemetry -> ByteString showT Telemetry{Int [Char] Word64 TVals _tele_values :: Telemetry -> TVals _tele_name :: Telemetry -> [Char] _tele_tsmp :: Telemetry -> Int _tele_stmp :: Telemetry -> Word64 _tele_values :: TVals _tele_name :: [Char] _tele_tsmp :: Int _tele_stmp :: Word64 ..} = ByteString " " forall a. Semigroup a => a -> a -> a <> [Char] -> ByteString BC.pack [Char] _tele_name forall a. Semigroup a => a -> a -> a <> ByteString " - stmp:" forall a. Semigroup a => a -> a -> a <> forall a. Show a => a -> ByteString tshow Word64 _tele_stmp forall a. Semigroup a => a -> a -> a <> ByteString " tsmp:" forall a. Semigroup a => a -> a -> a <> forall a. Show a => a -> ByteString tshow Int _tele_tsmp forall a. Semigroup a => a -> a -> a <> ByteString "\n" forall a. Semigroup a => a -> a -> a <> TVals -> ByteString showTVal TVals _tele_values showTVal :: TVals -> ByteString showTVal (TVUnknown [Value] vals) = ByteString " Unknown type\n" forall a. Semigroup a => a -> a -> a <> Int -> [Value] -> ByteString showValues Int 6 [Value] vals showTVal (TVAccl Accelerometer{Float [(Float, Float, Float)] _acc_vals :: Accelerometer -> [(Float, Float, Float)] _acc_temp :: Accelerometer -> Float _acc_vals :: [(Float, Float, Float)] _acc_temp :: Float ..}) = ByteString " Temp: " forall a. Semigroup a => a -> a -> a <> forall a. Show a => a -> ByteString tshow Float _acc_temp forall a. Semigroup a => a -> a -> a <> ByteString " and " forall a. Semigroup a => a -> a -> a <> forall a. Show a => a -> ByteString tshow (forall (t :: * -> *) a. Foldable t => t a -> Int length [(Float, Float, Float)] _acc_vals) forall a. Semigroup a => a -> a -> a <> ByteString " values like " forall a. Semigroup a => a -> a -> a <> (forall a. Show a => a -> ByteString tshowforall b c a. (b -> c) -> (a -> b) -> a -> c .forall a. [a] -> a head) [(Float, Float, Float)] _acc_vals showTVal (TVGyro Gyroscope{Float [(Float, Float, Float)] _gyro_vals :: Gyroscope -> [(Float, Float, Float)] _gyro_temp :: Gyroscope -> Float _gyro_vals :: [(Float, Float, Float)] _gyro_temp :: Float ..}) = ByteString " Temp: " forall a. Semigroup a => a -> a -> a <> forall a. Show a => a -> ByteString tshow Float _gyro_temp forall a. Semigroup a => a -> a -> a <> ByteString " and " forall a. Semigroup a => a -> a -> a <> forall a. Show a => a -> ByteString tshow (forall (t :: * -> *) a. Foldable t => t a -> Int length [(Float, Float, Float)] _gyro_vals) forall a. Semigroup a => a -> a -> a <> ByteString " values like " forall a. Semigroup a => a -> a -> a <> (forall a. Show a => a -> ByteString tshowforall b c a. (b -> c) -> (a -> b) -> a -> c .forall a. [a] -> a head) [(Float, Float, Float)] _gyro_vals showTVal (TVFaces [Face] fs) = ByteString " Faces:" forall a. Semigroup a => a -> a -> a <> (if forall (t :: * -> *) a. Foldable t => t a -> Bool null [Face] fs then ByteString "" else ByteString "\n") forall a. Semigroup a => a -> a -> a <> forall (f :: * -> *) a. Foldable f => (a -> ByteString) -> f a -> ByteString joinMap ((\Face{Float Int _face_smile :: Face -> Float _face_h :: Face -> Float _face_w :: Face -> Float _face_y :: Face -> Float _face_x :: Face -> Float _face_id :: Face -> Int _face_smile :: Float _face_h :: Float _face_w :: Float _face_y :: Float _face_x :: Float _face_id :: Int ..} -> ByteString " " forall a. Semigroup a => a -> a -> a <> forall a. Show a => a -> ByteString tshow Float _face_x forall a. Semigroup a => a -> a -> a <> ByteString "x" forall a. Semigroup a => a -> a -> a <> forall a. Show a => a -> ByteString tshow Float _face_y forall a. Semigroup a => a -> a -> a <> ByteString ", " forall a. Semigroup a => a -> a -> a <> forall a. Show a => a -> ByteString tshow Float _face_w forall a. Semigroup a => a -> a -> a <> ByteString "x" forall a. Semigroup a => a -> a -> a <> forall a. Show a => a -> ByteString tshow Float _face_h forall a. Semigroup a => a -> a -> a <> ByteString ", smile=" forall a. Semigroup a => a -> a -> a <> forall a. Show a => a -> ByteString tshow Float _face_smile)) [Face] fs showTVal (TVGPS5 [GPSReading] readings) = ByteString " GPS5\n\t" forall a. Semigroup a => a -> a -> a <> ByteString -> [ByteString] -> ByteString BC.intercalate ByteString "\n\t" (GPSReading -> ByteString showGPS forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> [GPSReading] readings) showTVal (TVGPS9 [GPSReading] readings) = ByteString " GPS9\n\t" forall a. Semigroup a => a -> a -> a <> ByteString -> [ByteString] -> ByteString BC.intercalate ByteString "\n\t" (GPSReading -> ByteString showGPS forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> [GPSReading] readings) showTVal (TVScene [Map Location Float] ss) = ByteString " Scenes, found " forall a. Semigroup a => a -> a -> a <> forall a. Show a => a -> ByteString tshow (forall (t :: * -> *) a. Foldable t => t a -> Int length [Map Location Float] ss) forall a. Semigroup a => a -> a -> a <> ByteString ", first:\n" forall a. Semigroup a => a -> a -> a <> forall (f :: * -> *) a. Foldable f => (a -> ByteString) -> f a -> ByteString joinMap ((\(Location k,Float v) -> ByteString " " forall a. Semigroup a => a -> a -> a <> forall a. Show a => a -> ByteString tshow Location k forall a. Semigroup a => a -> a -> a <> ByteString "=" forall a. Semigroup a => a -> a -> a <> forall a. Show a => a -> ByteString tshow Float v)) (forall k a. Map k a -> [(k, a)] Map.assocs (forall a. [a] -> a head [Map Location Float] ss)) showTVal (TVAudioLevel AudioLevel{[Int] _audio_peak :: AudioLevel -> [Int] _audio_rms :: AudioLevel -> [Int] _audio_peak :: [Int] _audio_rms :: [Int] ..}) = ByteString " Audio levels:\n" forall a. Semigroup a => a -> a -> a <> ByteString " rms: " forall a. Semigroup a => a -> a -> a <> (forall a. Show a => a -> ByteString tshow [Int] _audio_rms) forall a. Semigroup a => a -> a -> a <> ByteString "\n" forall a. Semigroup a => a -> a -> a <> ByteString " peak: " forall a. Semigroup a => a -> a -> a <> (forall a. Show a => a -> ByteString tshow [Int] _audio_peak) showGPS :: GPSReading -> BL.ByteString showGPS :: GPSReading -> ByteString showGPS GPSReading{Double Int UTCTime _gpsr_fix :: GPSReading -> Int _gpsr_dop :: GPSReading -> Double _gpsr_time :: GPSReading -> UTCTime _gpsr_speed3d :: GPSReading -> Double _gpsr_speed2d :: GPSReading -> Double _gpsr_alt :: GPSReading -> Double _gpsr_lon :: GPSReading -> Double _gpsr_lat :: GPSReading -> Double _gpsr_fix :: Int _gpsr_dop :: Double _gpsr_time :: UTCTime _gpsr_speed3d :: Double _gpsr_speed2d :: Double _gpsr_alt :: Double _gpsr_lon :: Double _gpsr_lat :: Double ..} = ByteString "(time=" forall a. Semigroup a => a -> a -> a <> forall a. Show a => a -> ByteString tshow UTCTime _gpsr_time forall a. Semigroup a => a -> a -> a <> ByteString " - (" forall a. Semigroup a => a -> a -> a <> forall a. Show a => a -> ByteString tshow Double _gpsr_lat forall a. Semigroup a => a -> a -> a <> ByteString "," forall a. Semigroup a => a -> a -> a <> forall a. Show a => a -> ByteString tshow Double _gpsr_lon forall a. Semigroup a => a -> a -> a <> ByteString ") alt=" forall a. Semigroup a => a -> a -> a <> forall a. Show a => a -> ByteString tshow Double _gpsr_alt forall a. Semigroup a => a -> a -> a <> ByteString " spd2d=" forall a. Semigroup a => a -> a -> a <> forall a. Show a => a -> ByteString tshow Double _gpsr_speed2d forall a. Semigroup a => a -> a -> a <> ByteString " spd3d=" forall a. Semigroup a => a -> a -> a <> forall a. Show a => a -> ByteString tshow Double _gpsr_speed3d