Example #1
0
        public byte[] ExportHeader()
        {
            List <byte> tmpheader = new List <byte>();


            byte[] data = new byte[64];
            ByteMethods.memcpy(data, ASCIIEncoding.ASCII.GetBytes(this.Name), 64, 0, 0);

            byte[] header = new byte[10];
            header[0] = (byte)'$';
            header[1] = (byte)'#';                                                                               // Sync
            ByteMethods.memcpy(header, BitConverter.GetBytes((ushort)TelemetryLogPacket.InstanceName), 2, 4, 0); // Packet ID
            ByteMethods.memcpy(header, BitConverter.GetBytes(this.ID), 2, 6, 0);                                 // Instance ID
            ByteMethods.memcpy(header, BitConverter.GetBytes((ushort)data.Length), 2, 8, 0);                     // Data length

            tmpheader.AddRange(header);
            tmpheader.AddRange(data);

            ByteMethods.memcpy(header, BitConverter.GetBytes((ushort)TelemetryLogPacket.InstanceMember), 2, 4, 0); // Packet ID
            ByteMethods.memcpy(header, BitConverter.GetBytes((ushort)68), 2, 8, 0);                                // Data length
            foreach (KeyValuePair <string, int> properyMap in this.Mapping)
            {
                data = new byte[68];
                short type = 0xFF;
                Type  t    = this.PropertyDescriptors.Find(properyMap.Key, true).PropertyType;

                // TODO: Put in enumerator
                // Or find something nicer for this.
                if (t == typeof(double))
                {
                    type = 0;
                }
                if (t == typeof(float))
                {
                    type = 1;
                }
                if (t == typeof(Int32))
                {
                    type = 2;
                }
                if (t == typeof(Int16))
                {
                    type = 3;
                }
                if (t == typeof(byte))
                {
                    type = 4;
                }
                if (t == typeof(UInt32))
                {
                    type = 5;
                }
                if (t == typeof(UInt16))
                {
                    type = 6;
                }
                if (t == typeof(char))
                {
                    type = 7;
                }
                if (t == typeof(string))
                {
                    type = 8;
                }
                if (t == typeof(bool))
                {
                    type = 9;
                }
                if (type < 0xFF)
                {
                    ByteMethods.memcpy(data, BitConverter.GetBytes(type), 2, 0, 0);
                    ByteMethods.memcpy(data, BitConverter.GetBytes(properyMap.Value), 2, 2, 0);
                    ByteMethods.memcpy(data, ASCIIEncoding.ASCII.GetBytes(properyMap.Key), 64, 4, 0);

                    tmpheader.AddRange(header);
                    tmpheader.AddRange(data);
                }
            }


            return(tmpheader.ToArray());
        }
Example #2
0
        private void ReadWorker(object n)
        {
            lock (this.Data)
            {
                _DataPointer = 0;
                _ReadStage   = 1;

                for (int i = 0; i < data.Length - 8; i++)
                {
                    if (data[i] == '$' && data[i + 1] == '#')
                    {
                        ushort PacketID   = BitConverter.ToUInt16(data, i + 2);
                        ushort Type       = BitConverter.ToUInt16(data, i + 4);
                        ushort InstanceID = BitConverter.ToUInt16(data, i + 6);
                        ushort PacketSize = BitConverter.ToUInt16(data, i + 8);
                        byte[] PacketData = new byte[PacketSize];
                        ByteMethods.memcpy(PacketData, data, PacketSize, 0, i + 10);

                        TelemetryPacket packet = new TelemetryPacket
                        {
                            Data       = PacketData,
                            ID         = PacketID,
                            Type       = (TelemetryLogPacket)Type,
                            InstanceID = InstanceID,
                            Size       = PacketSize
                        };
                        Packets.Add(packet);
                        _DataPointer = i + PacketSize;
                        i           += PacketSize;
                    }
                }
                _DataPointer = data.Length;
                _ReadStage   = 2;

                // parse packets
                TelemetrySample Sample = new TelemetrySample();
                Instances  = new Dictionary <int, string>();
                Properties = new Dictionary <string, Dictionary <int, string> >();
                Types      = new Dictionary <string, Dictionary <int, int> >();

                string last_type    = "";
                int    last_type_id = 0;
                bool   first_packet = true;
                double time         = -1.0;
                foreach (TelemetryPacket packet in Packets)
                {
                    _PacketPointer++;
                    switch (packet.Type)
                    {
                    case TelemetryLogPacket.InstanceName:
                        last_type    = ASCIIEncoding.ASCII.GetString(packet.Data).Replace('\0', ' ').Trim();
                        last_type_id = packet.InstanceID;
                        Instances.Add(last_type_id, last_type);
                        Types.Add(last_type, new Dictionary <int, int>());
                        Properties.Add(last_type, new Dictionary <int, string>());
                        break;

                    case TelemetryLogPacket.InstanceMember:
                        int id = BitConverter.ToInt16(packet.Data, 2);

                        if (!Sample.Data.ContainsKey(last_type_id))
                        {
                            Sample.Data.Add(last_type_id, new Dictionary <int, object>());
                        }
                        if (Sample.Data[last_type_id].ContainsKey(id) == false)
                        {
                            Sample.Data[last_type_id].Add(id, 0);
                        }


                        int type_id = BitConverter.ToInt16(packet.Data, 0);

                        if (Types[last_type].ContainsKey(id) == false)
                        {
                            Types[last_type].Add(id, type_id);

                            byte[] member_name = new byte[packet.Data.Length - 4];
                            ByteMethods.memcpy(member_name, packet.Data, packet.Data.Length - 4, 0, 4);

                            string key = ASCIIEncoding.ASCII.GetString(member_name).Replace('\0', ' ').Trim();
                            Properties[last_type].Add(id, key);
                        }

                        break;

                    case TelemetryLogPacket.Data:

                        int instance_id = BitConverter.ToInt16(packet.Data, 0);
                        int last_typeid = 0;
                        for (int i = 2; i < packet.Data.Length;)
                        {
                            int    id_type = BitConverter.ToInt32(packet.Data, i);
                            object v       = 0;
                            Dictionary <int, int> TypeArray = Types[Instances[instance_id]];
                            i += 4;
                            if (TypeArray.ContainsKey(id_type))
                            {
                                switch (TypeArray[id_type])
                                {
                                case 0:         //double
                                    v  = BitConverter.ToDouble(packet.Data, i);
                                    i += 8;
                                    break;

                                case 1:         //float
                                    v  = BitConverter.ToSingle(packet.Data, i);
                                    i += 4;
                                    break;

                                case 2:         // int32
                                    v  = BitConverter.ToInt32(packet.Data, i);
                                    i += 4;
                                    break;

                                case 3:         // int16
                                    v  = BitConverter.ToInt16(packet.Data, i);
                                    i += 2;
                                    break;

                                case 4:         // int8
                                    v  = packet.Data[i];
                                    i += 1;
                                    break;

                                case 5:         // uint32
                                    v  = BitConverter.ToUInt32(packet.Data, i);
                                    i += 4;
                                    break;

                                case 6:         // uint16
                                    v  = BitConverter.ToUInt16(packet.Data, i);
                                    i += 2;
                                    break;

                                case 7:         // uint8
                                    v  = packet.Data[i];
                                    i += 1;
                                    break;

                                case 8:         // string
                                    int k = i;
                                    for (; k < packet.Data.Length; k++)
                                    {
                                        if (packet.Data[k] == 0)
                                        {
                                            break;
                                        }
                                    }
                                    v = ASCIIEncoding.ASCII.GetString(packet.Data, i, k - i);
                                    i = k + 1;
                                    break;

                                case 9:         // bool
                                    v  = ((packet.Data[i] == 1) ? true : false);
                                    i += 1;
                                    break;

                                default:
                                    v = 0;
                                    break;
                                }

                                Sample.Data[instance_id][id_type] = (object)v;
                                last_typeid = id_type;
                            }
                        }
                        break;

                    case TelemetryLogPacket.Time:

                        // Store previous samples.
                        if (time != -1.0 && this.Data.ContainsKey(time) == false)
                        {
                            this.Data.Add(time, Sample.Clone());
                            this.Data[time].Time = time;
                        }
                        time = BitConverter.ToDouble(packet.Data, 0);
                        break;
                    }
                }


                // Store last sample.
                if (time != -1.0 && this.Data.ContainsKey(time) == false)
                {
                    this.Data.Add(time, Sample.Clone());
                    this.Data[time].Time = time;
                }

                _ReadStage = 3;

                // Set the telemetry track.
                if (Telemetry.m.Active_Session)
                {
                    return;
                }
                else if (Telemetry.m.Sims != null)
                {
                    // TODO: Urgent; add simulator type to log file.
                    Telemetry.m.Track_Load(Telemetry.m.Sims.Get("rfactor"), GetString(time, "Session.CircuitName"));
                }
            }
        }
Example #3
0
        void _Worker_Elapsed(object sender, ElapsedEventArgs e)
        {
            if (Telemetry.m.Net.IsClient)
            {
                Stop();
            }
            if (Telemetry.m.Active_Session == false)
            {
                Stop();
            }


            if (_mWrite != null)
            {
                lock (_mWrite)
                {
                    try
                    {
                        /************** TIME SYNC *************/

                        double dt_ms    = 0;
                        double dt_dt_ms = 0;
                        if (Telemetry.m.Sim.Modules.Time_Available)
                        {
                            dt_ms  = Telemetry.m.Sim.Session.Time - AnnotationStartTime;
                            dt_ms *= 1000.0;
                        }
                        else
                        {
                            TimeSpan dt = DateTime.Now.Subtract(AnnotationStart);
                            dt_ms = dt.TotalMilliseconds;
                        }

                        dt_dt_ms = dt_ms - LastTime;
                        LastTime = dt_ms;
                        if (dt_dt_ms > 0)// && Telemetry.m.Sim.Drivers.Player.Driving) // time is ticking AND player is driving
                        {
                            byte[] data   = new byte[8];
                            byte[] header = new byte[10];
                            header[0] = (byte)'$'; // Sync
                            header[1] = (byte)'#'; // Sync
                            ByteMethods.memcpy(header, BitConverter.GetBytes((ushort)TelemetryLogPacket.Time), 2, 4, 0);
                            // Packet ID
                            ByteMethods.memcpy(header, BitConverter.GetBytes(0), 2, 6, 0);         // Instance ID
                            ByteMethods.memcpy(header, BitConverter.GetBytes((ushort)8), 2, 8, 0); // Data length of a double (8)

                            data = BitConverter.GetBytes(dt_ms);
                            _mWrite.BaseStream.Write(header, 0, header.Length);
                            _mWrite.BaseStream.Write(data, 0, data.Length);

                            /************** DATA *************/
                            lock (EventsFired)
                            {
                                foreach (KeyValuePair <string, TelemetryLoggerSubscribedInstance> tel_instance in Instances)
                                {
                                    data = tel_instance.Value.Dump(EventsFired);
                                    if (data.Length > 0)
                                    {
                                        // Write a packet to the stream.
                                        ByteMethods.memcpy(header,
                                                           BitConverter.GetBytes((ushort)TelemetryLogPacket.Data), 2, 4,
                                                           0);
                                        // Packet ID
                                        ByteMethods.memcpy(header, BitConverter.GetBytes(tel_instance.Value.ID), 2, 6, 0);
                                        // Instance ID
                                        ByteMethods.memcpy(header, BitConverter.GetBytes((ushort)data.Length), 2, 8, 0);
                                        // Data length


                                        _mWrite.BaseStream.Write(header, 0, header.Length);
                                        _mWrite.BaseStream.Write(data, 0, data.Length);
                                    }
                                }

                                // Reset the events fired.
                                EventsFired = new List <string>();
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                    }
                }

                AnnotationWaiter.Set();
            }
        }
 public void PushGameData(byte[] data)
 {
     ByteMethods.memcpy(_txBuffer, data, data.Length, _txPtr, 0);
     Array.Copy(data, 0, _txBuffer, _txPtr, data.Length);
     _txPtr += data.Length;
 }