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