Jump to content

[C/C++] Joystick Callback bei limit reached


Recommended Posts

Wie kann ich beim Joystick und den C-Bindings darauf einen Callback-Aufruf triggern, dass entweder einer der Min-Schwellwerte unterschritten oder Max-Schwellwerte überschritten wurde? Für die Steuerung des LCD würde ich gerne den Joystick in digitaler Art zur Steuerung nutzen (links/rechts/oben/unten). Mit den vorhandenen Triggern ('o'utside) schaffe ich es aber nur (wie in dem Beispiel), dass die Ansteuerung der Ecken detektiert wird, oder aber nur in einer Richtung ('>' oder '<') die Bewegung auf der Achse erkannt wird. Irgendwie fehlt mir diese Triggerart:

(v<minX) || (v>maxX) || (v<minY) || (v>maxY)

Link zu diesem Kommentar
Share on other sites

Prinzipiell kann es ja bis zu 256 device_callbacks geben. Man muss die Firmware der Bricklets anpassen, wenn man bisher nicht bekannte Typen hinzufügen möchte, oder?

 

Vermutlich würden mir folgende Callbacks helfen:

JOYSTICK_CALLBACK_POSITION_REACHED_X

JOYSTICK_CALLBACK_POSITION_REACHED_Y

 

Und dann entsprechende Funktionen zum Definieren der Schwellwerte (für 'o'utside trigger):

FUNCTION_GET_POSITION_CALLBACK_THRESHOLD_X

FUNCTION_SET_POSITION_CALLBACK_THRESHOLD_X

FUNCTION_GET_POSITION_CALLBACK_THRESHOLD_Y

FUNCTION_SET_POSITION_CALLBACK_THRESHOLD_Y

 

Eine andere Alternative wäre, gleich mehrere generische POSITION_CALLBACK vorzusehen. Dann könnte man alle x und y, sowie min und max Schwellwerte einzeln aufrufen und separate Trigger setzen. Das wäre besonders charmant, weil man damit auch z.B. zweistufig beim Joystick reagieren könnte. Z.B.:

Stufe 1 = halbe Stellung bzw. >50

Stufe 2 = volle Stellung bzw. >99

 

Hba eich eine Chance das so oder anderweitig hinzubekommen?

Link zu diesem Kommentar
Share on other sites

Habe keinen Joystick, aber da dir niemand antwortet habe ich mal in die C#-Doku geschaut (sollte überall gleich sein):

http://www.tinkerforge.com/doc/Software/Bricklets/Joystick_Bricklet_CSharp.html#BrickletJoystick::SetPositionCallbackThreshold__c.short-.short-.short-.short-

 

In der Tabelle steht als option das o.

Callback is triggered when the position is outside the min and max values

 

Denke das ist es was du suchst.

Link zu diesem Kommentar
Share on other sites

Danke für die Antwort. Genau mit diesem Callback bin ich gestartet, aber das führt dazu, dass nur die Ecken detektiert werden, da 'outside' bedeutet, dass sowohl die X als auch die Y Werte ausserhalb liegen müssen. Gestern habe ich mit dem callback_position gespielt, was in Intervallen und wenn sich der Wert verändert hat einen Callbvack-Aufruf startet. Das sind zwar deutlich mehr Events, aber es hält sich doch mehr in Grenzen, als ich angenommen hatte. Dann muss die Logik für das Triggern auf Schwellwertüberschreitung (links,rechts,oben,unten,center) in der CallbackLogik erfolgen. Mal schauen, wie stabil das funktioniert...

Link zu diesem Kommentar
Share on other sites

Das wäre dann entweder Fehlverhalten oder aber unterspezifiziert. Ich vermute aber es ist ein Copy & paste Fehler in der Firmware...

 

Zur Erklärung:

inside ist ja:

x > minX && x < maxX && y > minY && y < minY

 

Das Gegenteil dieses Ausdrucks würde ich outside nennen:

!(x > minX && x < maxX && y > minY && y < minY)

 

Wenn wir das auflösen kommt der gute alte De Morgan ins Spiel:

  !(x > minX && x < maxX && y > minY && y < minY)
= !(x > minX) || !(x < maxX) || !(y > minY) || !(y < minY)

 

Kurz: Es hätten ODER's hingehört, aber vermutlich aus Versehen wurden UND's gesetzt.

 

@TF: Zustimmung oder Widerspruch? Bug-Fix?

 

Viele Grüße

Jan

Link zu diesem Kommentar
Share on other sites

Ich bin absolut verwirrt :)

 

Also die Stelle in der Firmware sieht folgendermaßen aus:

if(((BC->threshold_option[i] == 'o') &&
((value1 < BC->threshold_min1[i]) ||
 (value1 > BC->threshold_max1[i])) &&
((value2 < BC->threshold_min2[i]) ||
 (value2 > BC->threshold_max2[i]))) ||
   ((BC->threshold_option[i] == 'i') &&
((value1 > BC->threshold_min1[i]) &&
 (value1 < BC->threshold_max1[i])) &&
((value2 > BC->threshold_min2[i]) &&
 (value2 < BC->threshold_max2[i])))) {

 

Du möchtest das der callback auch getriggert wird wenn nur der threshold nur für X oder Y eingehalten wird?

 

Kannst du mal ein Paar Beispielwerte geben die Callbacks verursachen sollen, es aber nicht tun (oder umgekehrt)?

Link zu diesem Kommentar
Share on other sites

Aktuell werden die Postionen detektiert, die am Ende eines "X" stehen (Ecken des Joysticks/diagonale Punkte). Typischerweise möchte man aber den Joystick als Steuerkreuz nutzen "+". Mit der aktuellen Logik ist es nicht Möglich, Callbacks auf (0,100),(-100,0),(100,,0),(0,-100) einzurichten, also nur ein Wert liegt ausserhalb. Die aktuelle Logik kann man auch gebrauchen. Ich wäre eher für eine zusätzliche Triggerart, bei der das Mittlere "&&" gegen ein "||" ausgetauscht wird. So wie AuronX das richtig beschreiben hat.

Link zu diesem Kommentar
Share on other sites

Wenn ich aus dem mittleren && ein || mache bekommst du aber die in den Ecken zusätzlich!

 

Edit: Wo ich AuronX recht gebe: Wenn wir 'i' so festhalten wie es ist, sollte das 'o' eigentlich "not 'i'" sein und damit so wie AuronX sagt.

 

Das bezieht sich nur auf den Joystick, da wir sonst nirgends diese Threshold-Geschichte für zwei Werte haben, d.h. das kann ich gerade ändern.

 

Edit: Ich hab aus dem mittleren && erstmal ein || gemacht, einfach weil es logischer so ist (1.1.3): http://download.tinkerforge.com/firmwares/bricklets/joystick/

 

Link zu diesem Kommentar
Share on other sites

Nach der Änderung von borg ist die neue Implementierung, so, dass 'neu' und 'o' einen Trigger bilden. Neuer Vorschlag, war ein zusätzlicher Trigger um die Ecken separat zu halten. Das kann ich aber auch innerhalb der Callback-Funktion regeln.

 

Ich habe die neue Firmware gerade getestet, und sie tut jetzt so, wie ich das erwartet hätte. Vielen Dank an euch beide!

Link zu diesem Kommentar
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...