module ParasitemiaUI.Main open System open System.IO open System.Threading open Emgu.CV open Emgu.CV.Structure open Logger open ParasitemiaCore.Utils open ParasitemiaCore.Config [] extern bool AttachConsole (int dwProcessId) [] [] let main args = // To redirect stdout to the attached console. AttachConsole -1 |> ignore // -1 to attach to the parent process. Log.LogDirectory <- Constants.USER_DIRECTORY_LOG #if DEBUG Log.ClearLogFiles () #endif Log.AvoidRepeatingIdenticalMessages <- true if Array.exists (fun e -> e = "--help" || e = "-h") args then Args.showArgsHelp () 0 else try Log.Info ">>>>> Starting of Parasitemia UI ..." // Log.Info "UI Version: %s" Utils.UIVersion TODO let result = match Args.parse args with | mode, debug -> let config = Config defaultParameters #if DEBUG Log.DebugLoggingEnabled <- true #else Log.DebugLoggingEnabled <- debug #endif Log.Info "Command line arguments: %s" (args |> String.concat " ") Log.Info "Configuration: %O" config // Log.Info "Settings from %s:\n%s" Settings.Instance.Path Settings.Instance.AsJson TODO match mode with | Args.CmdLine (input, output) -> if debug then config.Debug <- DebugOn output Directory.CreateDirectory output |> ignore use logFile = new StreamWriter (new FileStream (Path.Combine(output, "log.txt"), FileMode.Append, FileAccess.Write)) let listener = { new IListener with member this.NewEntry severity header mess = logFile.WriteLine (header + " : " + mess) } Log.AddListener listener Log.Info "=== New run : %O %s ===" DateTime.Now (if debug then "[DEBUG]" else "[RELEASE]") let files = match input with | Args.File file -> [ file ] | Args.Dir dir -> Directory.EnumerateFiles dir |> List.ofSeq use resultFile = new StreamWriter (new FileStream (Path.Combine (output, "results.txt"), FileMode.Append, FileAccess.Write)) let images = [ for file in files -> Path.GetFileNameWithoutExtension (FileInfo(file).Name), config.Copy (), new Image (file) ] Log.LogWithTime Types.Severity.INFO ( fun () -> match ParasitemiaCore.Analysis.doMultipleAnalysis images None with | Some results -> for id, result in results do let config, img = images |> List.pick (fun (id', config', img') -> if id' = id then Some (config', img') else None) img.Dispose () let total, infected = countCells result.Cells fprintf resultFile "File: %s %d %d %.2f (diameter: %O)\n" id total infected (100. * (float infected) / (float total)) config.RBCRadius | None -> fprintf resultFile "Analysis aborted" Some () ) "Whole analyze" |> ignore Log.RemoveListener listener 0 | Args.Window fileToOpen -> if debug then config.Debug <- DebugOn "." GUI.run config fileToOpen Log.Info "<<<<< Parasitemia UI closed" Log.Close () result with | ex -> Log.Fatal "Error: %A" ex Log.Close () 1