Skip to content

Commit

Permalink
Features/cleanup (#2)
Browse files Browse the repository at this point in the history
* Updated readme and package

* Cleanup
  • Loading branch information
TimianHeber committed Sep 6, 2020
1 parent 8941f10 commit a389719
Show file tree
Hide file tree
Showing 7 changed files with 105 additions and 54 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ If, on the other hand, you just want to connect to Flight Simulator and read som

# Usage

1) Create a .NET Framework Console project
1) Create a .NET Framework Console project that target x64.
2) Add a reference to the CTrue.FsConnect package.
3) Set up Flight Simulator to receive remote TCP connections, see the SimConnect.xml file, and configure the example accordingly.
4) See example below:
Expand Down
1 change: 1 addition & 0 deletions src/CTrue.FsConnect.TestConsole/PlaneInfoResponse.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ public struct PlaneInfoResponse
public double Latitude;
public double Longitude;
public double AltitudeAboveGround;
public double Altitude;
public double Heading;
};
}
30 changes: 17 additions & 13 deletions src/CTrue.FsConnect.TestConsole/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,16 @@ private static void Run(Options commandLineOptions)
{
FsConnect fsConnect = new FsConnect();

Console.WriteLine("Connecting to Flight Simulator");
fsConnect.Connect(commandLineOptions.Hostname, commandLineOptions.Port);
Console.WriteLine($"Connecting to Flight Simulator on {commandLineOptions.Hostname}:{commandLineOptions.Port}");
try
{
fsConnect.Connect(commandLineOptions.Hostname, commandLineOptions.Port);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
return;
}

fsConnect.FsDataReceived += HandleReceivedFsData;

Expand Down Expand Up @@ -58,18 +66,14 @@ private static void Run(Options commandLineOptions)

private static void InitializeDataDefinitions(FsConnect fsConnect)
{
List<Tuple<string, string, SIMCONNECT_DATATYPE>>
definition = new List<Tuple<string, string, SIMCONNECT_DATATYPE>>();
List<Tuple<string, string, SIMCONNECT_DATATYPE>> definition = new List<Tuple<string, string, SIMCONNECT_DATATYPE>>();

definition.Add(new Tuple<string, string, SIMCONNECT_DATATYPE>("Title", null, SIMCONNECT_DATATYPE.STRING256));
definition.Add(
new Tuple<string, string, SIMCONNECT_DATATYPE>("Plane Latitude", "degrees", SIMCONNECT_DATATYPE.FLOAT64));
definition.Add(
new Tuple<string, string, SIMCONNECT_DATATYPE>("Plane Longitude", "degrees", SIMCONNECT_DATATYPE.FLOAT64));
definition.Add(
new Tuple<string, string, SIMCONNECT_DATATYPE>("Plane Alt Above Ground", "feet", SIMCONNECT_DATATYPE.FLOAT64));
definition.Add(new Tuple<string, string, SIMCONNECT_DATATYPE>("Plane Heading Degrees Gyro", "degrees",
SIMCONNECT_DATATYPE.FLOAT64));
definition.Add(new Tuple<string, string, SIMCONNECT_DATATYPE>("Plane Latitude", "degrees", SIMCONNECT_DATATYPE.FLOAT64));
definition.Add(new Tuple<string, string, SIMCONNECT_DATATYPE>("Plane Longitude", "degrees", SIMCONNECT_DATATYPE.FLOAT64));
definition.Add(new Tuple<string, string, SIMCONNECT_DATATYPE>("Plane Alt Above Ground", "feet", SIMCONNECT_DATATYPE.FLOAT64));
definition.Add(new Tuple<string, string, SIMCONNECT_DATATYPE>("PLANE ALTITUDE", "feet", SIMCONNECT_DATATYPE.FLOAT64));
definition.Add(new Tuple<string, string, SIMCONNECT_DATATYPE>("Plane Heading Degrees Gyro", "degrees", SIMCONNECT_DATATYPE.FLOAT64));

fsConnect.RegisterDataDefinition<PlaneInfoResponse>(Requests.PlaneInfo, definition);
}
Expand All @@ -82,7 +86,7 @@ private static void HandleReceivedFsData(object sender, FsDataReceivedEventArgs
{
PlaneInfoResponse r = (PlaneInfoResponse)e.Data;

Console.WriteLine($"{r.Latitude:F4} {r.Longitude:F4} {r.AltitudeAboveGround:F1} {r.Heading}");
Console.WriteLine($"Pos: ({r.Latitude:F4}, {r.Longitude:F4}), Alt: {r.Altitude:F0} ft, Hdg: {r.Heading:F1} deg");
}
}
catch (Exception ex)
Expand Down
14 changes: 5 additions & 9 deletions src/CTrue.FsConnect/CTrue.FsConnect.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,10 @@ Contains SimConnect binaries, as distributed by the Flight Simulator 20202 SDK 0
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<PackageLicenseFile>LICENSE.txt</PackageLicenseFile>
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
</PropertyGroup>

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<PlatformTarget>x64</PlatformTarget>
</PropertyGroup>

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<PlatformTarget>x64</PlatformTarget>
<RepositoryUrl>https://github.com/c-true/FsConnect</RepositoryUrl>
<PackageTags>msfs flight-simulator simconnect</PackageTags>
<Version>1.0.1</Version>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
</PropertyGroup>

<ItemGroup>
Expand All @@ -31,7 +27,7 @@ Contains SimConnect binaries, as distributed by the Flight Simulator 20202 SDK 0
<None Include="..\Dependencies\SimConnect\build\simconnect.dll" Visible="false" Pack="true" PackagePath="build" />
<None Include="..\Dependencies\SimConnect\build\CTrue.FsConnect.targets" Visible="false" Pack="true" PackagePath="build" />
<None Include="..\Dependencies\SimConnect\lib\net40\Microsoft.FlightSimulator.SimConnect.dll" Visible="false" Pack="true" PackagePath="lib\net40" />
<None Include="licenses\LICENSE.txt" Pack="true" PackagePath="$(PackageLicenseFile)"/>
<None Include="licenses\LICENSE.txt" Pack="true" PackagePath="$(PackageLicenseFile)" />
</ItemGroup>

</Project>
95 changes: 64 additions & 31 deletions src/CTrue.FsConnect/FsConnect.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ public class FsConnect : IFsConnect

private EventWaitHandle _simConnectEventHandle = new EventWaitHandle(false, EventResetMode.AutoReset);
private Thread _simConnectReceiveThread = null;
private bool _connected;

#region Simconnect structures

Expand All @@ -28,59 +29,83 @@ public enum DEFINITIONS
#endregion

/// <inheritdoc />
public bool Connected { get; private set; }
public bool Connected
{
get => _connected;
private set
{
if(_connected != value)
{
_connected = value;
ConnectionChanged?.Invoke(this, EventArgs.Empty);
}
}
}

/// <inheritdoc />
public event EventHandler ConnectionChanged;

/// <inheritdoc />
public event EventHandler<FsDataReceivedEventArgs> FsDataReceived;

/// <inheritdoc />
public event EventHandler<FsErrorEventArgs> FsError;

public FsConnect()
{
}

/// <inheritdoc />
public void Connect(string hostName, uint port)
{
CreateSimConnectConfigFile(hostName, port);

try
{
CreateSimConnectConfigFile(hostName, port);

_simConnect = new SimConnect("FsConnect", IntPtr.Zero, 0, _simConnectEventHandle, 0);

_simConnectReceiveThread = new Thread(new ThreadStart(SimConnect_MessageReceiveThreadHandler));
_simConnectReceiveThread.IsBackground = true;
_simConnectReceiveThread.Start();

_simConnect.OnRecvOpen += new SimConnect.RecvOpenEventHandler(SimConnect_OnRecvOpen);
_simConnect.OnRecvQuit += new SimConnect.RecvQuitEventHandler(SimConnect_OnRecvQuit);

_simConnect.OnRecvException += new SimConnect.RecvExceptionEventHandler(SimConnect_OnRecvException);
_simConnect.OnRecvSimobjectDataBytype += new SimConnect.RecvSimobjectDataBytypeEventHandler(SimConnect_OnRecvSimobjectDataBytype);
}
catch (Exception e)
{
Debug.Assert(false, e.Message);
_simConnect = null;
throw new Exception("Could not connect to Flight Simulator: " + e.Message, e);
}

_simConnectReceiveThread = new Thread(new ThreadStart(SimConnect_MessageReceiveThreadHandler));
_simConnectReceiveThread.IsBackground = true;
_simConnectReceiveThread.Start();

_simConnect.OnRecvOpen += new SimConnect.RecvOpenEventHandler(SimConnect_OnRecvOpen);
_simConnect.OnRecvQuit += new SimConnect.RecvQuitEventHandler(SimConnect_OnRecvQuit);

_simConnect.OnRecvException += new SimConnect.RecvExceptionEventHandler(SimConnect_OnRecvException);
_simConnect.OnRecvSimobjectDataBytype += new SimConnect.RecvSimobjectDataBytypeEventHandler(SimConnect_OnRecvSimobjectDataBytype);
}

/// <inheritdoc />
public void Disconnect()
{
if (_simConnect != null)
if (!Connected) return;

try
{
_simConnectReceiveThread.Abort();
_simConnectReceiveThread.Join();
_simConnectReceiveThread = null;

_simConnect.OnRecvOpen -= new SimConnect.RecvOpenEventHandler(SimConnect_OnRecvOpen);
_simConnect.OnRecvQuit -= new SimConnect.RecvQuitEventHandler(SimConnect_OnRecvQuit);
_simConnect.OnRecvException -= new SimConnect.RecvExceptionEventHandler(SimConnect_OnRecvException);
_simConnect.OnRecvSimobjectDataBytype -= new SimConnect.RecvSimobjectDataBytypeEventHandler(SimConnect_OnRecvSimobjectDataBytype);

_simConnect.Dispose();
}
catch (Exception e)
{
}
finally
{
_simConnectReceiveThread = null;
_simConnect = null;

Connected = false;
ConnectionChanged?.Invoke(this, EventArgs.Empty);
}
}

Expand All @@ -104,7 +129,6 @@ public void RequestData(Enum requestId)
private void SimConnect_OnRecvOpen(SimConnect sender, SIMCONNECT_RECV_OPEN data)
{
Connected = true;
ConnectionChanged?.Invoke(this, EventArgs.Empty);
}

private void SimConnect_OnRecvQuit(SimConnect sender, SIMCONNECT_RECV data)
Expand All @@ -115,9 +139,14 @@ private void SimConnect_OnRecvQuit(SimConnect sender, SIMCONNECT_RECV data)
private void SimConnect_OnRecvException(SimConnect sender, SIMCONNECT_RECV_EXCEPTION data)
{
SIMCONNECT_EXCEPTION eException = (SIMCONNECT_EXCEPTION)data.dwException;
Console.WriteLine("SimConnect_OnRecvException: " + eException.ToString());

//lErrorMessages.Add("SimConnect : " + eException.ToString());
FsError?.Invoke(this, new FsErrorEventArgs()
{
Exception = data.dwException,
ExceptionDescription = eException.ToString(),
SendID = data.dwSendID,
Index = data.dwIndex
});
}

private void SimConnect_OnRecvSimobjectDataBytype(SimConnect sender, SIMCONNECT_RECV_SIMOBJECT_DATA_BYTYPE data)
Expand All @@ -137,28 +166,32 @@ private void SimConnect_MessageReceiveThreadHandler()

try
{
Console.WriteLine("Receiving message from Flight Simulator");

_simConnect?.ReceiveMessage();
}
catch (Exception e)
{
Console.WriteLine("An error occurred while receiving message: " + e);
}
}
}

private void CreateSimConnectConfigFile(string hostName, uint port)
{
StringBuilder sb = new StringBuilder();
try
{
StringBuilder sb = new StringBuilder();

sb.AppendLine("[SimConnect]");
sb.AppendLine("Protocol=IPv4");
sb.AppendLine($"Address={hostName}");
sb.AppendLine($"Port={port}");
sb.AppendLine("[SimConnect]");
sb.AppendLine("Protocol=IPv4");
sb.AppendLine($"Address={hostName}");
sb.AppendLine($"Port={port}");

string fileName = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "SimConnect.cfg");
File.WriteAllText(fileName, sb.ToString());
string fileName = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "SimConnect.cfg");
File.WriteAllText(fileName, sb.ToString());
}
catch (Exception e)
{
throw new Exception("Could not create SimConnect.cfg file: " + e.Message, e);
}
}
}
}
12 changes: 12 additions & 0 deletions src/CTrue.FsConnect/FsErrorEventArgs.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using System;

namespace CTrue.FsConnect
{
public class FsErrorEventArgs : EventArgs
{
public uint Exception { get; set; }
public uint SendID { get; set; }
public uint Index { get; set; }
public string ExceptionDescription { get; set; }
}
}
5 changes: 5 additions & 0 deletions src/CTrue.FsConnect/IFsConnect.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,11 @@ public interface IFsConnect
/// </summary>
event EventHandler<FsDataReceivedEventArgs> FsDataReceived;

/// <summary>
/// The <see cref="FsError"/> event is raised when an error has been raised by SimConnect.
/// </summary>
event EventHandler<FsErrorEventArgs> FsError;

/// <summary>
/// Gets a boolean value indication whether a connection to Flight Simulator is established.
/// </summary>
Expand Down

0 comments on commit a389719

Please sign in to comment.