diff options
Diffstat (limited to 'lirc.c')
-rw-r--r-- | lirc.c | 34 |
1 files changed, 22 insertions, 12 deletions
@@ -6,7 +6,7 @@ * * LIRC support added by Carsten Koch <Carsten.Koch@icem.de> 2000-06-16. * - * $Id: lirc.c 2.2 2013/01/30 11:56:38 kls Exp $ + * $Id: lirc.c 2.3 2013/01/31 12:13:39 kls Exp $ */ #include "lirc.h" @@ -15,7 +15,6 @@ #define REPEATDELAY 300 // ms #define REPEATFREQ 100 // ms -#define REPEATTIMEOUT 150 // ms #define RECONNECTDELAY 3000 // ms cLircRemote::cLircRemote(const char *DeviceName) @@ -63,8 +62,10 @@ void cLircRemote::Action(void) { cTimeMs FirstTime; cTimeMs LastTime; + cTimeMs ThisTime; char buf[LIRC_BUFFER_SIZE]; char LastKeyName[LIRC_KEY_BUF] = ""; + bool pressed = false; bool repeat = false; int timeout = -1; @@ -94,12 +95,15 @@ void cLircRemote::Action(void) esyslog("ERROR: unparseable lirc command: %s", buf); continue; } + int Delta = ThisTime.Elapsed(); // the time between two subsequent LIRC events + ThisTime.Set(); if (count == 0) { if (strcmp(KeyName, LastKeyName) == 0 && FirstTime.Elapsed() < REPEATDELAY) continue; // skip keys coming in too fast if (repeat) Put(LastKeyName, false, true); strcpy(LastKeyName, KeyName); + pressed = true; repeat = false; FirstTime.Set(); timeout = -1; @@ -110,18 +114,24 @@ void cLircRemote::Action(void) continue; // skip same keys coming in too fast else { repeat = true; - timeout = REPEATTIMEOUT; + timeout = Delta * 10 / 9; } - LastTime.Set(); - Put(KeyName, repeat); + if (pressed) + LastTime.Set(); + Put(KeyName, repeat); } - else if (repeat) { // the last one was a repeat, so let's generate a release - if (LastTime.Elapsed() >= REPEATTIMEOUT) { - Put(LastKeyName, false, true); - repeat = false; - *LastKeyName = 0; - timeout = -1; - } + else if (pressed && repeat) { // the last one was a repeat, so let's generate a release + Put(LastKeyName, false, true); + pressed = false; + repeat = false; + *LastKeyName = 0; + timeout = -1; + } + else { + pressed = false; + repeat = false; + *LastKeyName = 0; + timeout = -1; } } } |