24 #include <sys/types.h>
25 #include <sys/socket.h>
26 #include <netinet/in.h>
27 #include <arpa/inet.h>
46 sockDesc = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
48 struct sockaddr_in stSockAddr;
50 stSockAddr.sin_family = PF_INET;
51 stSockAddr.sin_port = htons(port);
52 Res = inet_pton(AF_INET, host.c_str(), &stSockAddr.sin_addr);
76 sprintf(buf,
"%c%s%c", 0x02,
"sMN LMCstartmeas", 0x03);
91 sprintf(buf,
"%c%s%c", 0x02,
"sMN LMCstopmeas", 0x03);
106 sprintf(buf,
"%c%s%c", 0x02,
"sRN STlms", 0x03);
118 sscanf((buf + 10),
"%d", &ret);
125 sprintf(buf,
"%c%s%c", 0x02,
"sMN SetAccessMode 03 F4724744", 0x03);
141 sprintf(buf,
"%c%s%c", 0x02,
"sRN LMPscancfg", 0x03);
153 sscanf(buf + 1,
"%*s %*s %X %*d %X %X %X", &cfg.scaningFrequency,
154 &cfg.angleResolution, &cfg.startAngle, &cfg.stopAngle);
160 sprintf(buf,
"%c%s %X +1 %X %X %X%c", 0x02,
"sMN mLMPsetscancfg",
161 cfg.scaningFrequency, cfg.angleResolution, cfg.startAngle,
162 cfg.stopAngle, 0x03);
173 sprintf(buf,
"%c%s %02X 00 %d %d 0 %02X 00 %d %d 0 %d +%d%c", 0x02,
174 "sWN LMDscandatacfg", cfg.outputChannel, cfg.remission ? 1 : 0,
175 cfg.resolution, cfg.encoder, cfg.position ? 1 : 0,
176 cfg.deviceName ? 1 : 0, cfg.timestamp ? 1 : 0, cfg.outputInterval, 0x03);
187 sprintf(buf,
"%c%s %d%c", 0x02,
"sEN LMDscandata", start, 0x03);
194 printf(
"invalid packet recieved\n");
202 for (
int i = 0; i < 10; i++)
220 retval = select(
sockDesc + 1, &rfds, NULL, NULL, &tv);
222 len += read(
sockDesc, buf + len, 20000 - len);
224 }
while ((buf[0] != 0x02) || (buf[len - 1] != 0x03));
229 char* tok = strtok(buf,
" ");
230 tok = strtok(NULL,
" ");
231 tok = strtok(NULL,
" ");
232 tok = strtok(NULL,
" ");
233 tok = strtok(NULL,
" ");
234 tok = strtok(NULL,
" ");
235 tok = strtok(NULL,
" ");
236 tok = strtok(NULL,
" ");
237 tok = strtok(NULL,
" ");
238 tok = strtok(NULL,
" ");
239 tok = strtok(NULL,
" ");
240 tok = strtok(NULL,
" ");
241 tok = strtok(NULL,
" ");
242 tok = strtok(NULL,
" ");
243 tok = strtok(NULL,
" ");
244 tok = strtok(NULL,
" ");
245 tok = strtok(NULL,
" ");
246 tok = strtok(NULL,
" ");
247 tok = strtok(NULL,
" ");
249 sscanf(tok,
"%d", &NumberEncoders);
250 for (
int i = 0; i < NumberEncoders; i++) {
251 tok = strtok(NULL,
" ");
252 tok = strtok(NULL,
" ");
255 tok = strtok(NULL,
" ");
256 int NumberChannels16Bit;
257 sscanf(tok,
"%d", &NumberChannels16Bit);
259 printf(
"NumberChannels16Bit : %d\n", NumberChannels16Bit);
260 for (
int i = 0; i < NumberChannels16Bit; i++) {
263 tok = strtok(NULL,
" ");
264 sscanf(tok,
"%s", content);
265 if (!strcmp(content,
"DIST1")) {
267 }
else if (!strcmp(content,
"DIST2")) {
269 }
else if (!strcmp(content,
"RSSI1")) {
271 }
else if (!strcmp(content,
"RSSI2")) {
274 tok = strtok(NULL,
" ");
275 tok = strtok(NULL,
" ");
276 tok = strtok(NULL,
" ");
277 tok = strtok(NULL,
" ");
278 tok = strtok(NULL,
" ");
280 sscanf(tok,
"%X", &NumberData);
283 printf(
"NumberData : %d\n", NumberData);
286 data.dist_len1 = NumberData;
287 }
else if (type == 1) {
288 data.dist_len2 = NumberData;
289 }
else if (type == 2) {
290 data.rssi_len1 = NumberData;
291 }
else if (type == 3) {
292 data.rssi_len2 = NumberData;
295 for (
int i = 0; i < NumberData; i++) {
297 tok = strtok(NULL,
" ");
298 sscanf(tok,
"%X", &dat);
302 }
else if (type == 1) {
304 }
else if (type == 2) {
306 }
else if (type == 3) {
313 tok = strtok(NULL,
" ");
314 int NumberChannels8Bit;
315 sscanf(tok,
"%d", &NumberChannels8Bit);
317 printf(
"NumberChannels8Bit : %d\n", NumberChannels8Bit);
318 for (
int i = 0; i < NumberChannels8Bit; i++) {
321 tok = strtok(NULL,
" ");
322 sscanf(tok,
"%s", content);
323 if (!strcmp(content,
"DIST1")) {
325 }
else if (!strcmp(content,
"DIST2")) {
327 }
else if (!strcmp(content,
"RSSI1")) {
329 }
else if (!strcmp(content,
"RSSI2")) {
332 tok = strtok(NULL,
" ");
333 tok = strtok(NULL,
" ");
334 tok = strtok(NULL,
" ");
335 tok = strtok(NULL,
" ");
336 tok = strtok(NULL,
" ");
338 sscanf(tok,
"%X", &NumberData);
341 printf(
"NumberData : %d\n", NumberData);
344 data.dist_len1 = NumberData;
345 }
else if (type == 1) {
346 data.dist_len2 = NumberData;
347 }
else if (type == 2) {
348 data.rssi_len1 = NumberData;
349 }
else if (type == 3) {
350 data.rssi_len2 = NumberData;
352 for (
int i = 0; i < NumberData; i++) {
354 tok = strtok(NULL,
" ");
355 sscanf(tok,
"%X", &dat);
359 }
else if (type == 1) {
361 }
else if (type == 2) {
363 }
else if (type == 3) {
373 sprintf(buf,
"%c%s%c", 0x02,
"sMN mEEwriteall", 0x03);
388 sprintf(buf,
"%c%s%c", 0x02,
"sMN Run", 0x03);
void setScanDataCfg(const scanDataCfg &cfg)
Set scan data configuration. Set format of scan message returned by device.
scanCfg getScanCfg() const
Get current scan configuration. Get scan configuration :
status_t queryStatus()
Get current status of LMS1xx device.
void login()
Log into LMS1xx unit. Increase privilege level, giving ability to change device configuration.
void stopMeas()
Stop measurements. After receiving this command LMS1xx unit stop spinning laser and measuring...
Structure containing single scan message.
Structure containing scan configuration.
void setScanCfg(const scanCfg &cfg)
Set scan configuration. Get scan configuration :
void startDevice()
The device is returned to the measurement mode after configuration.
void scanContinous(int start)
Start or stop continuous data acquisition. After reception of this command device start or stop conti...
void startMeas()
Start measurements. After receiving this command LMS1xx unit starts spinning laser and measuring...
bool isConnected()
Get status of connection.
void disconnect()
Disconnect from LMS1xx device.
void connect(std::string host, int port=2111)
Connect to LMS1xx.
void getData(scanData &data)
Receive single scan message.
void saveConfig()
Save data permanently. Parameters are saved in the EEPROM of the LMS and will also be available after...
Structure containing scan data configuration.