/// <summary> /// Closes the device. /// </summary> /// <returns></returns> public async Task CloseAsync() { if (m_cts != null) { if (m_cts != null) { m_cts.Cancel(); } m_cts = null; } if (m_ParserTask != null) { await m_ParserTask; } if (m_stream != null) { await CloseStreamAsync(m_stream); } MultiPartMessageCache.Clear(); m_stream = null; lock (m_lockObject) { m_isOpening = false; IsOpen = false; } }
/// <summary> /// Opens the device connection. /// </summary> /// <returns></returns> public async Task OpenAsync() { lock (m_lockObject) { if (IsOpen) { return; } IsOpen = true; } m_cts = new System.Threading.CancellationTokenSource(); m_stream = await OpenStreamAsync(); StartParser(); MultiPartMessageCache.Clear(); }
/// <summary> /// Closes the device. /// </summary> /// <returns></returns> public async Task CloseAsync() { if (m_cts != null) { closeTask = new TaskCompletionSource <bool>(); if (m_cts != null) { m_cts.Cancel(); } m_cts = null; } await closeTask.Task; await CloseStreamAsync(m_stream); MultiPartMessageCache.Clear(); m_stream = null; lock (m_lockObject) IsOpen = false; }
private void OnMessageReceived(Nmea.NmeaMessage msg) { var args = new NmeaMessageReceivedEventArgs(msg); var multi = msg as IMultiPartMessage; if (multi != null) { args.IsMultipart = true; if (MultiPartMessageCache.ContainsKey(msg.MessageType)) { var dic = MultiPartMessageCache[msg.MessageType]; if (dic.ContainsKey(multi.MessageNumber - 1) && !dic.ContainsKey(multi.MessageNumber)) { dic[multi.MessageNumber] = msg; } else //Something is out of order. Clear cache { MultiPartMessageCache.Remove(msg.MessageType); } } else if (multi.MessageNumber == 1) { MultiPartMessageCache[msg.MessageType] = new Dictionary <int, Nmea.NmeaMessage>(multi.TotalMessages); MultiPartMessageCache[msg.MessageType][1] = msg; } if (MultiPartMessageCache.ContainsKey(msg.MessageType)) { var dic = MultiPartMessageCache[msg.MessageType]; if (dic.Count == multi.TotalMessages) //We have a full list { MultiPartMessageCache.Remove(msg.MessageType); args.MessageParts = dic.Values.ToArray(); } } } if (MessageReceived != null) { MessageReceived(this, args); } }
/// <summary> /// Opens the device connection. /// </summary> /// <returns></returns> public async Task OpenAsync() { lock (m_lockObject) { if (IsOpen || m_isOpening) { return; } m_isOpening = true; } m_cts = new CancellationTokenSource(); m_stream = await OpenStreamAsync(); StartParser(m_cts.Token); MultiPartMessageCache.Clear(); lock (m_lockObject) { IsOpen = true; m_isOpening = false; } }
private void OnMessageReceived(Nmea.NmeaMessage msg) { if (msg == null) { return; } Nmea.NmeaMessage[] messageParts = null; if (msg is IMultiPartMessage multi) { string messageType = msg.MessageType.Substring(2); //We don't care about the two first characters. Ie GPGSV, GLGSV, GAGSV etc are all part of the same multi-part message if (MultiPartMessageCache.ContainsKey(messageType)) { var dic = MultiPartMessageCache[messageType]; if (dic.ContainsKey(multi.MessageNumber - 1) && !dic.ContainsKey(multi.MessageNumber)) { dic[multi.MessageNumber] = msg; } else //Something is out of order. Clear cache { MultiPartMessageCache.Remove(messageType); } } else if (multi.MessageNumber == 1) { MultiPartMessageCache[messageType] = new Dictionary <int, Nmea.NmeaMessage>(multi.TotalMessages); MultiPartMessageCache[messageType][1] = msg; } if (MultiPartMessageCache.ContainsKey(messageType)) { var dic = MultiPartMessageCache[messageType]; if (dic.Count == multi.TotalMessages) //We have a full list { MultiPartMessageCache.Remove(messageType); messageParts = dic.Values.ToArray(); } } } MessageReceived?.Invoke(this, new NmeaMessageReceivedEventArgs(msg, messageParts)); }