PMDG 777 SDK durch SimConnect in (VB).NET

    • Anleitung

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • PMDG 777 SDK durch SimConnect in (VB).NET

      Hallo,
      Da man im Internet leider sehr wenig Informationen findet, wie man in VB.Net durch SimConnect mit dem FSX kommuniziert und da funktionierende PMDG SDK Beispiele in .Net leider nur mit Wrappern findet oder in C++ geschrieben sind, möchte ich hier mal eine Beispiel-Anwendung zur verfügungstellen.

      Als aller erstens, wenn Ihr in .Net eine Verbindung über SimConnect realisieren wollt, solltet Ihr sicherstellen, das das FSX SDK und SimConnect installiert ist.Wichtig ist auch, das SimConnect in der richtigen Version installiert ist, da z.B. die Standart-FSX( ohne SP1 , Acceleration) nicht alle Funktionen unterstützt. Das System auf dem die Anwendung später laufen soll, braucht natürlich auch die richtige Version, dort wird aber nur SimConnect und nicht das ganze SDK benötigt. Wie Ihr das SDK für euer FSX installiert findet Ihr hier (Englisch).


      In dieser Anleitung wird mit Microsoft Visual Studio programmiert, manche Dinge können in anderen Programmen abweichen.

      Zuerst, Verweist ihr auf die SimConnect DLL die ihr im Ordner eures SDK's unter Core Utilities Kit\SimConnect SDK\lib\managed finden könnt, falls ihr eine Falsche Version installiert habt, wird euch VS darauf hinweisen, indem es im folgenden ProgrammCode, insbessondere bei SimConnect Funktionen, Fehler anzeigt. Stellt auch sicher das ihr .Net framwork 2 - 3.5 verwendet, da SimConnect die neueren Versionen leider nichtmehr unterstützt.

      Alls nächstes fügt diese zwei Imports vor eurer Class ein:

      Quellcode

      1. Imports Microsoft.FlightSimulator.SimConnect
      2. Imports System.Runtime.InteropServices


      In eurer Klasse fügen wir dan diese Definitonen ein:

      Quellcode

      1. Private Const WM_USER_SIMCONNECT As Integer = &H402
      2. Dim sc As Microsoft.FlightSimulator.SimConnect.SimConnect
      3. Dim Control As SDK.PMDG_777X_Control
      4. Dim pmdg_777X_data As SDK.PMDG_777X_Data


      Ihr müsst auch immer die SDK.vb die in der Beispielanwenung enthalten ist, in euer Programm einbauen.

      Die verbindung mit dem FSX baut ihr zum Beispiel so auf:

      Quellcode

      1. Private Sub OpenSimConnectCon()
      2. If sc Is Nothing Then
      3. Try
      4. sc = New SimConnect("T7COM", Me.Handle, WM_USER_SIMCONNECT, Nothing, 0)
      5. InitDataConnection()
      6. InitControlConnection()
      7. DisplayText("Connection request sent ...", "info")
      8. Catch ex As Exception
      9. DisplayText("Coud not connect!", "error", 10)
      10. End Try
      11. Else
      12. DisplayText("Already Connected", "error", 10)
      13. CloseSimConnectCon()
      14. End If
      15. End Sub
      16. Private Sub InitControlConnection()
      17. 'Set up Control connection
      18. Control.Event = 0
      19. Control.Parameter = 0
      20. sc.MapClientDataNameToID(SDK.PMDG_777X_CONTROL_NAME, SDK.PMDGIDs.PMDG_777X_CONTROL_ID)
      21. sc.AddToClientDataDefinition(SDK.PMDGIDs.PMDG_777X_CONTROL_DEFINITION, 0, Marshal.SizeOf(Control), 0, 0)
      22. sc.RequestClientData(SDK.PMDGIDs.PMDG_777X_CONTROL_ID, SDK.Data_Request_ID.CONTROL_REQUEST, SDK.PMDGIDs.PMDG_777X_CONTROL_DEFINITION, SIMCONNECT_CLIENT_DATA_PERIOD.ON_SET, SIMCONNECT_CLIENT_DATA_REQUEST_FLAG.CHANGED, 0, 0, 0)
      23. End Sub
      24. Private Sub InitDataConnection()
      25. 'Set up Data connection
      26. 'Add Handler's to get incomming Data
      27. AddHandler sc.OnRecvOpen, New SimConnect.RecvOpenEventHandler(AddressOf sc_OnRecvOpen)
      28. AddHandler sc.OnRecvQuit, New SimConnect.RecvQuitEventHandler(AddressOf sc_OnRecvQuit)
      29. AddHandler sc.OnRecvException, New SimConnect.RecvExceptionEventHandler(AddressOf sc_OnRecvException)
      30. AddHandler sc.OnRecvSimobjectDataBytype, New SimConnect.RecvSimobjectDataBytypeEventHandler(AddressOf sc_OnRecvSimobjectDataBytype)
      31. AddHandler sc.OnRecvEvent, New SimConnect.RecvEventEventHandler(AddressOf sc_OnRecvEvent)
      32. AddHandler sc.OnRecvClientData, New SimConnect.RecvClientDataEventHandler(AddressOf sc_OnRecvClientData)
      33. sc.MapClientDataNameToID(SDK.PMDG_777X_DATA_NAME, SDK.PMDGIDs.PMDG_777X_DATA_ID)
      34. sc.AddToClientDataDefinition(SDK.PMDGIDs.PMDG_777X_DATA_DEFINITION, 0, Marshal.SizeOf(pmdg_777X_data), 0, 0)
      35. sc.RegisterStruct(Of SIMCONNECT_RECV_CLIENT_DATA, SDK.PMDG_777X_Data)(SDK.PMDGIDs.PMDG_777X_DATA_DEFINITION)
      36. sc.RequestClientData(SDK.PMDGIDs.PMDG_777X_DATA_ID, SDK.Data_Request_ID.DATA_REQUEST, SDK.PMDGIDs.PMDG_777X_DATA_DEFINITION, SIMCONNECT_CLIENT_DATA_PERIOD.ON_SET, SIMCONNECT_CLIENT_DATA_REQUEST_FLAG.CHANGED, 0, 0, 0)
      37. End Sub
      Alles anzeigen


      Durch diesen Code wurden auch EventHandler für die Sub's sc_OnRecvOpen,sc_OnRecvQuit, ... hinzugefügt.
      Wenn ihr soweit seid, könnt Ihr aber noch keine Antworten von SimConnect empfangen, die hinzugefügten Events, könne auch noch nicht ausgeführt werden, da wir erst Daten von SimConnect empfangen und an die API weitergeben müssen. Das tun wir so:

      Quellcode

      1. Protected Overrides Sub DefWndProc(ByRef m As Message)
      2. If m.Msg = WM_USER_SIMCONNECT Then
      3. If sc IsNot Nothing Then
      4. sc.ReceiveMessage()
      5. End If
      6. Else
      7. MyBase.DefWndProc(m)
      8. End If
      9. End Sub


      Sobald die Verbindung aufgebaut wurde solltet zuerst sc_OnRecvOpen ausgeführt werden, das die Verbindung erfolgreich aufgebaut wurde, können wir uns z.B. durch eine MsgBox ausgben lassen:

      Quellcode

      1. Private Sub sc_OnRecvOpen(ByVal sender As SimConnect, ByVal data As SIMCONNECT_RECV_OPEN)
      2. MsgBox("Connected to FSX")
      3. End Sub


      Im normallfall empfangt Ihr Daten der 777 durch sc_OnRecvClientData, diese könnt ihr dann weiter verarbeiten lassen:

      Quellcode

      1. Private Sub sc_OnRecvClientData(ByVal sender As SimConnect, ByVal data As SIMCONNECT_RECV_CLIENT_DATA)
      2. Select Case data.dwRequestID
      3. Case SDK.Data_Request_ID.DATA_REQUEST
      4. 'hier kommen die Daten der PMDG an diese können z.B. so ausgelesen werden:
      5. Dim da As SDK.PMDG_777X_Data = DirectCast(data.dwData(0), SDK.PMDG_777X_Data)
      6. MsgBox(da.MCP_Altitude) '<- dies Zeigt die gewälte MCP Höhe
      7. DisplayText("DataConnection Data recived", "debug", 10)
      8. Case SDK.Data_Request_ID.CONTROL_REQUEST
      9. DisplayText("ControlConnection Data recived", "debug", 10)
      10. Case Else
      11. DisplayText("Unknown Request ID |DwRId: " & data.dwRequestID, "debug", 5)
      12. End Select
      Alles anzeigen

      Falls fehler auftreten, sendet SimConnect diese auch, ihr könnst sie mit sc_OnRecvException und dwException auslesen, um die Uhrsache(n) schneller zu beheben solltet ihr auch Informationen in dem SimConnect eigenen Log finden, das geht am einfachsten, wenn Ihr mit einem Texteditor nach EXCEPTION=[dwException] sucht.

      Um Events zum FSX zu senden benutzen wir sc.SetClientData:

      Quellcode

      1. Control.Parameter = TextBox1.Text
      2. Control.Event = System.Enum.Parse(GetType(SDK.PMDGEvents), ComboBox1.Text)
      3. sc.SetClientData(SDK.PMDGIDs.PMDG_777X_CONTROL_ID, SDK.PMDGIDs.PMDG_777X_CONTROL_DEFINITION, 0, 0, Control)


      Bei Control.Event gibt ihr das gewünschte Event an, zB. EVT_OH_DOME_SWITCH
      Bei Control.Parameter gibt ihr 1 um die Dome Lights einzuschalten oder 0 um die Dome Lights auszuschalten an
      Das ganze wird dan mit SetClientData über die ControlConnection gesendet(nicht über die DataConnection)


      Die Beispielanwendung findet ihr inklusiv Qullcode hier. Ihr könnt(und sollt) sie auch gerne Verändern. Um die Vorgänge besser zu verstehn könnt ihr das Programm in Einzelschritten laufen lassen(VS Debugger), in den Verschieden Fenstern von VS(/VB Express) könnt ihr sehen wie sich Variabeln, Datenbanken, usw. verändern.

      Wenn ihr eure Anwendung veröffentlich, denkt daran sie für 32-Bit(nicht 'AnyCPU'!) zu kompilieren und auf die verschieden SimConnect versionen hinzuweisen(Bei SimConnect-RTM Benutzer wird euer Programm unter Umständen nicht richtig funktionieren!).

      Falls ihr lieber in C# programmiert und den Code übersetzt, stellt sicher das die SDK richtig übersetzt wird(sollang ihr dafür ein Programm oder WebService verwendet) auch das StructurLayout, MarshalAs's usw. !

      Der ProgrammCode der sich oberhalb befindet, funktioniert natürlich nicht durch einfaches Copy&Past, falls ihr Probleme habt, schaut euch zuerst mal die Beispielanwendung an, diese könnt ihr auch mit VB Express öffnen, falls ihr trotzdem nicht weiterkommt könnt ihr gerne fragen, es gibt aber kein fertigen Komplett-Code :D

      PS:
      Bevor ich es noch Vergesse ihr müst in dem PMDG/777X Ordner noch die PMDGOptions.ini bearbeiten, das wird aber in der PDF von PMDG im Unterordner SDK erlätert, sont sendet die 777 garnicht erst!
      Wenn für ein neues Flugzeug von PMDG eine SDK veröffentlicht wird, könnt ihr das Programm weiterverwenden indem ihr die SDK.vb abändert, solang das SDK ähnlich das der 777 und NGX ist!
      So könnt ihr auch mit der 737 NGX kommunizieren, um dies zu tun müsst ihr wiederum die SDK.vb bearbeiten.

      Bitte entschuldig Rechtschreibfehler, war ein langer Tag heute :D

      Mit freundlichen Grüßen
      Christian

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Christian_b ()

    • Hallo Christian,

      einfach klasse, kommst ja garnicht zu dem Overhead *lach*

      soll ich Dir im gegenzug unter die Arme greifen?

      Skino ist voll dabei, denn bekommt man garnicht mehr ins Bett :-)) ;(

      Gruß Herbert
      Die Einen Sagen So, Die Anderen Sagen So.......
      ++++++++++++++++++++++
      MSI Z170 A M7
      Intel i7 6700 K 4.0 (4.9 GHZ)
      Corsair H110i liquid cooler
      16GB Grafik Gamerock GTX 1070
      SD M.2 512 GB Samsung 950 Pro
      Samsung SSD 840 Eco 500 GB
      Samsung SSD 840 Eco 500 GB (Backup)
      +++++++++++++++++++++++
      Win 10 P3D V4

      Kannschonsein... Die Schande der Cockpitbauer :rolleyes: