/* Data Looks like this
         * DS 01 245 TIME
         * ...
         * RR 0000 0232   05:27:51.01040
         * ...
         * RR 0002 9999   06:06:01.35403
         * DE 01
         */
        public TagHeuerData ParseRR(string line)
        {
            line = TrimNewEndLine(line);

            TagHeuerData parsedData = null;

            string prefix = line.Substring(0, 2);

            if (prefix == "RR")
            {
                string rank    = line.Substring(3, 4);
                string number  = line.Substring(8, 4);
                string timeStr = line.Substring(15);
                try
                {
                    int      nRank   = int.Parse(rank);
                    int      nNumber = int.Parse(number);
                    string[] formats = { @"hh\:mm\:ss\.fffff", @"hh\:mm\:ss\.ffff", @"hh\:mm\:ss\.fff", @"hh\:mm\:ss\.ff", @"hh\:mm\:ss\.f" };
                    timeStr = timeStr.TrimEnd(' ');
                    TimeSpan time = TimeSpan.ParseExact(timeStr, formats, System.Globalization.CultureInfo.InvariantCulture);

                    parsedData = new TagHeuerData {
                        Number = nNumber, Rank = nRank, Time = time
                    };
                }
                catch (FormatException)
                {
                    throw;
                }
            }
            return(parsedData);
        }
        public IEnumerable <TimingData> TimingData()
        {
            do
            {
                TagHeuerData parsedData = null;
                try
                {
                    string dataLine = _parser.TrimNewEndLine(_serialPort.ReadLine());

                    if (dataLine.StartsWith("DE ")) // until "DE NN"
                    {
                        break;
                    }

                    parsedData = _parser.ParseRR(dataLine);
                }
                catch (TimeoutException)
                {
                    break; // no new data
                }
                catch (Exception)
                { }

                TimingData td = new TimingData
                {
                    Time = (_synchroTime + parsedData.Time).TimeOfDay
                };

                reportProgress(td.Time.ToString());

                yield return(td);
            } while (true);

            reportFinal();
        }