]> git.vomp.tv Git - vompclient.git/blob - udp.cc
UDP server for inserting remote button presses
[vompclient.git] / udp.cc
1 /*
2     Copyright 2006 Chris Tallon
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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 */
20
21 #include "udp.h"
22
23 //void dump(unsigned char* data, USHORT size);
24 //unsigned char dcc(UCHAR c);
25
26 UDP::UDP()
27 {
28   log = Log::getInstance();
29   initted = 0;
30 }
31
32 UDP::~UDP()
33 {
34   shutdown();
35 }
36
37 int UDP::shutdown()
38 {
39   if (!initted) return 1;
40   if (threadIsActive()) threadCancel();
41   ds->shutdown();
42
43   initted = 0;
44   return 1;
45 }
46
47 int UDP::run(MessageQueue* tcommandMessageQueue)
48 {
49   if (threadIsActive()) return 1;
50   log->log("UDP", Log::DEBUG, "Starting UDP command server");
51
52   initted = 1;
53
54   commandMessageQueue = tcommandMessageQueue;
55   ds = new DatagramSocket(2000);
56
57   if (!ds->init())
58   {
59     log->log("UDP", Log::DEBUG, "DSock init error");
60     shutdown();
61     return 0;
62   }
63
64   if (!threadStart())
65   {
66     log->log("UDP", Log::DEBUG, "Thread start error");
67     shutdown();
68     return 0;
69   }
70
71   log->log("UDP", Log::DEBUG, "UDP command server started");
72   return 1;
73 }
74
75 void UDP::threadMethod()
76 {
77   int retval;
78   while(1)
79   {
80     log->log("UDP", Log::DEBUG, "Starting wait");
81     retval = ds->waitforMessage(0);
82     log->log("UDP", Log::DEBUG, "Wait finished");
83
84     if (retval == 0)
85     {
86       log->log("UDP", Log::CRIT, "Wait for packet error");
87       return;
88     }
89     else if (retval == 1)
90     {
91       continue;
92     }
93     else
94     {
95       processRequest((UCHAR*)ds->getData(), ds->getDataLength());
96     }
97   }
98 }
99
100 void UDP::processRequest(UCHAR* data, int length)
101 {
102   log->log("UDP", Log::DEBUG, "Got request");
103
104   char* temp = new char[length + 1];
105   memcpy(temp, data, length);
106   temp[length] = '\0';
107   int command = atoi(temp);
108   delete[] temp;
109
110   log->log("UDP", Log::DEBUG, "Command %i recieved", command);
111
112
113   Message *m = new Message();
114   m->to = commandMessageQueue;
115   m->message = Message::UDP_BUTTON;
116   m->parameter = command;
117   commandMessageQueue->postMessage(m);
118 }
119
120 /*
121 void dump(unsigned char* data, USHORT size)
122 {
123   printf("Size = %u\n", size);
124
125   USHORT c = 0;
126   while(c < size)
127   {
128     if ((size - c) > 15)
129     {
130       printf(" %02X %02X %02X %02X  %02X %02X %02X %02X  %02X %02X %02X %02X  %02X %02X %02X %02X  %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n",
131         data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6], data[c+7],
132         data[c+8], data[c+9], data[c+10], data[c+11], data[c+12], data[c+13], data[c+14], data[c+15],
133         dcc(data[c]), dcc(data[c+1]), dcc(data[c+2]), dcc(data[c+3]), dcc(data[c+4]), dcc(data[c+5]), dcc(data[c+6]), dcc(data[c+7]),
134         dcc(data[c+8]), dcc(data[c+9]), dcc(data[c+10]), dcc(data[c+11]), dcc(data[c+12]), dcc(data[c+13]), dcc(data[c+14]), dcc(data[c+15]));
135       c += 16;
136     }
137     else
138     {
139       switch (size - c)
140       {
141         case 15:
142           printf(" %02X %02X %02X %02X  %02X %02X %02X %02X  %02X %02X %02X %02X  %02X %02X %02X     %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n",
143             data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6], data[c+7],
144             data[c+8], data[c+9], data[c+10], data[c+11], data[c+12], data[c+13], data[c+14],
145             dcc(data[c]), dcc(data[c+1]), dcc(data[c+2]), dcc(data[c+3]), dcc(data[c+4]), dcc(data[c+5]), dcc(data[c+6]), dcc(data[c+7]),
146             dcc(data[c+8]), dcc(data[c+9]), dcc(data[c+10]), dcc(data[c+11]), dcc(data[c+12]), dcc(data[c+13]), dcc(data[c+14]));
147           c += 15;
148           break;
149         case 14:
150           printf(" %02X %02X %02X %02X  %02X %02X %02X %02X  %02X %02X %02X %02X  %02X %02X        %c%c%c%c%c%c%c%c%c%c%c%c%c%c\n",
151             data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6], data[c+7],
152             data[c+8], data[c+9], data[c+10], data[c+11], data[c+12], data[c+13],
153             dcc(data[c]), dcc(data[c+1]), dcc(data[c+2]), dcc(data[c+3]), dcc(data[c+4]), dcc(data[c+5]), dcc(data[c+6]), dcc(data[c+7]),
154             dcc(data[c+8]), dcc(data[c+9]), dcc(data[c+10]), dcc(data[c+11]), dcc(data[c+12]), dcc(data[c+13]));
155           c += 14;
156           break;
157         case 13:
158           printf(" %02X %02X %02X %02X  %02X %02X %02X %02X  %02X %02X %02X %02X  %02X           %c%c%c%c%c%c%c%c%c%c%c%c%c\n",
159             data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6], data[c+7],
160             data[c+8], data[c+9], data[c+10], data[c+11], data[c+12],
161             dcc(data[c]), dcc(data[c+1]), dcc(data[c+2]), dcc(data[c+3]), dcc(data[c+4]), dcc(data[c+5]), dcc(data[c+6]), dcc(data[c+7]),
162             dcc(data[c+8]), dcc(data[c+9]), dcc(data[c+10]), dcc(data[c+11]), dcc(data[c+12]));
163           c += 13;
164           break;
165         case 12:
166           printf(" %02X %02X %02X %02X  %02X %02X %02X %02X  %02X %02X %02X %02X               %c%c%c%c%c%c%c%c%c%c%c%c\n",
167             data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6], data[c+7],
168             data[c+8], data[c+9], data[c+10], data[c+11],
169             dcc(data[c]), dcc(data[c+1]), dcc(data[c+2]), dcc(data[c+3]), dcc(data[c+4]), dcc(data[c+5]), dcc(data[c+6]), dcc(data[c+7]),
170             dcc(data[c+8]), dcc(data[c+9]), dcc(data[c+10]), dcc(data[c+11]));
171           c += 12;
172           break;
173         case 11:
174           printf(" %02X %02X %02X %02X  %02X %02X %02X %02X  %02X %02X %02X                  %c%c%c%c%c%c%c%c%c%c%c\n",
175             data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6], data[c+7],
176             data[c+8], data[c+9], data[c+10],
177             dcc(data[c]), dcc(data[c+1]), dcc(data[c+2]), dcc(data[c+3]), dcc(data[c+4]), dcc(data[c+5]), dcc(data[c+6]), dcc(data[c+7]),
178             dcc(data[c+8]), dcc(data[c+9]), dcc(data[c+10]));
179           c += 11;
180           break;
181         case 10:
182           printf(" %02X %02X %02X %02X  %02X %02X %02X %02X  %02X %02X                     %c%c%c%c%c%c%c%c%c%c\n",
183             data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6], data[c+7],
184             data[c+8], data[c+9],
185             dcc(data[c]), dcc(data[c+1]), dcc(data[c+2]), dcc(data[c+3]), dcc(data[c+4]), dcc(data[c+5]), dcc(data[c+6]), dcc(data[c+7]),
186             dcc(data[c+8]), dcc(data[c+9]));
187           c += 10;
188           break;
189         case 9:
190           printf(" %02X %02X %02X %02X  %02X %02X %02X %02X  %02X                        %c%c%c%c%c%c%c%c%c\n",
191             data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6], data[c+7],
192             data[c+8],
193             dcc(data[c]), dcc(data[c+1]), dcc(data[c+2]), dcc(data[c+3]), dcc(data[c+4]), dcc(data[c+5]), dcc(data[c+6]), dcc(data[c+7]),
194             dcc(data[c+8]));
195           c += 9;
196           break;
197         case 8:
198           printf(" %02X %02X %02X %02X  %02X %02X %02X %02X                            %c%c%c%c%c%c%c%c\n",
199             data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6], data[c+7],
200             dcc(data[c]), dcc(data[c+1]), dcc(data[c+2]), dcc(data[c+3]), dcc(data[c+4]), dcc(data[c+5]), dcc(data[c+6]), dcc(data[c+7]));
201           c += 8;
202           break;
203         case 7:
204           printf(" %02X %02X %02X %02X  %02X %02X %02X                               %c%c%c%c%c%c%c\n",
205             data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6],
206             dcc(data[c]), dcc(data[c+1]), dcc(data[c+2]), dcc(data[c+3]), dcc(data[c+4]), dcc(data[c+5]), dcc(data[c+6]));
207           c += 7;
208           break;
209         case 6:
210           printf(" %02X %02X %02X %02X  %02X %02X                                  %c%c%c%c%c%c\n",
211             data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5],
212             dcc(data[c]), dcc(data[c+1]), dcc(data[c+2]), dcc(data[c+3]), dcc(data[c+4]), dcc(data[c+5]));
213           c += 6;
214           break;
215         case 5:
216           printf(" %02X %02X %02X %02X  %02X                                     %c%c%c%c%c\n",
217             data[c], data[c+1], data[c+2], data[c+3], data[c+4],
218             dcc(data[c]), dcc(data[c+1]), dcc(data[c+2]), dcc(data[c+3]), dcc(data[c+4]));
219           c += 5;
220           break;
221         case 4:
222           printf(" %02X %02X %02X %02X                                         %c%c%c%c\n",
223             data[c], data[c+1], data[c+2], data[c+3],
224             dcc(data[c]), dcc(data[c+1]), dcc(data[c+2]), dcc(data[c+3]));
225           c += 4;
226           break;
227         case 3:
228           printf(" %02X %02X %02X                                            %c%c%c\n",
229             data[c], data[c+1], data[c+2],
230             dcc(data[c]), dcc(data[c+1]), dcc(data[c+2]));
231           c += 3;
232           break;
233         case 2:
234           printf(" %02X %02X                                               %c%c\n",
235             data[c], data[c+1],
236             dcc(data[c]), dcc(data[c+1]));
237           c += 2;
238           break;
239         case 1:
240           printf(" %02X                                                  %c\n",
241             data[c],
242             dcc(data[c]));
243           c += 1;
244           break;
245       }
246     }
247   }
248 }
249
250 unsigned char dcc(UCHAR c)
251 {
252   if (isspace(c)) return ' ';
253   if (isprint(c)) return c;
254   return '.';
255 }
256 */