Thema: API - DLL für Zugriff auf interne Variablen Sa 12 März - 14:20
Hallo,
wird es für den OMSI eine API geben?
Einen Ansatz kann man ja schon im Ordner "Plugins" sehen. Dort ist eine test.dll. Diese zeigt u.a. die Geschwindigkeit an.
Dies wäre auch nützlich um Bremsdruck, Temperatur usw. auszulesen um diese auf Hardware Instrumente anzuzeigen.
Hinweis zur test.dll:
Code:
To activate, rename this file to "test.opl"
[dll] Test.dll
[varlist] 2 Velocity cockpit_heizregler_temp
[triggers] 1 bus_doorfront0
Dies wäre von Vorteil für z.B. Hardware-Simmer!
Grüße Ronald
Fuenfer
Anzahl der Beiträge : 4 Anmeldedatum : 10.03.11
Thema: das schrieb Marcel: Di 15 März - 10:08
Also nach langem suchen ( da die Suchfunktion sehr engeschränkt ist) habe ich folgendes gefunden:
Zitat :
Dann darf ich jetzt mal verraten, wie wir das Hardware-Einbindungsproblem in OMSI gelöst haben:
Es gibt ein Verzeichnis "plugins", in welches man eine selbstprogrammierte DLL samt Konfig-Datei packen muss.
In die Konfig-Datei muss man den Namen der DLL, eine Liste der anzusteuernden Variablen und eine Liste der anzusteuernden Trigger eintragen. Die Reihenfolge ist wichtig.
Im Betrieb wird OMSI dann alle Konfigdateien suchen (nach Dateiendung) und die zugehörigen DLLs laden.
Dann wird OMSI jeweils die Listen durchgehen und für jede Variable und jeden Trigger, der in der Liste steht (identifikation erfolgt dann mittels des Indexes in der Liste) eine Methode aufrufen, die der DLL-Programmierer zu erstellen hat.
Beim Aufruf dieser Methode seitens OMSI teilt OMSI der DLL dann den aktuellen Wert der Variable mit (und natürlich den Index, damit die DLL weiß, um welche Variable es geht) und dann kann die Methode den Wert auch verändern und mittels "write" flag OMSI anweisen, diesen Wert zu übernehmen. Mit den Triggern läuft das soähnlich: Hier muss die DLL OMSI mitteilen, ob aktuell die zugehörige bspw. Taste "gedrückt" wird oder nicht. Dadurch, dass sich dieser Wert beim Drücken der Hardware-Taste verändert, weiß OMSI selbst, dass es den Trigger auslösen muss.
Damit sollte dann wirklich fast alles möglich sein, also insbesondere Schreiben und Auslesen sämtlicher Fahrzeugvariablen (außer Lenkung! Das muss leider - historisch bedingt - weiterhin über ein "Joystickmäßiges" Lenkrad geschehen) und Auslösen sämtlicher Trigger.
Es KANN aber theoretisch sein, dass die eine oder andere Modifikation im Fahrzeugscript vorgenommen werden muss. Und der Bastler muss sich natürlich aus dem Script raussuchen, welche Variablen er lesen und schreiben muss!
Viele Grüße
Marcel
PS: Achso, das Wichtigste vergessen: Die "andere" Seite muss dann natürlich die DLL ebenso machen! Aber das ist entsprechend flexibel: Die DLL kann ein eigenes Windows-Fenster öffnen, man kann Werte plotten und - der eigentliche Zweck - die DLL kann (wie auch immer das dann geht, davon hab ICH keine Ahnung! ) Hardware ansteuern.
Meine Frage: Ist es möglich den Programmcode für die Test.dll zu bekommen? Oder eine Übersicht zum Aufruf der Programm-Prozeduren?
Marcel Kuhnt Admin
Anzahl der Beiträge : 3364 Anmeldedatum : 26.04.09 Alter : 40 Ort : Berlin-Spandau
Thema: Re: API - DLL für Zugriff auf interne Variablen Di 15 März - 13:00
Jau, genau für diese Zwecke ist das gedacht!
Dann werd ich mal eine Kurzanleitung hier geben: Die Einbindung der DLL sollte ja bereits klar sein. Es können beliebig viele eingebunden werden.
Der Code der Test-DLL ist dann der folgende:
Code:
library Test;
uses SysUtils, Dialogs, Classes, TestU in 'TestU.pas' {Form1};
procedure Finalize; stdcall; begin form1.Free; end;
procedure AccessVariable( varindex: word; var value: single; var write: boolean ); stdcall; begin case varindex of 0: begin form1.Label2.Caption := floattostrF( value, ffFixed, 5, 1 ) + ' km/h'; form1.Gauge1.Progress := round( value ); write := false; end; 1: begin value := form1.TrackBar1.Position / 30; write := true; end; end; end;
procedure AccessTrigger( triggerindex: word; var active: boolean ); stdcall; begin case triggerindex of 0: begin active := form1.button1_pressed; end; end; end;
Vom Prinzip her: Start und Finalize werden am Anfang bzw. Ende durchlaufen und ermöglichen wie hier gezeigt eine Initialisierung einer Form mittels "AOwner".
AccessVariable und AccessTrigger werden dann für alle Variablen bzw. Trigger durchlaufen, die in der test.opl eingetragen wurden.
AccessVariable( varindex: word; var value: single; var write: boolean ) varindex: Index der Variable (natürlich nullbasiert! ) value: Wert der Variable - hier kann zunächst ausgelesen werden aber auch geschrieben write: diese Variable muss "true" gesetzt werden, damit OMSI den Wert "value" nach dem Aufruf der Prozedur übernimmt
AccessTrigger( triggerindex: word; var active: boolean ) triggerindex: Index des Triggers active: Wird diese Variable auf true gesetzt, dann wird der besagte Trigger im Folgenden ausgelöst.
felix01
Anzahl der Beiträge : 566 Anmeldedatum : 03.03.11 Alter : 29 Ort : Fichtenwalde (nahe Potsdam)
Thema: Re: API - DLL für Zugriff auf interne Variablen Di 5 Apr - 19:59
Müssen die Plugins in Delphi geschrieben sein, oder kann man die auch z.B. in VB.NET schreiben?
wäre sehr von Vorteil, da ich Delphi nicht mächtig bin
Marcel Kuhnt Admin
Anzahl der Beiträge : 3364 Anmeldedatum : 26.04.09 Alter : 40 Ort : Berlin-Spandau
Thema: Re: API - DLL für Zugriff auf interne Variablen Di 5 Apr - 21:31
Vom Prinzip her sollte es ja egal sein - du musst die Prozeduraufrufe eben nur an "deine" Programmiersprache anpassen!
felix01
Anzahl der Beiträge : 566 Anmeldedatum : 03.03.11 Alter : 29 Ort : Fichtenwalde (nahe Potsdam)
Thema: Re: API - DLL für Zugriff auf interne Variablen Mi 6 Apr - 8:21
Also ich hab jetzt mal in einer VB.NET DLL ein Programm geschrieben, welches beim Start eine Form öffnet und beim Beenden die form wieder schließt. Folgender Code:
Code:
Public Class Class1 Dim frm As New Form1 Public Sub Start(ByVal AOwner As Object) frm.Show() End Sub
Protected Overrides Sub Finalize() frm.Close() MyBase.Finalize() End Sub End Class
Jedoch passiert nichts, außer wenn ich OMSI schließe, kommt folgender Fehler:
Marcel Kuhnt Admin
Anzahl der Beiträge : 3364 Anmeldedatum : 26.04.09 Alter : 40 Ort : Berlin-Spandau
Thema: Re: API - DLL für Zugriff auf interne Variablen Mi 6 Apr - 9:30
Dann versuch erstmal deine DLL von einem eigenen Programm aus zu starten...
JanH
Anzahl der Beiträge : 10 Anmeldedatum : 12.04.11
Thema: Re: API - DLL für Zugriff auf interne Variablen Di 12 Apr - 15:42
Meine Vermutung: Eine .NET-DLL und eine 'normale' Win32-Anwendung vertragen sich nicht so einfach, du müsstest also auf C++/Delphi/... umsteigen.
felix01
Anzahl der Beiträge : 566 Anmeldedatum : 03.03.11 Alter : 29 Ort : Fichtenwalde (nahe Potsdam)
Thema: Re: API - DLL für Zugriff auf interne Variablen Di 12 Apr - 15:45
hab ich mir schon irgendwie gedacht, da ja die .NEt Sprachen doch sone "geschlossene Sache" sind
MANSD202FAN
Anzahl der Beiträge : 1106 Anmeldedatum : 31.03.11 Alter : 26 Ort : Tübingen [Baden-Württemberg]
Thema: Re: API - DLL für Zugriff auf interne Variablen Di 12 Apr - 17:08
Du musst dann natürlich für die Einbindung die Bus-Datei und die Haupt-Scripts (MAN_SD80_main.osc usw.) manipulieren, weshalb ich nur bedingt zur Anwendung (und vor allem Veröffentlichtung) DIESER Zusatzfunktion rate...
Auf jeden Fall schreib ich es mir auf für Updates, dass man vieleicht auch ohne den Workaround auskommt...
Gesponserte Inhalte
Thema: Re: API - DLL für Zugriff auf interne Variablen