sick_scan_common_nw.cpp
Go to the documentation of this file.
1 
69 #include "sick_scan/tcp/colaa.hpp"
70 #include "sick_scan/tcp/colab.hpp"
72 #include "sick_scan/tcp/tcp.hpp"
73 #include <map> // for std::map
74 
75 #include "sick_scan/tcp/tcp.hpp"
78 #include "sick_scan/tcp/Mutex.hpp"
79 #include <assert.h>
80 
82 {
84  m_beVerbose = false;
85 
86 }
87 
89 {
90  // Disconnect and shut down receive thread.
91  if (isConnected() == true)
92  {
93  // Change from CONNECTED to CONSTRUCTED
94  disconnect();
95  }
96 }
97 
98 
99 //
100 // Disconnect from the scanner, and close the interface.
101 //
103 {
105 
106  // Change back to CONSTRUCTED
108  return true;
109 }
110 
111 
112 //
113 // Initialisation from Scanner class:
114 // Parameter setup only. Afterwards, call connect() to connect to the scanner.
115 //
116 bool SickScanCommonNw::init(std::string ipAddress,
117  unsigned short portNumber,
118  Tcp::DisconnectFunction disconnectFunction,
119  void *obj)
120 {
121  m_ipAddress = ipAddress;
122  m_portNumber = portNumber;
123  m_tcp.setDisconnectCallbackFunction(disconnectFunction, obj);
124  return true;
125 }
126 
127 
129  void *obj)
130 {
131  m_tcp.setReadCallbackFunction(readFunction, obj);
132  return (true);
133 }
134 //
135 // Verbinde mit dem unter init() eingestellten Geraet, und pruefe die Verbindung
136 // durch einen DeviceIdent-Aufruf.
137 //
138 // true = Erfolgreich.
139 //
140 
141 
143 {
144 
145  assert (m_state == CONSTRUCTED); // must not be opened or running already
146 
147  // Initialise buffer variables
148  m_numberOfBytesInReceiveBuffer = 0; // Buffer is empty
149  m_numberOfBytesInResponseBuffer = 0; // Buffer is empty
150 
151  // Establish connection here
152  // Set the data input callback for our TCP connection
153  // m_tcp.setReadCallbackFunction(&SickScanCommonNw::readCallbackFunctionS, this); // , this, _1, _2));
154 
155  bool success = openTcpConnection();
156  if (success == true)
157  {
158  // Check if scanner type matches
159  m_state = CONNECTED;
160 
161  }
162  return success;
163 }
164 
165 
166 //
167 // True, if state is CONNECTED, that is:
168 // - A TCP-connection exists
169 // - Read thread is running
170 //
172 {
173  return (m_state == CONNECTED);
174 }
175 
176 
183 {
184  // printInfoMessage("SickScanCommonNw::openTcpConnection: Connecting TCP/IP connection to " + m_ipAddress + ":" + toString(m_portNumber) + " ...", m_beVerbose);
185 
186  bool success = m_tcp.open(m_ipAddress, m_portNumber, m_beVerbose);
187  if (success == false)
188  {
189  // printError("SickScanCommonNw::openTcpConnection: ERROR: Failed to establish TCP connection, aborting!");
190  return false;
191  }
192 
193  return true;
194 }
195 
200 {
202 }
203 
204 //
205 // Close TCP-connection and shut down read thread
206 //
208 {
209  if (m_tcp.isOpen())
210  {
211  m_tcp.close();
212  }
213 }
214 
215 //
216 // Static entry point.
217 //
218 void SickScanCommonNw::readCallbackFunctionS(void *obj, UINT8 *buffer, UINT32 &numOfBytes)
219 {
220  ((SickScanCommonNw *) obj)->readCallbackFunction(buffer, numOfBytes);
221 }
222 
223 
229 {
230  bool beVerboseHere = false;
232  "SickScanCommonNw::readCallbackFunction(): Called with " + toString(numOfBytes) + " available bytes.",
233  beVerboseHere);
234 
235  ScopedLock lock(&m_receiveDataMutex); // Mutex for access to the input buffer
236  UINT32 remainingSpace = sizeof(m_receiveBuffer) - m_numberOfBytesInReceiveBuffer;
237  UINT32 bytesToBeTransferred = numOfBytes;
238  if (remainingSpace < numOfBytes)
239  {
240  bytesToBeTransferred = remainingSpace;
241  // printWarning("SickScanCommonNw::readCallbackFunction(): Input buffer space is to small, transferring only " +
242  // ::toString(bytesToBeTransferred) + " of " + ::toString(numOfBytes) + " bytes.");
243  }
244  else
245  {
246  // printInfoMessage("SickScanCommonNw::readCallbackFunction(): Transferring " + ::toString(bytesToBeTransferred) +
247  // " bytes from TCP to input buffer.", beVerboseHere);
248  }
249 
250  if (bytesToBeTransferred > 0)
251  {
252  // Data can be transferred into our input buffer
253  memcpy(&(m_receiveBuffer[m_numberOfBytesInReceiveBuffer]), buffer, bytesToBeTransferred);
254  m_numberOfBytesInReceiveBuffer += bytesToBeTransferred;
255 
256  UINT32 size = 0;
257 
258  while (1)
259  {
260  // Now work on the input buffer until all received datasets are processed
262 
263  size = frame.size();
264  if (size == 0)
265  {
266  // Framesize = 0: There is no valid frame in the buffer. The buffer is either empty or the frame
267  // is incomplete, so leave the loop
268  printInfoMessage("SickScanCommonNw::readCallbackFunction(): No complete frame in input buffer, we are done.",
269  beVerboseHere);
270 
271  // Leave the loop
272  break;
273  }
274  else
275  {
276  // A frame was found in the buffer, so process it now.
278  "SickScanCommonNw::readCallbackFunction(): Processing a frame of length " + ::toString(frame.size()) +
279  " bytes.", beVerboseHere);
280  processFrame(frame);
281  }
282  }
283  }
284  else
285  {
286  // There was input data from the TCP interface, but our input buffer was unable to hold a single byte.
287  // Either we have not read data from our buffer for a long time, or something has gone wrong. To re-sync,
288  // we clear the input buffer here.
290  }
291 
292 }
293 
294 
295 //
296 // Look for 23-frame (STX/ETX) in receive buffer.
297 // Move frame to start of buffer
298 //
299 // Return: 0 : No (complete) frame found
300 // >0 : Frame length
301 //
303 {
304  UINT32 frameLen = 0;
305  UINT32 i;
306 
307  // Depends on protocol...
308  if (m_protocol == CoLa_A)
309  {
310  //
311  // COLA-A
312  //
313  // Must start with STX (0x02)
314  if (m_receiveBuffer[0] != 0x02)
315  {
316  // Look for starting STX (0x02)
317  for (i = 1; i < m_numberOfBytesInReceiveBuffer; i++)
318  {
319  if (m_receiveBuffer[i] == 0x02)
320  {
321  break;
322  }
323  }
324 
325  // Found beginning of frame?
327  {
328  // No start found, everything can be discarded
329  m_numberOfBytesInReceiveBuffer = 0; // Invalidate buffer
330  return SopasEventMessage(); // No frame found
331  }
332 
333  // Move frame start to index 0
335  memmove(&(m_receiveBuffer[0]), &(m_receiveBuffer[i]), newLen);
337  }
338 
339  // Look for ending ETX (0x03)
340  for (i = 1; i < m_numberOfBytesInReceiveBuffer; i++)
341  {
342  if (m_receiveBuffer[i] == 0x03)
343  {
344  break;
345  }
346  }
347 
348  // Found end?
350  {
351  // No end marker found, so it's not a complete frame (yet)
352  return SopasEventMessage(); // No frame found
353  }
354 
355  // Calculate frame length in byte
356  frameLen = i + 1;
357 
358  return SopasEventMessage(m_receiveBuffer, CoLa_A, frameLen);
359  }
360  else if (m_protocol == CoLa_B)
361  {
362  UINT32 magicWord;
363  UINT32 payloadlength;
364 
366  {
367  return SopasEventMessage();
368  }
369  UINT16 pos = 0;
370  magicWord = colab::getIntegerFromBuffer<UINT32>(m_receiveBuffer, pos);
371  if (magicWord != 0x02020202)
372  {
373  // Look for starting STX (0x02020202)
374  for (i = 1; i <= m_numberOfBytesInReceiveBuffer - 4; i++)
375  {
376  pos = i; // this is needed, as the position value is updated by getIntegerFromBuffer
377  magicWord = colab::getIntegerFromBuffer<UINT32>(m_receiveBuffer, pos);
378  if (magicWord == 0x02020202)
379  {
380  // found magic word
381  break;
382  }
383  }
384 
385  // Found beginning of frame?
386  if (i > m_numberOfBytesInReceiveBuffer - 4)
387  {
388  // No start found, everything can be discarded
389  m_numberOfBytesInReceiveBuffer = 0; // Invalidate buffer
390  return SopasEventMessage(); // No frame found
391  }
392  else
393  {
394  // Move frame start to index
395  UINT32 bytesToMove = m_numberOfBytesInReceiveBuffer - i;
396  memmove(&(m_receiveBuffer[0]), &(m_receiveBuffer[i]), bytesToMove); // payload+magic+length+s+checksum
397  m_numberOfBytesInReceiveBuffer = bytesToMove;
398  }
399  }
400 
401  // Pruefe Laenge des Pufferinhalts
403  {
404  // Es sind nicht genug Daten fuer einen Frame
405  printInfoMessage("SickScanCommonNw::findFrameInReceiveBuffer: Frame cannot be decoded yet, only " +
406  ::toString(m_numberOfBytesInReceiveBuffer) + " bytes in the buffer.", m_beVerbose);
407  return SopasEventMessage();
408  }
409 
410  // Read length of payload
411  pos = 4;
412  payloadlength = colab::getIntegerFromBuffer<UINT32>(m_receiveBuffer, pos);
414  "SickScanCommonNw::findFrameInReceiveBuffer: Decoded payload length is " + ::toString(payloadlength) +
415  " bytes.", m_beVerbose);
416 
417  // Ist die Datenlaenge plausibel und wuede in den Puffer passen?
418  if (payloadlength > (sizeof(m_receiveBuffer) - 9))
419  {
420  // magic word + length + checksum = 9
421  printWarning(
422  "SickScanCommonNw::findFrameInReceiveBuffer: Frame too big for receive buffer. Frame discarded with length:"
423  + ::toString(payloadlength) + ".");
425  return SopasEventMessage();
426  }
427  if ((payloadlength + 9) > m_numberOfBytesInReceiveBuffer)
428  {
429  // magic word + length + s + checksum = 10
431  "SickScanCommonNw::findFrameInReceiveBuffer: Frame not complete yet. Waiting for the rest of it (" +
432  ::toString(payloadlength + 9 - m_numberOfBytesInReceiveBuffer) + " bytes missing).", m_beVerbose);
433  return SopasEventMessage(); // frame not complete
434  }
435 
436  // Calculate the total frame length in bytes: Len = Frame (9 bytes) + Payload
437  frameLen = payloadlength + 9;
438 
439  //
440  // test checksum of payload
441  //
442  UINT8 temp = 0;
443  UINT8 temp_xor = 0;
444  UINT8 checkSum;
445 
446  // Read original checksum
447  pos = frameLen - 1;
448  checkSum = colab::getIntegerFromBuffer<UINT8>(m_receiveBuffer, pos);
449 
450  // Erzeuge die Pruefsumme zum Vergleich
451  for (UINT16 j = 8; j < (frameLen - 1); j++)
452  {
453  pos = j;
454  temp = colab::getIntegerFromBuffer<UINT8>(m_receiveBuffer, pos);
455  temp_xor = temp_xor ^ temp;
456  }
457 
458  // Vergleiche die Pruefsummen
459  if (temp_xor != checkSum)
460  {
461  printWarning("SickScanCommonNw::findFrameInReceiveBuffer: Wrong checksum, Frame discarded.");
463  return SopasEventMessage();
464  }
465 
466  return SopasEventMessage(m_receiveBuffer, CoLa_B, frameLen);
467  }
468 
469  // Return empty frame
470  return SopasEventMessage();
471 }
472 
473 
480 {
481  return m_tcp.write(buffer, len);
482 }
483 
484 
491 {
492 
493  if (m_protocol == CoLa_A)
494  {
496  "SickScanCommonNw::processFrame: Calling processFrame_CoLa_A() with " + ::toString(frame.size()) + " bytes.",
497  m_beVerbose);
498  // processFrame_CoLa_A(frame);
499  }
500  else if (m_protocol == CoLa_B)
501  {
503  "SickScanCommonNw::processFrame: Calling processFrame_CoLa_B() with " + ::toString(frame.size()) + " bytes.",
504  m_beVerbose);
505  // processFrame_CoLa_B(frame);
506  }
507 }
508 
509 
510 //
511 // Copies a complete frame - in any protocol - from the main input buffer to
512 // the response buffer.
513 // The frame is *not* removed from the main input buffer.
514 //
516 {
517  printInfoMessage("SickScanCommonNw::copyFrameToResposeBuffer: Copying a frame of " + ::toString(frameLength) +
518  " bytes to response buffer.", m_beVerbose);
519 
520  if (frameLength <= sizeof(m_responseBuffer))
521  {
522  // Wir duerfen kopieren
523  memcpy(m_responseBuffer, m_receiveBuffer, frameLength);
524  m_numberOfBytesInResponseBuffer = frameLength;
525  }
526  else
527  {
528  // Der respose-Buffer ist zu klein
529  printError("SickScanCommonNw::copyFrameToResposeBuffer: Failed to copy frame (Length=" + ::toString(frameLength) +
530  " bytes) to response buffer because the response buffer is too small (buffer size=" +
531  ::toString(sizeof(m_responseBuffer)) + " bytes).");
533  }
534 }
535 
536 
537 //
538 // Removes a complete frame - in any protocol - from the main input buffer.
539 //
541 {
542  // Remove frame from receive buffer
543  if (frameLength < m_numberOfBytesInReceiveBuffer)
544  {
545  // More data in buffer, move them to the buffer start
546  UINT32 newLen = m_numberOfBytesInReceiveBuffer - frameLength;
547  printInfoMessage("SickScanCommonNw::removeFrameFromReceiveBuffer: Removing " + ::toString(frameLength) +
548  " bytes from the input buffer. New length is " + ::toString(newLen) + " bytes.", m_beVerbose);
549  memmove(m_receiveBuffer, &(m_receiveBuffer[frameLength]), newLen);
551  }
552  else
553  {
554  // No other data in buffer, just mark as empty
555  printInfoMessage("SickScanCommonNw::removeFrameFromReceiveBuffer: Done, no more data in input buffer.",
556  m_beVerbose);
558  }
559 }
560 
561 
562 //
563 // ************************* SOPAS FRAME ************************************************** //
564 //
566  m_buffer(NULL), m_protocol(CoLa_A), m_frameLength(0)
567 {
568 }
569 
570 
572  m_buffer(buffer), m_protocol(protocol), m_frameLength(frameLength)
573 {
574 // Constructor
575 }
576 
577 
579 {
580  UINT32 payLoadLength = 0;
581 
582  switch (m_protocol)
583  {
584  case CoLa_A:
585  payLoadLength = m_frameLength - 2; // everything except the 0x02 0x03 frame
586  break;
587  case CoLa_B:
588  payLoadLength =
589  m_frameLength - 9; // everything except start 0x02020202(4byte), payloadLength(4byte) and checksum(1 byte)
590  }
591 
592  return payLoadLength;
593 }
594 
595 
603 {
604  std::string commandString;
605 
606  switch (m_protocol)
607  {
608  case CoLa_A:
609  commandString = std::string((char *) &m_buffer[2], 2);
610  break;
611  case CoLa_B:
612  commandString = std::string((char *) &m_buffer[9], 2);
613  }
614 
615  return commandString;
616 }
617 
618 
627 {
628  BYTE *bufferPos = NULL;
629 
630  switch (m_protocol)
631  {
632  case CoLa_A:
633  bufferPos = &m_buffer[1];
634  break;
635  case CoLa_B:
636  bufferPos = &m_buffer[8];
637  break;
638  }
639 
640  return bufferPos;
641 }
642 
643 
651 {
652  BYTE *bufferPos = NULL;
653  bufferPos = &m_buffer[0];
654  return bufferPos;
655 }
656 
657 
659 {
660  INT32 index = -1;
661 
662 
663  BYTE *bufferPos = &getPayLoad()[3];
664  switch (m_protocol)
665  {
666  case CoLa_A:
667  index = (INT32) (colaa::decodeUINT16(bufferPos));
668  break;
669  case CoLa_B:
670  index = (INT32) (colab::decodeUINT16(bufferPos));
671  break;
672  default:
673  printError("SopasEventMessage::getVariableIndex: Unknown protocol!");
674  }
675 
676  return index;
677 }
UINT16
uint16_t UINT16
Definition: BasicDatatypes.hpp:73
UINT8
uint8_t UINT8
Definition: BasicDatatypes.hpp:75
SopasEventMessage::getPayLoad
BYTE * getPayLoad()
contains 's' + command string(2 byte) + content(payload length - 3)
Definition: sick_scan_common_nw.cpp:626
Tcp::isOpen
bool isOpen()
Definition: tcp.cpp:107
SickScanCommonNw::sendCommandBuffer
bool sendCommandBuffer(UINT8 *buffer, UINT16 len)
Definition: sick_scan_common_nw.cpp:479
NULL
#define NULL
errorhandler.hpp
ScopedLock
Definition: Mutex.hpp:39
SickScanCommonNw::connect
bool connect()
Connects to a sensor via tcp and reads the device name.
Definition: sick_scan_common_nw.cpp:142
SickScanCommonNw::m_ipAddress
std::string m_ipAddress
Definition: sick_scan_common_nw.h:107
SickScanCommonNw::m_beVerbose
bool m_beVerbose
Definition: sick_scan_common_nw.h:91
SickScanCommonNw
Interface for TCP/IP.
Definition: sick_scan_common_nw.h:39
BasicDatatypes.hpp
SickScanCommonNw::m_receiveDataMutex
Mutex m_receiveDataMutex
Access mutex for buffer.
Definition: sick_scan_common_nw.h:97
SickScanCommonNw::m_numberOfBytesInReceiveBuffer
UINT32 m_numberOfBytesInReceiveBuffer
Number of bytes in buffer.
Definition: sick_scan_common_nw.h:100
SickScanCommonNw::readCallbackFunction
void readCallbackFunction(UINT8 *buffer, UINT32 &numOfBytes)
Definition: sick_scan_common_nw.cpp:228
SickScanCommonNw::m_numberOfBytesInResponseBuffer
UINT32 m_numberOfBytesInResponseBuffer
Number of bytes in buffer.
Definition: sick_scan_common_nw.h:95
BYTE
unsigned char BYTE
SickScanCommonNw::disconnect
bool disconnect()
Closes the connection to the LMS. This is the opposite of init().
Definition: sick_scan_common_nw.cpp:102
SickScanCommonNw::~SickScanCommonNw
~SickScanCommonNw()
Definition: sick_scan_common_nw.cpp:88
Tcp::DisconnectFunction
void(* DisconnectFunction)(void *obj)
Definition: tcp.hpp:59
Tcp::ReadFunction
void(* ReadFunction)(void *obj, UINT8 *inputBuffer, UINT32 &numBytes)
Definition: tcp.hpp:55
SickScanCommonNw::removeFrameFromReceiveBuffer
void removeFrameFromReceiveBuffer(UINT32 frameLength)
Definition: sick_scan_common_nw.cpp:540
SopasEventMessage::m_protocol
SopasProtocol m_protocol
Definition: sick_scan_common_nw.h:190
SopasEventMessage::m_buffer
BYTE * m_buffer
Definition: sick_scan_common_nw.h:189
toString
std::string toString(INT32 value)
Definition: toolbox.cpp:279
SickScanCommonNw::m_state
State m_state
Definition: sick_scan_common_nw.h:130
INT32
int32_t INT32
Definition: BasicDatatypes.hpp:71
SickScanCommonNw::m_tcp
Tcp m_tcp
Definition: sick_scan_common_nw.h:106
printInfoMessage
#define printInfoMessage(a, b)
Definition: errorhandler.hpp:14
CoLa_A
@ CoLa_A
Command Language ASCI.
Definition: sick_scan_common_nw.h:33
printWarning
void printWarning(std::string message)
Definition: errorhandler.cpp:80
SopasEventMessage::getRawData
BYTE * getRawData()
get SOPAS raw data include header and CRC
Definition: sick_scan_common_nw.cpp:650
Tcp::write
bool write(UINT8 *buffer, UINT32 numberOfBytes)
Definition: tcp.cpp:57
Tcp::setDisconnectCallbackFunction
void setDisconnectCallbackFunction(DisconnectFunction discFunction, void *obj)
Definition: tcp.cpp:94
colab.hpp
SickScanCommonNw::SickScanCommonNw
SickScanCommonNw()
Definition: sick_scan_common_nw.cpp:81
Mutex.hpp
SickScanCommonNw::readCallbackFunctionS
static void readCallbackFunctionS(void *obj, UINT8 *buffer, UINT32 &numOfBytes)
Function that will be called on incomming data via tcp.
Definition: sick_scan_common_nw.cpp:218
toolbox.hpp
SickScanCommonNw::m_receiveBuffer
UINT8 m_receiveBuffer[25000]
Low-Level receive buffer for all data (25000 should be enough for NAV300 Events)
Definition: sick_scan_common_nw.h:101
colaa::decodeUINT16
UINT16 decodeUINT16(BYTE *buffer)
Definition: colaa.cpp:627
SopasEventMessage::m_frameLength
UINT32 m_frameLength
Definition: sick_scan_common_nw.h:191
SickScanCommonNw::init
bool init(std::string ipAddress, unsigned short portNumber, Tcp::DisconnectFunction disconnectFunction, void *obj)
Definition: sick_scan_common_nw.cpp:116
printError
void printError(std::string message)
Definition: errorhandler.cpp:102
SickScanCommonNw::CONNECTED
@ CONNECTED
Definition: sick_scan_common_nw.h:124
SickScanCommonNw::m_responseBuffer
UINT8 m_responseBuffer[1024]
Receive buffer for everything except scan data and eval case data.
Definition: sick_scan_common_nw.h:96
SickScanCommonNw::m_portNumber
UINT16 m_portNumber
Definition: sick_scan_common_nw.h:108
Tcp::setReadCallbackFunction
void setReadCallbackFunction(ReadFunction readFunction, void *obj)
Definition: tcp.cpp:122
SickScanCommonNw::findFrameInReceiveBuffer
SopasEventMessage findFrameInReceiveBuffer()
Definition: sick_scan_common_nw.cpp:302
Tcp::getNanosecTimestampLastTcpMessageReceived
uint64_t getNanosecTimestampLastTcpMessageReceived(void)
Definition: tcp.hpp:62
SickScanCommonNw::closeTcpConnection
void closeTcpConnection()
Definition: sick_scan_common_nw.cpp:207
SopasEventMessage::getPayLoadLength
UINT32 getPayLoadLength() const
contains 's' + command string(2 byte) + content(payload length - 3)
Definition: sick_scan_common_nw.cpp:578
SickScanCommonNw::setReadCallbackFunction
bool setReadCallbackFunction(Tcp::ReadFunction readFunction, void *obj)
Definition: sick_scan_common_nw.cpp:128
tcp.hpp
SickScanCommonNw::openTcpConnection
bool openTcpConnection()
Definition: sick_scan_common_nw.cpp:182
SopasProtocol
SopasProtocol
Definition: sick_scan_common_nw.h:31
colaa.hpp
SopasEventMessage::SopasEventMessage
SopasEventMessage()
Default constructor.
Definition: sick_scan_common_nw.cpp:565
SickScanCommonNw::processFrame
void processFrame(SopasEventMessage &frame)
Definition: sick_scan_common_nw.cpp:490
CoLa_B
@ CoLa_B
Command Language binary.
Definition: sick_scan_common_nw.h:34
SickScanCommonNw::isConnected
bool isConnected()
Returns true if the tcp connection is established.
Definition: sick_scan_common_nw.cpp:171
sick_scan_common_nw.h
SickScanCommonNw::CONSTRUCTED
@ CONSTRUCTED
Object has been constructed. Use init() to go into CONNECTED state.
Definition: sick_scan_common_nw.h:120
UINT32
uint32_t UINT32
Definition: BasicDatatypes.hpp:72
Tcp::close
void close()
Definition: tcp.cpp:373
SopasEventMessage::size
UINT32 size() const
Definition: sick_scan_common_nw.h:159
colab::decodeUINT16
UINT16 decodeUINT16(BYTE *buffer)
Definition: colab.cpp:142
SickScanCommonNw::m_protocol
SopasProtocol m_protocol
Definition: sick_scan_common_nw.h:109
SopasEventMessage::getVariableIndex
INT32 getVariableIndex()
Returns the index of a variable (answer to read variable by index). In case of error a negative value...
Definition: sick_scan_common_nw.cpp:658
SopasEventMessage
Class that represents a message that was sent by a sensor. (Event message)
Definition: sick_scan_common_nw.h:134
SickScanCommonNw::getNanosecTimestampLastTcpMessageReceived
uint64_t getNanosecTimestampLastTcpMessageReceived(void)
Definition: sick_scan_common_nw.cpp:199
SopasEventMessage::getCommandString
std::string getCommandString() const
Returns two character long command.
Definition: sick_scan_common_nw.cpp:602
SickScanCommonNw::copyFrameToResposeBuffer
void copyFrameToResposeBuffer(UINT32 frameLength)
Definition: sick_scan_common_nw.cpp:515
Tcp::open
bool open(std::string ipAddress, UINT16 port, bool enableVerboseDebugOutput=false)
Definition: tcp.cpp:148


sick_scan_xd
Author(s): Michael Lehning , Jochen Sprickerhof , Martin Günther
autogenerated on Fri Oct 25 2024 02:47:10