module EventLoop.Output.Single (outSingle) where
import qualified Network.Socket as S
import qualified Network.WebSockets as WS
import qualified Data.Text as T
import EventLoop.EventProcessor (sendResponse, IOMessage)
import EventLoop.Output.OutputEvent
import EventLoop.Output.Graphical
import EventLoop.Output.SystemMessage
import EventLoop.Config
import EventLoop.Json
import EventLoop.CommonTypes
outSingle :: OutputEvent -> IO ()
outSingle out = S.withSocketsDo $ do
sock <- WS.makeSocket ipadres (fromIntegral port)
pendingConn <- WS.makePendingConnection sock
conn <- WS.acceptRequest pendingConn
sendResponse conn setup
sendResponse conn out'
sendResponse conn close
WS.sendClose conn (T.pack "")
WS.closeSocket sock
return ()
where
setup = toIOMessage (setupMessage out)
out' = toIOMessage out
close = toIOMessage closeMessage
setupMessage :: OutputEvent -> OutputEvent
setupMessage (OutGraphical (Draw g _)) = OutSysMessage [CanvasSetup dim]
where
dim = maxDimensions g
setupMessage _ = OutSysMessage [CanvasSetup (512, 512)]
closeMessage :: OutputEvent
closeMessage = OutSysMessage [Close]
toIOMessage :: OutputEvent -> IOMessage
toIOMessage = toJsonMessage
maxDimensions :: GObject -> Dimension
maxDimensions (GObject _ prim []) = maxDimensionsPrim prim
maxDimensions (GObject n prim (c:cs)) = (max h h', max w w')
where
(h, w) = maxDimensions c
(h', w') = maxDimensions (GObject n prim cs)
maxDimensions (Container []) = (0, 0)
maxDimensions (Container (c:cs)) = (max h h', max w w')
where
(h, w) = maxDimensions c
(h', w') = maxDimensions (Container cs)
maxDimensionsPrim :: Primitive -> Dimension
maxDimensionsPrim (Text _ _ _ (x, y) size _ str fromCenter) | fromCenter = (y + size / 2, x + (fromIntegral $ length str * 10) / 2)
| otherwise = (y + size, x + (fromIntegral $ length str * 10))
maxDimensionsPrim (Line _ _ []) = (0, 0)
maxDimensionsPrim (Line _ _ [(x, y)]) = (y, x)
maxDimensionsPrim (Line ec et ((x, y):xs)) = (max y y', max x x')
where
(y', x') = maxDimensionsPrim (Line ec et xs)
maxDimensionsPrim (Rect _ _ _ (x, y) (h, w)) = (y + h / 2, x + w / 2)
maxDimensionsPrim (Arc _ _ _ (x, y) r _ _) = (y + r, x + r)