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