Joystick Schubregler (Throttle) kalibrieren

Hier ist der Ort für Fragen bei technischen Problemen mit X Rebirth.

Moderator: Moderatoren für Deutsches X-Forum

Post Reply
svarni
Posts: 31
Joined: Tue, 11. Jan 05, 23:46
x4

Joystick Schubregler (Throttle) kalibrieren

Post by svarni » Mon, 12. Oct 15, 15:53

Hallo,

Mein Joystick (Thrustmater Top-Gun Afterburner II) hat einen separaten Schubregler. Dieser produziert Rohdaten von 0 bis 255. Das Spiel interpretiert die Werte von 0 bis etwa 127 als Rückwärtsschub, die darüber als Vorwärtsschub. Man kann diese Interpretation der Schubreglerstellung aber nicht anpassen. Das stört mich, seitdem das Spiel veröffentlicht wurde. Ich habe die gesamte untere Hälfte des Schubreglers, was viel zu viel ist, um einen Rückwärtsschub bis vielleicht 30 EInheiten zu kontrollieren. Aber ich habe nur die obere Hälfte des Schubreglers, um den Vorwärtsschub bis vielleicht 300 Einheiten zu kontrollieren, was viel zu wenig ist. Denn irgendwo in der Mitte gibt es noch die Nullzone, die diese Auflösung noch verschlechtert. Gleichzeitig ist sie natürlich zu klein, weil der Schubregler keine Nullstellung in der Mitte hat (haben das andere Joysticks mit separatem Schubregler?), d.h. das Schiff zum Stillstand zu bringen ist jedes mal eine Tortur.

Können wir bitte eine Möglichkeit bekommen, den Schubregler vollumfänglich im Spiel zu kalibrieren? D.h. eine definierbares Fenster für den Nullschub, nicht nur in der Größe 127 +/- X), sondern auch in der Position (0 < X < Y < 255). Ich habe das irgendwann in den vergangenen zwei Jahren schon einmal bemängelt :( Sinngemäß sollte natürlich der Bereich 0...X auf das ganze Rückwärtsschubspektrum und Y...255 entsprechend auf Vorwärts abgebildet werden.

Mein Schubregler hat eine Arretierung Nahe der Null- (und Maximalstellung). Darauf würde ich gerne die Nullzone setzen und das kann ich seit 2 Jahren nicht.

Hüpper
Posts: 295
Joined: Fri, 21. Feb 14, 13:57
x4

Post by Hüpper » Mon, 12. Oct 15, 23:39

Hallo svarni,

eher erfüllt egosoft meinen Wunsch der Tastaturunterstützung für (Handels-)Punkte.

Wenn mich mein Gedächtnis nicht täuscht, so sollte der Throttlestatus am HID Interface mit 9bits abgebildet werden. Das wäre dann 0-511. Diese Werte werden aber noch intern auf -32767 - +32767 skaliert. Ich kann mich aber auch irren.

Was ich mit meinem ersten Satz ausdrücken wollte, das wäre (siehe letzter Satz):

Dein Joystick ist schon etwas betagt, aber solltest Du noch unter XP/64 den Rechner befeuern, so könntest Du die beiliegende Thrustmaster-Software nehmen und damit Deinen Wunsch erfüllen können. Laut Beschreibung solltest Du den Kurvenverlauf justieren können. Nur, leider, läuft die Software ab Vista nicht mehr und ist auch mittlerweile von der Supportseite entfernt worden.

Mit meinem Thrustmaster habe ich für XR den Schubhebelverlauf auf

SetCustomCurve(&Throttle, THR_LEFT, LIST(0,0, 10,50, 20,55, 100,100)); // Verhältnis von Reverser/Throttle auf ca. 10 zu 90% festlegen

gesetzt. Das ist das, was Du möchtest. Du könntest nun Dir einen Joystick besorgen, mit dem man auch solch eine Einstellung vornehmen kann.

Alternativ über Software. Suche nach vJoy (es gibt zwei unterschiedliche Anbieter mit dem selben Produktnamen (und damit hört die Ähnlichkeit auf))

sowie PPJoy, AHK, UJR, GlovePie. Damit sollte sich was umsetzen lassen.

Alternativ, falls Du eine Programmiersprache kannst, wäre, den Feeder für vJoy selber zu schreiben. Als Joystickeingabebibliothek , falls man das nicht selber entwickeln möchte, könnte man auf SDL2 zurückgreifen.

Dann siehst Du Deinen Wunsch schneller realisiert...

Ahoj
-Uwe

svarni
Posts: 31
Joined: Tue, 11. Jan 05, 23:46
x4

Post by svarni » Tue, 13. Oct 15, 16:24

Hallo und Danke für Deine Antwort.
Hüpper wrote:[...]Diese Werte werden aber noch intern auf -32767 - +32767 skaliert. Ich kann mich aber auch irren.
Das ist ja der Punkt. Intern rechnet das Spiel die Daten um, und dort würde ich gerne ansetzen. Ein neuer Joystick ist dafür einfach nicht nötig.
Hüpper wrote:Alternativ über Software. Suche nach vJoy (es gibt zwei unterschiedliche Anbieter mit dem selben Produktnamen (und damit hört die Ähnlichkeit auf))[...]
XR ist ja nun auch Software, aber es ist es leider nicht wert, dutzende externer Programme durchzuprobieren. Der Zeitaufwand ist einfach zu groß.
Hüpper wrote:Alternativ, falls Du eine Programmiersprache kannst, wäre, den Feeder für vJoy selber zu schreiben. Als Joystickeingabebibliothek , falls man das nicht selber entwickeln möchte, könnte man auf SDL2 zurückgreifen.
Ich kann mehrere, aber nur unter Linux, und die ganze Arbeit ist das Spiel wirklich nicht wert. Es kann nicht schwer sein, eine Konfiguration anzubieten, in der man ein paar Fallunterscheidungen und affine Abbildungen auf den Throttle-Input anwenden lässt. Von mir aus nur in einer config-Datei und nicht per grafischem Menü. Dafür müssten die Entwickler halt eine Minimalstdokumentation mitliefern, die den Namen "Dokumentation" noch wert ist (und nicht: "die Speicheradresse für die Achse müssen Sie schon selbst herausfinden" oder "hier Assemblercode einfügen").

Aber ich bin immernoch zuversichtlich, dass man X Rebirth irgendwann auch mit einem Joystick vernünftig wird steuern können. Die Deadzone war ja ein halbes Jahr nach Release auch konfigurierbar.

svarni
Posts: 31
Joined: Tue, 11. Jan 05, 23:46
x4

Post by svarni » Thu, 15. Oct 15, 22:33

Achja, die einfachste Lösung bestünde natürlich darin, das Spiel einfach mit einer Option starten zu können, die die Uminterpretation auf vorzeichenbehaftete Werte des Schubreglers abschaltet bzw. dessen Inputs nur auf den Vorwärtsschub abbildet. Könnte man natürlich auch über eine Option zum Anwählen im Spiel selbst anbieten.

Dann kann ich mit dem Schubregler halt nicht rückwärts fliegen und muss das halt ggf. mit der Tastatur oder Maus machen - brauche ich eh fast nie.

Zumindest solche eine Änderung sollte schon drin sein.

Hüpper
Posts: 295
Joined: Fri, 21. Feb 14, 13:57
x4

Post by Hüpper » Sat, 17. Oct 15, 22:00

Hi svarni,

uns wird keiner helfen und Dein Problem ist ja wenigstens zu lösen.

Angenommen Du spielst unter Windows, ich habe von Linux keine Ahnung.

Hole Dir von MS die VS2013 für lau. (Die ist zwar nicht komplett, so wie die NotSoLau Versionen, sollte aber m.W. hier reichen.)

Hole Dir VJoy und die SDL2

Installiere das alles. Starte das Visual Studio und lasse Dir von der Framework eine MFC Dialoganwendung erstellen.


Gehe im CMyDialog::OnInitDialog() ans Ende und starte einen Worker
z.B.
BOOL CFSThrottleManagerDialog::OnInitDialog()
{
CDialogEx::OnInitDialog();

// Starte den ThrottleManagerThread
m_Event[0].ResetEvent();
m_Event[1].ResetEvent();
m_pThread[0] = AfxBeginThread(ProcessJoystick, this);
return TRUE;
}

Ein paar Helper
void CFSThrottleManagerDialog::OnBnClickedStopButton()
{
if (IsThreadRunning())
{
// Signalisiere dem FSThrottleMangerThread das Ende an
m_Event[0].SetEvent();
// und warte bis Thread sich beendet hat
WaitForSingleObject(m_pThread[0]->m_hThread, INFINITE);
}
}

bool CFSThrottleManagerDialog::IsThreadRunning()
{
EnterCriticalSection(&csThrottleManager);
bool bThreadRunning = m_bThreadRunning;
LeaveCriticalSection(&csThrottleManager);
return bThreadRunning;
}


Der Thread
UINT ProcessJoystick(LPVOID pParam)
{
// Helper: Aufruf der eigentlichen WorkerThreadFunktion hier
// AfxEndThread() ruft keine Destruktoren auf. Dadurch können
// Memory Leaks entstehen. Bspw. CString
// Im Workerthread werden, wie in jeder anderen Funktion
// die Destruktoren aufgerufen.
//
// Oder man verzichtet im Workerthread auf AfxEndThread()
// und ruft einfach return nRetCode; auf.
//
UINT nRetCode = ProcessJoystickWorker(pParam);
AfxEndThread(nRetCode);
return 0;
}

Der eigentliche Worker

UINT ProcessJoystickWorker(LPVOID pParam)
{
CFSThrottleManagerDialog* pDialog = (CFSThrottleManagerDialog*)pParam;
pDialog->SetThreadRunning(true);
SDL_Joystick *Joystick = NULL;
SDL_bool done = SDL_FALSE;
JOYSTICK_POSITION_V2 vJoyReport1;
SDL_Init(SDL_INIT_JOYSTICK)
// Enumeriere alle bekannten Joysticks
for (i = 0; i < SDL_NumJoysticks(); ++i)
{
strName = SDL_JoystickNameForIndex(i);
if (strName.CompareNoCase(strJoystick) == 0)
{
nJoystick = i; // Joystick gefunden
break;
}
}
if (!vJoyEnabled())
{
// Ende der Fahnenstange, vJoy ist nicht in Betrieb
}
// Ermittle den Status vom vJoy Device bevor wir diesen anfordern
VjdStat status = GetVJDStatus(nvJoy1)
AcquireVJD(nvJoy1);
Joystick = SDL_JoystickOpen(nJoystick);
// Initialisier die beiden vJoy
memset(&vJoyReport1, 0, sizeof(vJoyReport1));
vJoyReport1.bDevice = (BYTE)nvJoy1;
while (!done)
{
DWORD dwRet = WaitForMultipleObjects(2, hEvent, FALSE, 10);

// Stoppe den Loop
if (dwRet == WAIT_OBJECT_0)
{
done = SDL_TRUE;
break;
}
SDL_JoystickUpdate();
// Hier kommt Deine Mathe für die Beeinflussung des Leistungshebels
// ich mache hier meine für ein anderes Spiel
vJoyReport1.wAxisZ = (SDL_JoystickGetAxis(Joystick, nThrottle1) + 32768) / 2; // Motor 1

UpdateVJD(nvJoy1, (PVOID)(&vJoyReport1));
}
// Thread soll sich beenden
// bischen aufräumen und fertig
RelinquishVJD(nvJoy1);
if (Joystick)
SDL_JoystickClose(Joystick);

// Schliesse Subsystem und SDL
SDL_QuitSubSystem(SDL_INIT_JOYSTICK);
SDL_Quit();

pDialog->SetThreadRunning(false);
return nRetCode;
}

und somit hast Du schon 90% des benötigten Codes. Ein bisschen Feinschliff noch und ab geht die Post.

Leider lässt sich mein Wunsch nur von egosoft erfüllen. Da habe ich deutlich schlechtere Karten

Ahoj
-Uwe

svarni
Posts: 31
Joined: Tue, 11. Jan 05, 23:46
x4

Post by svarni » Fri, 23. Oct 15, 17:55

Danke nochmal, aber das wäre mir einfach zuviel Arbeit.

Gibt es denn irgendwo eine fundierte Einführung in das Thema Modding? Vielleicht ist es ja möglich, einen Dreizeiler zu schreiben, der die nötige Veränderung für mich macht. Da kann ich mich ggf. noch einarbeiten. Sofern es halt eine lesbare Doku gibt. Und natürlich muss vorgesehen sein, dass ein Modder auch mit den Eingabegeräten herumspielen kann. Wenn ein Mod gar nicht so tief ins Spiel eingreifen kann, muss man sich ja nicht weiter informieren.

svarni
Posts: 31
Joined: Tue, 11. Jan 05, 23:46
x4

Post by svarni » Sat, 24. Oct 15, 02:58

Ich habe mittels des Catalog Tools mal in der Datei
09.cat/libraries/parameters.xml
Zeile 18 ersetzt durch folgende Zeilen:

Code: Select all

    <throttle button="2.0" mousewheel="0.2">
        <curve default="1">
          <point position="0" value="0" />
          <point position="0.2" value="0.5" />
          <point position="1" value="1" />
        </curve>
	  </throttle>
  
Das hat aber leider keinerlei Auswirkung. Aber so in der Richtung müsste es doch gehen.

svarni
Posts: 31
Joined: Tue, 11. Jan 05, 23:46
x4

Post by svarni » Sun, 13. Dec 15, 02:03

Bei Elite: Dangerous ist es übrigens ganz simpel einzustellen, dass die Schub-Achse zur Gänze nur dem Vorwärtsschub dient. Darüberhinaus darf man sogar eine Taste/einen Button festlegen, der gedrückt und wahlweise (!) gehalten werden muss, um temporär dieselbe Achse für den Rückwärtsschub zu verwenden. Dort gibt es also sogar Optionen, von denen ich hier noch nicht mal zu träumen wage.

svarni
Posts: 31
Joined: Tue, 11. Jan 05, 23:46
x4

Post by svarni » Sun, 11. Sep 16, 18:22

svarni wrote:Ich habe mittels des Catalog Tools mal in der Datei
09.cat/libraries/parameters.xml
Zeile 18 ersetzt durch folgende Zeilen:

Code: Select all

    <throttle button="2.0" mousewheel="0.2">
        <curve default="1">
          <point position="0" value="0" />
          <point position="0.2" value="0.5" />
          <point position="1" value="1" />
        </curve>
	  </throttle>
  
Das hat aber leider keinerlei Auswirkung. Aber so in der Richtung müsste es doch gehen.
*push*
ich möchte nur alle paar Jahre mal nachfragen: muss ich meinen Schubregler immernoch zentrieren, um das Schiff zum Stehen zu bringen?

Hat irgend jemand eine Lösung für das Problem?

Bin ich der einzige im Universum, der einen separaten Schubregler für den Joystick benutzt?

Hüpper
Posts: 295
Joined: Fri, 21. Feb 14, 13:57
x4

Post by Hüpper » Fri, 16. Sep 16, 01:36

Hallo svarni,

da Dir keiner antwortet, so bringt das mich, wie schon vor Jahren, auf den Plan.

Kaufe Dir einen Joystick den man scripten kann, oder siehe meine damalige Antwort #2 oder war es #3 ?

Der Preis für solch einen (mein benutzter) Joystick ist meines Wissens von 400€ auf 250€ gesunken. Mit diesem Teil geht Dein Wunsch sicherlich in Erfüllung.

Das das ist nicht Deine von Dir erhoffte Antwort, aber ich kann es nicht ändern. Siehe meinen ersten Satz von damaliger Antort #1

Ahoj
-Uwe

svarni
Posts: 31
Joined: Tue, 11. Jan 05, 23:46
x4

Post by svarni » Sun, 2. Oct 16, 22:28

Hallo Uwe und Danke für dein Posting.

Einen neuen Joystick möchte ich mir allerdings nicht kaufen ;)

In welchem Foum sollte ich denn nachfragen, was es mit dem o.g. Code

Code: Select all

    <throttle button="2.0" mousewheel="0.2">
        <curve default="1">
          <point position="0" value="0" />
          <point position="0.2" value="0.5" />
          <point position="1" value="1" />
        </curve>
	  </throttle>
  
auf sich hat? Ich bin mir sicher, dass das Mapping der Schubregler-Achse über einen Streckenzug aus "position" und "value" definiert wird. Leider hatte die modifizierte Datei, die ich damit erstellt habe, keinerlei Auswirkung. Aber irgend einen Einfluss müssen die Werte ja haben. Sicher habe ich beim modden nur etwas falsch gemacht (habe da keine Erfahrung). Gibt's ein dediziertes modding-Forum, bei dem man professionelle Hilfe erwarten kann? Ich dachte immer, die Unterstützung für die X-Reihe wäre so gut.

Grüße,
svarni

PS: ich habe unter http://update.egosoft.com/x2/forum/view ... p?t=392062 jetzt mal im englischsprachigen MOD-Forum gefragt, vielleicht kommt ja doch etwas bei rum.

Hüpper
Posts: 295
Joined: Fri, 21. Feb 14, 13:57
x4

Post by Hüpper » Mon, 3. Oct 16, 15:49

Hallo svarni,

für mich sieht dieses Schnipsel nicht nach einer "Kalibrierkurve" aus.

Für mich sieht das eher nach einer Veränderungstabelle aus.
Wenn eine Taste/Button gedrückt dann gebe abs(2) zurück
Mausrad gedreht, dann gebe abs(0.2) zurück
Dann für die Kurvenregler. Anscheinend gibt es unterschiedliche Einheiten.
Bspw Joystick gegen Gamepad ??

Veränderung 0 == abs(0)
Veränderung 0.2 == abs(0.5) // Joystick ??
Veränderung 1 == abs(1) // Gamepad ??

und mit dem Wert verändert (add oder dec) dann das Programm (X-Rebirth) die absolute Position des virtuellen Throttle Deiner Skunk.

Nur eine Mutmaßung meinerseits


Für meine Throttle habe ich in der Joystick-Software diese Kalibrierung festgelegt

SetCustomCurve(&Throttle, THR_LEFT, LIST(0,0, 10,50, 20,55, 100,100)); // Verhältnis von Reverser/Schub auf ca. 10 zu 90 festlegen

Die ersten 10% des Schubhebelweges werden für den Rückwärtsschub verwendet. Dann ein kleiner Totpunkt mit wenig Veränderung (zwischen 10 und 20) und der Rest dann für den normalen Schub voraus.

Ich denke nach so etwas ähnlichem müsstest Du in den xml files suchen.

Ahoj
-Uwe

svarni
Posts: 31
Joined: Tue, 11. Jan 05, 23:46
x4

Post by svarni » Sun, 22. Jan 17, 18:36

Was muss ich eigentlich tun, um herauszufinden, ob dieses technische Problem den Entwicklern überhaupt bekannt ist? Ich kaufe mir kein "X:R VR" ohne eine Klärung darüber, ob dieses Problem endlich mal behoben wird, oder ob es gar nicht als Problem betrachtet wird.

Post Reply

Return to “X Rebirth - Technische Unterstützung”