示例#1
0
 /// <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;
     }
 }
示例#2
0
        /// <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();
        }
示例#3
0
        /// <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;
        }
示例#4
0
        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);
            }
        }
示例#5
0
        /// <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;
            }
        }
示例#6
0
        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));
        }