module Numeric.HFoil.Repl( run
) where
import System.Console.Haskeline hiding(display)
import Graphics.Gloss.Interface.IO.Animate hiding(scale, Vector)
import Control.Monad.IO.Class
import Control.Concurrent(forkIO)
import Control.Concurrent.MVar(newMVar, readMVar, swapMVar)
import Numeric.HFoil.Foil
import Numeric.HFoil.Naca4
import Numeric.HFoil.Drawing
import Numeric.HFoil.Flow
nPanels :: Int
nPanels = 200
xSize, ySize :: Int
xSize = 800
ySize = 500
run :: IO ()
run = do
let naca0 = "2412"
alfaDeg0 = 4
flow0 = solveFlow (panelizeNaca4 (naca4 naca0) nPanels) (pi/180*alfaDeg0)
mpics <- newMVar $ [drawSolution flow0]
putStrLn "Welcome to hfoil\n"
_ <- forkIO $ runInputT defaultSettings (topLoop (\pics -> swapMVar mpics pics >>= (\_ -> return ())))
animateIO
(InWindow
"hfoil"
(xSize, ySize)
(10, 650))
black
(\_ -> readMVar mpics >>= return . pictures)
foilLoop :: ([Picture] -> IO ()) -> Foil Double -> InputT IO ()
foilLoop draw foil@(Foil _ name) = do
minput <- getInputLine $ "\ESC[1;32m\STXhfoil."++name++">> \ESC[0m\STX"
case minput of
Nothing -> return ()
Just "quit" -> do outputStrLn "gloss won't let you quit :(\ntry ctrl-c or hit ESC in drawing window"
foilLoop draw foil
Just ('a':'l':'f':'a':' ':[]) -> do outputStrLn $ "unrecognized command"
foilLoop draw foil
Just ('a':'l':'f':'a':' ':alphaDeg) -> do let flow = solveFlow foil (pi/180*(read alphaDeg))
liftIO $ draw $ [drawSolution flow]
foilLoop draw foil
Just "" -> return ()
Just input -> do outputStrLn $ "unrecognized command \"" ++ input ++ "\""
foilLoop draw foil
topLoop :: ([Picture] -> IO ()) -> InputT IO ()
topLoop draw = do
minput <- getInputLine "\ESC[1;32m\STXhfoil>> \ESC[0m\STX"
case minput of
Nothing -> return ()
Just "quit" -> do outputStrLn "gloss won't let you quit :(\ntry ctrl-c or hit ESC in drawing window"
topLoop draw
Just ('n':'a':'c':'a':' ':spec) -> do parseNaca draw spec
topLoop draw
Just ('l':'o':'a':'d':' ':name) -> do
foil <- liftIO (loadFoil name)
case foil of Left errMsg -> outputStrLn errMsg
Right foil' -> do liftIO $ draw [drawFoil foil', drawNormals foil']
foilLoop draw foil'
topLoop draw
Just ('u':'i':'u':'c':' ':name) -> do
efoil <- liftIO (getUIUCFoil name)
case efoil of Left errMsg -> outputStrLn errMsg
Right foil -> do liftIO $ draw [drawFoil foil, drawNormals foil]
foilLoop draw foil
topLoop draw
Just "" -> topLoop draw
Just input -> do outputStrLn $ "unrecognized command \"" ++ input ++ "\""
topLoop draw
parseNaca :: ([Picture] -> IO ()) -> String -> InputT IO ()
parseNaca draw str
| length str == 4 = do let foil = panelizeNaca4 (naca4 str :: Naca4 Double) nPanels
liftIO $ draw [drawFoil foil, drawNormals foil]
foilLoop draw foil
| otherwise = do outputStrLn $ "Not 4 digits"
return ()