--- a/remote.c +++ a/remote.c @@ -15,7 +15,9 @@ #include #include #include +#ifdef REMOTE_FEATURE_DEVINPUT #include +#endif #include "i18n.h" #include "remote.h" #ifdef REMOTE_FEATURE_TCPIP @@ -25,6 +27,9 @@ #define NUMREMOTES 10 // maximum number of remote control devices +#ifdef REMOTE_FEATURE_UHID +#define UHID_DEFAULT_READSIZE 8 // default size of uhid reads +#endif #define AV7110_KEYMAP_DEVICE "/proc/av7110_ir" #if 0 @@ -183,6 +188,7 @@ void cRemoteGeneric::Action(void) int identifyInputDevice(const int fh, char *name) // --------------------------------------------------------------------------- { +#ifdef REMOTE_FEATURE_DEVINPUT char description[256]; // check name of input device @@ -196,11 +202,13 @@ int identifyInputDevice(const int fh, ch if (strstr(description, "DVB") || strstr(description, "dvb")) return 2; +#endif return 0; } +#ifdef REMOTE_FEATURE_DEVINPUT // --------------------------------------------------------------------------- bool cRemoteDevInput::loadKeymap(const char *devname, uint32_t options) // --------------------------------------------------------------------------- @@ -454,6 +462,68 @@ bool cRemoteDevInput::keyPressed(uint64_ { return (code & 0xFFFF00000000ULL); } +#endif // REMOTE_FEATURE_DEVINPUT + + +/*****************************************************************************/ + + +#ifdef REMOTE_FEATURE_UHID +// --------------------------------------------------------------------------- +cRemoteUhid::cRemoteUhid(const char *name, int f, char *d, int size) + :cRemoteGeneric(name, f, d) +// --------------------------------------------------------------------------- +{ + Start(); + + readsize = size; + repeatcode = 0; + fcntl(f, F_SETFL, O_NONBLOCK); +} + + +// --------------------------------------------------------------------------- +bool cRemoteUhid::Initialize() +// --------------------------------------------------------------------------- +{ + return true; +} + + +// --------------------------------------------------------------------------- +uint64_t cRemoteUhid::getKey(void) +// --------------------------------------------------------------------------- +{ + int n; + uint64_t code = 0; + + // XXX handle short reads properly on big-endian + n = read(fh, &code, readsize); + if (n <= 0) { + if (n < 0 && (errno == EAGAIN || errno == EINTR)) + code = repeatcode; + else { + code = INVALID_KEY; + repeatcode = 0; + } + } else { + repeatcode = code; +#if 1 //def PRINTFDEBUGGING + printf("code %jx\n", code); +#endif + } + + return code; +} + + +// --------------------------------------------------------------------------- +bool cRemoteUhid::keyPressed(uint64_t code) +// --------------------------------------------------------------------------- +{ + return ((code & ~0xffULL) != 0LL); +} +#endif // REMOTE_FEATURE_UHID /*****************************************************************************/ @@ -557,6 +627,9 @@ private: int devcnt; char devtyp[NUMREMOTES]; char *devnam[NUMREMOTES]; +#ifdef REMOTE_FEATURE_UHID + int devsize[NUMREMOTES]; +#endif int fh[NUMREMOTES]; public: cPluginRemote(void); @@ -604,6 +677,10 @@ const char *cPluginRemote::CommandLineHe // --------------------------------------------------------------------------- { return " -i dev, --input=dev input device (/dev/input/... | autodetect)\n" +#ifdef REMOTE_FEATURE_UHID + " -h dev, --uhid=dev uhid(4) device (/dev/uhidX)\n" + " -s size, --uhidsize=size uhid device read size\n" +#endif #ifdef REMOTE_FEATURE_LIRC " -l dev, --lirc=dev lirc device (/dev/lircd)\n" #endif @@ -624,6 +701,10 @@ bool cPluginRemote::ProcessArgs(int argc { static struct option long_options[] = { { "input", required_argument, NULL, 'i' }, +#ifdef REMOTE_FEATURE_UHID + { "uhid", required_argument, NULL, 'h' }, + { "uhidsize", required_argument, NULL, 's' }, +#endif { "lirc", required_argument, NULL, 'l' }, { "port", required_argument, NULL, 'p' }, { "tty", required_argument, NULL, 't' }, @@ -631,11 +712,20 @@ bool cPluginRemote::ProcessArgs(int argc { NULL } }; int c; +#ifndef REMOTE_FEATURE_UHID while ((c = getopt_long(argc, argv, "i:l:p:t:T:", long_options, NULL)) != -1) +#else + while ((c = getopt_long(argc, argv, "i:h:s:l:p:t:T:", long_options, NULL)) != -1) +#endif { +#ifdef REMOTE_FEATURE_UHID + int size; +#endif + switch (c) { case 'i': + case 'h': case 'l': case 'p': case 't': @@ -647,8 +737,27 @@ bool cPluginRemote::ProcessArgs(int argc } devtyp[devcnt] = c; devnam[devcnt] = optarg; +#ifdef REMOTE_FEATURE_UHID + devsize[devcnt] = UHID_DEFAULT_READSIZE; +#endif devcnt++; break; +#ifdef REMOTE_FEATURE_UHID + case 's': + if (!devcnt || devcnt > NUMREMOTES) + { + esyslog("%s: uhidsize must come after uhid device", Name()); + return false; + } + size = atoi(optarg); + if (size <= 0 || size_t(size) > sizeof (int64_t)) + { + esyslog("%s: bad uhidsize %s", Name(), optarg); + return false; + } + devsize[devcnt] = size; + break; +#endif default: esyslog("%s: invalid argument", Name()); @@ -671,6 +780,7 @@ bool cPluginRemote::Start(void) RegisterI18n(remotePhrases); #endif +#ifdef REMOTE_FEATURE_DEVINPUT // no device specified by the user, set default if (devcnt == 0) { @@ -719,6 +829,7 @@ bool cPluginRemote::Start(void) if (devtyp[i] == 'i' && strcmp(devnam[i], "autodetect") == 0) devnam[i] = "/dev/input/ir"; } // for i +#endif for (int i = 0; i < devcnt; i++) { @@ -769,9 +880,17 @@ bool cPluginRemote::Start(void) switch (devtyp[i]) { +#ifdef REMOTE_FEATURE_DEVINPUT case 'i': new cRemoteDevInput(nam,fh[i],devnam[i]); break; +#endif + +#ifdef REMOTE_FEATURE_UHID + case 'h': + new cRemoteUhid(nam,fh[i],devnam[i],devsize[i]); + break; +#endif #ifdef REMOTE_FEATURE_LIRC case 'l': --- a/remote.h +++ a/remote.h @@ -82,6 +82,24 @@ public: +#ifdef REMOTE_FEATURE_UHID +/*****************************************************************************/ +class cRemoteUhid : protected cRemoteGeneric +/*****************************************************************************/ +{ +private: + uint64_t repeatcode; + int readsize; +protected: + virtual uint64_t getKey(void); + virtual bool keyPressed(uint64_t code); +public: + cRemoteUhid(const char *name, int f, char *d, int size); + virtual bool Initialize(void); +}; +#endif + + #ifdef REMOTE_FEATURE_LIRCOLD /*****************************************************************************/ class cRemoteDevLirc : protected cRemoteGeneric