109 lines
4.0 KiB
Haskell
109 lines
4.0 KiB
Haskell
|
{-# LANGUAGE NoImplicitPrelude #-}
|
||
|
{-# LANGUAGE TemplateHaskell #-}
|
||
|
module Main (main) where
|
||
|
|
||
|
import Import
|
||
|
import Data.Aeson (eitherDecodeFileStrict')
|
||
|
import Control.Monad.Managed
|
||
|
import Control.Concurrent
|
||
|
import DearImGui
|
||
|
import DearImGui.OpenGL3
|
||
|
import DearImGui.GLFW
|
||
|
import DearImGui.GLFW.OpenGL
|
||
|
import Run
|
||
|
import RIO.Process
|
||
|
import System.Directory
|
||
|
import Options.Applicative.Simple
|
||
|
import qualified Paths_ibhelper
|
||
|
import qualified Graphics.UI.GLFW as GLFW
|
||
|
import qualified Data.Text as T
|
||
|
import Prelude (putStrLn)
|
||
|
import AppFiller
|
||
|
|
||
|
|
||
|
main :: IO ()
|
||
|
main = do
|
||
|
(options, ()) <- simpleOptions
|
||
|
$(simpleVersion Paths_ibhelper.version)
|
||
|
"Header for command line arguments"
|
||
|
"Program description, also for command line arguments"
|
||
|
(Options
|
||
|
<$> switch ( long "verbose"
|
||
|
<> short 'v'
|
||
|
<> help "Verbose output?"
|
||
|
)
|
||
|
)
|
||
|
empty
|
||
|
settingsFileExists <- doesFileExist "settings.json"
|
||
|
settings <- if settingsFileExists
|
||
|
then do
|
||
|
s <- fmap unDefaultJSON <$> eitherDecodeFileStrict' "settings.json"
|
||
|
pPrint s
|
||
|
case s of
|
||
|
Left e -> putStrLn ("Error loading settings: \n"<>e) >> return def
|
||
|
Right s' -> return s'
|
||
|
else return def
|
||
|
lo <- logOptionsHandle stderr (optionsVerbose options)
|
||
|
<&> setLogMinLevel (settings ^. logLevel)
|
||
|
<&> setLogTerminal True
|
||
|
pc <- mkDefaultProcessContext
|
||
|
withLogFunc lo $ \lf -> do
|
||
|
-- let bare_log = unLogFunc $ view logFuncL lf
|
||
|
-- logErr = liftIO . bare_log callStack "" LevelError
|
||
|
initialized <- GLFW.init
|
||
|
unless initialized $ error "GLFW init failed"
|
||
|
|
||
|
liftIO $ runManaged $ do
|
||
|
mwin <- managed $ bracket
|
||
|
(GLFW.createWindow (settings ^. windowParams . windowWidth) (settings ^. windowParams . windowHeight) "IB-Helper" Nothing Nothing)
|
||
|
(maybe (return ()) GLFW.destroyWindow)
|
||
|
case mwin of
|
||
|
Just win -> do
|
||
|
liftIO $ do
|
||
|
GLFW.makeContextCurrent (Just win)
|
||
|
GLFW.swapInterval 1
|
||
|
|
||
|
-- Create an ImGui context
|
||
|
_ <- managed $ bracket createContext destroyContext
|
||
|
|
||
|
-- Create an ImPlot context
|
||
|
-- _ <- managed $ bracket createPlotContext destroyPlotContext
|
||
|
|
||
|
-- Initialize ImGui's GLFW backend
|
||
|
_ <- managed_ $ bracket_ (glfwInitForOpenGL win True) glfwShutdown
|
||
|
|
||
|
-- Initialize ImGui's OpenGL backend
|
||
|
_ <- managed_ $ bracket_ openGL3Init openGL3Shutdown
|
||
|
|
||
|
twsConnectionRefsHost <- liftIO $ atomically $ newTVar $ settings ^. twsConnection . host . to T.unpack
|
||
|
twsConnectionRefsPort <- liftIO $ atomically $ newTVar $ settings ^. twsConnection . port . to T.unpack
|
||
|
twsConnectionStatus <- liftIO $ atomically $ newTVar $ TWSDisconnected
|
||
|
twsConnectionSend <- liftIO $ atomically $ newTQueue
|
||
|
twsConnectionRecieve <- liftIO $ atomically $ newTQueue
|
||
|
let twsConnectionRefs = TWSConnectionRefs{..}
|
||
|
liftIO $ atomically $ writeTQueue twsConnectionSend $ Msg_IB_OUT $ IB_RequestMarketDataType DelayedFrozen
|
||
|
currentAccount <- liftIO $ newTVarIO $ Nothing
|
||
|
tickerIdToSymbol <- liftIO $ newTVarIO $ mempty
|
||
|
appCharts <- liftIO $ newTVarIO $ mempty
|
||
|
appData <- liftIO $ DataRefs
|
||
|
<$> newTVarIO mempty
|
||
|
<*> newTVarIO Nothing
|
||
|
<*> newTVarIO mempty
|
||
|
<*> newTVarIO mempty
|
||
|
let app = App
|
||
|
{ appSettings = settings
|
||
|
, appLogFunc = lf
|
||
|
, appProcessContext = pc
|
||
|
, appOptions = options
|
||
|
, appWindow = win
|
||
|
, appRefs = AppRefs{..}
|
||
|
, appData = appData
|
||
|
}
|
||
|
void $ liftIO $ forkIO $ appFiller app
|
||
|
liftIO $ runRIO app run
|
||
|
Nothing -> do
|
||
|
error "GLFW createWindow failed"
|
||
|
|
||
|
GLFW.terminate
|
||
|
|