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 if (initted) return false;
32 log = Log::getInstance();
33 log->log("InputUDP", Log::DEBUG, "Starting InputUDP command server");
35 ds = new DatagramSocket(2000);
38 log->log("InputUDP", Log::DEBUG, "DSock init error");
44 if (pipe2(pfds, O_NONBLOCK) == -1)
46 Log::getInstance()->log("InputUDP", Log::ERR, "pipe2() fail");
56 void InputUDP::shutdown()
67 bool InputUDP::start()
69 threadStartProtect.lock(); // Make sure listenThread is fully initted before start returns
70 listenThread = std::thread( [this]
72 threadStartProtect.lock();
73 threadStartProtect.unlock();
76 threadStartProtect.unlock();
78 log->log("InputUDP", Log::DEBUG, "InputUDP command server started");
84 std::lock_guard<std::mutex> lg(threadStartProtect); // Also use it to protect against starting while stopping
88 if (listenThread.joinable())
90 write(pfds[1], "1", 1); // break the select in listenLoop
95 void InputUDP::listenLoop()
100 retval = ds->waitforMessage(3, pfds[0]);
104 processRequest(ds->getData(), ds->getDataLength());
106 else if (retval == 3) // quit
112 log->log("InputUDP", Log::CRIT, "Wait for packet error");
118 void InputUDP::processRequest(const void* data, UINT length)
120 log->log("InputUDP", Log::DEBUG, "Got request");
122 char* temp = new char[length + 1];
123 memcpy(temp, data, length);
125 UINT command = static_cast<UINT>(atoi(temp));
128 log->log("InputUDP", Log::DEBUG, "Command %i recieved", command);
129 sendInputKey(command);
132 const char* InputUDP::getHardCodedHardwareKeyNamesForVompKey(UCHAR /* vompKey */)
137 std::string InputUDP::getHardwareKeyName(int /* hardwareKey */)
150 //void dump(unsigned char* data, USHORT size);
151 //unsigned char dcc(UCHAR c);
153 void dump(unsigned char* data, USHORT size)
155 printf("Size = %u\n", size);
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]));
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]));
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]));
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]));
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]));
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]));
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]));
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],
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]),
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]));
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]));
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]));
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]));
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]));
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]));
266 printf(" %02X %02X %c%c\n",
268 dcc(data[c]), dcc(data[c+1]));
282 unsigned char dcc(UCHAR c)
284 if (isspace(c)) return ' ';
285 if (isprint(c)) return c;