use rc-keyboard on ultimo
[vuplus_dvbapp] / lib / driver / rcinput.cpp
1 #include <lib/driver/rcinput.h>
2
3 #include <lib/base/eerror.h>
4
5 #include <sys/ioctl.h>
6 #include <linux/input.h>
7 #include <sys/stat.h>
8
9 #include <lib/base/ebase.h>
10 #include <lib/base/init.h>
11 #include <lib/base/init_num.h>
12 #include <lib/driver/input_fake.h>
13
14 #ifdef VUPLUS_USE_RCKBD 
15 //                                /         /         /         /          /         /
16 static char g_SmallAlphaMap[] = "            -=  qwertyuiop    asdfghjkl;\'   zxcvbnm,./";
17 static char g_LargeAlphaMap[] = "  !@# % &*()_+  QWERTYUIOP    ASDFGHJKL:\"   ZXCVBNM<>?";
18
19 #include <lib/driver/rcconsole.h>
20 extern eRCConsole* g_ConsoleDevice;
21 static char* g_pMap = g_SmallAlphaMap;
22 inline char getAsciiCode(unsigned int code)
23 {
24         switch(code)
25         {
26         case 57: return ' ';
27         case 43: return '\\';
28         }
29         
30         if(code<54)
31         {
32                 if(g_pMap[code] == ' ')
33                         return 0;
34                 return g_pMap[code];
35         }
36         return 0;
37 }
38 #endif /*VUPLUS_USE_RCKBD*/
39
40 void eRCDeviceInputDev::handleCode(long rccode)
41 {
42         struct input_event *ev = (struct input_event *)rccode;
43         if (ev->type!=EV_KEY)
44                 return;
45
46 //      eDebug("%x %x %x", ev->value, ev->code, ev->type);
47
48         if (ev->type!=EV_KEY)
49                 return;
50
51         int km = iskeyboard ? input->getKeyboardMode() : eRCInput::kmNone;
52
53 //      eDebug("keyboard mode %d", km);
54         
55         if (km == eRCInput::kmAll)
56                 return;
57
58         if (km == eRCInput::kmAscii)
59         {
60 //              eDebug("filtering.. %d", ev->code);
61                 bool filtered = ( ev->code > 0 && ev->code < 61 );
62                 switch (ev->code)
63                 {
64                         case KEY_RESERVED:
65                         case KEY_ESC:
66                         case KEY_TAB:
67                         case KEY_BACKSPACE:
68                         case KEY_ENTER:
69                         case KEY_LEFTCTRL:
70                         case KEY_RIGHTSHIFT:
71                         case KEY_LEFTALT:
72                         case KEY_CAPSLOCK:
73                         case KEY_INSERT:
74                         case KEY_DELETE:
75                         case KEY_MUTE:
76                                 filtered=false;
77                         default:
78                                 break;
79                 }
80                 if (filtered)
81                         return;
82 //              eDebug("passed!");
83         }
84
85 #ifdef VUPLUS_USE_RCKBD
86         if(g_ConsoleDevice)
87         {
88                 char code = getAsciiCode(ev->code);
89                 //eDebug("getAsciiCode : [%d] [%c]", code, code);
90                 switch(ev->value)
91                 {
92                 case 0:
93                         if(ev->code == 42) { g_pMap = g_SmallAlphaMap; return; }
94                         if(code) return;
95                 case 1:
96                         {
97                                 if(ev->code == 42) { g_pMap = g_LargeAlphaMap; return; }
98                                 if(code)
99                                 {
100                                         g_ConsoleDevice->handleCode(code);
101                                         return;
102                                 }
103                         }
104                         break;
105                 }
106         }
107 #endif /*VUPLUS_USE_RCKBD*/
108
109         switch (ev->value)
110         {
111         case 0:
112                 /*emit*/ input->keyPressed(eRCKey(this, ev->code, eRCKey::flagBreak));
113                 break;
114         case 1:
115                 /*emit*/ input->keyPressed(eRCKey(this, ev->code, 0));
116                 break;
117         case 2:
118                 /*emit*/ input->keyPressed(eRCKey(this, ev->code, eRCKey::flagRepeat));
119                 break;
120         }
121 }
122
123 eRCDeviceInputDev::eRCDeviceInputDev(eRCInputEventDriver *driver)
124         :eRCDevice(driver->getDeviceName(), driver), iskeyboard(false)
125 {
126         if (strcasestr(id.c_str(), "keyboard") != NULL)
127                 iskeyboard = true;
128         setExclusive(true);
129         eDebug("Input device \"%s\" is %sa keyboard.", id.c_str(), iskeyboard ? "" : "not ");
130 }
131
132 void eRCDeviceInputDev::setExclusive(bool b)
133 {
134         if (!iskeyboard)
135                 driver->setExclusive(b);
136 }
137
138 const char *eRCDeviceInputDev::getDescription() const
139 {
140         return id.c_str();
141 }
142
143 class eInputDeviceInit
144 {
145         ePtrList<eRCInputEventDriver> m_drivers;
146         ePtrList<eRCDeviceInputDev> m_devices;
147 public:
148         eInputDeviceInit()
149         {
150                 int i = 0;
151                 while (1)
152                 {
153                         struct stat s;
154                         char filename[128];
155                         sprintf(filename, "/dev/input/event%d", i);
156                         if (stat(filename, &s))
157                                 break;
158                         eRCInputEventDriver *p;
159                         m_drivers.push_back(p = new eRCInputEventDriver(filename));
160                         m_devices.push_back(new eRCDeviceInputDev(p));
161                         ++i;
162                 }
163                 eDebug("Found %d input devices!", i);
164         }
165         
166         ~eInputDeviceInit()
167         {
168                 while (m_drivers.size())
169                 {
170                         delete m_devices.back();
171                         m_devices.pop_back();
172                         delete m_drivers.back();
173                         m_drivers.pop_back();
174                 }
175         }
176 };
177
178 eAutoInitP0<eInputDeviceInit> init_rcinputdev(eAutoInitNumbers::rc+1, "input device driver");