mruniversum Posted October 25, 2013 at 02:40 AM Posted October 25, 2013 at 02:40 AM 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)); Quote
photron Posted October 25, 2013 at 10:00 AM Posted October 25, 2013 at 10:00 AM 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. Quote
mruniversum Posted October 28, 2013 at 05:57 AM Author Posted October 28, 2013 at 05:57 AM 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); Quote
photron Posted October 28, 2013 at 09:25 AM Posted October 28, 2013 at 09:25 AM 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); Quote
mohsin147 Posted November 1, 2013 at 07:15 AM Posted November 1, 2013 at 07:15 AM 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. Quote
mruniversum Posted November 1, 2013 at 10:51 PM Author Posted November 1, 2013 at 10:51 PM 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! Quote
photron Posted November 4, 2013 at 09:42 AM Posted November 4, 2013 at 09:42 AM 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); Quote
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.