Terminal demo program
authorJoachim Breitner <mail@joachim-breitner.de>
Sun, 9 Mar 2014 21:04:38 +0000 (22:04 +0100)
committerJoachim Breitner <mail@joachim-breitner.de>
Sun, 9 Mar 2014 21:04:38 +0000 (22:04 +0100)
src/LedXML.hs
src/Screen.hs
src/Terminal.hs
src/terminal-main.hs [new file with mode: 0644]

index 5be2aa6..c586fc5 100644 (file)
@@ -38,6 +38,7 @@ xmlToScreenElement f e
         readFromGif $ "icons" </> basename ++ ".gif"
   | n == "thintext" = return $ text thinfont (strContent e)
   | n == "text"     = return $ text f (strContent e)
+  | n == "bright"   = return $ brightScreenElem
   | otherwise = error $ "Unknown element  " ++ show e
 
   where
index e6cbc1f..3902858 100644 (file)
@@ -187,3 +187,6 @@ transitions = M.fromList
     , ("rollup", rollUp)
     ]
 
+brightScreenElem :: ScreenElement
+brightScreenElem = ScreenElement (0,0) $ \r _ -> generateScreen r (\ _ _ -> True)
+
index 4155919..660857b 100644 (file)
@@ -12,9 +12,10 @@ openTerminal cont = do
     setSGR [SetColor Foreground Vivid Green]
     hideCursor
     let upd i = do
-        clearScreen
-        putStr $ unlines
-            [ [ if pixAt i x y then '★' else ' ' | x <- [0..wIDTH-1]] | y <- [0..hEIGHT-1] ]
+            clearScreen
+            putStr $ unlines
+                [ concat [ if pixAt i x y then "★★" else "  "
+                | x <- [0..wIDTH-1]] | y <- [0..hEIGHT-1] ]
     cont upd `finally` (showCursor >> setSGR [Reset])
 
 
diff --git a/src/terminal-main.hs b/src/terminal-main.hs
new file mode 100644 (file)
index 0000000..f9b9140
--- /dev/null
@@ -0,0 +1,44 @@
+import qualified Data.Map as M
+import System.Environment
+import Control.Concurrent
+import System.FSNotify
+import System.FilePath
+import qualified Filesystem.Path.CurrentOS as FP
+import Data.IORef
+
+import Types
+import Screen
+import Fonts
+import LedXML
+import Terminal
+
+main = openTerminal $ \setScreen -> do
+    font <- readFont
+    [filename] <- getArgs
+    elemRef <- reReadFile (readXMLFile font) filename 
+
+    renderLoop setScreen elemRef
+
+reReadFile :: (FilePath -> IO a) -> FilePath -> IO (IORef a)
+reReadFile read name = do
+    let name' = FP.decodeString name
+    x <- read name
+    ref <- newIORef x
+    manager <- startManager
+    watchDir manager (FP.directory name')
+        (\e -> case e of Modified p _ -> FP.filename p == FP.filename name'
+                         Added p _    -> FP.filename p == FP.filename name'
+                         _            -> False)
+        (\e -> read name >>= writeIORef ref)
+    return ref
+
+
+renderLoop :: (Elem -> IO a) -> IORef ScreenElement -> IO a
+renderLoop setScreen elemRef = go 0
+  where
+    go n = do
+        elem <- readIORef elemRef
+        setScreen (seRender elem (wIDTH, hEIGHT) n)
+        threadDelay fRAME_DELAY
+        go (n+1)
+