68 for (
int i = 0; i <
payload.size(); i++)
70 checksum = checksum ^
payload[i];
78 std::vector<uint8_t> telegram;
79 telegram.reserve(12 +
payload.size());
83 for(
int i = 0; i < 4; i++)
84 telegram.push_back(0x02);
85 uint32_t payload_length =
payload.size();
86 for(
int i = 3; i >= 0; i--)
87 telegram.push_back((payload_length >> (8 * i)) & 0xFF);
89 telegram.push_back(checksum);
93 telegram.push_back(0x02);
95 telegram.push_back(0x03);
100 static std::vector<uint8_t>
encodeColaTelegram(
const std::string &
command,
const std::vector<std::string> command_parameter,
bool is_binary)
104 for(
int n = 0; n < command_parameter.size(); n++)
106 std::string parameter = command_parameter[n];
107 if(parameter.size() > 254)
109 parameter.resize(254);
110 ROS_WARN_STREAM(
"encodeColaTelegram(): resized " << parameter.size() <<
" byte parameter " << command_parameter[n] <<
" to " << parameter.size() <<
" byte parameter " << parameter);
117 payload.push_back((uint8_t)(parameter.size() & 0xFF));
118 payload.insert(
payload.end(), parameter.begin(), parameter.end());
125 for(
int i = 0; i < len; i++)
128 payload.insert(
payload.end(), parameter.begin(), parameter.end());
135 static std::vector<uint8_t>
encodeColaTelegram(
const std::string &
command,
const std::vector<int64_t> & parameter_value,
const std::vector<size_t> & parameter_size,
bool is_binary)
139 assert(parameter_value.size() == parameter_size.size());
140 payload.reserve(
command.size() + 16 * parameter_value.size() + 16);
142 for(
int n = 0; n < parameter_value.size(); n++)
148 size_t len = parameter_size[n];
149 int64_t value = parameter_value[n];
150 for(
int i = len - 1; i >= 0; i--)
151 payload.push_back((value >> (8 * i)) & 0xFF);
158 for(
int i = 0; i < len; i++)
170 value.resize(nr_bytes);
171 if (!tcp_client_socket.
read(nr_bytes, value.data(), read_blocking))
179 std::vector<uint8_t> buffer;
180 if(!
receive(tcp_client_socket, nr_bytes, little_endian, buffer, read_blocking) || buffer.size() < nr_bytes)
184 for(
int n = nr_bytes - 1; n >= 0; n--)
186 value = ((value << 8) | (buffer[n] & 0xFF));
191 for(
int n = 0; n < nr_bytes; n++)
193 value = ((value << 8) | (buffer[n] & 0xFF));
205 : m_nh(nh), m_send_scan_data_rate(send_scan_data_rate), m_send_scan_data(false), m_send_scan_data_cnt(0)
212 std::map<int, std::vector<uint8_t>> sRN_fieldResponses = {
213 { 0, {0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x4c,0x73,0x52,0x41,0x20,0x66,0x69,0x65,0x6c,0x64,0x30,0x30,0x30,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x83,0xff,0xff,0x3c,0xb0,0x02,0x01,0x00,0x01,0x00,0x03,0x01,0x2c,0xff,0xff,0x01,0x62,0x01,0xd2,0xff,0xff,0x01,0xa3,0x01,0xe6,0xff,0xff,0x00,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0b,0x73,0x65,0x67,0x6d,0x65,0x6e,0x74,0x65,0x64,0x5f,0x31,0x00,0x00,0x6a} },
214 { 1, {0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x54,0x73,0x52,0x41,0x20,0x66,0x69,0x65,0x6c,0x64,0x30,0x30,0x31,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x83,0xff,0xff,0x3c,0xb0,0x01,0x02,0x00,0x00,0x00,0x01,0x00,0x0d,0xbb,0xa0,0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x15,0x72,0x65,0x63,0x74,0x61,0x6e,0x67,0x6c,0x65,0x5f,0x66,0x69,0x65,0x6c,0x64,0x5f,0x30,0x5f,0x64,0x65,0x67,0x00,0x00,0x0d} },
215 { 2, {0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x4f,0x73,0x52,0x41,0x20,0x66,0x69,0x65,0x6c,0x64,0x30,0x30,0x32,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x83,0xff,0xff,0x3c,0xb0,0x01,0x03,0x00,0x00,0x00,0x01,0x00,0x0f,0x75,0x6b,0x00,0x7f,0x00,0x06,0xdd,0xd0,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x10,0x72,0x65,0x63,0x74,0x66,0x69,0x65,0x6c,0x64,0x5f,0x34,0x35,0x5f,0x64,0x65,0x67,0x00,0x00,0x0b} },
216 { 3, {0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x52,0x73,0x52,0x41,0x20,0x66,0x69,0x65,0x6c,0x64,0x30,0x30,0x33,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x83,0xff,0xff,0x3c,0xb0,0x03,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x1b,0x77,0x40,0x00,0xfa,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xe8,0x00,0x00,0x01,0x2c,0x09,0x60,0x00,0x00,0x05,0xdc,0x00,0x01,0x00,0x0d,0x64,0x79,0x6e,0x61,0x6d,0x69,0x63,0x5f,0x66,0x69,0x65,0x6c,0x64,0x00,0x00,0x9a} },
217 { 4, {0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x2d,0x73,0x52,0x41,0x20,0x66,0x69,0x65,0x6c,0x64,0x30,0x30,0x34,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x88,0xff,0xff,0x3c,0xb0,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x62} },
218 { 5, {0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x2d,0x73,0x52,0x41,0x20,0x66,0x69,0x65,0x6c,0x64,0x30,0x30,0x35,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x88,0xff,0xff,0x3c,0xb0,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x63} },
219 { 6, {0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x2d,0x73,0x52,0x41,0x20,0x66,0x69,0x65,0x6c,0x64,0x30,0x30,0x36,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x88,0xff,0xff,0x3c,0xb0,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x60} },
220 { 7, {0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x2d,0x73,0x52,0x41,0x20,0x66,0x69,0x65,0x6c,0x64,0x30,0x30,0x37,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x88,0xff,0xff,0x3c,0xb0,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x61} },
221 { 8, {0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x2d,0x73,0x52,0x41,0x20,0x66,0x69,0x65,0x6c,0x64,0x30,0x30,0x38,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x88,0xff,0xff,0x3c,0xb0,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x6e} },
222 { 9, {0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x2d,0x73,0x52,0x41,0x20,0x66,0x69,0x65,0x6c,0x64,0x30,0x30,0x39,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x88,0xff,0xff,0x3c,0xb0,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x6f} },
223 { 10, {0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x0e,0x73,0x52,0x41,0x20,0x66,0x69,0x65,0x6c,0x64,0x30,0x31,0x30,0x20,0x00,0x33} },
224 { 11, {0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x0e,0x73,0x52,0x41,0x20,0x66,0x69,0x65,0x6c,0x64,0x30,0x31,0x31,0x20,0x00,0x32} },
225 { 12, {0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x0e,0x73,0x52,0x41,0x20,0x66,0x69,0x65,0x6c,0x64,0x30,0x31,0x32,0x20,0x00,0x31} },
226 { 13, {0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x0e,0x73,0x52,0x41,0x20,0x66,0x69,0x65,0x6c,0x64,0x30,0x31,0x33,0x20,0x00,0x30} },
227 { 14, {0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x0e,0x73,0x52,0x41,0x20,0x66,0x69,0x65,0x6c,0x64,0x30,0x31,0x34,0x20,0x00,0x37} },
228 { 15, {0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x0e,0x73,0x52,0x41,0x20,0x66,0x69,0x65,0x6c,0x64,0x30,0x31,0x35,0x20,0x00,0x36} },
229 { 16, {0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x0e,0x73,0x52,0x41,0x20,0x66,0x69,0x65,0x6c,0x64,0x30,0x31,0x36,0x20,0x00,0x35} },
230 { 17, {0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x0e,0x73,0x52,0x41,0x20,0x66,0x69,0x65,0x6c,0x64,0x30,0x31,0x37,0x20,0x00,0x34} },
231 { 18, {0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x0e,0x73,0x52,0x41,0x20,0x66,0x69,0x65,0x6c,0x64,0x30,0x31,0x38,0x20,0x00,0x3b} },
232 { 19, {0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x0e,0x73,0x52,0x41,0x20,0x66,0x69,0x65,0x6c,0x64,0x30,0x31,0x39,0x20,0x00,0x3a} },
233 { 20, {0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x0e,0x73,0x52,0x41,0x20,0x66,0x69,0x65,0x6c,0x64,0x30,0x32,0x30,0x20,0x00,0x30} },
234 { 21, {0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x0e,0x73,0x52,0x41,0x20,0x66,0x69,0x65,0x6c,0x64,0x30,0x32,0x31,0x20,0x00,0x31} },
235 { 22, {0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x0e,0x73,0x52,0x41,0x20,0x66,0x69,0x65,0x6c,0x64,0x30,0x32,0x32,0x20,0x00,0x32} },
236 { 23, {0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x0e,0x73,0x52,0x41,0x20,0x66,0x69,0x65,0x6c,0x64,0x30,0x32,0x33,0x20,0x00,0x33} },
237 { 24, {0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x0e,0x73,0x52,0x41,0x20,0x66,0x69,0x65,0x6c,0x64,0x30,0x32,0x34,0x20,0x00,0x34} },
238 { 25, {0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x0e,0x73,0x52,0x41,0x20,0x66,0x69,0x65,0x6c,0x64,0x30,0x32,0x35,0x20,0x00,0x35} },
239 { 26, {0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x0e,0x73,0x52,0x41,0x20,0x66,0x69,0x65,0x6c,0x64,0x30,0x32,0x36,0x20,0x00,0x36} },
240 { 27, {0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x0e,0x73,0x52,0x41,0x20,0x66,0x69,0x65,0x6c,0x64,0x30,0x32,0x37,0x20,0x00,0x37} },
241 { 28, {0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x0e,0x73,0x52,0x41,0x20,0x66,0x69,0x65,0x6c,0x64,0x30,0x32,0x38,0x20,0x00,0x38} },
242 { 29, {0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x0e,0x73,0x52,0x41,0x20,0x66,0x69,0x65,0x6c,0x64,0x30,0x32,0x39,0x20,0x00,0x39} }
244 for(
int is_binary_idx = 0; is_binary_idx <= 1; is_binary_idx++)
247 {
"sMN SetAccessMode",
encodeColaTelegram(
"sAN SetAccessMode", {1}, {1}, is_binary_idx > 0)},
249 {
"sRN FirmwareVersion",
encodeColaTelegram(
"sRA FirmwareVersion", {8, 1, 0, 0, 0}, {2, 1, 1, 1, 1}, is_binary_idx > 0)},
250 {
"sRN OrdNum",
encodeColaTelegram(
"sRA OrdNum", {7, 1234567}, {1, 4}, is_binary_idx > 0)},
251 {
"sWN TransmitTargets",
encodeColaTelegram(
"sWA TransmitTargets", {}, {}, is_binary_idx > 0)},
252 {
"sWN TransmitObjects",
encodeColaTelegram(
"sWA TransmitObjects", {}, {}, is_binary_idx > 0)},
253 {
"sWN TCTrackingMode",
encodeColaTelegram(
"sWA TCTrackingMode", {}, {}, is_binary_idx > 0)},
254 {
"sRN SCdevicestate",
encodeColaTelegram(
"sRA SCdevicestate", {1}, {1}, is_binary_idx > 0)},
255 {
"sRN DItype",
encodeColaTelegram(
"sRA DItype F RMS2731C.636111", {}, {}, is_binary_idx > 0)},
257 {
"sMN mSCloadappdef",
encodeColaTelegram(
"sAN mSCloadappdef", {}, {}, is_binary_idx > 0)},
258 {
"sRN SerialNumber",
encodeColaTelegram(
"sRA SerialNumber", {
"18340008"}, is_binary_idx > 0)},
260 {
"sRN LocationName",
encodeColaTelegram(
"sRA LocationName B not defined", {}, {}, is_binary_idx > 0)},
261 {
"sEN LMDradardata",
encodeColaTelegram(
"sEA LMDradardata", {1}, {1}, is_binary_idx > 0)},
262 {
"sRN LMPoutputRange",
encodeColaTelegram(
"sRA LMPoutputRange", {1, 2500, -450000, 1850000}, {2, 4, 4, 4}, is_binary_idx > 0)},
263 {
"sWN LMPoutputRange",
encodeColaTelegram(
"sWA LMPoutputRange", {}, {}, is_binary_idx > 0)},
264 {
"sWN LMDscandatacfg",
encodeColaTelegram(
"sWA LMDscandatacfg", {}, {}, is_binary_idx > 0)},
265 {
"sRN LMDscandatacfg",
encodeColaTelegram(
"sRA LMDscandatacfg", {1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, is_binary_idx > 0)},
266 {
"sWN SetActiveApplications",
encodeColaTelegram(
"sWA SetActiveApplications", {}, {}, is_binary_idx > 0)},
267 {
"sWN FREchoFilter",
encodeColaTelegram(
"sWA FREchoFilter", {}, {}, is_binary_idx > 0)},
268 {
"sEN InertialMeasurementUnit",
encodeColaTelegram(
"sEA InertialMeasurementUnit", {}, {}, is_binary_idx > 0)},
269 {
"sRN DeviceIdent",
encodeColaTelegram(
"sRA DeviceIdent", {
"MRS1xxxC",
"1.4.3.0B"}, is_binary_idx > 0)},
270 {
"sMN LMCstartmeas",
encodeColaTelegram(
"sAN LMCstartmeas", {}, {}, is_binary_idx > 0)},
271 {
"sMN LMCstopmeas",
encodeColaTelegram(
"sAN LMCstopmeas", {}, {}, is_binary_idx > 0)},
273 {
"sEN LMDscandata",
encodeColaTelegram(
"sEA LMDscandata", {}, {}, is_binary_idx > 0)},
274 {
"sRN field000", sRN_fieldResponses[0]},
275 {
"sRN field001", sRN_fieldResponses[1]},
276 {
"sRN field002", sRN_fieldResponses[2]},
277 {
"sRN field003", sRN_fieldResponses[3]},
278 {
"sRN field004", sRN_fieldResponses[4]},
279 {
"sRN field005", sRN_fieldResponses[5]},
280 {
"sRN field006", sRN_fieldResponses[6]},
281 {
"sRN field007", sRN_fieldResponses[7]},
282 {
"sRN field008", sRN_fieldResponses[8]},
283 {
"sRN field009", sRN_fieldResponses[9]},
284 {
"sRN field010", sRN_fieldResponses[10]},
285 {
"sRN field011", sRN_fieldResponses[11]},
286 {
"sRN field012", sRN_fieldResponses[12]},
287 {
"sRN field013", sRN_fieldResponses[13]},
288 {
"sRN field014", sRN_fieldResponses[14]},
289 {
"sRN field015", sRN_fieldResponses[15]},
290 {
"sRN field016", sRN_fieldResponses[16]},
291 {
"sRN field017", sRN_fieldResponses[17]},
292 {
"sRN field018", sRN_fieldResponses[18]},
293 {
"sRN field019", sRN_fieldResponses[19]},
294 {
"sRN field020", sRN_fieldResponses[20]},
295 {
"sRN field021", sRN_fieldResponses[21]},
296 {
"sRN field022", sRN_fieldResponses[22]},
297 {
"sRN field023", sRN_fieldResponses[23]},
298 {
"sRN field024", sRN_fieldResponses[24]},
299 {
"sRN field025", sRN_fieldResponses[25]},
300 {
"sRN field026", sRN_fieldResponses[26]},
301 {
"sRN field027", sRN_fieldResponses[27]},
302 {
"sRN field028", sRN_fieldResponses[28]},
303 {
"sRN field029", sRN_fieldResponses[29]}
320 cola_telegram.clear();
322 size_t stx_received = 0, payload_length = 0;
323 if (!
receive(tcp_client_socket, 4,
false, stx_received,
false))
325 if(stx_received == 0x02020202)
330 if (!
receive(tcp_client_socket, 4,
false, payload_length))
332 if (!
receive(tcp_client_socket, payload_length + 1,
false, cola_telegram))
334 cola_telegram.pop_back();
337 else if(((stx_received >> 24) & 0xFF) == 0x02)
339 cola_telegram.reserve(1024);
340 cola_telegram.push_back((stx_received >> 16) & 0xFF);
341 cola_telegram.push_back((stx_received >> 8) & 0xFF);
342 cola_telegram.push_back((stx_received) & 0xFF);
345 while(tcp_client_socket.
read(1, &
byte))
349 cola_telegram.push_back(
byte);
357 ROS_ERROR_STREAM(
"sick_scan_xd::test::TestServerColaMsg::receiveMessage(): received 4 byte 0x" << std::hex << stx_received <<
", expected <STX>");
374 std::string received_str(message_received.begin(), message_received.end());
375 const std::map<std::string, std::vector<uint8_t>> & colaRequestResponseMap = m_colaRequestResponseMap[is_binary?1:0];
376 for(std::map<std::string, std::vector<uint8_t>>::const_iterator iter = colaRequestResponseMap.cbegin(); iter != colaRequestResponseMap.cend(); iter++)
378 if(received_str.find(iter->first) != std::string::npos)
385 int send_scan_data = -1;
386 if(received_str.find(
"sEN LMDscandata ") != std::string::npos && message_received.size() > 16)
388 if(is_binary && message_received[16] == 0x00)
390 else if(!is_binary && message_received[16] ==
'0')
395 else if(received_str.find(
"sMN LMCstartmeas") != std::string::npos)
397 else if(received_str.find(
"sMN LMCstopmeas") != std::string::npos)
399 if(send_scan_data >= 0)
401 m_send_scan_data = ((send_scan_data > 0) ?
true :
false);
404 ROS_INFO_STREAM(
"sick_scan_xd::test::TestServerThread::createResponse(): received " << message_received.size()
405 <<
" byte message " <<
binDumpVecToString(&message_received,
true) <<
" -> " << (m_send_scan_data ?
"start" :
"stop") <<
" sending scan data");
424 std::string
command =
"sRA LMDscandata ";
426 payload.reserve(
command.size() + m_scan_data_payload.size() + 16);
428 payload.insert(
payload.end(), m_scan_data_payload.begin(), m_scan_data_payload.end());
433 m_send_scan_data_cnt += 1;
434 ROS_DEBUG_STREAM(
"sick_scan_xd::test::TestServerColaMsg::createScandata(" << m_send_scan_data_cnt <<
"): " << scandata.size() <<
" byte scan data generated");
435 if(m_send_scan_data_cnt <= 1)
436 ROS_DEBUG_STREAM(
"sick_scan_xd::test::TestServerColaMsg::createScandata(): Generating " << scandata.size() <<
" byte scan data with " << m_send_scan_data_rate <<
" Hz");