Regularily write .png file
authorJoachim Breitner <mail@joachim-breitner.de>
Sat, 27 Jun 2009 08:47:36 +0000 (10:47 +0200)
committerJoachim Breitner <mail@joachim-breitner.de>
Sat, 27 Jun 2009 08:47:36 +0000 (10:47 +0200)
src/Lseed/Data.hs
src/Lseed/Mainloop.hs
src/Lseed/Renderer/Cairo.hs
src/dbclient.hs

index 5ad19c1..4719440 100644 (file)
@@ -85,9 +85,9 @@ data ScreenContent = ScreenContent
 data Observer = Observer {
        -- | Called once per season, before the main loop starts
          obInit :: IO ()
-       -- | Called once per tick, with the current tick number and the current
-       -- state of the garden
-       , obState :: Integer -> GrowingGarden -> IO ()
+       -- | Called once per tick, with the current tick number corresponding
+       -- light angle and the current state of the garden
+       , obState :: Integer -> Angle -> GrowingGarden -> IO ()
        -- | Also called once per tick, with a function that calculates the
        -- information that should be displayed given a point in time
        , obGrowingState :: (ClockTime -> ScreenContent) -> IO ()
@@ -96,7 +96,7 @@ data Observer = Observer {
        -- | Called once before program termination
        , obShutdown :: IO ()
        }
-nullObserver = Observer (return ()) (\_ _ -> return ()) (\_ -> return ()) (\_ -> return ()) (return ())
+nullObserver = Observer (return ()) (\_ _ -> return ()) (\_ -> return ()) (\_ -> return ()) (return ())
 
 -- | Methods to get the initial garden and the updated code when a plant multiplies
 data GardenSource = GardenSource {
index 9b61cb8..6b30876 100644 (file)
@@ -47,7 +47,7 @@ lseedMainLoop rt obs gardenSource maxDays = do
                let growingGarden = growGarden sampleAngle rgen newGarden
 
 
-               obState obs tick garden
+               obState obs tick sampleAngle garden
                when rt $ do
                        obGrowingState obs $ \later -> 
                                let tickDiff = timeSpanFraction tickLength tickStart later
index ee74044..abd862e 100644 (file)
@@ -20,6 +20,23 @@ import Data.Ord
 colors :: [ (Double, Double, Double) ]
 colors = cycle $ [ (r,g,b) | r <- [0.0,0.4], b <- [0.0, 0.4], g <- [1.0,0.6,0.8]]
 
+pngDailyObserver :: FilePath -> Observer
+pngDailyObserver filename = nullObserver {
+       obState = \_ angle garden -> do
+               let (w,h) = (800,400)
+               withImageSurface FormatRGB24 w h $ \sur -> do
+                       renderWith sur $ do
+                               -- Set up coordinates
+                               translate 0 (fromIntegral h)
+                               scale 1 (-1)
+                               scale (fromIntegral w) (fromIntegral w)
+                               translate 0 groundLevel
+                               setLineWidth stipeWidth
+
+                               render angle (annotateGarden angle garden)
+                       surfaceWriteToPNG sur filename
+       }
+
 pngObserver :: IO Observer
 pngObserver = return $ nullObserver {
        obFinished = \garden -> do
index c1b2cab..17d4b2b 100644 (file)
@@ -52,9 +52,9 @@ scoringObs conf = nullObserver {
 main = do
        args <- getArgs
        case args of
-         [conf] -> do
+         [conf, pngfile] -> do
                obs <- cairoObserver
-               let obs' = obs `mappend` scoringObs conf
+               let obs' = obs `mappend` scoringObs conf `mappend` pngDailyObserver pngfile
                lseedMainLoop True
                              obs'
                              (GardenSource (getDBGarden conf) (getDBUpdate conf))
@@ -62,4 +62,4 @@ main = do
                obShutdown obs'
          _ -> do
                putStrLn "L-Seed DB client application."
-               putStrLn "Please pass DB configuration file on the command line."
+               putStrLn "Please pass DB configuration file and a PNG file to write on the command line."