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); } }
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; }