NXTDSL-0.1: ExampleVM.hs
import ExampleCode
import NXT.Interpretation
import Control.Monad
import Control.Monad.Trans
import Control.Monad.Trans.Resource
import Control.Concurrent
import Control.Concurrent.STM
main =
do t <- tree
runResourceT $ do env <- runVM t
liftIO $ threadDelay 500000 -- 50 ms setup time
liftIO $ setLoop env
where
assertMotor name m expect =
do got <- atomically $ do b <- readTVar (m_b m)
c <- readTVar (m_c m)
return (b, c)
when (expect /= got) $ error $ "Assertion (" ++ name ++ ") failed. Expected motor values: "
++ (show expect) ++ ". Got: " ++ (show got)
setLoop t@(envQ, motor) =
do atomically $ writeTBQueue envQ (RealEnv 55 55)
threadDelay 100000 -- 10 ms
assertMotor "light = 55" motor (37, 37)
atomically $ writeTBQueue envQ (RealEnv 0 0)
threadDelay 100000 -- 10 ms
assertMotor "light = 0" motor (0, 75)
atomically $ writeTBQueue envQ (RealEnv 100 0)
threadDelay 100000 -- 10 ms
assertMotor "light = 100" motor (75, 0)
setLoop t