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 to comment
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 to comment
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 to comment
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 to comment
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 to comment
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 to comment
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 to comment
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 to comment
Share on other sites

Mir hilft das erst einmal. Eine Frage wäre noch, ob es sinnvoll ist, einen zusätzlichen Trigger zu definieren. Ich habe mal eine Grafik anghängt, die die drei Triggertypen darstellt.

 

PS: Danke für's Ändern!

joy-positions.png.4a4b89aa3efa882cc314d9c935e517f5.png

Link to comment
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 to comment
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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...