1
0
mirror of https://github.com/VDR4Arch/vdr.git synced 2023-10-10 13:36:52 +02:00

Modified rcu.c to better handle RC5 codes

This commit is contained in:
Klaus Schmidinger 2006-06-16 09:30:11 +02:00
parent 1d4512cbea
commit b99c700f1d
2 changed files with 10 additions and 8 deletions

View File

@ -4794,3 +4794,4 @@ Video Disk Recorder Revision History
- Now making sure VPS timers don't get stuck with outdated events, and that the - Now making sure VPS timers don't get stuck with outdated events, and that the
actual device isn't used for updating a VPS timer's event as long as other actual device isn't used for updating a VPS timer's event as long as other
free devices are available. free devices are available.
- Modified rcu.c to better handle RC5 codes.

17
rcu.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: rcu.c 1.13 2006/01/08 11:40:09 kls Exp $ * $Id: rcu.c 1.14 2006/06/16 09:29:24 kls Exp $
*/ */
#include "rcu.h" #include "rcu.h"
@ -13,8 +13,9 @@
#include <unistd.h> #include <unistd.h>
#include "tools.h" #include "tools.h"
#define REPEATLIMIT 20 // ms #define REPEATLIMIT 150 // ms
#define REPEATDELAY 350 // ms #define REPEATDELAY 350 // ms
#define HANDSHAKETIMEOUT 20 // ms
cRcuRemote::cRcuRemote(const char *DeviceName) cRcuRemote::cRcuRemote(const char *DeviceName)
:cRemote("RCU") :cRemote("RCU")
@ -96,7 +97,7 @@ void cRcuRemote::Action(void)
time_t LastCodeRefresh = 0; time_t LastCodeRefresh = 0;
cTimeMs FirstTime; cTimeMs FirstTime;
unsigned char LastCode = 0, LastMode = 0; unsigned char LastCode = 0, LastMode = 0;
uint64 LastCommand = 0; uint64 LastCommand = ~0; // 0x00 might be a valid command
unsigned int LastData = 0; unsigned int LastData = 0;
bool repeat = false; bool repeat = false;
@ -136,7 +137,7 @@ void cRcuRemote::Action(void)
else if (repeat) { // the last one was a repeat, so let's generate a release else if (repeat) { // the last one was a repeat, so let's generate a release
Put(LastCommand, false, true); Put(LastCommand, false, true);
repeat = false; repeat = false;
LastCommand = 0; LastCommand = ~0;
} }
else { else {
unsigned int d = data; unsigned int d = data;
@ -154,9 +155,9 @@ void cRcuRemote::Action(void)
SendCommand(m); SendCommand(m);
LastMode = m; LastMode = m;
} }
LastCommand = 0; LastCommand = ~0;
} }
if (code && time(NULL) - LastCodeRefresh > 60) { if (!repeat && code && time(NULL) - LastCodeRefresh > 60) {
SendCommand(code); // in case the PIC listens to the wrong code SendCommand(code); // in case the PIC listens to the wrong code
LastCodeRefresh = time(NULL); LastCodeRefresh = time(NULL);
} }
@ -181,7 +182,7 @@ bool cRcuRemote::SendByteHandshake(unsigned char c)
if (f >= 0) { if (f >= 0) {
int w = write(f, &c, 1); int w = write(f, &c, 1);
if (w == 1) { if (w == 1) {
for (int reply = ReceiveByte(REPEATLIMIT); reply >= 0;) { for (int reply = ReceiveByte(HANDSHAKETIMEOUT); reply >= 0;) {
if (reply == c) if (reply == c)
return true; return true;
else if (reply == 'X') { else if (reply == 'X') {