static void Main(string[] args) { var logger = LogManager.GetCurrentClassLogger(); logger.Log(LogLevel.Info, "Starting..."); try { var config = new ConfigurationBuilder() .SetBasePath(System.IO.Directory.GetCurrentDirectory()) //From NuGet Package Microsoft.Extensions.Configuration.Json .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .Build(); var servicesProvider = BuildDi(config); using (servicesProvider as IDisposable) { ILoggerFactory factory = servicesProvider.GetService <ILoggerFactory>(); Parser.Default.ParseArguments <Options>(args) .WithParsed(o => { //wait for exit signal Console.CancelKeyPress += delegate(object sender, ConsoleCancelEventArgs e) { e.Cancel = true; _closeWait.Set(); }; SerialSettings settings = new SerialSettings(); settings.Handshake = o.Handshake; settings.BaudRate = o.BaudRate; settings.PortName = o.PortName; settings.DataBits = o.DataBits; settings.Parity = o.Parity; settings.StopBits = o.StopBits; settings.ReadTimeout = o.ReadTimeout; settings.WriteTimeout = o.WriteTimeout; _instance = new DotnetNMEACLI(settings, factory); _closeWait.WaitOne(); }); } } catch (Exception ex) { // NLog: catch any exception and log it. logger.Error(ex, "Stopped program because of exception"); throw; } finally { logger.Log(LogLevel.Info, "Stopping..."); // Ensure to flush and stop internal timers/threads before application-exit (Avoid segmentation fault on Linux) LogManager.Shutdown(); } }
/// <summary> /// Constructor for DotnetNMEACLI instace, currently only supports serial sources. /// </summary> /// <param name="settings">All serial settings needed to open up the serial port and start reading NMEA0183 data</param> /// <param name="loggerFactory">Logger Factory used to created logger instances</param> public DotnetNMEACLI(SerialSettings settings, ILoggerFactory loggerFactory) { _logger = loggerFactory.CreateLogger <DotnetNMEACLI>(); _lineParser = new NMEA0183Parser(); _lineEmitter = new SerialLineReader(settings); _lineEmitter.OnLine += (line) => { try { var message = _lineParser.Parse(line); _logger.LogInformation("Parsed message with speaker {0} and type {1}", message.Speaker, message.Type); } catch (Exception e) { _logger.LogError("Exception while parsing line: {0}", e.Message); } }; }
/// <summary> /// /// </summary> /// <param name="settings"></param> public SerialLineReader(SerialSettings settings) { _cancelTokenSource = new CancellationTokenSource(); _dataWaitHandle = new EventWaitHandle(false, EventResetMode.ManualReset); _serialPort = new SerialPort(); _serialPort.PortName = settings.PortName; _serialPort.BaudRate = settings.BaudRate; _serialPort.Parity = settings.Parity; _serialPort.DataBits = settings.DataBits; _serialPort.StopBits = settings.StopBits; _serialPort.Handshake = settings.Handshake; _serialPort.ReadTimeout = settings.ReadTimeout; _serialPort.WriteTimeout = settings.WriteTimeout; _serialPort.DataReceived += (sender, args) => _dataWaitHandle.Set(); _serialPort.Open(); _readTask = Read(); }