TORCS-0.1.0: Examples/Simple.hs
{-# LANGUAGE Arrows #-}
{-# LANGUAGE MultiWayIf #-}
{-# LANGUAGE RecordWildCards #-}
module Main where
import FRP.Yampa
import TORCS
import Debug.Trace
main :: IO ()
main = (startDriver $ myDriver 100) >>= print
myDriver :: Double -> Driver
myDriver targetSpeed = proc CarState{..} -> do
g <- arr shifting -< (rpm,gear')
s <- arr steering -< (angle,trackPos)
a <- arr (gas targetSpeed) -< (speedX,s)
m <- arr endRace -< (lapTimes,curLapTime)
returnA -< defaultDriveState {accel = a, gear = g, steer = s, meta = m}
shifting :: (Double,Int) -> Int
shifting (rpm,g) = if
| rpm > 7000 -> min 6 (g+1)
| rpm < 3000 -> max 1 (g-1)
| otherwise -> g
steering :: (Double,Double) -> Double
steering (spd,trackPos) = let
turns = spd*14 / pi
centering = turns - (trackPos*0.1)
clip x = max (-1) $ min x 1
in
clip centering
gas :: Double -> (Double,Double) -> Double
gas targetSpeed (speed,steer) =
if speed < (targetSpeed-(steer*50)) then 0.5 else 0
-- | Run 3 laps then stop the simulation
endRace :: ([Double],Double) -> Int
endRace (lapTs,ct) =
if (length lapTs >= 2) || ct > timeout then 1 else 0
where
timeout = 200