Modified LIRC interface to better handle repeat function

This commit is contained in:
Klaus Schmidinger 2000-09-21 17:00:59 +02:00
parent f9a3ec512a
commit b4faf3787a
2 changed files with 28 additions and 16 deletions

View File

@ -203,3 +203,7 @@ Video Disk Recorder Revision History
- The daemon mode (option '-d') now no longer works with REMOTE=KBD (there - The daemon mode (option '-d') now no longer works with REMOTE=KBD (there
is no stdin in daemon mode, so KBD makes no sense - plus it sometimes is no stdin in daemon mode, so KBD makes no sense - plus it sometimes
crashed). crashed).
2000-09-21: Version 0.65
- Modified LIRC interface to better handle repeat function (by Carsten Koch).

View File

@ -6,7 +6,7 @@
* *
* Ported to LIRC by Carsten Koch <Carsten.Koch@icem.de> 2000-06-16. * Ported to LIRC by Carsten Koch <Carsten.Koch@icem.de> 2000-06-16.
* *
* $Id: remote.c 1.13 2000/09/19 17:40:52 kls Exp $ * $Id: remote.c 1.14 2000/09/21 16:57:56 kls Exp $
*/ */
#include "remote.h" #include "remote.h"
@ -362,23 +362,32 @@ cRcIoLIRC::~cRcIoLIRC()
const char *cRcIoLIRC::ReceiveString(void) const char *cRcIoLIRC::ReceiveString(void)
{ {
char buf[LIRC_BUFFER_SIZE]; char buf[LIRC_BUFFER_SIZE];
int repeat = 1;
const int startTime = time_ms();
while (InputAvailable(true)) { // Wait up to REPEATLIMIT ms for a new command, skip repetition of last command while waiting.
if (read(f, buf, sizeof(buf)) > 21) { do {
const int now = time_ms(); if (InputAvailable(false) && (read(f, buf, sizeof(buf)) > 21)) {
int repeat; sscanf(buf, "%*x %x %7s", &repeat, keyName); // '7' in '%7s' is LIRC_KEY_BUF-1!
sscanf(buf, "%*s %x %7s", &repeat, keyName); // '7' in '%7s' is LIRC_KEY_BUF-1! if (repeat == 0) {
if (repeat == 0) { firstTime = time_ms();
firstTime = lastTime = now; return keyName;
return keyName;
}
else if ((now > firstTime + REPEATDELAY) && (now > lastTime + REPEATLIMIT)) {
lastTime = now;
return keyName;
}
} }
} }
return NULL; } while (time_ms() < startTime + REPEATLIMIT);
// No new command encountered while skipping old repetitions - wait for new command.
repeat = 1;
if (InputAvailable(true) && (read(f, buf, sizeof(buf)) > 21))
sscanf(buf, "%*x %x %7s", &repeat, keyName); // '7' in '%7s' is LIRC_KEY_BUF-1!
if (repeat == 0) {
firstTime = time_ms();
return keyName;
}
// Always ignore first repeat, as it often comes in too early.
return (repeat == 1) || (time_ms() < firstTime + REPEATDELAY) ? NULL : keyName;
} }
void cRcIoLIRC::Flush(int WaitMs) void cRcIoLIRC::Flush(int WaitMs)
@ -403,7 +412,6 @@ bool cRcIoLIRC::InputAvailable(bool Wait)
bool cRcIoLIRC::GetCommand(unsigned int *Command, unsigned short *) bool cRcIoLIRC::GetCommand(unsigned int *Command, unsigned short *)
{ {
Flush();
if (Command) { if (Command) {
const char *cmd = ReceiveString(); const char *cmd = ReceiveString();
if (cmd) { if (cmd) {