-- A classic Ping-Pong example. import Control.Monad.Trans import Simulation.Aivika delta = 1.0 specs = Specs { spcStartTime = 0, spcStopTime = 10 * delta, spcDT = delta, spcMethod = RungeKutta4, spcGeneratorType = SimpleGenerator } model :: Simulation () model = do pingSource <- newSignalSource pongSource <- newSignalSource let pingSignal = publishSignal pingSource pongSignal = publishSignal pongSource ping = do holdProcess delta liftEvent $ traceEvent "ping" $ triggerSignal pingSource () processAwait pongSignal ping pong = do processAwait pingSignal liftEvent $ traceEvent "pong" $ triggerSignal pongSource () pong runProcessInStartTime ping runProcessInStartTime pong runEventInStopTime $ traceEvent "end" $ return () main = runSimulation model specs