mirror of
				https://github.com/vdr-projects/vdr.git
				synced 2025-03-01 10:50:46 +00:00 
			
		
		
		
	Added support for LIRC remote control
This commit is contained in:
		
							
								
								
									
										5
									
								
								CONTRIBUTORS
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								CONTRIBUTORS
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| Thanks go to the following people for patches and contributions: | ||||
|  | ||||
| Carsten Koch <Carsten.Koch@icem.de> | ||||
|  for adding LIRC support | ||||
|  | ||||
							
								
								
									
										9
									
								
								HISTORY
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								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). | ||||
|  | ||||
|   | ||||
							
								
								
									
										30
									
								
								INSTALL
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								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. | ||||
|  | ||||
|   | ||||
							
								
								
									
										8
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								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 | ||||
|   | ||||
							
								
								
									
										13
									
								
								config.c
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								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++) { | ||||
|   | ||||
							
								
								
									
										3
									
								
								config.h
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								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); | ||||
|   }; | ||||
|   | ||||
							
								
								
									
										6
									
								
								dvbapi.c
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								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; | ||||
|   | ||||
							
								
								
									
										4
									
								
								dvbapi.h
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								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 <ncurses.h> | ||||
| #endif | ||||
| #include <stdio.h> | ||||
|   | ||||
							
								
								
									
										28
									
								
								interface.c
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								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 <unistd.h> | ||||
| #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) | ||||
|   | ||||
							
								
								
									
										218
									
								
								remote.c
									
									
									
									
									
								
							
							
						
						
									
										218
									
								
								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 <Carsten.Koch@icem.de>  2000-06-16. | ||||
|  * | ||||
|  * $Id: remote.c 1.9 2000/07/15 12:19:50 kls Exp $ | ||||
|  */ | ||||
|  | ||||
| #include "remote.h" | ||||
| @@ -15,20 +17,82 @@ | ||||
| #include <sys/time.h> | ||||
| #include <termios.h> | ||||
| #include <unistd.h> | ||||
|  | ||||
| #if defined REMOTE_LIRC | ||||
| #include <sys/socket.h> | ||||
| #include <sys/stat.h> | ||||
| #include <sys/un.h> | ||||
| #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 | ||||
|  | ||||
|   | ||||
							
								
								
									
										85
									
								
								remote.h
									
									
									
									
									
								
							
							
						
						
									
										85
									
								
								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 <stdio.h> | ||||
| #include <time.h> | ||||
|  | ||||
| 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 | ||||
|   | ||||
							
								
								
									
										21
									
								
								tools.c
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								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) | ||||
|   | ||||
							
								
								
									
										4
									
								
								tools.h
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								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); | ||||
|   | ||||
							
								
								
									
										6
									
								
								vdr.c
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								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 <signal.h> | ||||
| @@ -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); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user