add rc-keyboard on the vuultimo(us_de)
[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 #include <lib/driver/rcconsole.h>
16 extern eRCConsole* g_ConsoleDevice;
17 #define CODE_RC    0
18 #define CODE_ASCII 1
19
20 #define KEY_LALT        56
21 #define KEY_RALT        100
22 #define KEY_LSHIFT      42
23 static int special_key_mode = 0;
24
25 int getType(int code)
26 {
27         switch(code)
28         {
29         case 2:   // 1
30         case 3:   // 2
31         case 4:   // 3
32         case 5:   // 4
33         case 6:   // 5
34         case 7:   // 6
35         case 8:   // 7
36         case 9:   // 8
37         case 10:  // 9
38         case 11:  // 0
39         case 14:  // backspace
40         case 103: // up
41         case 105: // left
42         case 106: // right
43         case 108: // down
44         case 114: // volume down
45         case 115: // vulume up
46         case 116: // power
47         case 128: // stop
48         case 133: // mute
49         case 138: // help
50         case 139: // menu
51         case 163: // FF
52         case 164: // pause
53         case 165: // RF
54         case 167: // record
55         case 174: // exit
56         case 207: // play
57         case 352: // ok
58         case 358: // epg
59         case 370: // _subtitle selection
60         case 377: // tv
61         case 385: // radio
62         case 388: // =text
63         case 392: // audio
64         case 393: // =recorded files
65         case 398: // red
66         case 399: // green
67         case 400: // yellow
68         case 401: // blue
69         case 402: // channel up
70         case 403: // channel down
71         case 407: // >
72         case 412: // <
73                 return CODE_RC;
74         }
75         return CODE_ASCII;
76 }
77 #endif /*VUPLUS_USE_RCKBD*/
78
79 void eRCDeviceInputDev::handleCode(long rccode)
80 {
81         struct input_event *ev = (struct input_event *)rccode;
82         if (ev->type!=EV_KEY)
83                 return;
84 #ifdef VUPLUS_USE_RCKBD
85         //eDebug("value : %d, code : %d, type : %d, type : %s", ev->value, ev->code, ev->type, getType(ev->code)?"ASCII":"RC");
86         if(getType(ev->code) || special_key_mode)
87         {
88                 switch(ev->value)
89                 {
90                         case 0:
91                                 if(ev->code == KEY_RALT || ev->code == KEY_LSHIFT || ev->code == KEY_LALT)
92                                 {
93                                         special_key_mode = 0;
94                                         g_ConsoleDevice->handleCode(0);
95                                 }
96                                 break;
97                         case 1: 
98                                 if(ev->code == KEY_RALT || ev->code == KEY_LSHIFT || ev->code == KEY_LALT)
99                                         special_key_mode = 1;
100                                 g_ConsoleDevice->handleCode(ev->code);
101                                 break;
102                         case 2: break;
103                 }
104                 return;
105         }
106 #endif /*VUPLUS_USE_RCKBD*/
107
108 //      eDebug("%x %x %x", ev->value, ev->code, ev->type);
109         int km = iskeyboard ? input->getKeyboardMode() : eRCInput::kmNone;
110
111 //      eDebug("keyboard mode %d", km);
112         
113         if (km == eRCInput::kmAll)
114                 return;
115
116         if (km == eRCInput::kmAscii)
117         {
118 //              eDebug("filtering.. %d", ev->code);
119                 bool filtered = ( ev->code > 0 && ev->code < 61 );
120                 switch (ev->code)
121                 {
122                         case KEY_RESERVED:
123                         case KEY_ESC:
124                         case KEY_TAB:
125                         case KEY_BACKSPACE:
126                         case KEY_ENTER:
127                         case KEY_LEFTCTRL:
128                         case KEY_RIGHTSHIFT:
129                         case KEY_LEFTALT:
130                         case KEY_CAPSLOCK:
131                         case KEY_INSERT:
132                         case KEY_DELETE:
133                         case KEY_MUTE:
134                                 filtered=false;
135                         default:
136                                 break;
137                 }
138                 if (filtered)
139                         return;
140 //              eDebug("passed!");
141         }
142
143         switch (ev->value)
144         {
145         case 0:
146                 /*emit*/ input->keyPressed(eRCKey(this, ev->code, eRCKey::flagBreak));
147                 break;
148         case 1:
149                 /*emit*/ input->keyPressed(eRCKey(this, ev->code, 0));
150                 break;
151         case 2:
152                 /*emit*/ input->keyPressed(eRCKey(this, ev->code, eRCKey::flagRepeat));
153                 break;
154         }
155 }
156
157 eRCDeviceInputDev::eRCDeviceInputDev(eRCInputEventDriver *driver)
158         :eRCDevice(driver->getDeviceName(), driver), iskeyboard(false)
159 {
160         if (strcasestr(id.c_str(), "keyboard") != NULL)
161                 iskeyboard = true;
162         setExclusive(true);
163         eDebug("Input device \"%s\" is %sa keyboard.", id.c_str(), iskeyboard ? "" : "not ");
164 }
165
166 void eRCDeviceInputDev::setExclusive(bool b)
167 {
168         if (!iskeyboard)
169                 driver->setExclusive(b);
170 }
171
172 const char *eRCDeviceInputDev::getDescription() const
173 {
174         return id.c_str();
175 }
176
177 class eInputDeviceInit
178 {
179         ePtrList<eRCInputEventDriver> m_drivers;
180         ePtrList<eRCDeviceInputDev> m_devices;
181 public:
182         eInputDeviceInit()
183         {
184                 int i = 0;
185                 while (1)
186                 {
187                         struct stat s;
188                         char filename[128];
189                         sprintf(filename, "/dev/input/event%d", i);
190                         if (stat(filename, &s))
191                                 break;
192                         eRCInputEventDriver *p;
193                         m_drivers.push_back(p = new eRCInputEventDriver(filename));
194                         m_devices.push_back(new eRCDeviceInputDev(p));
195                         ++i;
196                 }
197                 eDebug("Found %d input devices!", i);
198         }
199         
200         ~eInputDeviceInit()
201         {
202                 while (m_drivers.size())
203                 {
204                         delete m_devices.back();
205                         m_devices.pop_back();
206                         delete m_drivers.back();
207                         m_drivers.pop_back();
208                 }
209         }
210 };
211
212 eAutoInitP0<eInputDeviceInit> init_rcinputdev(eAutoInitNumbers::rc+1, "input device driver");