diff options
-rw-r--r-- | lirc.c | 84 | ||||
-rw-r--r-- | rcu.c | 105 |
2 files changed, 94 insertions, 95 deletions
@@ -6,7 +6,7 @@ * * LIRC support added by Carsten Koch <Carsten.Koch@icem.de> 2000-06-16. * - * $Id: lirc.c 1.11 2005/07/31 10:18:09 kls Exp $ + * $Id: lirc.c 1.12 2005/08/15 12:28:10 kls Exp $ */ #include "lirc.h" @@ -61,48 +61,48 @@ void cLircRemote::Action(void) bool repeat = false; int timeout = -1; - for (; f >= 0;) { + while (Running() && f >= 0) { - bool ready = cFile::FileReady(f, timeout); - int ret = ready ? safe_read(f, buf, sizeof(buf)) : -1; + bool ready = cFile::FileReady(f, timeout); + int ret = ready ? safe_read(f, buf, sizeof(buf)) : -1; - if (ready && ret <= 0 ) { - esyslog("ERROR: lircd connection lost"); - close(f); - f = -1; - break; - } + if (ready && ret <= 0 ) { + esyslog("ERROR: lircd connection lost"); + close(f); + f = -1; + break; + } - if (ready && ret > 21) { - int count; - char KeyName[LIRC_KEY_BUF]; - sscanf(buf, "%*x %x %29s", &count, KeyName); // '29' in '%29s' is LIRC_KEY_BUF-1! - if (count == 0) { - if (strcmp(KeyName, LastKeyName) == 0 && FirstTime.Elapsed() < KEYPRESSDELAY) - continue; // skip keys coming in too fast - if (repeat) - Put(LastKeyName, false, true); - strcpy(LastKeyName, KeyName); - repeat = false; - FirstTime.Set(); - timeout = -1; - } - else { - if (FirstTime.Elapsed() < REPEATDELAY) - continue; // repeat function kicks in after a short delay - repeat = true; - timeout = REPEATDELAY; - } - LastTime.Set(); - Put(KeyName, repeat); - } - else if (repeat) { // the last one was a repeat, so let's generate a release - if (LastTime.Elapsed() >= REPEATDELAY) { - Put(LastKeyName, false, true); - repeat = false; - *LastKeyName = 0; - timeout = -1; - } - } - } + if (ready && ret > 21) { + int count; + char KeyName[LIRC_KEY_BUF]; + sscanf(buf, "%*x %x %29s", &count, KeyName); // '29' in '%29s' is LIRC_KEY_BUF-1! + if (count == 0) { + if (strcmp(KeyName, LastKeyName) == 0 && FirstTime.Elapsed() < KEYPRESSDELAY) + continue; // skip keys coming in too fast + if (repeat) + Put(LastKeyName, false, true); + strcpy(LastKeyName, KeyName); + repeat = false; + FirstTime.Set(); + timeout = -1; + } + else { + if (FirstTime.Elapsed() < REPEATDELAY) + continue; // repeat function kicks in after a short delay + repeat = true; + timeout = REPEATDELAY; + } + LastTime.Set(); + Put(KeyName, repeat); + } + else if (repeat) { // the last one was a repeat, so let's generate a release + if (LastTime.Elapsed() >= REPEATDELAY) { + Put(LastKeyName, false, true); + repeat = false; + *LastKeyName = 0; + timeout = -1; + } + } + } } @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: rcu.c 1.9 2005/07/31 10:17:45 kls Exp $ + * $Id: rcu.c 1.10 2005/08/15 12:30:21 kls Exp $ */ #include "rcu.h" @@ -98,60 +98,59 @@ void cRcuRemote::Action(void) uint64 LastCommand = 0; bool repeat = false; - //XXX - for (; f >= 0;) { + while (Running() && f >= 0) { - LOCK_THREAD; + LOCK_THREAD; - if (ReceiveByte(REPEATLIMIT) == 'X') { - for (int i = 0; i < 6; i++) { - int b = ReceiveByte(); - if (b >= 0) { - buffer.raw[i] = b; - if (i == 5) { - unsigned short Address = ntohs(buffer.data.address); // the PIC sends bytes in "network order" - uint64 Command = ntohl(buffer.data.command); - if (code == 'B' && Address == 0x0000 && Command == 0x00004000) - // Well, well, if it isn't the "d-box"... - // This remote control sends the above command before and after - // each keypress - let's just drop this: - break; - Command |= uint64(Address) << 32; - if (Command != LastCommand) { - LastCommand = Command; - repeat = false; - FirstTime.Set(); - } - else { - if (FirstTime.Elapsed() < REPEATDELAY) - break; // repeat function kicks in after a short delay - repeat = true; - } - Put(Command, repeat); - receivedCommand = true; - } - } - else - break; - } - } - else if (repeat) { // the last one was a repeat, so let's generate a release - Put(LastCommand, false, true); - repeat = false; - LastCommand = 0; - } - else { - LastCommand = 0; - if (numberToSend >= 0) { - Number(numberToSend); - numberToSend = -1; - } - } - if (code && time(NULL) - LastCodeRefresh > 60) { - SendCommand(code); // in case the PIC listens to the wrong code - LastCodeRefresh = time(NULL); - } - } + if (ReceiveByte(REPEATLIMIT) == 'X') { + for (int i = 0; i < 6; i++) { + int b = ReceiveByte(); + if (b >= 0) { + buffer.raw[i] = b; + if (i == 5) { + unsigned short Address = ntohs(buffer.data.address); // the PIC sends bytes in "network order" + uint64 Command = ntohl(buffer.data.command); + if (code == 'B' && Address == 0x0000 && Command == 0x00004000) + // Well, well, if it isn't the "d-box"... + // This remote control sends the above command before and after + // each keypress - let's just drop this: + break; + Command |= uint64(Address) << 32; + if (Command != LastCommand) { + LastCommand = Command; + repeat = false; + FirstTime.Set(); + } + else { + if (FirstTime.Elapsed() < REPEATDELAY) + break; // repeat function kicks in after a short delay + repeat = true; + } + Put(Command, repeat); + receivedCommand = true; + } + } + else + break; + } + } + else if (repeat) { // the last one was a repeat, so let's generate a release + Put(LastCommand, false, true); + repeat = false; + LastCommand = 0; + } + else { + LastCommand = 0; + if (numberToSend >= 0) { + Number(numberToSend); + numberToSend = -1; + } + } + if (code && time(NULL) - LastCodeRefresh > 60) { + SendCommand(code); // in case the PIC listens to the wrong code + LastCodeRefresh = time(NULL); + } + } } int cRcuRemote::ReceiveByte(int TimeoutMs) |