mirror of
https://github.com/VDR4Arch/vdr.git
synced 2023-10-10 13:36:52 +02:00
Modified LIRC interface to better handle repeat function
This commit is contained in:
parent
f9a3ec512a
commit
b4faf3787a
4
HISTORY
4
HISTORY
@ -203,3 +203,7 @@ Video Disk Recorder Revision History
|
||||
- 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
|
||||
crashed).
|
||||
|
||||
2000-09-21: Version 0.65
|
||||
|
||||
- Modified LIRC interface to better handle repeat function (by Carsten Koch).
|
||||
|
40
remote.c
40
remote.c
@ -6,7 +6,7 @@
|
||||
*
|
||||
* 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"
|
||||
@ -362,23 +362,32 @@ cRcIoLIRC::~cRcIoLIRC()
|
||||
const char *cRcIoLIRC::ReceiveString(void)
|
||||
{
|
||||
char buf[LIRC_BUFFER_SIZE];
|
||||
int repeat = 1;
|
||||
const int startTime = time_ms();
|
||||
|
||||
while (InputAvailable(true)) {
|
||||
if (read(f, buf, sizeof(buf)) > 21) {
|
||||
const int now = time_ms();
|
||||
int repeat;
|
||||
sscanf(buf, "%*s %x %7s", &repeat, keyName); // '7' in '%7s' is LIRC_KEY_BUF-1!
|
||||
if (repeat == 0) {
|
||||
firstTime = lastTime = now;
|
||||
return keyName;
|
||||
}
|
||||
else if ((now > firstTime + REPEATDELAY) && (now > lastTime + REPEATLIMIT)) {
|
||||
lastTime = now;
|
||||
return keyName;
|
||||
}
|
||||
// Wait up to REPEATLIMIT ms for a new command, skip repetition of last command while waiting.
|
||||
do {
|
||||
if (InputAvailable(false) && (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;
|
||||
}
|
||||
}
|
||||
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)
|
||||
@ -403,7 +412,6 @@ bool cRcIoLIRC::InputAvailable(bool Wait)
|
||||
|
||||
bool cRcIoLIRC::GetCommand(unsigned int *Command, unsigned short *)
|
||||
{
|
||||
Flush();
|
||||
if (Command) {
|
||||
const char *cmd = ReceiveString();
|
||||
if (cmd) {
|
||||
|
Loading…
Reference in New Issue
Block a user