Esempio n. 1
0
        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);
            }
        }
Esempio n. 2
0
 static Action<Stats> StatsReporter(StatsDialog dlg)
 {
     return (Action<Stats>) ((stats) =>
                             {
                                 dlg.BeginInvoke((Action) (() => { dlg.Update(stats); }));
                             });
 }