static void Main(String[] args) { TextWriter recordWriter = null; String port = null; String telemetryPath = null; bool serialTest = false; bool chopTest = false; int chopInterval = 10; // msec int chopStep = 100; // Units for (int i = 0; i < args.Length; ++i) { if (args[i] == "--record") { ++i; if ((i < args.Length) && !args[i].StartsWith("--")) { recordWriter = new StreamWriter(args[i]); } else { recordWriter = Console.Out; } } else if (args[i] == "--port") { port = args[++i]; } else if (args[i] == "--telemetry") { telemetryPath = args[++i]; } else if (args[i] == "--serialtest") { serialTest = true; } else if (args[i] == "--choptest") { chopTest = true; chopInterval = Int32.Parse(args[++i]); chopStep = Int32.Parse(args[++i]); } else { Console.WriteLine("Unrecognized command line option: ", args[i]); return; } } if (serialTest) { SerialTest(port); return; } Action<string> write; Func<string> read; if (port == null) { write = (s) => Console.WriteLine(s); read = () => { Thread.Sleep(Int32.MaxValue); return ""; }; } else { SerialPort serialPort = new SerialPort(port, 9600); serialPort.RtsEnable = true; serialPort.Open(); write = (s) => serialPort.WriteLine(s); read = () => serialPort.ReadLine(); } Action<string> reportTelemetry; if (telemetryPath == null) { reportTelemetry = (s) => Console.WriteLine(s); } else { StreamWriter file = new StreamWriter(telemetryPath); reportTelemetry = (s) => file.WriteLine(s); } StatsDialog stats = new StatsDialog(); ConfigDialog config = new ConfigDialog(MakeConfigurator(write)); var writeQueue = new BlockingCollection<string>(); var readQueue = new BlockingCollection<string>(); Thread writeWorker = new Thread(delegate() { while (true) { write(writeQueue.Take()); } }); Thread readWorker = new Thread(delegate() { while(true) { readQueue.Add(read()); } }); Thread worker = new Thread(delegate() { Drive(BMSSource(), recordWriter, (s) => writeQueue.Add(s), StatsReporter(stats)); }); Thread telemetryWorker = new Thread(delegate() { while (true) { reportTelemetry(readQueue.Take()); } }); telemetryWorker.Start(); writeWorker.Start(); readWorker.Start(); if (chopTest) { writeQueue.Add("M BL 9000"); writeQueue.Add("M BL 9000"); Thread.Sleep(1000); for (int pos = 9000; pos > 1000; pos -= chopStep) { writeQueue.Add(String.Format("M BL {0}", pos)); writeQueue.Add(String.Format("M BR {0}", pos)); Thread.Sleep(chopInterval); } } else { worker.Start(); config.Show(); System.Windows.Forms.Application.Run(stats); } }
static Action<Stats> StatsReporter(StatsDialog dlg) { return (Action<Stats>) ((stats) => { dlg.BeginInvoke((Action) (() => { dlg.Update(stats); })); }); }