From 20019e7ce51b9e14ce28f96b263b76e6becd4184 Mon Sep 17 00:00:00 2001 From: Klaus Schmidinger Date: Sat, 15 Jul 2000 12:39:20 +0200 Subject: [PATCH] Added support for LIRC remote control --- CONTRIBUTORS | 5 ++ HISTORY | 9 +++ INSTALL | 30 ++++--- Makefile | 8 +- config.c | 13 ++- config.h | 3 +- dvbapi.c | 6 +- dvbapi.h | 4 +- interface.c | 28 +++---- remote.c | 218 +++++++++++++++++++++++++++++++++++++++++---------- remote.h | 85 ++++++++++++++++---- tools.c | 21 ++--- tools.h | 4 +- vdr.c | 6 +- 14 files changed, 331 insertions(+), 109 deletions(-) create mode 100644 CONTRIBUTORS diff --git a/CONTRIBUTORS b/CONTRIBUTORS new file mode 100644 index 00000000..fbf6e867 --- /dev/null +++ b/CONTRIBUTORS @@ -0,0 +1,5 @@ +Thanks go to the following people for patches and contributions: + +Carsten Koch + for adding LIRC support + diff --git a/HISTORY b/HISTORY index 9767c3fe..40150c68 100644 --- a/HISTORY +++ b/HISTORY @@ -55,3 +55,12 @@ Video Disk Recorder Revision History - Reduced the number of remote control keys. Modified the key assignments for the PC keyboard to better resemble the "up-down-left-right-ok" layout on menu controlling remote control units. + +2000-07-15: Version 0.06 + +- Added support for LIRC remote control (thanks to Carsten Koch!). + There are now three different remote control modes: KBD (PC-Keyboard), RCU + and LIRC. See the INSTALL file for information on how to enable either of + these modes. The default mode is now KBD, not RCU as before (to make it + work immediately even if there is no actual remote control). + diff --git a/INSTALL b/INSTALL index bc619d7c..1a6442d9 100644 --- a/INSTALL +++ b/INSTALL @@ -20,10 +20,16 @@ and type 'make'. This should produce an executable file named 'vdr', which can be run after the DVB driver has been installed. -There are two macros you can use to customize the 'vdr' program -at compile time. Adding "DEBUG_REMOTE=1" to the 'make' call -will use the PC's keyboard as input device instead of the "Remote -Control Unit" (see http://www.cadsoft.de/people/kls/vdr/remote.htm). +The 'vdr' program can be controlled via the PC keyboard or +an infrared remote control unit. Define the REMOTE macro to one of the +following values 'make' call to activate the respective control mode: + + REMOTE=KBD control via the PC keyboard (default) + REMOTE=RCU control via the "Remote Control Unit" receiver + (see http://www.cadsoft.de/people/kls/vdr/remote.htm) + REMOTE=LIRC control via the "Linux Infrared Remote Control" + (see http://fsinfo.cs.uni-sb.de/~columbus/lirc) + Adding "DEBUG_OSD=1" will use the PC screen (or current window) to display texts instead of the DVB card's on-screen display interface. These modes are useful when testing new menus if you @@ -65,7 +71,7 @@ Learning the remote control keys: --------------------------------- There is no default 'keys.conf' file, so if you compile the program -without 'DEBUG_REMOTE=1' you will have to go through a "teach-in" +with 'REMOTE=RCU' you will have to go through a "teach-in" session that allows the program to learn your remote control codes. It will first attempt to determine the basic data transfer mode and timing of your remote control unit, and then will ask you to press one @@ -76,9 +82,9 @@ you define, the more you will be able to navigate through the menus and control recording/replaying. The program uses only a very small number of keys which have multiple meanings in the various modes (see MANUAL for a detailed description). -If the program has been built with "DEBUG_REMOTE=1", it will use the +If the program has been built with "REMOTE=KBD", it will use the key configuration file 'keys-pc.conf', so that you won't loose data -when switching between normal and debug mode. +when switching between remote control and keyboard mode. The default PC key assignments are: @@ -89,6 +95,12 @@ The default PC key assignments are: Red, Green, Yellow, Blue 'F1'..'F4' 0..9 '0'..'9' in top row -If you prefer different key assignments, simply delete the file -'keys-pc.conf' and restart 'vdr' to get into learning mode. +If you prefer different key assignments, or if the default doesn't work for +your keyboard, simply delete the file 'keys-pc.conf' and restart 'vdr' to get +into learning mode. + +If the program has been compiled with 'REMOTE=LIRC', no 'keys.conf' file +will be used. Instead, the key names as listed in the source file 'config.c' +must be used when setting up LIRC. See http://www2.arnes.si/~mthale1 for +more about LIRC. diff --git a/Makefile b/Makefile index 0ed17ca7..cfa7ef7f 100644 --- a/Makefile +++ b/Makefile @@ -4,14 +4,16 @@ # See the main source file 'vdr.c' for copyright information and # how to reach the author. # -# $Id: Makefile 1.3 2000/04/24 09:44:10 kls Exp $ +# $Id: Makefile 1.4 2000/06/24 15:09:30 kls Exp $ OBJS = config.o dvbapi.o interface.o menu.o osd.o recording.o remote.o tools.o vdr.o -ifdef DEBUG_REMOTE -DEFINES += -DDEBUG_REMOTE +ifndef REMOTE +REMOTE = KBD endif +DEFINES += -DREMOTE_$(REMOTE) + ifdef DEBUG_OSD DEFINES += -DDEBUG_OSD endif diff --git a/config.c b/config.c index 7e02c916..16f44124 100644 --- a/config.c +++ b/config.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: config.c 1.7 2000/05/27 14:44:15 kls Exp $ + * $Id: config.c 1.8 2000/07/15 12:39:20 kls Exp $ */ #include "config.h" @@ -146,6 +146,17 @@ eKeys cKeys::Get(unsigned int Code) return kNone; } +unsigned int cKeys::Encode(const char *Command) +{ + if (Command != NULL) { + const tKey *k = keys; + while ((k->type != kNone) && strncmp(k->name, Command, strlen(k->name)) != 0) // must use 'strncmp()' because LIRC delivers trailing characters! + k++; + return k->code; + } + return 0; +} + void cKeys::Set(eKeys Key, unsigned int Code) { for (tKey *k = keys; k->type != kNone; k++) { diff --git a/config.h b/config.h index 1e22b888..22099b90 100644 --- a/config.h +++ b/config.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: config.h 1.6 2000/05/27 14:43:46 kls Exp $ + * $Id: config.h 1.7 2000/06/24 13:42:32 kls Exp $ */ #ifndef __CONFIG_H @@ -52,6 +52,7 @@ public: void Clear(void); bool Load(char *FileName = NULL); bool Save(void); + unsigned int Encode(const char *Command); eKeys Get(unsigned int Code); void Set(eKeys Key, unsigned int Code); }; diff --git a/dvbapi.c b/dvbapi.c index e652d997..58b2d74f 100644 --- a/dvbapi.c +++ b/dvbapi.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: dvbapi.c 1.10 2000/05/27 14:07:17 kls Exp $ + * $Id: dvbapi.c 1.11 2000/06/24 14:03:19 kls Exp $ */ #include "dvbapi.h" @@ -1054,7 +1054,7 @@ cDvbApi::cDvbApi(const char *FileName) if (videoDev < 0) LOG_ERROR; cols = rows = 0; -#if defined(DEBUG_OSD) || defined(DEBUG_REMOTE) +#if defined(DEBUG_OSD) || defined(REMOTE_KBD) initscr(); keypad(stdscr, TRUE); nonl(); @@ -1080,7 +1080,7 @@ cDvbApi::~cDvbApi() StopRecord(); close(videoDev); } -#if defined(DEBUG_REMOTE) || defined(DEBUG_OSD) +#if defined(DEBUG_OSD) || defined(REMOTE_KBD) endwin(); #endif delete replayTitle; diff --git a/dvbapi.h b/dvbapi.h index e0c74b07..a43ba0ee 100644 --- a/dvbapi.h +++ b/dvbapi.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: dvbapi.h 1.10 2000/05/20 14:50:43 kls Exp $ + * $Id: dvbapi.h 1.11 2000/06/24 14:03:57 kls Exp $ */ #ifndef __DVBAPI_H @@ -15,7 +15,7 @@ typedef unsigned int __u32; typedef unsigned short __u16; typedef unsigned char __u8; -#if defined(DEBUG_OSD) || defined(DEBUG_REMOTE) +#if defined(DEBUG_OSD) || defined(REMOTE_KBD) #include #endif #include diff --git a/interface.c b/interface.c index 82f955dc..244488aa 100644 --- a/interface.c +++ b/interface.c @@ -4,15 +4,19 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: interface.c 1.9 2000/05/07 09:28:39 kls Exp $ + * $Id: interface.c 1.10 2000/07/15 12:39:20 kls Exp $ */ #include "interface.h" #include #include "remote.h" -#ifndef DEBUG_REMOTE -cRcIo RcIo("/dev/ttyS1"); +#if defined(REMOTE_RCU) +cRcIoRCU RcIo("/dev/ttyS1"); +#elif defined(REMOTE_LIRC) +cRcIoLIRC RcIo("/dev/lircd"); +#else +cRcIoKBD RcIo; #endif cInterface Interface; @@ -26,9 +30,7 @@ cInterface::cInterface(void) void cInterface::Init(void) { -#ifndef DEBUG_REMOTE RcIo.SetCode(Keys.code, Keys.address); -#endif } void cInterface::Open(int NumCols, int NumLines) @@ -47,21 +49,15 @@ void cInterface::Close(void) unsigned int cInterface::GetCh(bool Wait) { -#ifdef DEBUG_REMOTE - timeout(Wait ? 1000 :10); - int c = getch(); - return (c > 0) ? c : 0; -#else #ifdef DEBUG_OSD timeout(0); getch(); // just to make 'ncurses' display the window: #endif - if (Wait || RcIo.InputAvailable()) { + if (RcIo.InputAvailable(Wait)) { unsigned int Command; return RcIo.GetCommand(&Command, NULL) ? Command : 0; } return 0; -#endif } eKeys cInterface::GetKey(bool Wait) @@ -215,12 +211,12 @@ void cInterface::QueryKeys(void) WriteText(1, 1, "Learning Remote Control Keys"); WriteText(1, 3, "Phase 1: Detecting RC code type"); WriteText(1, 5, "Press any key on the RC unit"); -#ifndef DEBUG_REMOTE +#ifndef REMOTE_KBD unsigned char Code = 0; unsigned short Address; #endif for (;;) { -#ifdef DEBUG_REMOTE +#ifdef REMOTE_KBD if (GetCh()) break; #else @@ -318,9 +314,7 @@ void cInterface::LearnKeys(void) void cInterface::DisplayChannel(int Number, const char *Name) { -#ifndef DEBUG_REMOTE RcIo.Number(Number); -#endif if (Name && !Recording()) { Open(MenuColumns, 1); char buffer[MenuColumns + 1]; @@ -338,9 +332,7 @@ void cInterface::DisplayChannel(int Number, const char *Name) void cInterface::DisplayRecording(int Index, bool On) { -#ifndef DEBUG_REMOTE RcIo.SetPoints(1 << Index, On); -#endif } bool cInterface::Recording(void) diff --git a/remote.c b/remote.c index 816670fa..e3786c5c 100644 --- a/remote.c +++ b/remote.c @@ -4,7 +4,9 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: remote.c 1.8 2000/06/17 17:43:05 kls Exp $ + * Ported to LIRC by Carsten Koch 2000-06-16. + * + * $Id: remote.c 1.9 2000/07/15 12:19:50 kls Exp $ */ #include "remote.h" @@ -15,20 +17,82 @@ #include #include #include + +#if defined REMOTE_LIRC +#include +#include +#include +#endif + +#include "config.h" #include "tools.h" #define REPEATLIMIT 100 // ms #define REPEATDELAY 250 // ms -cRcIo::cRcIo(char *DeviceName) +// --- cRcIoBase ------------------------------------------------------------- + +cRcIoBase::cRcIoBase(void) +{ + t = 0; + firstTime = lastTime = 0; + lastCommand = 0; +} + +cRcIoBase::~cRcIoBase() +{ +} + +// --- cRcIoKBD -------------------------------------------------------------- + +#if defined REMOTE_KBD + +cRcIoKBD::cRcIoKBD(void) +{ +} + +cRcIoKBD::~cRcIoKBD() +{ +} + +void cRcIoKBD::Flush(int WaitSeconds) +{ + time_t t0 = time(NULL); + + timeout(10); + for (;;) { + while (getch() > 0) + t0 = time(NULL); + if (time(NULL) - t0 >= WaitSeconds) + break; + } +} + +bool cRcIoKBD::InputAvailable(bool Wait) +{ + timeout(Wait ? 1000 : 10); + return true;//XXX +} + +bool cRcIoKBD::GetCommand(unsigned int *Command, unsigned short *) +{ + if (Command) { + *Command = getch(); + return *Command > 0; + } + return false; +} + +// --- cRcIoRCU -------------------------------------------------------------- + +#elif defined REMOTE_RCU + +cRcIoRCU::cRcIoRCU(char *DeviceName) { dp = 0; mode = modeB; code = 0; address = 0xFFFF; - t = 0; - firstTime = lastTime = 0; - lastCommand = 0; lastNumber = 0; if ((f = open(DeviceName, O_RDWR | O_NONBLOCK)) >= 0) { struct termios t; @@ -46,28 +110,13 @@ cRcIo::cRcIo(char *DeviceName) f = -1; } -cRcIo::~cRcIo() +cRcIoRCU::~cRcIoRCU() { if (f >= 0) close(f); } -bool cRcIo::InputAvailable(bool Wait) -{ - if (f >= 0) { - fd_set set; - struct timeval timeout; - timeout.tv_sec = Wait ? 1 : 0; - timeout.tv_usec = Wait ? 0 : 10000; - FD_ZERO(&set); - FD_SET(f, &set); - if (select(FD_SETSIZE, &set, NULL, NULL, &timeout) > 0) - return FD_ISSET(f, &set); - } - return false; -} - -int cRcIo::ReceiveByte(bool Wait) +int cRcIoRCU::ReceiveByte(bool Wait) { // Returns the byte if one was received within a timeout, -1 otherwise if (InputAvailable(Wait)) { @@ -80,7 +129,7 @@ int cRcIo::ReceiveByte(bool Wait) return -1; } -bool cRcIo::SendByteHandshake(unsigned char c) +bool cRcIoRCU::SendByteHandshake(unsigned char c) { if (f >= 0) { int w = write(f, &c, 1); @@ -104,7 +153,7 @@ bool cRcIo::SendByteHandshake(unsigned char c) return false; } -bool cRcIo::SendByte(unsigned char c) +bool cRcIoRCU::SendByte(unsigned char c) { for (int retry = 5; retry--;) { if (SendByteHandshake(c)) @@ -113,7 +162,20 @@ bool cRcIo::SendByte(unsigned char c) return false; } -void cRcIo::Flush(int WaitSeconds) +bool cRcIoRCU::SetCode(unsigned char Code, unsigned short Address) +{ + code = Code; + address = Address; + return SendCommand(code); +} + +bool cRcIoRCU::SetMode(unsigned char Mode) +{ + mode = Mode; + return SendCommand(mode); +} + +void cRcIoRCU::Flush(int WaitSeconds) { time_t t0 = time(NULL); @@ -125,20 +187,12 @@ void cRcIo::Flush(int WaitSeconds) } } -bool cRcIo::SetCode(unsigned char Code, unsigned short Address) +bool cRcIoRCU::InputAvailable(bool Wait) { - code = Code; - address = Address; - return SendCommand(code); + return DataAvailable(f, Wait); } -bool cRcIo::SetMode(unsigned char Mode) -{ - mode = Mode; - return SendCommand(mode); -} - -bool cRcIo::GetCommand(unsigned int *Command, unsigned short *Address) +bool cRcIoRCU::GetCommand(unsigned int *Command, unsigned short *Address) { #pragma pack(1) union { @@ -191,17 +245,17 @@ bool cRcIo::GetCommand(unsigned int *Command, unsigned short *Address) return false; } -bool cRcIo::SendCommand(unsigned char Cmd) +bool cRcIoRCU::SendCommand(unsigned char Cmd) { return SendByte(Cmd | 0x80); } -bool cRcIo::Digit(int n, int v) +bool cRcIoRCU::Digit(int n, int v) { return SendByte(((n & 0x03) << 5) | (v & 0x0F) | (((dp >> n) & 0x01) << 4)); } -bool cRcIo::Number(int n, bool Hex) +bool cRcIoRCU::Number(int n, bool Hex) { if (!Hex) { char buf[8]; @@ -222,7 +276,7 @@ bool cRcIo::Number(int n, bool Hex) return SendCommand(mode); } -bool cRcIo::String(char *s) +bool cRcIoRCU::String(char *s) { const char *chars = mode == modeH ? "0123456789ABCDEF" : "0123456789-EHLP "; int n = 0; @@ -239,7 +293,7 @@ bool cRcIo::String(char *s) return Number(n, true); } -void cRcIo::SetPoints(unsigned char Dp, bool On) +void cRcIoRCU::SetPoints(unsigned char Dp, bool On) { if (On) dp |= Dp; @@ -248,7 +302,7 @@ void cRcIo::SetPoints(unsigned char Dp, bool On) Number(lastNumber, true); } -bool cRcIo::DetectCode(unsigned char *Code, unsigned short *Address) +bool cRcIoRCU::DetectCode(unsigned char *Code, unsigned short *Address) { // Caller should initialize 'Code' to 0 and call DetectCode() // until it returns true. Whenever DetectCode() returns false @@ -282,3 +336,83 @@ bool cRcIo::DetectCode(unsigned char *Code, unsigned short *Address) return false; } +// --- cRcIoLIRC ------------------------------------------------------------- + +#elif defined REMOTE_LIRC + +cRcIoLIRC::cRcIoLIRC(char *DeviceName) +{ + struct sockaddr_un addr; + addr.sun_family = AF_UNIX; + strcpy(addr.sun_path, DeviceName); + f = socket(AF_UNIX, SOCK_STREAM, 0); + if (f >= 0) { + if (connect(f, (struct sockaddr *)&addr, sizeof(addr)) >= 0) + return; + LOG_ERROR_STR(DeviceName); + close(f); + } + else + LOG_ERROR_STR(DeviceName); + f = -1; +} + +cRcIoLIRC::~cRcIoLIRC() +{ + if (f >= 0) + close(f); +} + +const char *cRcIoLIRC::ReceiveString(void) +{ + while (InputAvailable(true)) { + if (read(f, buf, sizeof(buf)) > 21) { + const int repeat = 10 * (buf[17] - '0') + (buf[18] - '0'); + const int now = time_ms(); + if (repeat == 0) { + firstTime = lastTime = now; + return buf + 20; + } + else if ((now > firstTime + REPEATDELAY) && (now > lastTime + REPEATLIMIT)) { + lastTime = now; + return buf + 20; + } + } + } + return NULL; +} + +void cRcIoLIRC::Flush(int WaitSeconds) +{ + time_t t0 = time(NULL); + + for (;;) { + while (InputAvailable(false)) { + read(f, buf, sizeof(buf)); + t0 = time(NULL); + } + if (time(NULL) - t0 >= WaitSeconds) + break; + } +} + +bool cRcIoLIRC::InputAvailable(bool Wait) +{ + return DataAvailable(f, Wait); +} + +bool cRcIoLIRC::GetCommand(unsigned int *Command, unsigned short *) +{ + Flush(); + if (Command) { + const char *cmd = ReceiveString(); + if (cmd) { + *Command = Keys.Encode(cmd); + return true; + } + } + return false; +} + +#endif + diff --git a/remote.h b/remote.h index 1d0a1cce..38961b9c 100644 --- a/remote.h +++ b/remote.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: remote.h 1.5 2000/05/07 09:27:54 kls Exp $ + * $Id: remote.h 1.6 2000/06/24 15:52:56 kls Exp $ */ #ifndef __REMOTE_H @@ -13,14 +13,44 @@ #include #include -class cRcIo { +class cRcIoBase { +protected: + time_t t; + int firstTime, lastTime; + unsigned int lastCommand; + cRcIoBase(void); + virtual ~cRcIoBase(); +public: + enum { modeH = 'h', modeB = 'b', modeS = 's' }; + virtual bool SetCode(unsigned char Code, unsigned short Address) { return true; } + virtual bool SetMode(unsigned char Mode) { return true; } + virtual bool Number(int n, bool Hex = false) { return true; } + virtual void SetPoints(unsigned char Dp, bool On) {} + virtual bool String(char *s) { return true; } + virtual bool DetectCode(unsigned char *Code, unsigned short *Address) { return true; } + virtual void Flush(int WaitSeconds = 0) {} + virtual bool InputAvailable(bool Wait = false) = 0; + virtual bool GetCommand(unsigned int *Command, unsigned short *Address = NULL) = 0; + }; + +#if defined REMOTE_KBD + +class cRcIoKBD : public cRcIoBase { +public: + cRcIoKBD(void); + virtual ~cRcIoKBD(); + virtual void Flush(int WaitSeconds = 0); + virtual bool InputAvailable(bool Wait = false); + virtual bool GetCommand(unsigned int *Command, unsigned short *Address = NULL); + }; + +#elif defined REMOTE_RCU + +class cRcIoRCU : public cRcIoBase { private: int f; unsigned char dp, code, mode; unsigned short address; - time_t t; - int firstTime, lastTime; - unsigned int lastCommand; int lastNumber; bool SendCommand(unsigned char Cmd); int ReceiveByte(bool Wait = true); @@ -28,18 +58,39 @@ private: bool SendByte(unsigned char c); bool Digit(int n, int v); public: - enum { modeH = 'h', modeB = 'b', modeS = 's' }; - cRcIo(char *DeviceName); - ~cRcIo(); - bool InputAvailable(bool Wait = false); - void Flush(int WaitSeconds = 0); - bool SetCode(unsigned char Code, unsigned short Address); - bool SetMode(unsigned char Mode); - bool GetCommand(unsigned int *Command, unsigned short *Address = NULL); - bool Number(int n, bool Hex = false); - void SetPoints(unsigned char Dp, bool On); - bool String(char *s); - bool DetectCode(unsigned char *Code, unsigned short *Address); + cRcIoRCU(char *DeviceName); + virtual ~cRcIoRCU(); + virtual bool SetCode(unsigned char Code, unsigned short Address); + virtual bool SetMode(unsigned char Mode); + virtual bool Number(int n, bool Hex = false); + virtual void SetPoints(unsigned char Dp, bool On); + virtual bool String(char *s); + virtual bool DetectCode(unsigned char *Code, unsigned short *Address); + virtual void Flush(int WaitSeconds = 0); + virtual bool InputAvailable(bool Wait = false); + virtual bool GetCommand(unsigned int *Command, unsigned short *Address = NULL); }; +#elif defined REMOTE_LIRC + +class cRcIoLIRC : public cRcIoBase { +private: + enum { LIRC_BUFFER_SIZE = 128 }; + int f; + char buf[LIRC_BUFFER_SIZE]; + const char *ReceiveString(void); +public: + cRcIoLIRC(char *DeviceName); + virtual ~cRcIoLIRC(); + virtual void Flush(int WaitSeconds = 0); + virtual bool InputAvailable(bool Wait = false); + virtual bool GetCommand(unsigned int *Command, unsigned short *Address = NULL); + }; + +#else + +#error Please define a remote control mode! + +#endif + #endif //__REMOTE_H diff --git a/tools.c b/tools.c index eb0a14a4..c0eb2ec5 100644 --- a/tools.c +++ b/tools.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: tools.c 1.7 2000/04/24 15:01:35 kls Exp $ + * $Id: tools.c 1.8 2000/06/24 15:26:15 kls Exp $ */ #define _GNU_SOURCE @@ -22,15 +22,18 @@ int SysLogLevel = 3; -bool DataAvailable(int filedes) +bool DataAvailable(int filedes, bool wait) { - fd_set set; - FD_ZERO(&set); - FD_SET(filedes, &set); - struct timeval timeout; - timeout.tv_sec = 0; - timeout.tv_usec = 10000; - return select(FD_SETSIZE, &set, NULL, NULL, &timeout) > 0 && FD_ISSET(filedes, &set); + if (filedes >= 0) { + fd_set set; + FD_ZERO(&set); + FD_SET(filedes, &set); + struct timeval timeout; + timeout.tv_sec = wait ? 1 : 0; + timeout.tv_usec = wait ? 0 : 10000; + return select(FD_SETSIZE, &set, NULL, NULL, &timeout) > 0 && FD_ISSET(filedes, &set); + } + return false; } void writechar(int filedes, char c) diff --git a/tools.h b/tools.h index 57b2065d..db55983f 100644 --- a/tools.h +++ b/tools.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: tools.h 1.7 2000/04/24 15:01:49 kls Exp $ + * $Id: tools.h 1.8 2000/06/24 15:25:00 kls Exp $ */ #ifndef __TOOLS_H @@ -30,7 +30,7 @@ extern int SysLogLevel; #define DELETENULL(p) (delete (p), p = NULL) -bool DataAvailable(int filedes); +bool DataAvailable(int filedes, bool wait = false); void writechar(int filedes, char c); void writeint(int filedes, int n); char readchar(int filedes); diff --git a/vdr.c b/vdr.c index bcda4711..4c1dce0a 100644 --- a/vdr.c +++ b/vdr.c @@ -22,7 +22,7 @@ * * The project's page is at http://www.cadsoft.de/people/kls/vdr * - * $Id: vdr.c 1.19 2000/05/27 15:38:35 kls Exp $ + * $Id: vdr.c 1.20 2000/07/15 11:45:05 kls Exp $ */ #include @@ -33,7 +33,7 @@ #include "recording.h" #include "tools.h" -#ifdef DEBUG_REMOTE +#ifdef REMOTE_KBD #define KEYS_CONF "keys-pc.conf" #else #define KEYS_CONF "keys.conf" @@ -58,8 +58,10 @@ int main(int argc, char *argv[]) Channels.Load("channels.conf"); Timers.Load("timers.conf"); +#ifndef REMOTE_LIRC if (!Keys.Load(KEYS_CONF)) Interface.LearnKeys(); +#endif Interface.Init(); cChannel::SwitchTo(CurrentChannel);