fix mutekey bug.
[vuplus_dvbapp] / lib / driver / rcinput.cpp
index 041330a..669d1c4 100644 (file)
@@ -1,5 +1,7 @@
 #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 103: // up
+       case 105: // left
+       case 106: // right
+       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 164: // pause
+       case 165: // RF
+       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:
@@ -29,97 +154,58 @@ void eRCDeviceInputDev::handleCode(int rccode)
        }
 }
 
-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();
+               }
        }
 };