]> git.vomp.tv Git - vompclient.git/blob - inputudp.cc
Change WSelectList option data to void*. About 65 CWFs
[vompclient.git] / inputudp.cc
1 /*
2     Copyright 2006-2020 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, see <https://www.gnu.org/licenses/>.
18 */
19
20 #include <fcntl.h>
21 #include <unistd.h>
22
23 #include "dsock.h"
24 #include "log.h"
25
26 #include "inputudp.h"
27
28 bool InputUDP::init()
29 {
30   if (initted) return false;
31   initted = true;
32   log = Log::getInstance();
33   log->log("InputUDP", Log::DEBUG, "Starting InputUDP command server");
34
35   ds = new DatagramSocket(2000);
36   if (!ds->init())
37   {
38     log->log("InputUDP", Log::DEBUG, "DSock init error");
39     delete ds;
40     initted = false;
41     return false;
42   }
43
44   if (pipe2(pfds, O_NONBLOCK) == -1)
45   {
46     Log::getInstance()->log("InputUDP", Log::ERR, "pipe2() fail");
47     ds->shutdown();
48     delete ds;
49     initted = false;
50     return false;
51   }
52
53   return true;
54 }
55
56 void InputUDP::shutdown()
57 {
58   ds->shutdown();
59   delete ds;
60
61   close(pfds[1]);
62   close(pfds[0]);
63
64   initted = false;
65 }
66
67 bool InputUDP::start()
68 {
69   threadStartProtect.lock(); // Make sure listenThread is fully initted before start returns
70   listenThread = std::thread( [this]
71   {
72     threadStartProtect.lock();
73     threadStartProtect.unlock();
74     listenLoop();
75   });
76   threadStartProtect.unlock();
77
78   log->log("InputUDP", Log::DEBUG, "InputUDP command server started");
79   return true;
80 }
81
82 void InputUDP::stop()
83 {
84   std::lock_guard<std::mutex> lg(threadStartProtect); // Also use it to protect against starting while stopping
85
86   if (!initted) return;
87
88   if (listenThread.joinable())
89   {
90     write(pfds[1], "1", 1); // break the select in listenLoop
91     listenThread.join();
92   }
93 }
94
95 void InputUDP::listenLoop()
96 {
97   int retval;
98   while(1)
99   {
100     retval = ds->waitforMessage(3, pfds[0]);
101
102     if (retval == 2)
103     {
104       processRequest(ds->getData(), ds->getDataLength());
105     }
106     else if (retval == 3) // quit
107     {
108       break;
109     }
110     else
111     {
112       log->log("InputUDP", Log::CRIT, "Wait for packet error");
113       return;
114     }
115   }
116 }
117
118 void InputUDP::processRequest(const void* data, UINT length)
119 {
120   log->log("InputUDP", Log::DEBUG, "Got request");
121
122   char* temp = new char[length + 1];
123   memcpy(temp, data, length);
124   temp[length] = '\0';
125   UINT command = static_cast<UINT>(atoi(temp));
126   delete[] temp;
127
128   log->log("InputUDP", Log::DEBUG, "Command %i recieved", command);
129   sendInputKey(command);
130 }
131
132 const char* InputUDP::getHardCodedHardwareKeyNamesForVompKey(UCHAR /* vompKey */)
133 {
134   return "";
135 }
136
137 std::string InputUDP::getHardwareKeyName(int /* hardwareKey */)
138 {
139   std::string retval;
140   return retval;
141 }
142
143
144
145
146
147
148 /*
149
150 //void dump(unsigned char* data, USHORT size);
151 //unsigned char dcc(UCHAR c);
152
153 void dump(unsigned char* data, USHORT size)
154 {
155   printf("Size = %u\n", size);
156
157   USHORT c = 0;
158   while(c < size)
159   {
160     if ((size - c) > 15)
161     {
162       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",
163         data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6], data[c+7],
164         data[c+8], data[c+9], data[c+10], data[c+11], data[c+12], data[c+13], data[c+14], data[c+15],
165         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]),
166         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]));
167       c += 16;
168     }
169     else
170     {
171       switch (size - c)
172       {
173         case 15:
174           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",
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], data[c+11], data[c+12], data[c+13], data[c+14],
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]), dcc(data[c+11]), dcc(data[c+12]), dcc(data[c+13]), dcc(data[c+14]));
179           c += 15;
180           break;
181         case 14:
182           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",
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], data[c+10], data[c+11], data[c+12], data[c+13],
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]), dcc(data[c+10]), dcc(data[c+11]), dcc(data[c+12]), dcc(data[c+13]));
187           c += 14;
188           break;
189         case 13:
190           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",
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], data[c+9], data[c+10], data[c+11], data[c+12],
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]), dcc(data[c+9]), dcc(data[c+10]), dcc(data[c+11]), dcc(data[c+12]));
195           c += 13;
196           break;
197         case 12:
198           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",
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             data[c+8], data[c+9], data[c+10], data[c+11],
201             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]),
202             dcc(data[c+8]), dcc(data[c+9]), dcc(data[c+10]), dcc(data[c+11]));
203           c += 12;
204           break;
205         case 11:
206           printf(" %02X %02X %02X %02X  %02X %02X %02X %02X  %02X %02X %02X                  %c%c%c%c%c%c%c%c%c%c%c\n",
207             data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6], data[c+7],
208             data[c+8], data[c+9], data[c+10],
209             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]),
210             dcc(data[c+8]), dcc(data[c+9]), dcc(data[c+10]));
211           c += 11;
212           break;
213         case 10:
214           printf(" %02X %02X %02X %02X  %02X %02X %02X %02X  %02X %02X                     %c%c%c%c%c%c%c%c%c%c\n",
215             data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6], data[c+7],
216             data[c+8], data[c+9],
217             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]),
218             dcc(data[c+8]), dcc(data[c+9]));
219           c += 10;
220           break;
221         case 9:
222           printf(" %02X %02X %02X %02X  %02X %02X %02X %02X  %02X                        %c%c%c%c%c%c%c%c%c\n",
223             data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6], data[c+7],
224             data[c+8],
225             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]),
226             dcc(data[c+8]));
227           c += 9;
228           break;
229         case 8:
230           printf(" %02X %02X %02X %02X  %02X %02X %02X %02X                            %c%c%c%c%c%c%c%c\n",
231             data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6], data[c+7],
232             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]));
233           c += 8;
234           break;
235         case 7:
236           printf(" %02X %02X %02X %02X  %02X %02X %02X                               %c%c%c%c%c%c%c\n",
237             data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6],
238             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]));
239           c += 7;
240           break;
241         case 6:
242           printf(" %02X %02X %02X %02X  %02X %02X                                  %c%c%c%c%c%c\n",
243             data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5],
244             dcc(data[c]), dcc(data[c+1]), dcc(data[c+2]), dcc(data[c+3]), dcc(data[c+4]), dcc(data[c+5]));
245           c += 6;
246           break;
247         case 5:
248           printf(" %02X %02X %02X %02X  %02X                                     %c%c%c%c%c\n",
249             data[c], data[c+1], data[c+2], data[c+3], data[c+4],
250             dcc(data[c]), dcc(data[c+1]), dcc(data[c+2]), dcc(data[c+3]), dcc(data[c+4]));
251           c += 5;
252           break;
253         case 4:
254           printf(" %02X %02X %02X %02X                                         %c%c%c%c\n",
255             data[c], data[c+1], data[c+2], data[c+3],
256             dcc(data[c]), dcc(data[c+1]), dcc(data[c+2]), dcc(data[c+3]));
257           c += 4;
258           break;
259         case 3:
260           printf(" %02X %02X %02X                                            %c%c%c\n",
261             data[c], data[c+1], data[c+2],
262             dcc(data[c]), dcc(data[c+1]), dcc(data[c+2]));
263           c += 3;
264           break;
265         case 2:
266           printf(" %02X %02X                                               %c%c\n",
267             data[c], data[c+1],
268             dcc(data[c]), dcc(data[c+1]));
269           c += 2;
270           break;
271         case 1:
272           printf(" %02X                                                  %c\n",
273             data[c],
274             dcc(data[c]));
275           c += 1;
276           break;
277       }
278     }
279   }
280 }
281
282 unsigned char dcc(UCHAR c)
283 {
284   if (isspace(c)) return ' ';
285   if (isprint(c)) return c;
286   return '.';
287 }
288 */