#include <lib/driver/rcinput.h>
+#include <lib/base/eerror.h>
+
#include <sys/ioctl.h>
#include <linux/input.h>
#include <sys/stat.h>
#include <lib/base/init_num.h>
#include <lib/driver/input_fake.h>
-void eRCDeviceInputDev::handleCode(int rccode)
+#ifdef VUPLUS_USE_RCKBD
+#include <lib/driver/rcconsole.h>
+extern eRCConsole* g_ConsoleDevice;
+#define CODE_RC 0
+#define CODE_ASCII 1
+
+#define KEY_LALT 56
+#define KEY_RALT 100
+#define KEY_LSHIFT 42
+static int special_key_mode = 0;
+
+int getType(int code)
+{
+ switch(code)
+ {
+ case 2: // 1
+ case 3: // 2
+ case 4: // 3
+ case 5: // 4
+ case 6: // 5
+ case 7: // 6
+ case 8: // 7
+ case 9: // 8
+ case 10: // 9
+ case 11: // 0
+ case 14: // backspace
+ case 102: // home
+ case 103: // up
+ case 105: // left
+ case 106: // right
+ case 107: // end
+ case 108: // down
+ case 113: // mute
+ case 114: // volume down
+ case 115: // vulume up
+ case 116: // power
+ case 128: // stop
+ case 138: // help
+ case 139: // menu
+ case 163: // FF
+ case 208: // FF
+ case 164: // pause
+ case 165: // RW
+ case 168: // RW
+ case 167: // record
+ case 174: // exit
+ case 207: // play
+ case 352: // ok
+ case 358: // epg
+ case 370: // _subtitle selection
+ case 377: // tv
+ case 385: // radio
+ case 388: // =text
+ case 392: // audio
+ case 393: // =recorded files
+ case 398: // red
+ case 399: // green
+ case 400: // yellow
+ case 401: // blue
+ case 402: // channel up
+ case 403: // channel down
+ case 407: // >
+ case 412: // <
+ return CODE_RC;
+ }
+ return CODE_ASCII;
+}
+#endif /*VUPLUS_USE_RCKBD*/
+
+void eRCDeviceInputDev::handleCode(long rccode)
{
struct input_event *ev = (struct input_event *)rccode;
if (ev->type!=EV_KEY)
return;
- eDebug("%x %x %x", ev->value, ev->code, ev->type);
+#ifdef VUPLUS_USE_RCKBD
+ //eDebug("value : %d, code : %d, type : %d, type : %s", ev->value, ev->code, ev->type, getType(ev->code)?"ASCII":"RC");
+ if(getType(ev->code) || special_key_mode)
+ {
+ switch(ev->value)
+ {
+ case 0:
+ if(ev->code == KEY_RALT || ev->code == KEY_LSHIFT || ev->code == KEY_LALT)
+ {
+ special_key_mode = 0;
+ g_ConsoleDevice->handleCode(0);
+ }
+ break;
+ case 1:
+ if(ev->code == KEY_RALT || ev->code == KEY_LSHIFT || ev->code == KEY_LALT)
+ special_key_mode = 1;
+ g_ConsoleDevice->handleCode(ev->code);
+ break;
+ case 2: break;
+ }
+ return;
+ }
+#endif /*VUPLUS_USE_RCKBD*/
+
+// eDebug("%x %x %x", ev->value, ev->code, ev->type);
+ int km = iskeyboard ? input->getKeyboardMode() : eRCInput::kmNone;
+
+// eDebug("keyboard mode %d", km);
+
+ if (km == eRCInput::kmAll)
+ return;
+
+ if (km == eRCInput::kmAscii)
+ {
+// eDebug("filtering.. %d", ev->code);
+ bool filtered = ( ev->code > 0 && ev->code < 61 );
+ switch (ev->code)
+ {
+ case KEY_RESERVED:
+ case KEY_ESC:
+ case KEY_TAB:
+ case KEY_BACKSPACE:
+ case KEY_ENTER:
+ case KEY_LEFTCTRL:
+ case KEY_RIGHTSHIFT:
+ case KEY_LEFTALT:
+ case KEY_CAPSLOCK:
+ case KEY_INSERT:
+ case KEY_DELETE:
+ case KEY_MUTE:
+ filtered=false;
+ default:
+ break;
+ }
+ if (filtered)
+ return;
+// eDebug("passed!");
+ }
+
switch (ev->value)
{
case 0:
}
}
-eRCDeviceInputDev::eRCDeviceInputDev(eRCInputEventDriver *driver): eRCDevice(driver->getDeviceName(), driver)
-{
-}
-
-const char *eRCDeviceInputDev::getDescription() const
+eRCDeviceInputDev::eRCDeviceInputDev(eRCInputEventDriver *driver)
+ :eRCDevice(driver->getDeviceName(), driver), iskeyboard(false)
{
- return id.c_str();
+ if (strcasestr(id.c_str(), "keyboard") != NULL)
+ iskeyboard = true;
+ setExclusive(true);
+ eDebug("Input device \"%s\" is %sa keyboard.", id.c_str(), iskeyboard ? "" : "not ");
}
-const char *eRCDeviceInputDev::getKeyDescription(const eRCKey &key) const
+void eRCDeviceInputDev::setExclusive(bool b)
{
- switch (key.code)
- {
- case KEY_0: return "0";
- case KEY_1: return "1";
- case KEY_2: return "2";
- case KEY_3: return "3";
- case KEY_4: return "4";
- case KEY_5: return "5";
- case KEY_6: return "6";
- case KEY_7: return "7";
- case KEY_8: return "8";
- case KEY_9: return "9";
- case KEY_RIGHT: return "rechts";
- case KEY_LEFT: return "links";
- case KEY_UP: return "oben";
- case KEY_DOWN: return "unten";
- case KEY_OK: return "ok";
- case KEY_MUTE: return "mute";
- case KEY_POWER: return "power";
- case KEY_GREEN: return "gruen";
- case KEY_YELLOW: return "gelb";
- case KEY_RED: return "rot";
- case KEY_BLUE: return "blau";
- case KEY_VOLUMEUP: return "Lautstaerke plus";
- case KEY_VOLUMEDOWN: return "Lautstaerke minus";
- case KEY_HELP: return "?";
- case KEY_SETUP: return "d-Box";
-#if 0
- case KEY_TOPLEFT: return "oben links";
- case KEY_TOPRIGHT: return "oben rechts";
- case KEY_BOTTOMLEFT: return "unten links";
- case KEY_BOTTOMRIGHT: return "unten rechts";
-#endif
- case KEY_HOME: return "home";
- default: return 0;
- }
+ if (!iskeyboard)
+ driver->setExclusive(b);
}
-int eRCDeviceInputDev::getKeyCompatibleCode(const eRCKey &key) const
+const char *eRCDeviceInputDev::getDescription() const
{
- switch (key.code)
- {
- case KEY_0: return eRCInput::RC_0;
- case KEY_1: return eRCInput::RC_1;
- case KEY_2: return eRCInput::RC_2;
- case KEY_3: return eRCInput::RC_3;
- case KEY_4: return eRCInput::RC_4;
- case KEY_5: return eRCInput::RC_5;
- case KEY_6: return eRCInput::RC_6;
- case KEY_7: return eRCInput::RC_7;
- case KEY_8: return eRCInput::RC_8;
- case KEY_9: return eRCInput::RC_9;
- case KEY_RIGHT: return eRCInput::RC_RIGHT;
- case KEY_LEFT: return eRCInput::RC_LEFT;
- case KEY_UP: return eRCInput::RC_UP;
- case KEY_DOWN: return eRCInput::RC_DOWN;
- case KEY_OK: return eRCInput::RC_OK;
- case KEY_MUTE: return eRCInput::RC_MUTE;
- case KEY_POWER: return eRCInput::RC_STANDBY;
- case KEY_GREEN: return eRCInput::RC_GREEN;
- case KEY_YELLOW: return eRCInput::RC_YELLOW;
- case KEY_RED: return eRCInput::RC_RED;
- case KEY_VOLUMEUP: return eRCInput::RC_PLUS;
- case KEY_BLUE: return eRCInput::RC_BLUE;
- case KEY_VOLUMEDOWN: return eRCInput::RC_MINUS;
- case KEY_HELP: return eRCInput::RC_HELP;
- case KEY_SETUP: return eRCInput::RC_DBOX;
- case KEY_HOME: return eRCInput::RC_HOME;
- }
- return -1;
+ return id.c_str();
}
-
class eInputDeviceInit
{
- eRCInputEventDriver driver;
- eRCDeviceInputDev deviceInputDev;
+ ePtrList<eRCInputEventDriver> m_drivers;
+ ePtrList<eRCDeviceInputDev> m_devices;
public:
- eInputDeviceInit(): driver("/dev/input/event0"), deviceInputDev(&driver)
+ eInputDeviceInit()
+ {
+ int i = 0;
+ while (1)
+ {
+ struct stat s;
+ char filename[128];
+ sprintf(filename, "/dev/input/event%d", i);
+ if (stat(filename, &s))
+ break;
+ eRCInputEventDriver *p;
+ m_drivers.push_back(p = new eRCInputEventDriver(filename));
+ m_devices.push_back(new eRCDeviceInputDev(p));
+ ++i;
+ }
+ eDebug("Found %d input devices!", i);
+ }
+
+ ~eInputDeviceInit()
{
+ while (m_drivers.size())
+ {
+ delete m_devices.back();
+ m_devices.pop_back();
+ delete m_drivers.back();
+ m_drivers.pop_back();
+ }
}
};