]> git.vomp.tv Git - vompclient.git/blob - remotelirc.cc
Fix segfault in boxstack.cc
[vompclient.git] / remotelirc.cc
1 /*
2     Copyright 2004-2005 Chris Tallon 2009 Marten Richter
3
4     This file is part of VOMP.
5
6     VOMP is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10
11     VOMP is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with VOMP; if not, write to the Free Software
18     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19 */
20 #include <sys/socket.h>
21
22 #include "remotelirc.h"
23 #include "i18n.h"
24
25 #include "log.h"
26
27 #define LIRC_BUFFER_SIZE  128 
28
29
30 RemoteLirc::RemoteLirc()
31 {
32   if (instance) return;
33   initted = 0;
34   tv.tv_sec = 0;
35   tv.tv_usec = 0;
36   device = -1;
37 }
38
39 RemoteLirc::~RemoteLirc()
40 {
41 }
42
43 int RemoteLirc::init(char* devName)
44 {
45   if (initted) return 0;
46   initted = 1;
47
48   address.sun_family = AF_UNIX;
49
50   strcpy(address.sun_path, devName);
51   if (!sockConnect()) return 0;
52 /*
53   device = open(devName, O_RDONLY);
54   if (device < 0)
55   {
56     initted = 0;
57     return 0;
58   }
59 */
60   return 1;
61 }
62
63 int RemoteLirc::shutdown()
64 {
65   if (!initted) return 0;
66   initted = 0;
67   close(device);
68   device = 0;
69   return 1;
70 }
71
72 int RemoteLirc::sockConnect()
73 {
74          if ((device = socket(AF_UNIX, SOCK_STREAM, 0)) >= 0) {
75                  if (connect(device, (struct sockaddr *)&address, sizeof(address)) >= 0)
76                          return 1;
77                  Log::getInstance()->log("Remote", Log::INFO, "Connecting lircd failed %s", address.sun_path);
78                  close(device);
79                  device = -1;
80          }
81          else
82                 Log::getInstance()->log("Remote", Log::INFO, "Creating socket failed");
83          
84      Log::getInstance()->log("Remote", Log::DEBUG, "Creating socket successfull");
85
86          return 0;
87 }
88
89 int RemoteLirc::getDevice()
90 {
91   if (!initted) return 0;
92   return device;
93 }
94
95 UCHAR RemoteLirc::getButtonPress(int waitType)
96 {
97   /* how = 0 - block
98      how = 1 - start new wait
99      how = 2 - continue wait
100      how = 3 - no wait
101   */
102
103   unsigned long input;
104   struct timeval* passToSelect = NULL;
105   char buffer[LIRC_BUFFER_SIZE]; 
106   int retval;
107   fd_set readfds;
108
109   if (waitType == 0)
110   {
111     passToSelect = NULL;
112   }
113   else if (waitType == 1)
114   {
115     tv.tv_sec = 1;
116     tv.tv_usec = 000000;
117     passToSelect = &tv;
118   }
119   else if (waitType == 2)
120   {
121     if ((tv.tv_sec == 0) && (tv.tv_usec == 0))  // protection in case timer = 0
122     {
123       tv.tv_sec = 1;
124       tv.tv_usec = 000000;
125     }
126     passToSelect = &tv;
127   }
128   else if (waitType == 3)
129   {
130     tv.tv_sec = 0;
131     tv.tv_usec = 0;
132     passToSelect = &tv;
133   }
134   FD_ZERO(&readfds);
135   FD_SET(device, &readfds);
136
137   retval = select(device + 1, &readfds, NULL, NULL, &tv);
138   // 0 = nothing happened
139   // 1 = data arrived (actually num of descriptors that changed)
140   // other value = signal or error
141   if (retval == 0) return NA_NONE;
142   if (retval == -1) return NA_SIGNAL;
143   
144   int count = read(device, &buffer, sizeof(LIRC_BUFFER_SIZE));
145   if (count  > 0)
146   {
147           int input=NA_UNKNOWN;
148           if (sscanf(buffer, "%d", &input) != 1) { 
149                   Log::getInstance()->log("Remote", Log::DEBUG, "ERROR: unparseable lirc command: %s", buffer);
150                   return NA_UNKNOWN;
151       }
152
153           Log::getInstance()->log("Remote", Log::DEBUG, "Button %x", input);
154
155           return (UCHAR) TranslateHWC(input);
156   }
157   return NA_UNKNOWN;
158 }
159
160 void RemoteLirc::clearBuffer()
161 {
162 //  while(getButtonPress(3) != NA_NONE);
163 }
164
165 UCHAR RemoteLirc::TranslateHWCFixed(ULLONG code)
166 {
167     switch (code) 
168     {
169     case 0xa9:
170         return DOWN;
171     case 0xa8:
172         return UP;
173     case 0xaa:
174         return LEFT;
175     case 0xab:
176         return RIGHT;
177     case 0x09:
178         return MENU;
179     case 0x8d:
180         return BACK;
181     case 0x0d:
182         return OK;
183     case 0xd2:
184         return POWER;
185     default:
186         return NA_UNKNOWN;
187     };
188 }
189
190
191 void RemoteLirc::InitHWCListwithDefaults()
192 {
193   translist[0x9e] = VOLUMEUP;
194   translist[0x9f] = VOLUMEDOWN;
195   translist[0x94] = CHANNELUP;
196   translist[0x90] = CHANNELDOWN;
197
198   // Common buttons
199   translist[0xf1] = ZERO;
200   translist[0xf2] = ONE;
201   translist[0xf3] = TWO;
202   translist[0xf4] = THREE;
203   translist[0xf5] = FOUR;
204   translist[0xf6] = FIVE;
205   translist[0xf7] = SIX;
206   translist[0xf8] = SEVEN;
207   translist[0xf9] = EIGHT;
208   translist[0xfa] = NINE;
209   translist[0xd2] = POWER;
210   translist[0x91] = GO;
211   translist[0xde] = RED;
212   translist[0xdf] = GREEN;
213   translist[0xe0] = YELLOW;
214   translist[0xe2] = BLUE;
215
216   translist[0xe1] = MUTE;
217   translist[0xd5] = REVERSE;
218   translist[0xd6] = FORWARD;
219   translist[0x1b] = STOP;
220   translist[0xea] = PAUSE;
221   translist[0xe9] = PLAY;
222   translist[0xdb] = SKIPBACK;
223   translist[0xdc] = SKIPFORWARD;
224
225   // Old remote only
226   translist[0xda] = FULL;
227
228  
229 }
230
231
232 char* RemoteLirc::HCWDesc(ULLONG hcw)
233 {
234    
235     char *ret=NULL;
236
237         ret=new char[20];
238
239     switch(hcw)
240     {
241         case  0x01: strncpy(ret,tr("Suspend") ,20);break;
242         case  0x09: strncpy(ret,tr("Menu") ,20);break;
243         case  0x0d: strncpy(ret,tr("Enter") ,20);break;
244         case  0x1b: strncpy(ret,tr("Stop") ,20);break;
245         case  0x8A: strncpy(ret,tr("TV mode") ,20);break;
246         case  0x8c: strncpy(ret,tr("Setup") ,20);break;
247         case  0x8D: strncpy(ret,tr("Return") ,20);break;
248         case  0x90: strncpy(ret,tr("Repeat") ,20);break;
249         case  0x91: strncpy(ret,tr("Time Seek"),20);break;
250         case  0x94: strncpy(ret,tr("Title") ,20);break;
251         case  0x95: strncpy(ret,tr("Info") ,20);break;
252         case  0x9e: strncpy(ret,tr("Volume up") ,20);break;
253         case  0x9f: strncpy(ret,tr("Volume down") ,20);break;
254         case  0xa8: strncpy(ret,tr("up") ,20);break;
255         case  0xaa: strncpy(ret,tr("Left") ,20);break;
256         case  0xab: strncpy(ret,tr("Right") ,20);break;
257         case  0xa9: strncpy(ret,tr("Down") ,20);break;
258         case  0xd0: strncpy(ret,tr("Home") ,20);break;
259         case  0xd2: strncpy(ret,tr("Stand by") ,20);break;
260         case  0xd5: strncpy(ret,tr("Backward") ,20);break;
261         case  0xd6: strncpy(ret,tr("Forward") ,20);break;
262         case  0xd8: strncpy(ret,tr("Audio") ,20);break;
263         case  0xd9: strncpy(ret,tr("Slow") ,20);break;
264         case  0xda: strncpy(ret,tr("Zoom") ,20);break;
265         case  0xdb: strncpy(ret,tr("Previous") ,20);break;
266     case  0xde: strncpy(ret,tr("Red") ,20);break;
267         case  0xdc: strncpy(ret,tr("Next") ,20);break;
268         case  0xdf: strncpy(ret,tr("Green") ,20);break;
269     case  0xe0: strncpy(ret,tr("Yellow") ,20);break;
270         case  0xe1: strncpy(ret,tr("Mute") ,20);break;
271         case  0xe2: strncpy(ret,tr("Blue") ,20);break;
272         case  0xe9: strncpy(ret,tr("Play") ,20);break;
273         case  0xea: strncpy(ret,tr("Pause") ,20);break;
274         case  0xeb: strncpy(ret,tr("Subtitle") ,20);break;
275         case  0xec: strncpy(ret,tr("Angle") ,20);break;
276         case  0xef: strncpy(ret,tr("Eject") ,20);break;
277         case  0xf1: strncpy(ret,tr("0") ,20);break;
278         case  0xf2: strncpy(ret,tr("1") ,20);break;
279         case  0xf3: strncpy(ret,tr("2") ,20);break;
280         case  0xf4: strncpy(ret,tr("3") ,20);break;
281         case  0xf5: strncpy(ret,tr("4") ,20);break;
282         case  0xf6: strncpy(ret,tr("5") ,20);break;
283         case  0xf7: strncpy(ret,tr("6") ,20);break;
284         case  0xf8: strncpy(ret,tr("7") ,20);break;
285         case  0xf9: strncpy(ret,tr("8") ,20);break;
286         case  0xfA: strncpy(ret,tr("9") ,20);break;
287         case  0xFC: strncpy(ret,tr("Caps") ,20);break;
288         case  0xFD: strncpy(ret,tr("File mode") ,20);break;
289    
290     
291     default:{
292         ULONG ri=(ULONG)hcw;
293         sprintf(ret,"R: %X",ri);
294                   }break;
295     };
296     return ret;
297 }