class EpicRollerCoasters_Telemetry
{
// Launch Options: -telemetry network
// Launch Options: -telemetry network -port 7701
// Launch Options: -telemetry network -ip 127.0.0.1 -port 7701
// Default port: 7701
private static int port = 7701;
private static UdpClient client;
private static IPEndPoint anyIP;
public static string lastReceivedUDPPacket = "";
static void Main(string[] args)
{
anyIP = new IPEndPoint(IPAddress.Any, 0);
client = new UdpClient(port);
Thread receiveThread = new Thread(new ThreadStart(ReceiveData));
receiveThread.IsBackground = true;
receiveThread.Start();
// Holds the MainThread while looking for data
receiveThread.Join();
}
private static void ReceiveData()
{
while (true)
{
try
{
byte[] data = client.Receive(ref anyIP);
string text = Encoding.UTF8.GetString(data);
// Latest UDPPacket
lastReceivedUDPPacket = text;
//Console.WriteLine(">> " + lastReceivedUDPPacket);
// UDPPacket output example:
// S[005.001]V[023.729]F[008.801]Y[173.541]P[000.049]R[000.052]H[000.000]W[000.004]U[005.001]A[000.119]I[-000.001]O[000.000]N[00]C[00]G[00]
// S[026.953]V[044.193]F[016.940]Y[159.710]P[001.965]R[-003.653]H[000.182]W[000.170]U[026.952]A[000.480]I[000.541]O[-000.098]N[11]C[19]G[05]
float speed = GetNumber("S", lastReceivedUDPPacket);
float vibrationIntensity = GetNumber("V", lastReceivedUDPPacket);
float vibrationFrequency = GetNumber("F", lastReceivedUDPPacket);
float yaw = GetNumber("Y", lastReceivedUDPPacket);
float pitch = GetNumber("P", lastReceivedUDPPacket);
float roll = GetNumber("R", lastReceivedUDPPacket);
float heave = GetNumber("H", lastReceivedUDPPacket);
float sway = GetNumber("W", lastReceivedUDPPacket);
float surge = GetNumber("U", lastReceivedUDPPacket);
float yawVel = GetNumber("A", lastReceivedUDPPacket);
float pitchVel = GetNumber("I", lastReceivedUDPPacket);
float rollVel = GetNumber("O", lastReceivedUDPPacket);
float rideIndex = GetInt("N", lastReceivedUDPPacket);
float carIndex = GetInt("C", lastReceivedUDPPacket);
float gunIndex = GetInt("G", lastReceivedUDPPacket);
string rideName = ((RideType)rideIndex).ToString();
string carName = ((CartType)carIndex).ToString();
string gunName = ((GunType)gunIndex).ToString();
Console.WriteLine(">> Speed: {0}, Yaw: {1}, Pitch: {2}, Roll: {3}, Heave: {4}, Sway: {5}, Surge: {6}, YawVelocity: {7}, PitchVelocity: {8}, RollVelocity: {9}, RideName: {10}, CarName: {11}, GunName: {12}, VibrationIntensity: {13}, VibrationFrequency: {14}",
speed, yaw, pitch, roll, heave, sway, surge, yawVel, pitchVel, rollVel, rideName, carName, gunName, vibrationIntensity, vibrationFrequency);
}
catch (Exception err)
{
Console.WriteLine("[UDPReceive] Error: " + err.ToString());
}
}
}
// Parse the packats
private float GetNumber(string prefix, string data)
{
string numberRx = @"\-*\d{3}\.\d{3}";
string dataBlockRx = @"\[" + numberRx + @"\]";
string value = new Regex(prefix + dataBlockRx).Match(data).Value;
float number = float.Parse(new Regex(numberRx).Match(value).Value, CultureInfo.InvariantCulture);
return number;
}
private int GetInt(string prefix, string data)
{
string intRx = @"\-*\d{2}";
string dataBlockRx = @"\[" + intRx + @"\]";
string value = new Regex(prefix + dataBlockRx).Match(data).Value;
int number = int.Parse(new Regex(intRx).Match(value).Value, CultureInfo.InvariantCulture);
return number;
}
// Enums
public enum RideType
{
NONE = 0,
ROCK_FALLS = 1,
TREX_KINGDOM = 2,
WYVERN_SIEGE = 3,
SNOW_LAND = 4,
NEON_RIDER = 5,
HALLOWEEN = 6,
ARMAGEDDON = 7,
LOST_FOREST = 8,
DREAD_BLOOD = 9,
TUWHENA_VOLCANO = 10,
TROPICAL_ISLAND = 11,
NORTH_POLE = 12,
TWILIGHT = 13,
HAUNTED_CASTLE = 14,
OASIS = 15,
GREAT_CANYON = 16,
SPACE_STATION = 17,
SECRET_CAVE = 18,
TUTORIAL = 19,
LOBBY = 20,
STONEHENGE = 21,
CANDYLAND = 22,
HIDDEN_PARADISE = 23,
ANTARCTICA = 24,
KELIMUTU = 25,
BLED = 26,
YELLOWSTONE = 27,
BRAZILIAN_DUNES_RALLY = 33,
COLOSSEUM = 34,
DYNASTY_DASH = 35,
CANDYLAND_BOO_LICIOUS = 36,
LADY_TUFF_ADVENTURE = 37,
THE_RED_HOOD_GIRL = 38,
EPIC_DREAMLAND = 39,
ELVES_WORKSHOP_OF_WONDERS = 40,
WINGS_OF_DARKNESS = 41
}
public enum CartType
{
RockFalls = 0,
TRexKingdom = 1,
WyvernSiege = 2,
Snowland = 3,
NeonRider = 4,
Halloween = 5,
Armageddon = 6,
LostForest = 7,
DreadBlood = 8,
TuwhenaVolcano = 9,
None = 10,
TropicalIsland = 11,
NorthPole = 12,
Twilight = 13,
HauntedCastle = 14,
Oasis = 15,
GreatCanyon = 16,
SpaceStation = 17,
SecretCave = 18,
Skate = 19,
MadTeaCup = 20,
HyperCart = 57,
Stonehenge = 58,
Candyland = 59,
HiddenParadise = 60,
Antarctica = 61,
Kelimutu = 62,
Bled = 63,
Yellowstone = 64,
BrazilianDunesRally = 70,
DynastyDash = 71,
Colosseum = 72,
FunALicious = 73,
LadyTuffAdventure = 75,
TheRedHoodGirl = 76,
EpicDreamland = 77,
ElvesWorkshopOfWonders = 78,
WingsOfDarkness = 79,
FunLentine = 80,
FunHeroes = 81
}
public enum GunType
{
NONE = 0,
SLINGSHOT = 1,
DART = 2,
CROSSBOW = 3,
SNOW_GUN = 4,
LASER_GUN = 5,
TOILET_GUN = 6,
CAL50 = 7,
WAND = 8,
SHOTGUN = 9,
TUWHENA_VOLCANO = 10,
TROPICAL_ISLAND = 11,
NORTH_POLE = 12,
TWILIGHT = 13,
HAUNTED_CASTLE = 14,
OASIS = 15,
GREAT_CANYON = 16,
SPACE_STATION = 17,
SECRET_CAVE = 18,
CAL50_SUPRESSED = 19,
BUBBLEGUN = 20,
SPLATTER_BLASTER = 26,
FUN_LENTINE = 27,
FUN_HEROES = 28
}
}