66 #pragma warning(disable: 4996)
67 #pragma warning(disable: 4267)
68 #pragma warning(disable: 4101) // C4101: "e" : Unreferenzierte lokale Variable
99 bool emulateReply(
UINT8 *requestData,
int requestLen, std::vector<unsigned char> *replyVector)
103 std::vector<std::string> keyWordList;
104 std::vector<std::string> answerList;
106 keyWordList.push_back(
"sMN SetAccessMode");
107 answerList.push_back(
"sAN SetAccessMode 1");
109 keyWordList.push_back(
"sWN EIHstCola");
110 answerList.push_back(
"sWA EIHstCola");
112 keyWordList.push_back(
"sRN FirmwareVersion");
113 answerList.push_back(
"sRA FirmwareVersion 8 1.0.0.0R");
115 keyWordList.push_back(
"sRN OrdNum");
116 answerList.push_back(
"sRA OrdNum 7 1234567");
118 keyWordList.push_back(
"sWN TransmitTargets 1");
119 answerList.push_back(
"sWA TransmitTargets");
121 keyWordList.push_back(
"sWN TransmitObjects 1");
122 answerList.push_back(
"sWA TransmitObjects");
124 keyWordList.push_back(
"sWN TCTrackingMode 0");
125 answerList.push_back(
"sWA TCTrackingMode");
127 keyWordList.push_back(
"sRN SCdevicestate");
128 answerList.push_back(
"sRA SCdevicestate 1");
130 keyWordList.push_back(
"sRN DItype");
131 answerList.push_back(
"sRA DItype F RMSxxxxx.xxxxxx");
133 keyWordList.push_back(
"sRN ODoprh");
134 answerList.push_back(
"sRA ODoprh 451");
136 keyWordList.push_back(
"sMN mSCloadappdef");
137 answerList.push_back(
"sAN mSCloadappdef");
140 keyWordList.push_back(
"sRN SerialNumber");
141 answerList.push_back(
"sRA SerialNumber 8 18020073");
143 keyWordList.push_back(
"sMN Run");
144 answerList.push_back(
"sAN Run 1s");
146 keyWordList.push_back(
"sRN ODpwrc");
147 answerList.push_back(
"sRA ODpwrc 20");
149 keyWordList.push_back(
"sRN LocationName");
150 answerList.push_back(
"sRA LocationName B not defined");
152 keyWordList.push_back(
"sEN LMDradardata 1");
153 answerList.push_back(
"sEA LMDradardata 1");
155 for (
int i = 0; i < requestLen; i++)
157 request += (char) requestData[i];
159 for (
int i = 0; i < keyWordList.size(); i++)
161 if (request.find(keyWordList[i]) != std::string::npos)
164 reply += answerList[i];
165 reply += (char) 0x03;
169 replyVector->clear();
170 for (
int i = 0; i < reply.length(); i++)
172 replyVector->push_back((
unsigned char) reply[i]);
204 timelimit_(timelimit)
208 if ((cola_dialect_id ==
'a') || (cola_dialect_id ==
'A'))
213 if ((cola_dialect_id ==
'b') || (cola_dialect_id ==
'B'))
243 usleep(delay_millisec * 1000);
285 if ((cola_dialect_id ==
'a') || (cola_dialect_id ==
'A'))
287 this->m_protocol =
CoLa_A;
291 this->m_protocol =
CoLa_B;
392 if (magicWord != 0x02020202)
399 if (magicWord == 0x02020202)
426 printInfoMessage(
"SickScanCommonNw::findFrameInReceiveBuffer: Frame cannot be decoded yet, only " +
433 payloadlength = colab::getIntegerFromBuffer<UINT32>(
m_receiveBuffer, pos);
435 "SickScanCommonNw::findFrameInReceiveBuffer: Decoded payload length is " + ::
toString(payloadlength) +
443 "SickScanCommonNw::findFrameInReceiveBuffer: Frame too big for receive buffer. Frame discarded with length:"
452 "SickScanCommonNw::findFrameInReceiveBuffer: Frame not complete yet. Waiting for the rest of it (" +
458 frameLen = payloadlength + 9;
472 for (
UINT16 j = 8; j < (frameLen - 1); j++)
476 temp_xor = temp_xor ^ temp;
480 if (temp_xor != checkSum)
482 printWarning(
"SickScanCommonNw::findFrameInReceiveBuffer: Wrong checksum, Frame discarded.");
506 "SickScanCommonNw::processFrame: Calling processFrame_CoLa_A() with " + ::
toString(frame.
size()) +
" bytes.",
513 "SickScanCommonNw::processFrame: Calling processFrame_CoLa_B() with " + ::
toString(frame.
size()) +
" bytes.",
530 bool beVerboseHere =
false;
532 "SickScanCommonNw::readCallbackFunction(): Called with " +
toString(numOfBytes) +
" available bytes.",
537 UINT32 bytesToBeTransferred = numOfBytes;
538 if (remainingSpace < numOfBytes)
540 bytesToBeTransferred = remainingSpace;
550 if (bytesToBeTransferred > 0)
568 printInfoMessage(
"SickScanCommonNw::readCallbackFunction(): No complete frame in input buffer, we are done.",
578 "SickScanCommonNw::readCallbackFunction(): Processing a frame of length " + ::
toString(frame.
size()) +
579 " bytes.", beVerboseHere);
601 sscanf(
port_.c_str(),
"%d", &portInt);
606 ROS_INFO(
"Sensor emulation is switched on - network traffic is switched off.");
619 ROS_WARN(
"Disconnecting TCP-Connection.");
623 ROS_INFO(
"Disconnecting TCP-Connection.");
660 ret = this->
recvQueue.getNumberOfEntriesInQueue();
666 bool retVal = this->
recvQueue.waitForIncomingObject(timeout_ms, datagram_keywords);
669 ROS_WARN(
"Timeout during waiting for new datagram");
673 if(datagramWithTimeStamp.
datagram.size() > buffer_size)
675 ROS_WARN_STREAM(
"Length of received datagram is " << datagramWithTimeStamp.
datagram.size() <<
" byte, exceeds buffer size (" << buffer_size <<
" byte), datagram truncated");
676 datagramWithTimeStamp.
datagram.resize(buffer_size);
679 *bytes_read = datagramWithTimeStamp.
datagram.size();
680 memcpy(buffer, &(datagramWithTimeStamp.
datagram[0]), datagramWithTimeStamp.
datagram.size());
692 bool cmdIsBinary =
false;
700 for (
int i = 0; i < 4; i++)
702 if (request[i] == 0x02)
717 if (cmdIsBinary ==
false)
719 msgLen = strlen(request);
724 for (
int i = 4; i < 8; i++)
726 dataLen |= ((
unsigned char) request[i] << (7 - i) * 8);
728 msgLen = 8 + dataLen + 1;
736 bool debugBinCmd =
false;
739 printf(
"=== START HEX DUMP ===\n");
740 for (
int i = 0; i < msgLen; i++)
742 unsigned char *ptr = (
UINT8 *) request;
743 printf(
"%02x ", ptr[i]);
745 printf(
"\n=== END HEX DUMP ===\n");
749 ROS_ERROR(
"## ERROR in sendSOPASCommand(): sendCommandBuffer failed");
760 const int BUF_SIZE = 65536;
761 char buffer[BUF_SIZE];
773 #if defined __ROS_VERSION && __ROS_VERSION == 1
778 #ifdef USE_DIAGNOSTIC_UPDATER
779 if(diagnostics_ &&
rosOk())
781 "sendSOPASCommand: no full reply available for read after timeout.");
790 reply->resize(bytes_read);
792 std::copy(buffer, buffer + bytes_read, &(*reply)[0]);
800 int *actual_length,
bool isBinaryProtocol,
int *numberOfRemainingFifoEntries,
const std::vector<std::string>& datagram_keywords)
802 if (
NULL != numberOfRemainingFifoEntries)
804 *numberOfRemainingFifoEntries = 0;
813 double waitTime10Hz = 10.0 * (double) nanoSec / 1E9;
815 uint32_t waitTime = (int) waitTime10Hz;
817 double waitTimeUntilNextTime10Hz = 1 / 10.0 * (1.0 - (waitTime10Hz - waitTime));
819 rosSleep(waitTimeUntilNextTime10Hz);
829 std::vector<unsigned char> dataBuffer;
830 #if 1 // prepared for reconnect
831 bool retVal = this->
recvQueue.waitForIncomingObject(maxWaitInMs, datagram_keywords);
834 ROS_WARN(
"Timeout during waiting for new datagram");
843 if (
NULL != numberOfRemainingFifoEntries)
845 *numberOfRemainingFifoEntries = this->
recvQueue.getNumberOfEntriesInQueue();
847 recvTimeStamp = datagramWithTimeStamp.
timeStamp;
848 dataBuffer = datagramWithTimeStamp.
datagram;
853 long size = dataBuffer.size();
854 memcpy(receiveBuffer, &(dataBuffer[0]), size);
855 *actual_length = size;