mruniversum Geschrieben October 25, 2013 at 02:40 Geschrieben October 25, 2013 at 02:40 Hallo zusammen, nach dem ersten versuch mit den shell-bindings versuche ich es nun mit java. es geht darum, per schalter der am IO4 hängt über einen listener eine aktion auszuführen. das klappt auch soweit, allerdings wird der listener ausgelöst wenn der schalter gedrückt wird, und auch wenn er losgelassen wird. wie lässt sich die abzufragene flanke definieren? // listener wenn IO4 aktiviert wird io4.addInterruptListener(new BrickletIO4.InterruptListener() { public void interrupt(short interruptMask, short valueMask) { System.out.println("STOP"); try { //stepper stoppen und position auf 0 setzen stepper.fullBrake(); stepper.setCurrentPosition(0); }catch(TinkerforgeException e) { } } }); // Enable interrupt on pin 0 io4.setInterrupt((short)(1 << 0)); Zitieren
photron Geschrieben October 25, 2013 at 10:00 Geschrieben October 25, 2013 at 10:00 Du muss dafür die valueMask im Listener prüfen. Bei einer steigenden Flanke ist das Bit für den entsprechenden Pin in valueMask gesetzt, bei einer fallenden Flanke nicht. Zitieren
mruniversum Geschrieben October 28, 2013 at 05:57 Autor Geschrieben October 28, 2013 at 05:57 Hi, der vollständigkeit halber wie ich es gelöst habe: io4.addInterruptListener(new BrickletIO4.InterruptListener() { public void interrupt(short interruptMask, short valueMask) { // System.out.println("!!ENDSCHALTER 0 oder 1!!"); try { val=io4.getValue(); if (val == 14) { System.out.println("NULLSCHALTER " + val); } if (val == 13) { System.out.println("ENDSCHALTER " + val); } }catch(TinkerforgeException e) { } } }); // Enable interrupt on pin 0 + 1 io4.setInterrupt((short)(1111)); ich habe allerdings noch das problem, dass bei jedem programmdurchlauf der listener scheinbar einmal mehr durchläuft wird, da beim ersten durchlauf eine textausgabe kommt, beim zweiten zwei, beim dritten drei usw. (das programm läuft in einer schleife). liegt das etvl. daran weil der listener nicht gestoppt wird? wäre nett wenn das nochmal jemand konkret posten könnte, meine versuche sind bisher gescheitert. => wie muss er beendet werden? io4.removeInterruptListener(null); Zitieren
photron Geschrieben October 28, 2013 at 09:25 Geschrieben October 28, 2013 at 09:25 Rufst du auf dem gleichen io4 Objekt mehrfach addInterruptListener() auf? Dann fügst du beim jedem Durchlauf einen weiteren Listener hinzu und dann werden auch mehrere Listener ausgeführt. Wenn das nicht deine Absicht ist, dann solltest du addInterruptListener() nur einmal am Anfang aufrufen. removeInterruptListener(null) ergibt keinen Sinn. Wenn dann musst du dir eine Referenz zum Listner Objekt zwischen speichern: BrickletIO4.InterruptListener listener = new BrickletIO4.InterruptListener() { ... } io4.addInterruptListener(listener); ... io4.removeInterruptListener(listener); Zitieren
mohsin147 Geschrieben November 1, 2013 at 07:15 Geschrieben November 1, 2013 at 07:15 Rufst du auf dem gleichen io4 Objekt mehrfach addInterruptListener() auf? Dann fügst du beim jedem Durchlauf einen weiteren Listener hinzu und dann werden auch mehrere Listener ausgeführt. Wenn das nicht deine Absicht ist, dann solltest du addInterruptListener() nur einmal am Anfang aufrufen. Zitieren
mruniversum Geschrieben November 1, 2013 at 22:51 Autor Geschrieben November 1, 2013 at 22:51 Hi, ich benötige nochmal Hilfe. Ich verstehe die Syntax nicht den Interruptlistener zu beenden! Das Beispiel io4.removeInterruptListener(listener); funktioniert nicht. Kannst du mir nochmal bitte konkret nennen wie ich ihn beenden muss, wenn ich ihn so starte? io4.addInterruptListener(new BrickletIO4.InterruptListener() { public void interrupt(short interruptMask, short valueMask) { try { if (val == 14) { System.out.print("\nSchalter 1"); } if (val == 13) { System.out.print("\nSchalter 2"); } }catch(TinkerforgeException e) { } } }); Vielen Dank! Zitieren
photron Geschrieben November 4, 2013 at 09:42 Geschrieben November 4, 2013 at 09:42 Das geht mit der "io4.addInterruptListener(new BrickletIO4.InterruptListener() { ... }" Schreibweise nicht. Du kannst das so machen: BrickletIO4.InterruptListener listener = new BrickletIO4.InterruptListener() { public void interrupt(short interruptMask, short valueMask) { try { if (val == 14) { System.out.print("\nSchalter 1"); } if (val == 13) { System.out.print("\nSchalter 2"); } }catch(TinkerforgeException e) { } } }); io4.addInterruptListener(listener); ... io4.removeInterruptListener(listener); 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.