packages feed

gpmf-0.1.1.0: src/GoPro/Command/DEVCString.hs

module GoPro.Command.DEVCString where

import qualified Data.ByteString.Lazy    as BL
import qualified Data.ByteString.Lazy.Char8    as BC
import qualified Data.Map.Strict    as Map
import Data.Foldable (toList)

import           GoPro.DEVC
import           GoPro.GPMF

fourcc :: FourCC -> BL.ByteString
fourcc (FourCC (a,b,c,d)) = "4cc:" <> BC.pack [a,b,c,d]

cval :: Value -> BL.ByteString
cval (GFourCC f) = fourcc f
cval x           = tshow x

showValues :: Int -> [Value] -> BL.ByteString
showValues n = joinMap showValue
  where
    showValue (GNested x) = showTelemetry (n + 2) x
    showValue (GFourCC f) = (BC.pack $ replicate n ' ') <> fourcc f
    showValue (GComplex f v) = (BC.pack $ replicate n ' ') <> "Complex: " <> BC.pack f <> ": " <> BL.intercalate ", " (map cval v)
    showValue x           = (BC.pack $ replicate n ' ') <> tshow x

showTelemetry :: Int -> (FourCC, [Value]) -> BL.ByteString
showTelemetry n (FourCC (a,b,c,d),vs) =  (BC.pack $ (replicate n ' ') <> [a,b,c,d]) <> "\n" <> showValues (n+2) vs

tshow :: Show a => a -> BL.ByteString
tshow = BC.pack . show

joinMap :: Foldable f => (a -> BL.ByteString) -> f a -> BL.ByteString
joinMap f = BL.intercalate "\n" . fmap f . toList

showDEVC :: DEVC -> BL.ByteString
showDEVC DEVC{..} = "Device " <> tshow _dev_id <> ": " <> BC.pack _dev_name <> "\n" <> joinMap showT _dev_telems

  where
    showT Telemetry{..} = "  " <> BC.pack _tele_name <> " - stmp:" <> tshow _tele_stmp <> " tsmp:" <> tshow _tele_tsmp <> "\n" <> showTVal _tele_values

    showTVal (TVUnknown vals)           = "    Unknown type\n" <> showValues 6 vals
    showTVal (TVAccl Accelerometer{..}) = "    Temp: " <> tshow _acc_temp <> " and "
                                          <> tshow (length _acc_vals) <> " values like " <> (tshow.head) _acc_vals
    showTVal (TVGyro Gyroscope{..})     = "    Temp: " <> tshow _gyro_temp <> " and "
                                          <> tshow (length _gyro_vals) <> " values like " <> (tshow.head) _gyro_vals
    showTVal (TVFaces fs)               = "    Faces:" <> (if null fs then "" else "\n") <>
                                          joinMap ((\Face{..} -> "        "
                                                     <> tshow _face_x <> "x" <> tshow _face_y
                                                     <> ", " <> tshow _face_w <> "x" <> tshow _face_h
                                                     <> ", smile=" <> tshow _face_smile)) fs
    showTVal (TVGPS GPS{..})            = "    GPS time=" <> tshow _gps_time <> " p=" <> tshow _gps_p
                                                    <> ", len(rs)=" <> tshow (length _gps_readings)
                                                    <> "\n        hd=" <> showGPS (head _gps_readings)
    showTVal (TVScene ss)               = "   Scenes, found " <> tshow (length ss) <> ", first:\n" <>
                                          joinMap ((\(k,v) ->
                                                      "        " <> tshow k <> "=" <> tshow v))
                                           (Map.assocs (head ss))
    showTVal (TVAudioLevel AudioLevel{..}) = "    Audio levels:\n" <>
                                             "      rms:  " <> (tshow _audio_rms) <> "\n" <>
                                             "      peak: " <> (tshow _audio_peak)

showGPS :: GPSReading -> BL.ByteString
showGPS GPSReading{..} = "(" <> tshow _gpsr_lat <> "," <> tshow _gpsr_lon <> ") alt=" <> tshow _gpsr_alt
                         <> " spd2d=" <> tshow _gpsr_speed2d <> " spd3d=" <> tshow _gpsr_speed3d