Exemplo n.º 1
0
            public DFItem(DFLog _parent, object[] _answer, int lineno) : this()
            {
                this.parent = _parent;

                this.lineno = lineno;

                this.raw = _answer;

                if (_answer == null)
                {
                    this.raw = new object[0];
                }
                else if (_answer.Length > 0) // check we have data
                {
                    // check this is a gps message and we dont have the current gpsstarttime
                    if (parent.gpsstarttime == DateTime.MinValue && msgtype.StartsWith("GPS"))
                    {
                        if (parent.logformat.ContainsKey(msgtype))
                        {
                            var indextimems = _parent.FindMessageOffset(msgtype, "T");
                            var time        = parent.GetTimeGPS(String.Join(",", items));

                            if (time != DateTime.MinValue)
                            {
                                parent.gpsstarttime = time;

                                parent.lasttime = parent.gpsstarttime;

                                indextimems = parent.FindMessageOffset(items[0], "T");

                                if (indextimems != -1)
                                {
                                    try
                                    {
                                        parent.msoffset = int.Parse(items[indextimems]);
                                    }
                                    catch
                                    {
                                        parent.gpsstarttime = DateTime.MinValue;
                                    }
                                }

                                int indextimeus = parent.FindMessageOffset(items[0], "TimeUS");

                                if (indextimeus != -1)
                                {
                                    try
                                    {
                                        parent.msoffset = long.Parse(items[indextimeus]) / 1000;
                                    }
                                    catch
                                    {
                                        parent.gpsstarttime = DateTime.MinValue;
                                    }
                                }
                            }
                        }
                    }
                }
            }
Exemplo n.º 2
0
 public string this[string item]
 {
     get
     {
         var index = parent.FindMessageOffset(msgtype, item);
         if (index == -1 || index >= items.Length)
         {
             return(null);
         }
         return(items[index]);
     }
 }
Exemplo n.º 3
0
            public DFItem(DFLog _parent, object[] _answer, int lineno) : this()
            {
                this.parent = _parent;

                this.lineno = lineno;

                this.raw = _answer;

                if (_answer.Length > 0)
                {
                    msgtype = _answer[0].ToString();
                    items   = _answer.Select((a) =>
                    {
                        if (a.IsNumber())
                        {
                            return(((IConvertible)a).ToString(CultureInfo.InvariantCulture));
                        }
                        else
                        {
                            return(a.ToString());
                        }
                    }).ToArray();
                    bool timeus = false;

                    if (_parent.logformat.ContainsKey(msgtype))
                    {
                        int indextimems = _parent.FindMessageOffset(msgtype, "TimeMS");

                        if (msgtype.StartsWith("GPS"))
                        {
                            indextimems = _parent.FindMessageOffset(msgtype, "T");

                            if (parent.gpsstarttime == DateTime.MinValue)
                            {
                                var time = parent.GetTimeGPS(String.Join(",", items));

                                if (time != DateTime.MinValue)
                                {
                                    parent.gpsstarttime = time;

                                    _parent.lasttime = parent.gpsstarttime;

                                    indextimems = _parent.FindMessageOffset(items[0], "T");

                                    if (indextimems != -1)
                                    {
                                        try
                                        {
                                            _parent.msoffset = int.Parse(items[indextimems]);
                                        }
                                        catch
                                        {
                                            _parent.gpsstarttime = DateTime.MinValue;
                                        }
                                    }

                                    int indextimeus = _parent.FindMessageOffset(items[0], "TimeUS");

                                    if (indextimeus != -1)
                                    {
                                        try
                                        {
                                            _parent.msoffset = long.Parse(items[indextimeus]) / 1000;
                                        }
                                        catch
                                        {
                                            _parent.gpsstarttime = DateTime.MinValue;
                                        }
                                    }
                                }
                            }
                        }

                        if (indextimems == -1)
                        {
                            indextimems = _parent.FindMessageOffset(msgtype, "TimeUS");
                            timeus      = true;
                        }

                        if (indextimems != -1)
                        {
                            long ntime = 0;

                            if (long.TryParse(items[indextimems], out ntime))
                            {
                                if (timeus)
                                {
                                    ntime /= 1000;
                                }

                                timems = (int)ntime;

                                if (_parent.gpsstarttime != DateTime.MinValue)
                                {
                                    time             = _parent.gpsstarttime.AddMilliseconds(timems - _parent.msoffset);
                                    _parent.lasttime = time;
                                }
                            }
                            else
                            {
                                time = _parent.lasttime;
                            }
                        }
                        else
                        {
                            time = _parent.lasttime;
                        }
                    }
                }
            }
Exemplo n.º 4
0
        void setlinecount()
        {
            int offset = 0;

            byte[] buffer = new byte[1024 * 1024];

            var lineCount = 0;

            if (binary)
            {
                long length = basestream.Length;
                while (basestream.Position < length)
                {
                    var ans = binlog.ReadMessageTypeOffset(basestream, length);

                    if (ans.MsgType == 0 && ans.Offset == 0)
                    {
                        continue;
                    }

                    byte type = ans.Item1;
                    messageindex[type].Add((uint)(ans.Item2));
                    messageindexline[type].Add((uint)lineCount);

                    linestartoffset.Add((uint)(ans.Item2));
                    lineCount++;
                }

                _count = lineCount;

                // build fmt line database to pre seed the FMT message
                int amax = Math.Min(2000, _count - 1);
                for (int a = 0; a < amax; a++)
                {
                    dflog.GetDFItemFromLine(this[a].ToString(), a);
                }
            }
            else
            {
                // first line starts at 0
                linestartoffset.Add(0);

                long length = basestream.Length;
                while (basestream.Position < length)
                {
                    offset = 0;

                    long startpos = basestream.Position;

                    int read = basestream.Read(buffer, offset, buffer.Length);

                    while (read > 0)
                    {
                        if (buffer[offset] == '\n')
                        {
                            linestartoffset.Add((uint)(startpos + 1 + offset));
                            lineCount++;
                        }

                        offset++;
                        read--;
                    }
                }

                _count = lineCount;

                // create msg cache
                int b = 0;
                foreach (var item in this)
                {
                    var idx = item.IndexOf(',');

                    if (idx <= 0)
                    {
                        continue;
                    }

                    var msgtype = item.Substring(0, idx);

                    if (msgtype == "FMT")
                    {
                        dflog.FMTLine(item);
                    }

                    if (dflog.logformat.ContainsKey(msgtype))
                    {
                        var type = (byte)dflog.logformat[msgtype].Id;

                        messageindex[type].Add(linestartoffset[b]);
                        messageindexline[type].Add((uint)b);
                    }
                    b++;
                }
            }

            // build fmt line database using type
            foreach (var item in GetEnumeratorType("FMT"))
            {
                try
                {
                    FMT[int.Parse(item["Type"])] = new Tuple <int, string, string, string>(
                        int.Parse(item["Length"].Trim()),
                        item["Name"].Trim(),
                        item["Format"].Trim(),
                        item.items.Skip(dflog.FindMessageOffset("FMT", "Columns")).FirstOrDefault());

                    dflog.FMTLine(this[item.lineno]);
                }
                catch { }
            }

            foreach (var item in GetEnumeratorType("FMTU"))
            {
                try
                {
                    FMTU[int.Parse(item["FmtType"])] =
                        new Tuple <string, string>(item["UnitIds"].Trim(), item["MultIds"].Trim());
                }
                catch { }
            }

            foreach (var item in GetEnumeratorType("UNIT"))
            {
                try
                {
                    Unit[(char)int.Parse(item["Id"])] = item["Label"].Trim();
                }
                catch { }
            }

            foreach (var item in GetEnumeratorType("MULT"))
            {
                try
                {
                    Mult[(char)int.Parse(item["Id"])] = item["Mult"].Trim();
                }
                catch { }
            }

            BuildUnitMultiList();

            foreach (var item in GetEnumeratorType(new[]
            {
                "GPS", "GPS2"
            }))
            {
                // get first gps time
                break;
            }

            indexcachelineno = -1;
        }