2 Copyright 2006-2020 Chris Tallon
4 This file is part of VOMP.
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.
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.
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/>.
30 const char* InputUDP::myModName = "InputUDP";
34 if (initted) return false;
36 log = Log::getInstance();
37 log->log("InputUDP", Log::DEBUG, "Starting InputUDP command server");
39 ds = new DatagramSocket(2000);
42 log->log("InputUDP", Log::DEBUG, "DSock init error");
49 quitPipe = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
50 if (quitPipe == INVALID_SOCKET)
52 Log::getInstance()->log("InputUDP", Log::ERR, "Win32 socket fail");
54 if (pipe2(pfds, O_NONBLOCK) == -1)
56 Log::getInstance()->log("InputUDP", Log::ERR, "pipe2() fail");
67 void InputUDP::shutdown()
70 CLOSESOCKET(quitPipe);
85 bool InputUDP::start()
87 threadStartProtect.lock(); // Make sure listenThread is fully initted before start returns
88 listenThread = std::thread( [this]
90 threadStartProtect.lock();
91 threadStartProtect.unlock();
94 threadStartProtect.unlock();
96 log->log("InputUDP", Log::DEBUG, "InputUDP command server started");
100 void InputUDP::stop()
102 std::lock_guard<std::mutex> lg(threadStartProtect); // Also use it to protect against starting while stopping
104 if (!initted) return;
106 if (listenThread.joinable())
109 Log::getInstance()->log("InputUDP", Log::DEBUG, "Calling CLOSESOCKET on WIN32 quitPipe");
111 CLOSESOCKET(quitPipe);
113 write(pfds[1], "1", 1); // break the select in listenLoop
119 void InputUDP::listenLoop()
125 retval = ds->waitforMessage(3, quitPipe);
127 retval = ds->waitforMessage(3, pfds[0]);
129 Log::getInstance()->log("InputUDP", Log::DEBUG, "Back from waitForMessage");
133 processRequest(ds->getData(), ds->getDataLength());
135 else if (retval == 3) // quit
137 Log::getInstance()->log("InputUDP", Log::DEBUG, "quit");
142 log->log("InputUDP", Log::CRIT, "Wait for packet error");
148 void InputUDP::processRequest(const void* data, UINT length)
150 log->log("InputUDP", Log::DEBUG, "Got request");
152 char* temp = new char[length + 1];
153 memcpy(temp, data, length);
155 UINT command = static_cast<UINT>(atoi(temp));
158 log->log("InputUDP", Log::DEBUG, "Command %i recieved", command);
159 sendInputKey(command);
162 const char* InputUDP::getHardCodedHardwareKeyNamesForVompKey(UCHAR /* vompKey */)
167 std::string InputUDP::getHardwareKeyName(HWC_TYPE /* hardwareKey */)
180 //void dump(unsigned char* data, USHORT size);
181 //unsigned char dcc(UCHAR c);
183 void dump(unsigned char* data, USHORT size)
185 printf("Size = %u\n", size);
192 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",
193 data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6], data[c+7],
194 data[c+8], data[c+9], data[c+10], data[c+11], data[c+12], data[c+13], data[c+14], data[c+15],
195 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]),
196 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]));
204 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",
205 data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6], data[c+7],
206 data[c+8], data[c+9], data[c+10], data[c+11], data[c+12], data[c+13], data[c+14],
207 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]),
208 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]));
212 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",
213 data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6], data[c+7],
214 data[c+8], data[c+9], data[c+10], data[c+11], data[c+12], data[c+13],
215 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]),
216 dcc(data[c+8]), dcc(data[c+9]), dcc(data[c+10]), dcc(data[c+11]), dcc(data[c+12]), dcc(data[c+13]));
220 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",
221 data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6], data[c+7],
222 data[c+8], data[c+9], data[c+10], data[c+11], data[c+12],
223 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]),
224 dcc(data[c+8]), dcc(data[c+9]), dcc(data[c+10]), dcc(data[c+11]), dcc(data[c+12]));
228 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",
229 data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6], data[c+7],
230 data[c+8], data[c+9], data[c+10], data[c+11],
231 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]),
232 dcc(data[c+8]), dcc(data[c+9]), dcc(data[c+10]), dcc(data[c+11]));
236 printf(" %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %c%c%c%c%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], data[c+7],
238 data[c+8], data[c+9], data[c+10],
239 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]),
240 dcc(data[c+8]), dcc(data[c+9]), dcc(data[c+10]));
244 printf(" %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %c%c%c%c%c%c%c%c%c%c\n",
245 data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6], data[c+7],
246 data[c+8], data[c+9],
247 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]),
248 dcc(data[c+8]), dcc(data[c+9]));
252 printf(" %02X %02X %02X %02X %02X %02X %02X %02X %02X %c%c%c%c%c%c%c%c%c\n",
253 data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6], data[c+7],
255 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]),
260 printf(" %02X %02X %02X %02X %02X %02X %02X %02X %c%c%c%c%c%c%c%c\n",
261 data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6], data[c+7],
262 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]));
266 printf(" %02X %02X %02X %02X %02X %02X %02X %c%c%c%c%c%c%c\n",
267 data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5], data[c+6],
268 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]));
272 printf(" %02X %02X %02X %02X %02X %02X %c%c%c%c%c%c\n",
273 data[c], data[c+1], data[c+2], data[c+3], data[c+4], data[c+5],
274 dcc(data[c]), dcc(data[c+1]), dcc(data[c+2]), dcc(data[c+3]), dcc(data[c+4]), dcc(data[c+5]));
278 printf(" %02X %02X %02X %02X %02X %c%c%c%c%c\n",
279 data[c], data[c+1], data[c+2], data[c+3], data[c+4],
280 dcc(data[c]), dcc(data[c+1]), dcc(data[c+2]), dcc(data[c+3]), dcc(data[c+4]));
284 printf(" %02X %02X %02X %02X %c%c%c%c\n",
285 data[c], data[c+1], data[c+2], data[c+3],
286 dcc(data[c]), dcc(data[c+1]), dcc(data[c+2]), dcc(data[c+3]));
290 printf(" %02X %02X %02X %c%c%c\n",
291 data[c], data[c+1], data[c+2],
292 dcc(data[c]), dcc(data[c+1]), dcc(data[c+2]));
296 printf(" %02X %02X %c%c\n",
298 dcc(data[c]), dcc(data[c+1]));
312 unsigned char dcc(UCHAR c)
314 if (isspace(c)) return ' ';
315 if (isprint(c)) return c;