Raw Input und Force Feedback / Output

Design Patterns, Erklärungen zu Algorithmen, Optimierung, Softwarearchitektur
Forumsregeln
Wenn das Problem mit einer Programmiersprache direkt zusammenhängt, bitte HIER posten.
Antworten
TDK
Beiträge: 54
Registriert: 06.04.2012, 11:15

Raw Input und Force Feedback / Output

Beitrag von TDK »

Mein Ziel ist es, dass ein Input Framework auch Daten senden kann. Dazu benutze ich Raw Input. Leider habe ich hier auch nur ein einziges Gerät zum Testen, ein Logitech F510 GamePad.
Die Allokation vom Output Buffer (Größe: Caps.OutputReportByteLength + 1) und das einfügen der Daten im Stream (HidP_SetUsageValue) funktioniert.
Was nicht funktioniert ist da Senden der Daten mit HidD_SetOutputReport: Es schlägt fehl und das Gerät meldet sich ab. :(
Interessanterweise: Schreibe ich die Daten mit WriteFile direkt, funktioniert das, bewegt sich am Gerät jedoch nichts.

So gehe ich vor:

Initialisierung:
  1. Device-Liste abfragen, für jedes Device:
  2. Handles erzeugen (jeweils eins für 0, GENERIC_READ und GENERIC_WRITE)
  3. Namen, Hersteller, Preparsed Data lesen.
  4. Capabilities abfragen.
  5. Blob für Output Buffer erzeugen (Caps.OutputReportByteLength + 1) [+1 byte für die Report ID]
  6. Buttons und Values zwischenspeichern, ranging von Indices.
  7. Konfiguration zwecks Name und Anpassung von Buttons (Kalibrierungsdaten, Namen für Buttons und Slider).
Senden von Feedback-Daten:
  1. Setzen des Wertes vom Benutzer-Bereich in den logischen Device-Bereich (Slider, Kalibrierung).
  2. Setzen des ersten Bytes für die Report ID.
  3. Setzen des Wertes via HidP_SetUsageValue(). Funktioniert.
  4. Senden des Buffers via HidD_SetOutputReport().
Ich packe mal den Quellcode vom Senden rein:

Code: Alles auswählen

/// <summary>	Sets the feedback. </summary>
///
/// <exception cref="DynamicException">	Thrown when a Dynamic error condition occurs. </exception>
///
/// <param name="hDevice">			The NT device. </param>
/// <param name="PreparsedData">	[in,out] Information describing the preparsed data. </param>
/// <param name="Page">				The page. </param>
/// <param name="Usage">			The usage. </param>
/// <param name="State">			The state. </param>
inline void SetFeedback(const HANDLE hDevice, PHIDP_PREPARSED_DATA &PreparsedData, const USHORT Page, const USHORT Usage, const ULONG State) const
{
	NTSTATUS ret = 0;
	memcpy_s(m_FeedbackData->Edit(), 1, &m_ReportID, 1);
	if (HIDP_STATUS_SUCCESS != (ret = HidP_SetUsageValue(	HidP_Output, Page, 0, Usage, State, PreparsedData,
								(PCHAR)m_FeedbackData->Edit() + 1, static_cast<ULONG>(m_FeedbackData->Size() - 1))))
		throw DynamicException(L"Failed to set feedback data", L"Failed to set the feedback value for a control.", TS_STAMP);

	DWORD NumBytesWritten = 0;
	// if(FALSE == WriteFile(hDevice, m_FeedbackData->Get(), cast<DWORD>(m_FeedbackData->Size()), &NumBytesWritten, nullptr))
				
	if (FALSE == HidD_SetOutputReport(hDevice, m_FeedbackData->Edit(), static_cast<ULONG>(m_FeedbackData->Size())))
	{
		LPWSTR errorText = NULL;
		const auto h = HRESULT_FROM_WIN32(GetLastError());

		// Only for description what happened.
		FormatMessageW(	FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS,
				nullptr, h, MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT), (LPTSTR)&errorText, 0, nullptr);

		wstring Message;
		if (NULL != errorText)
		{
			Message = wstring(L"Failed to set the output report for a device control: ") + errorText;
			LocalFree(errorText);
			errorText = NULL;
		}
		else
		{
			Message = L"Failed to set the output report for a device control.";
		}

		throw DynamicException(L"Failed to set feedback data", Message, TS_STAMP);
	}
					
	// wprintf_s(L"IO\tNum bytes written: %i", NumBytesWritten);
}
Habt ihr eine Idee oder wisst ihr schon warum ich hier seit Tagen verzweifle?
Ich weiß ehrlich gesagt nicht mehr, ob Logitech mal wieder etwas für sich verschlüsselt.
Hab mich schon bei TrackIR aufgeregt, OptiTrack unbedingt einarbeiten zu müssen.

Gruß,

Patrick
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Raw Input und Force Feedback / Output

Beitrag von Krishty »

Welche Usage Page / Usage ID hat denn das Force Feedback? Ich habe auf die Schnelle meinen PlayStation-Controller eingesteckt, und da ist die Vibration (habe sie noch nicht zum Laufen gekriegt) im Bereich Vendor-defined (0xFF000xFFFF) …

Leicht off-topic:
MSDN — Sending HID Reports by User-Mode Applications hat geschrieben:A user-mode application should use WriteFile (as described in the Microsoft Windows SDK) as its main approach to continuously send output reports to a HID collection. An application can also use HidD_SetXxx routines to send output reports and feature reports to a collection. However, an application should only use these routines to set the current state of a collection. Some devices might not support HidD_SetOutputReport and will become unresponsive if this routine is used.
WTF?! Meinen die sowas ernst?
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
TDK
Beiträge: 54
Registriert: 06.04.2012, 11:15

Re: Raw Input und Force Feedback / Output

Beitrag von TDK »

Fuck. Und das trifft auf Gamepads von Logitech zu.

Soll jetzt heißen:
Vergesst doch Raw Input und schreibt doch gleich selbst?
Ich krieg 'ne Kriese!

Force Feedback ist bei mir auch im Bereich Vendor Defined.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Raw Input und Force Feedback / Output

Beitrag von Krishty »

Naja; ich würde die Flinte nicht ins Korn werfen. Irgendwie löst DirectInput ja auch Force Feedback aus; ich kann mir nicht vorstellen, dass die für jeden Hersteller eine eigene Bibliothek schreiben (oder dass das für die Hersteller irgendwie lohnenswert wäre).

Auch bin ich bei mir jetzt so weit, dass HidD_SetOutputReport() bzw. WriteFile() erfolgreich sind, aber es vibriert trotzdem nichts. Bist du nach irgendeinem Tutorial vorgegangen, das mich erleuchten könnte? Ich probiere hier einfach blind rum und habe keine Ahnung, wie man es „richtig“ anpacken soll …
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
TDK
Beiträge: 54
Registriert: 06.04.2012, 11:15

Re: Raw Input und Force Feedback / Output

Beitrag von TDK »

Ne, ich habe das alles in Eigenregie mit Fallen und Weiterlaufen probiert.
Der erste Fall war ja die 'ReportID', die nicht per Device sondern pro Steuerelement anders sein könnte, laut Doku.
Dann habe ich jetzt noch die LinkCollection vorsichtshalber mit eingebunden
auch wenn ich immer noch nicht so recht kapiere, was sich dahinter verbirgt.

Eine Überlegung, die ich schon hatte, war die Daten vom Report von DirectInput und XInput mal zu vergleichen.
... Und was mir der Parser so für nette Dinge schreibt. Denn es kommt mir spanisch vor,
dass der Wert vom FF gleich ins erste Byte gesetzt ist, das Paket aber 8 Byte groß ist.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Raw Input und Force Feedback / Output

Beitrag von Krishty »

Was die Report ID betrifft: Für mein FF ist dort 0 eingetragen; also kein gültiger Wert. Auch bei mir wandert der FF-Wert ins erste Byte, und WriteFile() spuckt für jede andere Pufferlänge als caps.outputReportByteLength aus: The supplied user buffer is not valid for the requested operation. Ich gehe also davon aus, dass sie bei mir nicht benutzt wird.

Von Link Collections habe ich auch keinen Plan; ich bin dran. Was ich auch schon versucht habe: FF auf 0, Sleep(10); FF auf 255. Auch nüx.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Raw Input und Force Feedback / Output

Beitrag von Krishty »

FUCK jetzt hab ich’s geschafft aber das Ding hörte nicht mehr auf zu vibrieren. Melde mich wenn ich begriffen habe, was los ist.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Raw Input und Force Feedback / Output

Beitrag von Krishty »

Also:
  • bei mir wandert die einzige Output Value immer in Byte [1] (nicht 0; sry).
  • Byte [2] erzeugt starke Vibration; Byte [3] erzeugt leichte. Vielleicht sind sie ein gemeinsamer 16-Bit-Wert. Nichts davon deckt sich mit dem, was mir bei der Enumeration vermittelt wurde.
  • Von alleine hört das Gerät nicht mehr auf, wenn du einmal was aktiviert hast. Pflanz also irgendwo Code hinter deinen Test, der einen genullten Input Report sendet, damit du es nicht jedes Mal trennen musst.
  • WriteFile() und HidD_SetOutputReport() scheinen das gleiche zu sein.
Die Tatsache, dass es vibriert, zeigt, dass es auf jeden Fall schonmal möglich ist. Wir müssen jetzt nur herausfinden, wo wir Usage Page und Usage herbekommen, damit in dem Output Report die richtigen Bytes gesetzt werden.

Ein Hinweis wären Microsofts Dokumente Designing HID System Devices for DirectInput® und Designing HID Game Controllers for DirectInput®, auf die USB.org verweist. Ich kann aber nirgends eine Version davon finden; nur die Namen haben überlebt.

Nachtrag: Krass – hier schreibt jemand
http://www.q1.fcen.uba.ar/materias/iqi/joygus/pc_joystick.html hat geschrieben:By working directly with device drivers, DirectInput bypasses the Microsoft® Windows® message system.
Falls das zutrifft, sitzen wir tatsächlich in der Patsche.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Raw Input und Force Feedback / Output

Beitrag von Krishty »

Ich habe eben das hier gefunden: Universal Serial Bus — Device Class Definition for Physical Interface Devices (PID); Version 1.0 von 9/8/99

Demnach unterstützt wohl jedes entsprechende USB-HID Set-Reports, die Force-Feedback-Effekte auslösen. Ich lese mich mal ein.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
TDK
Beiträge: 54
Registriert: 06.04.2012, 11:15

Re: Raw Input und Force Feedback / Output

Beitrag von TDK »

Hm, klingt gar nicht gut.
Sprich, die Preparsed Data sind ungültig, wenn das Message System nicht benutzt wird?
Bin mir jetzt unsicher, da selbst die Geräte falsche Reports schicken könnten. Ich traue u.A. Logitech alles zu.
Weil siehe Anhang.
Dateianhänge
Connection Information.pdf
Verbindungsinformation Logitech F510 Gamepad
(210.97 KiB) 621-mal heruntergeladen
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Raw Input und Force Feedback / Output

Beitrag von Krishty »

Das Dokument, das ich oben erwähnt habe, sieht enorm vielversprechend aus. Scheinbar wird Force Feedback als Reihe von Effekten beschrieben (so weit bekannt aus DirectInput) und die werden via WriteFile() als einzelne Reports an das HID übertragen (wie aus der HID-API bekannt, nur dass der Input durch Preparsed Data abstrahiert und zusammengefasst wurde).

Kurz: Reports nach Vorbild des Dokuments zusammenbasteln, WriteFile(), und es sollte wackeln. Da ich aber erkältet bin, nehme ich das erst morgen vormittag in Angriff :(
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
TDK
Beiträge: 54
Registriert: 06.04.2012, 11:15

Re: Raw Input und Force Feedback / Output

Beitrag von TDK »

Nimm dir einfach die Zeit, die du brauchst. Ist auch nicht OMG-bitte-bitte-bitte-zu-morgen ( ͡° ͜ʖ ͡°) . Ich muss auch noch für Mittag kochen gehen.

Hier noch ein anderes, von mir erstelltes Dokument. Vielleicht kommt da mehr raus.
Es nimmt sich die Daten von den value caps.
Dateianhänge
Devices.xml
Devices - interne Doku
(188.02 KiB) 540-mal heruntergeladen
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Raw Input und Force Feedback / Output

Beitrag von Krishty »

Hmmm; knifflig. Also dein Hauptproblem war, dass sich das Gerät abmeldet, wenn du HidD_SetOutputReport() aufrufst? Und WriteFile() funktioniert nicht?

Ich bin mittlerweile so weit, dass meine Force Feedback-Daten ein Usage Value Array sind. Das ist etwas, das ich auch bei meiner eigenen HID-Implementierung völlig vergessen habe – dass ein Gerät mehr als eine X-Achse haben könnte. Offensichtlich enumeriert mein Controller seine vier Rumbling-Funktionen als eine einzige Usage mit vier parallelen Werten. Mal sehen, ob ich das hingebogen kriege.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Raw Input und Force Feedback / Output

Beitrag von Krishty »

Sooo … ich weiß jetzt also, dass bei Usage Page ff00 und Usage 0002 vier Regler habe, von denen die letzten beiden Vibration steuern. Jetzt muss ich nur wissen, inwiefern das auf andere Geräte übertragbar ist.

Wie ich das sehe, hat dein RumblePad bei ff00-0001 einen Knopf sechzehn Knöpfe dafür. Das ist zumindest schonmal eine ähnliche Region.

Ich werde am Wochenende bei einem Freund mein Logitech-Lenkrad testen; das hat neben Vibration ja auch noch Positionseinstellungen im Force Feedback. Bis dahin sehe ich mich online um, was bei anderen Geräten in der Usage Page 0xff00 herumschwirrt.

Das PID-Profil, das USB.org standardisiert hat, wird anscheinend nur von sehr wenigen Geräten implementiert (Microsoft Sidewinder?). Trotzdem werde ich es mir nochmal zur Brust nehmen weil ich vermute, dass DirectInput drauf aufsetzt und so weitestgehend Hardware-unabhängig funktioniert.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
TDK
Beiträge: 54
Registriert: 06.04.2012, 11:15

Re: Raw Input und Force Feedback / Output

Beitrag von TDK »

Force Feedback werde ich erstmal zurückstellen. Es kostet mir derzeit zu viele Nerven und es gibt wichtigere Komponenten zu erledigen (u.A. Messaging, Input Mapper, Control Mapper und Event Handler).
bananashakealchemist
Beiträge: 3
Registriert: 16.06.2016, 10:55

Re: Raw Input und Force Feedback / Output

Beitrag von bananashakealchemist »

gibt es schon neuigkeiten hierzu? es wäre supi wenn ihr eure derzeitigen codes veröffentlichen könnt. ein teilerfolg ist besser als gar kein erfolg. hoffentlich können wir es dann gemeinsam lösen. :)
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Raw Input und Force Feedback / Output

Beitrag von Krishty »

Ich hab’s damals vorerst aufgegeben und habe jetzt auch keine Zeit mehr, mich reinzuhängen :(

Macht das denn niemand sonst? Es muss doch irgendwo ein paar Entwickler geben, die sich mit der Problematik auskennen?
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
bananashakealchemist
Beiträge: 3
Registriert: 16.06.2016, 10:55

Re: Raw Input und Force Feedback / Output

Beitrag von bananashakealchemist »

das ist sehr schade. leider ist dieser thread einer der wenigen nützlichen threads im internet, die sich überhaupt erst mit dem thema beschäftigen.

ich hab das "Windows Driver Kit (WDK) 8.0 Samples" paket runtergeladen und mir die "HClient sample application" beispiele angeschaut. dort sieht man u.a. wie man ein report erstellt und verschickt. hilft mir aber wenig, da ich leider absolut keine ahnung hab, wo der controller die force feedback daten lagert und wie diese aussehen sollen.

es wäre schon ein anfang, wenn ich rausfinden könnte, ob ein controller überhaupt force feedback unterstützt.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Raw Input und Force Feedback / Output

Beitrag von Krishty »

Das Folgende ist total mutmaßlich weil ich nie vollständige Informationen dazu finden konnte, aber …
  • Force Feedback wird tatsächlich aktiviert, indem man einen Report erstellt und verschickt.
  • Die ganzen Force Feedback-Daten sind nicht im USB-HID-Standard festgelegt, sondern laufen über herstellerspezifische Reports (die mit den großen Zahlen in den IDs).
  • Das Force Feedback scheint komplett auf Microsofts DirectInput-Implementierung ausgerichtet zu sein. (Verwaltung in Blöcken von Effekten mit Parametern oder so.) Entweder, weil das der einzige Standard ist, den Hardware-Hersteller befolgen können; oder, weil Windows das für angeschlossene Geräte abstrahiert.
  • Ich habe vergeblich versucht, Informationen darüber zu finden, wie Hardware-Hersteller Force Feedback implementieren. Ob es da Datenblätter mit Schnittstellen gibt usw usf. Ich kenne aber leider niemanden aus der Branche, und diese Suche ist sehr zehrend.
  • Force Feedback scheint nur im exklusiven Modus verfügbar zu sein. Ich habe durch Zufall (Brute-Force alle Report IDs durchprobiert und an meinen Controller geschickt) die Vibration aktiviert, und sie wurde NICHT beendet, als mein Programm beendet wurde. Ich musste den Controller trennen und neu verbinden. Das bedeutet schonmal, dass keine zwei Anwendungen zugleich drauf zugreifen sollten und dass lustige Dinge passieren, falls das Programm während eines Force Feedback-Effekts abstürzt.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
bananashakealchemist
Beiträge: 3
Registriert: 16.06.2016, 10:55

Re: Raw Input und Force Feedback / Output

Beitrag von bananashakealchemist »

Krishty hat geschrieben:Die ganzen Force Feedback-Daten sind nicht im USB-HID-Standard festgelegt
bist du sicher? unter "5. PHYSICAL INPUT DEVICE PAGE (0X0F)" (http://www.usb.org/developers/hidpage/pid1_01.pdf) wird force feedback beschrieben. ich versuch das ganze grad zu entschlüsseln, weiss aber leider noch nicht mal, wie ich überhaupt erst diese daten auslesen kann.
Krishty hat geschrieben:Ich habe durch Zufall (Brute-Force alle Report IDs durchprobiert und an meinen Controller geschickt) die Vibration aktiviert, und sie wurde NICHT beendet, als mein Programm beendet wurde.
ich vermute mal, es gibt noch einen dauer parameter, den man angeben muss. zumindest wird duration im dokument erwähnt.

ansonsten könnte das vielleicht noch interessant sein: http://www.microchip.com/forums/m487478-p2.aspx

wenn ich mal zeit habe, werde ich mit xinput die vibration starten und mir dann die HidP_GetUsageValue() und HidP_GetUsages() input/output daten anschauen, ob sich was verändert hat.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Raw Input und Force Feedback / Output

Beitrag von Krishty »

Sicher bin ich mir bei nichts, darum steht „total mutmaßlich“ drüber ;)

Die USB-HID-Sachen hat keiner meiner Controller unterstützt (oder ich habe es halt total falsch gemacht), aber DirectInput ging. Ist Jahre her, aber ich meine mich zu erinnern, dass der Rückgabecode jedes Mal „nicht implementiert“ war oder so. Irgendwo hatte ich auch ein Datenblatt, dass die Vendor-defined ID XXXX mit Daten YYYY den DirectInput-Effekt ZZZZ auslöst, glaube ich.

Dein Experiment betreffend: Ja, prüf das mal. Falls sich was ergibt: Möglicherweise kannst du eine gefakte hid.dll bauen und ins Programmverzeichnis legen, und dir dann die Parameter anschauen, mit denen sie aufgerufen wird.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Antworten