Wumpus Geschrieben May 29, 2012 at 09:43 Geschrieben May 29, 2012 at 09:43 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) Zitieren
Wumpus Geschrieben May 29, 2012 at 18:35 Autor Geschrieben May 29, 2012 at 18:35 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? Zitieren
Wumpus Geschrieben May 31, 2012 at 17:36 Autor Geschrieben May 31, 2012 at 17:36 Hat niemand eine Idee? Wie verwendet ihr den Joystick? Ohne Callbacks und nur Polling? Zitieren
AuronX Geschrieben June 1, 2012 at 06:49 Geschrieben June 1, 2012 at 06:49 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. Zitieren
Wumpus Geschrieben June 1, 2012 at 08:14 Autor Geschrieben June 1, 2012 at 08:14 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... Zitieren
AuronX Geschrieben June 1, 2012 at 08:47 Geschrieben June 1, 2012 at 08:47 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 Zitieren
borg Geschrieben June 1, 2012 at 09:58 Geschrieben June 1, 2012 at 09:58 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)? Zitieren
Wumpus Geschrieben June 1, 2012 at 10:09 Autor Geschrieben June 1, 2012 at 10:09 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. Zitieren
borg Geschrieben June 1, 2012 at 10:24 Geschrieben June 1, 2012 at 10:24 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/ Zitieren
Wumpus Geschrieben June 1, 2012 at 11:40 Autor Geschrieben June 1, 2012 at 11:40 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! Zitieren
AuronX Geschrieben June 1, 2012 at 12:01 Geschrieben June 1, 2012 at 12:01 ich gehe davon aus, dass neu den o-bereich einschließt? oder verstehe ich grad was falsch? Zitieren
Wumpus Geschrieben June 1, 2012 at 13:36 Autor Geschrieben June 1, 2012 at 13:36 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! Zitieren
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.