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
|
- 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).
|
||||||
|
34
remote.c
34
remote.c
@ -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 = lastTime = now;
|
firstTime = time_ms();
|
||||||
return keyName;
|
|
||||||
}
|
|
||||||
else if ((now > firstTime + REPEATDELAY) && (now > lastTime + REPEATLIMIT)) {
|
|
||||||
lastTime = now;
|
|
||||||
return keyName;
|
return keyName;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} 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;
|
||||||
}
|
}
|
||||||
return NULL;
|
|
||||||
|
// 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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user