Langer Tastendruck bei Fernbedienung

Fohnbit

Top Contributor
Hallo Gemeinde!

Mir fehlt etwas der passende Ansatz um folgendes zu lösen:
Ich bekomme per UDP die Info, welche Taste auf einer Funk Fernbedienung gedrückt wurde.
(Ein RF Umsetzer sendet mir per UDP an meine Software)

Es gibt 52 Tasten mit je einen eigenen 3 stelligen Byte Code:
Taste 1: 0xe20d00
Taste 2: 0xe30e00
...

Wenn man auf der Taste oben bleibt, kommen die Infos zyklisch im Abstand von 400ms.

Nun soll für jedes Taste der Text ausgegeben werden, welche Taste gedrückt wurde und ob es ein kurzer oder langer Tastendruck war.
Der Kurze kann natürlich erst nach 800ms erkannt werden, da ein weiteres Telegramm ausbleibt.

Wie soll ich aber das in Java umsetzen. Ich müßte eine Info im Code halten, wenn der erste Befehl kommt.
Dann mind. 800ms warten und wenn der Code nicht nochmal kommt, ist es ein kurzer Tastendruck, ansonsten ein langer.

Hab schon überlegt einen Timer beim ersten Eintreffen zu starten, der nach 800ms den Text kurz ausgibt. Falls das Telegramm nochmal kommt und schon ein Timer für dieses Telegramm existiert, ist es ein langer und der 1. Timer muss abgebrochen werden und der Text für einen langen Tastendruck muss ausgeben werden.

Was ist die beste Strategie? Das ganze soll auf einem Rasp laufen. Also wenig Performance.

Danke!
 
Also wenn du das richtig umsetzen willst machst du eine "Treiberklasse" für das UDP-Socket. Diese schikt dann events raus, ala:
Java:
enum RemoteButton
{
    TASTE_1 (0xe20d00),
    TASTE_AN_AUS (0xe30e00);
    
    private int c;

    RemoteButton(int code)
    {
        c = code;
    }
    getCode()
    {
        return c;
    }
}

interface RemoteButtonListener
{
    public void buttonPressed(RemoteButton b);
    public void buttonReleased(RemoteButton b, int millisPressed);
}

Die o.g. Treiberklasse kannst du, wie du schon selbst gesagt hast, am Sinnvollsten mit Timern realisieren.

[EDIT]Wie du auch schon gesagt hast, das loslassen einer Taste wird im schlimmsten Fall eben mit 400ms Verzögerung bemerkt. Der Paremter millisPressed ist dann auch nur auf 400ms genau.[/EDIT]
 
Zuletzt bearbeitet:
Hallo!

Danke, so werde ich es machen.
Aber kann mir noch jemand einen Tipp wegen des Timer geben?

Java:
timer = new Timer(0, new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					buttonReleased(remoteButton);
				}
			});
			timer.setRepeats(false);
			timer.setDelay(500);
			timer.start();

Ich starte den Timer und nach 500Millisekunden wird der Befehl zur Loslassen der Taste ausgegeben (sofern kein neuer innerhalb der 500ms kommt)

Aber wie kann ich bei einem laufenden Timer das delay erhöhen bzw. diesen auf 0 setzen?
Oder soll ich einen laufenden Timer stoppen und einen neuen erstellen, anstelle einen laufenden zu beeinflussen?

Danke!
 
Für jedes Tasten-Signal das reinkommt schaust du, ob da schon einer Timer für läuft. Wenn ja, teilst du das dem entsprechenden TimerTask mit. Wenn nein löst dud as buttonPressed Event aus. Dann startest du einen neuen Timer (mit TimerTask), der alle 400ms neu aufgerufen wird. Dieser TimerTask prüft dann bei jedem durchlauf ob er während der letzten 400ms über ein neues Signal informiert wurde. Wenn nein löst er das buttonReleased Event aus und beendet sich.
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben