Yampa-0.15: examples/TailgatingDetector/TestTGMain.hs
{-# LANGUAGE Arrows #-}
-- |
-- Description : Testing of the tailgating detector.
-- Copyright : Yale University, 2003
-- Authors : Henrik Nilsson
--
-- Part of the TailgatingDetector example.
module Main where
import Data.List (sortBy)
import FRP.Yampa
import TailgatingDetector
-- Looks for interesting events in the video stream (cars entering,
-- leaving, overtaking) in the interval [0, t].
testVideo :: Time -> [(Time, Event Video)]
testVideo t_max = filter (isEvent . snd) $
takeWhile (\(t, _) -> t <= t_max) $
embed (localTime &&& (videoAndTrackers >>^ fst)
>>> filterVideo)
(deltaEncode smplPer (repeat ()))
where
filterVideo = second (edgeBy change [])
where
change v_prev v =
if (map fst (sortBy comparePos v_prev))
/= (map fst (sortBy comparePos v))
then Just v
else Nothing
comparePos (_, (p1, _)) (_, (p2, _)) = compare p1 p2
ppTestVideo t = mapM_ (putStrLn . show) (testVideo t)
testTailgating t_max = filter (isEvent . snd) $
takeWhile (\(t, _) -> t <= t_max) $
embed (localTime
&&& (mkCar3 (-1000) 40 95 30 200 30.9
&&& mkCar1 0 30
>>> tailgating))
(deltaEncode smplPer (repeat ()))
testMCT :: Time -> [(Time, Event [(Id, Car)])]
testMCT t_max = filter (isEvent . snd) $
takeWhile (\(t, _) -> t <= t_max) $
embed (localTime
&&& (uavStatus
>>> (highway &&& identity >>> mkVideoAndTrackers)
&&& identity
>>> arr (\((v, ect), s) -> (v, s, ect))
>>> mct)
>>> filterMCTOutput)
(deltaEncode smplPer (repeat ()))
where
filterMCTOutput = second (edgeBy change [])
where
change v_prev v =
if (map fst (sortBy comparePos v_prev))
/= (map fst (sortBy comparePos v))
then Just v
else Nothing
comparePos (_, (p1, _)) (_, (p2, _)) = compare p1 p2
ppTestMCT t = mapM_ (putStrLn . show) (testMCT t)
testMTGD :: Time -> [(Time, (Event [(Id,Id)], [(Id, Car)]))]
testMTGD t_max =
filter (isEvent . fst . snd) $
takeWhile (\(t, _) -> t <= t_max) $
embed (localTime
&&& (proc _ -> do s <- uavStatus -< ()
h <- highway -< ()
(v, ect) <- mkVideoAndTrackers -< (h, s)
(ics, etgs) <- findTailgaters -< (v,s,ect)
etgs <- mtgd -< ics
returnA -< (etgs, ics)))
(deltaEncode smplPer (repeat ()))
ppTestMTGD t = mapM_ (putStrLn . show) (testMTGD t)
-- We could read the car specification from standard input.
main = ppTestMTGD 2000