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()); }
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")); } } }
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; }