diff --git a/src/SampleApp.WinDesktop/MainWindow.xaml b/src/SampleApp.WinDesktop/MainWindow.xaml
index c4a1144..a69cacf 100644
--- a/src/SampleApp.WinDesktop/MainWindow.xaml
+++ b/src/SampleApp.WinDesktop/MainWindow.xaml
@@ -49,6 +49,41 @@
HorizontalScrollBarVisibility="Visible"
/>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1200
+ 2400
+ 4800
+ 9600
+ 19200
+ 38400
+ 57600
+ 115200
+
+
+
+
+
+
+
diff --git a/src/SampleApp.WinDesktop/MainWindow.xaml.cs b/src/SampleApp.WinDesktop/MainWindow.xaml.cs
index f2979b8..603be88 100644
--- a/src/SampleApp.WinDesktop/MainWindow.xaml.cs
+++ b/src/SampleApp.WinDesktop/MainWindow.xaml.cs
@@ -21,20 +21,64 @@ namespace SampleApp.WinDesktop
public partial class MainWindow : Window
{
private Queue messages = new Queue(101);
-
+ private NmeaParser.NmeaDevice currentDevice;
+ //Dialog for browsing to nmea log files
+ private Microsoft.Win32.OpenFileDialog nmeaOpenFileDialog = new Microsoft.Win32.OpenFileDialog()
+ {
+ Filter = "Text files|*.txt|NMEA Log|*.nmea|All files|*.*",
+ InitialDirectory = new System.IO.FileInfo(typeof(MainWindow).Assembly.Location).DirectoryName
+ };
public MainWindow()
{
InitializeComponent();
- // Use serial port:
- //var comPort = System.IO.Ports.SerialPort.GetPortNames().First();
- //var port = new System.IO.Ports.SerialPort(comPort, 4800);
- //var device = new NmeaParser.SerialPortDevice(port);
+ //Get list of serial ports for device tab
+ var availableSerialPorts = System.IO.Ports.SerialPort.GetPortNames().OrderBy(s=>s);
+ serialPorts.ItemsSource = availableSerialPorts;
+ serialPorts.SelectedIndex = 0;
+ // Use serial portName:
+ //var comPort = availableSerialPorts.First();
+ //var portName = new System.IO.Ports.SerialPort(comPort, 4800);
+ //var device = new NmeaParser.SerialPortDevice(portName);
//Use a log file for playing back logged data
var device = new NmeaParser.NmeaFileDevice("NmeaSampleData.txt");
- device.MessageReceived += device_MessageReceived;
- var _ = device.OpenAsync();
+
+ StartDevice(device);
+ }
+
+ ///
+ /// Unloads the current device, and opens the next device
+ ///
+ ///
+ private void StartDevice(NmeaParser.NmeaDevice device)
+ {
+ //Clean up old device
+ if (currentDevice != null)
+ {
+ currentDevice.MessageReceived -= device_MessageReceived;
+ currentDevice.Dispose();
+ }
+ output.Text = "";
+ messages.Clear();
+ gprmcView.Message = null;
+ gpggaView.Message = null;
+ gpgsaView.Message = null;
+ gpgllView.Message = null;
+ pgrmeView.Message = null;
+ satView.GpgsvMessages = null;
+ //Start new device
+ currentDevice = device;
+ currentDevice.MessageReceived += device_MessageReceived;
+ var _ = currentDevice.OpenAsync();
+ if (device is NmeaParser.NmeaFileDevice)
+ currentDeviceInfo.Text = string.Format("NmeaFileDevice( file={0} )", ((NmeaParser.NmeaFileDevice)device).Filename);
+ else if (device is NmeaParser.SerialPortDevice)
+ {
+ currentDeviceInfo.Text = string.Format("SerialPortDevice( port={0}, baud={1} )",
+ ((NmeaParser.SerialPortDevice)device).Port.PortName,
+ ((NmeaParser.SerialPortDevice)device).Port.BaudRate);
+ }
}
private void device_MessageReceived(object sender, NmeaParser.NmeaMessageReceivedEventArgs args)
@@ -64,5 +108,102 @@ namespace SampleApp.WinDesktop
pgrmeView.Message = args.Message as NmeaParser.Nmea.Gps.Garmin.Pgrme;
});
}
+
+ //Browse to nmea file and create device from selected file
+ private void OpenNmeaLogButton_Click(object sender, RoutedEventArgs e)
+ {
+ var result = nmeaOpenFileDialog.ShowDialog();
+ if (result.HasValue && result.Value)
+ {
+ var file = nmeaOpenFileDialog.FileName;
+ var device = new NmeaParser.NmeaFileDevice(file);
+ StartDevice(device);
+ }
+ }
+
+ //Creates a serial port device from the selected settings
+ private void ConnectToSerialButton_Click(object sender, RoutedEventArgs e)
+ {
+ var portName = serialPorts.Text as string;
+ var baudRate = int.Parse(baudRates.Text);
+ var device = new NmeaParser.SerialPortDevice(new System.IO.Ports.SerialPort(portName, baudRate));
+ StartDevice(device);
+ }
+
+ //Attempts to perform an auto discovery of serial ports
+ private async void AutoDiscoverButton_Click(object sender, RoutedEventArgs e)
+ {
+ var button = sender as Button;
+ button.IsEnabled = false;
+ System.IO.Ports.SerialPort port = await Task.Run(() => {
+ return FindPort(
+ new System.Progress((s) => { Dispatcher.BeginInvoke((Action)delegate() { autoDiscoverStatus.Text = s; }); }));
+ });
+ if (port != null) //we found a port
+ {
+ autoDiscoverStatus.Text = "";
+ serialPorts.Text = port.PortName;
+ baudRates.Text = port.BaudRate.ToString();
+ ConnectToSerialButton_Click(sender, e);
+ }
+ else
+ autoDiscoverStatus.Text = "No GPS port found";
+ button.IsEnabled = false;
+ }
+
+ //Iterates all serial ports and attempts to open them at different baud rates
+ //and looks for a GPS message.
+ private static System.IO.Ports.SerialPort FindPort(IProgress progress = null)
+ {
+ var ports = System.IO.Ports.SerialPort.GetPortNames().OrderBy(s => s);
+ foreach (var portName in ports)
+ {
+ using (var port = new System.IO.Ports.SerialPort(portName))
+ {
+ var defaultRate = port.BaudRate;
+ List baudRatesToTest = new List(new[] { 9600, 4800, 115200, 19200, 57600, 38400, 2400 }); //Ordered by likelihood
+ //Move default rate to first spot
+ if (baudRatesToTest.Contains(defaultRate)) baudRatesToTest.Remove(defaultRate);
+ baudRatesToTest.Insert(0, defaultRate);
+ foreach (var baud in baudRatesToTest)
+ {
+
+ if (progress != null)
+ progress.Report(string.Format("Trying {0} @ {1}baud", portName, port.BaudRate));
+ port.BaudRate = baud;
+ port.ReadTimeout = 2000; //this might not be long enough
+ bool success = false;
+ try
+ {
+ port.Open();
+ if (!port.IsOpen)
+ continue; //couldn't open port
+ try
+ {
+ port.ReadTo("$GP");
+ }
+ catch (TimeoutException)
+ {
+ continue;
+ }
+ }
+ catch
+ {
+ //Error reading
+ }
+ finally
+ {
+ port.Close();
+ }
+ if (success)
+ {
+ port.Dispose();
+ return new System.IO.Ports.SerialPort(portName, baud);
+ }
+ }
+ }
+ }
+ return null;
+ }
}
}