public PlayerStats GetPlayerStats(string identKey, string racer)
{
var uri = new Uri(string.Format(@"http://www.lfsworld.net/pubstat/get_stat2.php?version=1.4&idk={0}&action=pst&racer={1}&s=1", identKey, racer));
var request = WebRequest.Create(uri);
var response = request.GetResponse();
using (var stream = response.GetResponseStream())
{
var json = new DataContractJsonSerializer(typeof(List<PlayerStats>));
var stats = (List<PlayerStats>)json.ReadObject(stream);
return stats.Single();
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
namespace OutGauge
{
class Program
{
const int BufferSize = 1024;
const string Host = "127.0.0.1";
const ushort Port = 30000;
static void Main()
{
// Create UDP socket.
Socket socket = new Socket(
AddressFamily.InterNetwork,
SocketType.Dgram,
ProtocolType.Udp);
byte[] buffer = new byte[BufferSize];
try
{
// Create EndPoint for LFS and bind the socket to it.
IPEndPoint endPoint = new IPEndPoint(
IPAddress.Parse(Host),
Port);
socket.Bind(endPoint);
while (true)
{
// Receive packet data.
int received = socket.Receive(buffer);
if (received > 0)
{
// Copy data from buffer into correctly sized array.
byte[] data = new byte[received];
Buffer.BlockCopy(buffer, 0, data, 0, received);
// Packet received...
OutGaugePack packet = new OutGaugePack(data);
OutGaugePacketReceived(packet);
}
else
{
Console.WriteLine("Lost connection to OutGauge");
break;
}
}
}
catch (SocketException ex)
{
Console.WriteLine("Socket Error: {0}", ex.Message);
}
}
static void OutGaugePacketReceived(OutGaugePack packet)
{
// Do stuff with packet etc..
Console.WriteLine(packet.RPM);
if (packet.DashLights.HasFlag(DashLightFlags.DL_SHIFT))
{
Console.WriteLine("Shift-light on!");
}
}
class OutGaugePack
{
public TimeSpan Time { get; private set; }
public string Car { get; private set; }
public OutGaugeFlags Flags { get; private set; }
public int Gear { get; private set; }
public int SpareB { get; private set; }
public float Speed { get; private set; }
public float RPM { get; private set; }
public float Turbo { get; private set; }
public float EngTemp { get; private set; }
public float Fuel { get; private set; }
public float OilPressure { get; private set; }
public float OilTemp { get; private set; }
public DashLightFlags DashLights { get; private set; }
public DashLightFlags ShowLights { get; private set; }
public float Throttle { get; private set; }
public float Brake { get; private set; }
public float Clutch { get; private set; }
public string Display1 { get; private set; }
public string Display2 { get; private set; }
public int ID { get; private set; }
public OutGaugePack(byte[] data)
{
Time = TimeSpan.FromMilliseconds(BitConverter.ToUInt32(data, 0));
Car = ASCIIEncoding.ASCII.GetString(data, 4, 4).TrimEnd(char.MinValue);
Flags = (OutGaugeFlags)BitConverter.ToUInt16(data, 8);
Gear = data[10];
SpareB = data[11];
Speed = BitConverter.ToSingle(data, 12);
RPM = BitConverter.ToSingle(data, 16);
Turbo = BitConverter.ToSingle(data, 20);
EngTemp = BitConverter.ToSingle(data, 24);
Fuel = BitConverter.ToSingle(data, 28);
OilPressure = BitConverter.ToSingle(data, 32);
OilTemp = BitConverter.ToSingle(data, 36);
DashLights = (DashLightFlags)BitConverter.ToUInt32(data, 40);
ShowLights = (DashLightFlags)BitConverter.ToUInt32(data, 44);
Throttle = BitConverter.ToSingle(data, 48);
Brake = BitConverter.ToSingle(data, 52);
Clutch = BitConverter.ToSingle(data, 56);
Display1 = ASCIIEncoding.ASCII.GetString(data, 60, 16).TrimEnd(char.MinValue);
Display2 = ASCIIEncoding.ASCII.GetString(data, 76, 16).TrimEnd(char.MinValue);
if (data.Length == 96)
{
ID = BitConverter.ToInt32(data, 92);
}
}
}
[Flags]
enum OutGaugeFlags
{
OG_TURBO = 8192,
OG_KM = 16384,
OG_BAR = 32768,
}
[Flags]
enum DashLightFlags
{
DL_SHIFT = 1,
DL_FULLBEAM = 2,
DL_HANDBRAKE = 4,
DL_PITSPEED = 8,
DL_TC = 16,
DL_SIGNAL_L = 32,
DL_SIGNAL_R = 64,
DL_SIGNAL_ANY = 128,
DL_OILWARN = 256,
DL_BATTERY = 512,
DL_ABS = 1024,
DL_SPARE = 2048,
}
}
}
[DataContract]
public class PlayerStats
{
[DataMember(Name = "distance")]
public string Distance { get; set; }
[DataMember(Name = "fuel")]
public string Fuel { get; set; }
[DataMember(Name = "laps")]
public string Laps { get; set; }
[DataMember(Name = "joined")]
public string Joined { get; set; }
[DataMember(Name = "win")]
public string Win { get; set; }
[DataMember(Name = "second")]
public string Second { get; set; }
[DataMember(Name = "third")]
public string Third { get; set; }
[DataMember(Name = "races_finished")]
public string RacesFinished { get; set; }
[DataMember(Name = "qual")]
public string Qual { get; set; }
[DataMember(Name = "pole")]
public string Pole { get; set; }
[DataMember(Name = "drags")]
public string Drags { get; set; }
[DataMember(Name = "dragwins")]
public string DragWins { get; set; }
[DataMember(Name = "country")]
public string Country { get; set; }
[DataMember(Name = "ostatus")]
public string OStatus { get; set; }
[DataMember(Name = "hostname")]
public string HostName { get; set; }
[DataMember(Name = "last_time")]
public string LastTime { get; set; }
[DataMember(Name = "track")]
public string Track { get; set; }
[DataMember(Name = "car")]
public string Car { get; set; }
}
public PlayerStats GetPlayerStats(string identKey, string racer)
{
var uri = new Uri(string.Format(@"http://www.lfsworld.net/pubstat/get_stat2.php?version=1.4&idk={0}&action=pst&racer={1}&s=1", identKey, racer));
var request = WebRequest.Create(uri);
var response = request.GetResponse();
using (var stream = response.GetResponseStream())
{
var json = new DataContractJsonSerializer(typeof(PlayerStats));
return json.ReadObject(stream) as PlayerStats;
}
}