diff options
author | Klaus Schmidinger <vdr@tvdr.de> | 2006-01-27 16:03:32 +0100 |
---|---|---|
committer | Klaus Schmidinger <vdr@tvdr.de> | 2006-01-27 16:03:32 +0100 |
commit | b0678c91abfe06f97c789b06f91a25a7bc29dd23 (patch) | |
tree | 973946c0fdfee875305e8b7fd1fc5e04806bcbc3 | |
parent | 7398125f317987197b653638517f98f877511513 (diff) | |
download | vdr-b0678c91abfe06f97c789b06f91a25a7bc29dd23.tar.gz vdr-b0678c91abfe06f97c789b06f91a25a7bc29dd23.tar.bz2 |
Now trying to reestablish the connection to the LIRC daemon in case it breaks
-rw-r--r-- | CONTRIBUTORS | 2 | ||||
-rw-r--r-- | HISTORY | 2 | ||||
-rw-r--r-- | lirc.c | 41 | ||||
-rw-r--r-- | lirc.h | 5 |
4 files changed, 35 insertions, 15 deletions
diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 97041b41..eb9b25a0 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -1485,6 +1485,8 @@ Ville Skyttä <ville.skytta@iki.fi> for adding a missing #include <linux/unistd.h> to thread.c for adding missing i18n entry for the "Timer" button for removing the obsolete "ca.conf" section from vdr.1 + for making the cLircRemote try to reestablish the connection to the LIRC daemon + in case it breaks Steffen Beyer <cpunk@reactor.de> for fixing setting the colored button help after deleting a recording in case the next @@ -4243,3 +4243,5 @@ Video Disk Recorder Revision History Mair). - Now checking whether the channel exists before setting the PMT filter in cPatFilter::Process() (thanks to Thomas Bergwinkl). +- Now trying to reestablish the connection to the LIRC daemon in case it breaks + (thanks to Ville Skyttä). @@ -6,35 +6,28 @@ * * LIRC support added by Carsten Koch <Carsten.Koch@icem.de> 2000-06-16. * - * $Id: lirc.c 1.13 2005/09/02 12:51:35 kls Exp $ + * $Id: lirc.c 1.14 2006/01/27 15:59:47 kls Exp $ */ #include "lirc.h" #include <netinet/in.h> #include <sys/socket.h> -#include <sys/un.h> #define REPEATLIMIT 20 // ms #define REPEATDELAY 350 // ms #define KEYPRESSDELAY 150 // ms +#define RECONNECTDELAY 3000 // ms cLircRemote::cLircRemote(const char *DeviceName) :cRemote("LIRC") ,cThread("LIRC remote control") { - struct sockaddr_un addr; addr.sun_family = AF_UNIX; strcpy(addr.sun_path, DeviceName); - if ((f = socket(AF_UNIX, SOCK_STREAM, 0)) >= 0) { - if (connect(f, (struct sockaddr *)&addr, sizeof(addr)) >= 0) { - Start(); - return; - } - LOG_ERROR_STR(DeviceName); - close(f); + if (Connect()) { + Start(); + return; } - else - LOG_ERROR_STR(DeviceName); f = -1; } @@ -47,6 +40,20 @@ cLircRemote::~cLircRemote() close(fh); } +bool cLircRemote::Connect(void) +{ + if ((f = socket(AF_UNIX, SOCK_STREAM, 0)) >= 0) { + if (connect(f, (struct sockaddr *)&addr, sizeof(addr)) >= 0) + return true; + LOG_ERROR_STR(addr.sun_path); + close(f); + f = -1; + } + else + LOG_ERROR_STR(addr.sun_path); + return false; +} + bool cLircRemote::Ready(void) { return f >= 0; @@ -67,10 +74,16 @@ void cLircRemote::Action(void) int ret = ready ? safe_read(f, buf, sizeof(buf)) : -1; if (ready && ret <= 0 ) { - esyslog("ERROR: lircd connection lost"); + esyslog("ERROR: lircd connection broken, trying to reconnect every %.1f seconds", float(RECONNECTDELAY) / 1000); close(f); f = -1; - break; + while (Running() && f < 0) { + cCondWait::SleepMs(RECONNECTDELAY); + if (Connect()) { + isyslog("reconnected to lircd"); + break; + } + } } if (ready && ret > 21) { @@ -4,12 +4,13 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: lirc.h 1.3 2005/07/31 10:18:15 kls Exp $ + * $Id: lirc.h 1.4 2006/01/27 16:00:19 kls Exp $ */ #ifndef __LIRC_H #define __LIRC_H +#include <sys/un.h> #include "remote.h" #include "thread.h" @@ -17,7 +18,9 @@ class cLircRemote : public cRemote, private cThread { private: enum { LIRC_KEY_BUF = 30, LIRC_BUFFER_SIZE = 128 }; int f; + struct sockaddr_un addr; virtual void Action(void); + bool Connect(void); public: cLircRemote(const char *DeviceName); virtual ~cLircRemote(); |