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
-}