35 #include <arpa/inet.h>
37 #include <sys/socket.h>
54 std::string ATINetFTReceiverHostName =
55 getProperty<std::string>(
"ATINetFTReceiveHostName").getValue();
56 std::string captureName = getProperty<std::string>(
"CaptureName").getValue();
58 size_t pos = captureName.find(
"0");
59 captureNamePrefix = captureName.substr(0, pos);
60 ARMARX_INFO <<
"Capture Name Prefix " << captureNamePrefix;
61 std::string captureNameSuffix = captureName.substr(pos, captureName.size());
62 ARMARX_INFO <<
"Capture Name Suffix " << captureNameSuffix;
63 nPaddingZeros = captureNameSuffix.size();
64 captureNumber = std::stoi(captureNameSuffix);
65 establishATINetFTReceiveHostConnection(ATINetFTReceiverHostName);
68 receivePacketSize = 36;
69 recordingStopped =
true;
70 recordingCompleted =
true;
71 recordingStarted =
false;
110 ATINetFTUnit::periodicExec()
112 if (recordingStarted)
117 std::vector<float> ftdata(ftDataSize);
118 std::vector<char> receivePacketContent(receivePacketSize);
120 if (!receivePacket(receivePacketContent.data()))
126 convertToFTValues(receivePacketContent.data(), ftdata.data(), ftdata.size());
127 writeFTValuesToFile(ftdata.data(), ftdata.size());
142 if (remoteTriggerEnabled)
144 if (recordingCompleted)
146 int bpSize = sendPacketSize;
148 std::vector<char> bytePacket(bpSize);
149 *(uint16_t*)&bytePacket[0] = htons(0x1234);
150 *(uint16_t*)&bytePacket[2] = htons(2);
151 *(uint32_t*)&bytePacket[4] = htonl(0);
152 recordingStarted = sendPacket(bytePacket.data(), bytePacket.size());
154 if (recordingStarted)
156 recordingStopped =
false;
157 recordingCompleted =
false;
159 recordingFile.open(captureNamePrefix);
169 if (remoteTriggerEnabled)
173 std::vector<char> bytePacket(bpSize);
174 *(uint16_t*)&bytePacket[0] = htons(0x1234);
175 *(uint16_t*)&bytePacket[2] = htons(0);
176 *(uint32_t*)&bytePacket[4] = htonl(0);
178 recordingStopped = sendPacket(bytePacket.data(), bytePacket.size());
179 if (recordingStopped)
181 recordingFile.close();
182 recordingStarted =
false;
188 ATINetFTUnit::sendPacket(
char* bytePacket,
int bpSize)
190 if (remoteTriggerEnabled)
192 if (sendto(senderSocket,
196 (
struct sockaddr*)&receiveHostAddr,
197 sizeof(receiveHostAddr)) != bpSize)
208 ATINetFTUnit::receivePacket(
char* receiveBuf)
211 int test =
sizeof(receiveHostAddr);
213 int receiveint = recvfrom(senderSocket,
217 (
struct sockaddr*)&receiveHostAddr,
218 ((socklen_t*)&test));
231 ATINetFTUnit::convertToFTValues(
char* receiveBuf,
float* ftdata,
int ftdataSize)
237 for (
int i = 0; i < ftdataSize; i++)
239 ftdata[i] =
float(int32_t(ntohl(*(uint32_t*)&receiveBuf[12 + i * 4]))) / 1000000.0f;
244 ATINetFTUnit::writeFTValuesToFile(
float* ftdata,
int ftdataSize)
246 recordingFile << sampleIndex <<
" ";
247 for (
int i = 0; i < ftdataSize; i++)
249 recordingFile << ftdata[i] <<
" ";
251 recordingFile <<
"\n";
255 ATINetFTUnit::establishATINetFTReceiveHostConnection(std::string receiverHostName)
257 remoteTriggerEnabled =
false;
260 memset(&senderHostAddr, 0,
sizeof(senderHostAddr));
261 senderHostAddr.sin_family = AF_INET;
262 senderHostAddr.sin_addr.s_addr = htonl(INADDR_ANY);
263 senderHostAddr.sin_port = htons(0);
266 if ((senderSocket = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
271 if (bind(senderSocket, (
struct sockaddr*)&senderHostAddr,
sizeof(senderHostAddr)) < 0)
277 memset(&receiveHostAddr, 0,
sizeof(receiveHostAddr));
278 size_t pos = receiverHostName.find(
":");
279 std::string hostname = receiverHostName.substr(0, pos);
281 std::string hostport = receiverHostName.substr(pos + 1, receiverHostName.size());
284 struct in_addr** addr_list;
287 if ((he = gethostbyname(hostname.c_str())) == NULL)
290 herror(
"gethostbyname");
294 addr_list = (
struct in_addr**)he->h_addr_list;
296 for (i = 0; addr_list[i] != NULL; i++)
301 strcpy(ip, inet_ntoa(*addr_list[i]));
303 inet_pton(AF_INET, ip, &receiveHostAddr.sin_addr.s_addr);
305 receiveHostAddr.sin_port = htons(atoi(hostport.c_str()));
306 remoteTriggerEnabled =
true;
307 ARMARX_INFO <<
"Connection established to " << hostname <<
":" << hostport;