packages feed

lambda-devs-0.3.1: Example.hs

module Main where

import Data.DEVS.Simulation
import Example.Ship



{- 

--
-- SHIP 
--
data Ship = Ship {
      ship_mass :: Mass Double,
      ship_init_x :: Length Double,
      ship_init_y :: Length Double,
      ship_engine :: Engine
} deriving (Typeable)

data ShipCmd = ShipSetSpeed (Velocity Double) | ShipSetHeading (PlaneAngle Double)
             deriving (Eq, Ord)
data ShipEvent = ShipEventEngines Bool

instance Model Ship where
    type X Ship = ShipCmd
    type Y Ship = ShipEvent
    data S Ship = 
        ShipState {
          ship_x :: Length Double,
          ship_y :: Length Double,
          ship_bearing :: PlaneAngle Double,
          ship_vx :: Velocity Double,
          ship_vy :: Velocity Double,
          ship_thrust :: Thrust Double,
          ship_set_hdg :: PlaneAngle Double,
          ship_set_v :: Velocity Double
        }
    s0 ship = ShipState 
              { ship_x = ship_init_x ship
              , ship_y = ship_init_y ship
              , ship_bearing = 0 *~ degree
              , ship_vx = 0 *~ (meter / second)
              , ship_vy = 0 *~ (meter / second)
              , ship_thrust = 0 *~ (newton)
              , ship_set_hdg = 0 *~ degree
              , ship_set_v = 0 *~ (meter / second)
              }

instance DEVS Ship where
    lambda m s = undefined --ShipEventEngines (ship_v s == ship_set_v s)
    ta m s = t_infinity
    delta_int m s = s
    delta_ext m s t xs =
        let a = ((ship_thrust s) / (ship_mass m))
            ax = a * cos (ship_bearing s) 
            ay = a * sin (ship_bearing s)
            s' = s { ship_vx = ship_vx s + (ax * t)
                   , ship_vy = ship_vy s + (ay * t)
                   , ship_x = ship_x s + (ship_vx s * t)
                   , ship_y = ship_y s + (ship_vy s * t)
                   } 
        in s
    delta_con m s xs = undefined



--x = f / m

eng1 = Engine { engine_a = 1000 *~ newton, engine_rate = 13 *~ (liter / minute)}
eng1_sim = engineSim eng1
                     
instance CoupledModel Ship

--
-- TANK
--



instance DEVS Tank where
                         






instance ProcessorModel Tank where
--
-- ENGINE 
--

data Engine = Engine {
      engine_a :: Thrust Double,
      engine_rate :: FlowRate Double
    } deriving (Typeable)

data EngineCmd = EngineEnable | EngineDisable
               deriving (Ord, Eq)

instance Binary EngineCmd where

data EngineEvent = EngineEventThrust (Thrust Double)
              deriving (Typeable)

instance Binary EngineEvent where

instance Model Engine where
    type X Engine = EngineCmd
    type Y Engine = EngineEvent
    data S Engine =
        EngineState {
          engine_enabled :: Bool
        }
    s0 _ = EngineState { engine_enabled = False }

instance DEVS Engine where
    lambda m s = EngineEventThrust $ 
                 if (engine_enabled s) 
                 then engine_a m
                 else 0 *~ newton
    delta_int _ s = s
    delta_ext m s t xs = delta_con m s xs
    delta_con m s xs =
        let es = engine_enabled s
            sw = Set.member (if es then EngineDisable else EngineEnable) xs
            es' = if sw then not es else es
        in s { engine_enabled = es' }
    ta m _ = t_infinity

instance ProcessorModel Engine where


engineSim :: Engine -> Simulator Engine
engineSim = mkSimulator

-}