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