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