예제 #1
0
        public async Task Execute <TMessage>(IDeviceDefinition <TMessage> definition, Func <int, TMessage> messageFactory = null)
        {
            async Task HandleStream(IDeviceAdapter device)
            {
                if (device.TryOpen(out var stream))
                {
                    using (stream ?? throw new ApplicationException())
                    {
                        var streamDevice = new StreamDevice <TMessage>(device, definition, _token);//stream,
                        streamDevice.MessageReceived += (s, e) => Console.WriteLine(e);
                        // streamDevice.DeviceStatus += (s, e) => Console.WriteLine($"Status: {e}");
                        streamDevice.MessageReceivedError += (s, e) =>
                        {
                            Console.Error.WriteLine(e.Exception.Message);
                            e.ErrorHandling = ErrorHandling.Ignore;
                        };
                        streamDevice.MessageTrasmitterError += (s, e) =>
                        {
                            Console.Error.WriteLine(e.Exception.Message);
                            e.ErrorHandling = ErrorHandling.Ignore;
                        };

                        Task?uiTasks = null;
                        if (messageFactory != null && streamDevice is IDeviceTransmitter <TMessage> transmitter)
                        {
                            uiTasks = UserInteractionAsync(transmitter, messageFactory);
                        }

                        await Task.WhenAll(
                            Task.Run(() =>
                        {
                            Console.WriteLine("Enter to exit");
                            Console.ReadLine();
                            _tokenSource.Cancel();
                            Console.WriteLine("Done!");
                        }, _tokenSource.Token),
                            uiTasks ?? Task.FromResult(0),
                            streamDevice.Runner
                            );
                    }
                }
                throw new ApplicationException($"{device} Not found");
            }

            if (usbHid.CanGetDevice(definition))
            {
                var device = GetHidDevice(definition);
                await HandleStream(device);
            }
            else if (serial.CanGetDevice(definition))
            {
                var device = GetSerialPort(definition);
                await HandleStream(device);
            }
        }
예제 #2
0
        private void touraufzeichnungStartenToolStripMenuItem_Click(object sender, EventArgs e)
        {
            wifiFoundDelegate = WiFiFound;
            scanThreadEnded   = false;
            lockVictim        = new object();
            messageStats      = new Dictionary <string, int>();
            validGpsSignal    = false;
            DirectoryInfo tourStorageDir = new DirectoryInfo("tours");

            if (!tourStorageDir.Exists)
            {
                tourStorageDir.Create();
                tourStorageDir.Refresh();
            }

            wlanClient      = new WlanClient();
            usableInterface = null;
            foreach (WlanClient.WlanInterface device in wlanClient.Interfaces)
            {
                if (device.InterfaceState == Wlan.WlanInterfaceState.Disconnected)
                {
                    usableInterface = device;
                    break;
                }
                Console.WriteLine("Can't use {0}, it is in state {1}.", device.InterfaceDescription, device.InterfaceState);
            }
            if (usableInterface == null)
            {
                MessageBox.Show("Es ist kein WLAN-Gerät verfügbar!");
                return;
            }

            switch (context.Ini["gps"]["connType"])
            {
            case "tcp":
                string    ip        = context.Ini["gps"]["tcp_ip"];
                ushort    port      = Convert.ToUInt16(context.Ini["gps"]["tcp_port"]);
                TcpClient tcpClient = new TcpClient();
                tcpClient.Connect(ip, port);
                nmeaStream = tcpClient.GetStream();
                break;

            case "serial":
                string     comPort = context.Ini["gps"]["serial_port"];
                int        baud    = Convert.ToInt32(context.Ini["gps"]["serial_baud"]);
                SerialPort sp      = new SerialPort(comPort, baud);
                sp.Open();
                nmeaStream = sp.BaseStream;
                break;

            default:
                MessageBox.Show(String.Format("\"{0}\" ist kein gültiger GPS-Transport.", context.Ini["gps"]["connType"]));
                break;
            }

            nmeaStreamDevice = new StreamDevice(nmeaStream);
            nmeaStreamDevice.MessageReceived += NmeaStreamDevice_MessageReceived;
            if (!nmeaStreamDevice.IsOpen)
            {
                Task task = nmeaStreamDevice.OpenAsync();
                task.Wait();
            }
            tourRecording = true;
            context.MainForm.SetStatusBar("Nmea gestartet!");

            FileInfo tourFileName = new FileInfo(Path.Combine(tourStorageDir.FullName, DateTime.Now.Ticks.ToString() + ".csv"));

            tourStreamWriter = new StreamWriter(tourFileName.OpenWrite(), Encoding.UTF8);
            tourStreamWriter.WriteLine("Azusa Warwalking Tour");
            tourStreamWriter.WriteLine(Path.GetFileNameWithoutExtension(tourFileName.Name));

            usableInterface.WlanConnectionNotification += UsableInterface_WlanConnectionNotification;
            usableInterface.WlanNotification           += UsableInterface_WlanNotification;
            usableInterface.WlanReasonNotification     += UsableInterface_WlanReasonNotification;

            wlanScanThread          = new Thread(WlanScanThread);
            wlanScanThread.Priority = ThreadPriority.Lowest;
            wlanScanThread.Name     = "WiFi Sniffer";
            wlanScanThread.Start();

            touraufzeichnungStartenToolStripMenuItem.Enabled = false;
            aufzeichnungBeendenToolStripMenuItem.Enabled     = true;
        }