Go to the documentation of this file.00001
00016
00017 #include <stdlib.h>
00018 #include <string>
00019 #include <sstream>
00020 #include <iostream>
00021 #include <signal.h>
00022 #include <stdlib.h>
00023 #include <sicktoolbox/SickLMS2xx.hh>
00024
00025 #define INVALID_OPTION_STRING " Invalid option!!! :o("
00026 #define PROMPT_STRING "lms2xx?> "
00027
00028 using namespace std;
00029 using namespace SickToolbox;
00030
00036 void sigintHandler(int signal);
00037
00043 int strToInt(string input_str);
00044
00051 int getUserOption(bool &is_null_input);
00052
00057 bool writeToEEPROM();
00058
00064 void setMeasuringUnits();
00065
00071 void setMeasuringMode();
00072
00078 void setAvailabilityLevel();
00079
00085 void setSensitivityLevel();
00086
00087
00088 SickLMS2xx *sick_lms_2xx = NULL;
00089
00090 int main(int argc, char * argv[]) {
00091
00092 string device_str;
00093 SickLMS2xx::sick_lms_2xx_baud_t desired_baud = SickLMS2xx::SICK_BAUD_38400;
00094
00095
00096 if ((argc != 2 && argc != 3) || (argc == 2 && strcasecmp(argv[1],"--help") == 0)) {
00097 cout << "Usage: lms2xx_config PATH [BAUD RATE]" << endl
00098 << "Ex: lms2xx_config /dev/ttyUSB0 9600" << endl;
00099 return -1;
00100 }
00101
00102
00103 if (argc == 2) {
00104 device_str = argv[1];
00105 }
00106
00107
00108 if (argc == 3) {
00109 device_str = argv[1];
00110 if ((desired_baud = SickLMS2xx::StringToSickBaud(argv[2])) == SickLMS2xx::SICK_BAUD_UNKNOWN) {
00111 cerr << "Invalid baud value! Valid values are: 9600, 19200, 38400, and 500000" << endl;
00112 return -1;
00113 }
00114 }
00115
00116
00117 sick_lms_2xx = new SickLMS2xx(device_str);
00118
00119 cout << endl;
00120 cout << "The Sick LIDAR C++/Matlab Toolbox " << endl;
00121 cout << "Sick LMS 2xx Config Utility " << endl;
00122
00123
00124 try {
00125 sick_lms_2xx->Initialize(desired_baud);
00126 }
00127
00128 catch(...) {
00129 cerr << "Initialize failed! Are you using the correct device path?" << endl;
00130 return -1;
00131 }
00132
00133
00134 signal(SIGINT,sigintHandler);
00135
00136 cout << "NOTE - Configuring the Sick LMS - REQUIRES - writing to the device's EEPROM." << endl;
00137 cout << " The number of times this can be done is finite (a few thousand)." << endl;
00138 cout << " Thus, you should configure sparingly." << endl;
00139 cout << endl;
00140
00141 do {
00142
00143 cout << "Enter your choice: (Ctrl-c to exit)" << endl;
00144 cout << " [1] Set measuring units"<< endl;
00145 cout << " [2] Set measuring mode"<< endl;
00146 cout << " [3] Set availability level" << endl;
00147 cout << " [4] Set sensitivity level" << endl;
00148 cout << " [5] Show detailed configuration" << endl;
00149 cout << PROMPT_STRING;
00150
00151 bool is_null_input;
00152 switch(getUserOption(is_null_input)) {
00153
00154 case 1:
00155 setMeasuringUnits();
00156 break;
00157 case 2:
00158 setMeasuringMode();
00159 break;
00160 case 3:
00161 setAvailabilityLevel();
00162 break;
00163 case 4:
00164 setSensitivityLevel();
00165 break;
00166 case 5:
00167 sick_lms_2xx->PrintSickConfig();
00168 break;
00169 default:
00170 if (!is_null_input) {
00171 cerr << INVALID_OPTION_STRING << endl;
00172 }
00173 }
00174
00175 cout << endl;
00176
00177 } while(true);
00178
00179
00180 return 0;
00181
00182 }
00183
00187 void sigintHandler( int signal ) {
00188
00189 cout << endl;
00190 cout << "Quitting..." << endl;
00191
00192
00193 try {
00194
00195 sick_lms_2xx->Uninitialize();
00196 delete sick_lms_2xx;
00197
00198 }
00199
00200 catch(...) {
00201 cerr << "Uninitialize failed!" << endl;
00202 exit(-1);
00203 }
00204
00205 cout << endl;
00206 cout << "Thanks for using the Sick LIDAR Matlab/C++ Toolbox!" << endl;
00207 cout << "Bye Bye :o)" << endl;
00208
00209 exit(0);
00210
00211 }
00212
00216 int strToInt( string input_str ) {
00217 int int_val;
00218 istringstream input_stream(input_str);
00219 input_stream >> int_val;
00220 return int_val;
00221 }
00222
00227 int getUserOption( bool &is_null_input ) {
00228
00229 string user_input_str;
00230 getline(cin,user_input_str);
00231
00232
00233 is_null_input = true;
00234 if (user_input_str.length() > 0) {
00235 is_null_input = false;
00236 }
00237
00238 return strToInt(user_input_str);
00239
00240 }
00241
00245 bool writeToEEPROM( ) {
00246
00247 string user_input_str;
00248
00249 do {
00250
00251 cout << "This will attempt to write to EEPROM. Continue [y/n]? ";
00252 getline(cin,user_input_str);
00253
00254
00255 if (user_input_str == "Y" || user_input_str == "y") {
00256 return true;
00257 }
00258 else if (user_input_str == "N" || user_input_str == "n") {
00259 return false;
00260 }
00261 else {
00262 cerr << "Please answer [y/n]!" << endl;
00263 }
00264
00265 } while (true);
00266
00267 }
00268
00272 void setMeasuringUnits() {
00273
00274 bool keep_running = true;
00275
00276 do {
00277
00278 cout << endl;
00279 cout << "Select the desired units:" << endl;
00280 cout << " [1] Centimeters (cm)"<< endl;
00281 cout << " [2] Millimeters (mm)"<< endl;
00282 cout << " [3] Back to main"<< endl;
00283 cout << PROMPT_STRING;
00284
00285 try {
00286
00287 bool is_null_input;
00288 switch(getUserOption(is_null_input)) {
00289
00290 case 1:
00291 if (writeToEEPROM()) {
00292 cout << " Setting Sick LMS units to (cm)" << endl;
00293 sick_lms_2xx->SetSickMeasuringUnits(SickLMS2xx::SICK_MEASURING_UNITS_CM);
00294 cout << " Done!" << endl;
00295 }
00296 break;
00297 case 2:
00298 if (writeToEEPROM()) {
00299 cout << " Setting Sick LMS units to (mm)" << endl;
00300 sick_lms_2xx->SetSickMeasuringUnits(SickLMS2xx::SICK_MEASURING_UNITS_MM);
00301 cout << " Done!" << endl;
00302 }
00303 break;
00304 case 3:
00305 keep_running = !keep_running;
00306 break;
00307 default:
00308 if (!is_null_input) {
00309 cerr << INVALID_OPTION_STRING << endl;
00310 }
00311 }
00312
00313 }
00314
00315 catch( SickException &sick_exception ) {
00316 cerr << "A Sick exception occurred!" << endl;
00317 exit(-1);
00318 }
00319
00320 catch(...) {
00321 cerr << "An unknown exception occurred!" << endl;
00322 exit(-1);
00323 }
00324
00325 } while (keep_running);
00326
00327 }
00328
00332 void setMeasuringMode() {
00333
00334 bool keep_running = true;
00335
00336 do {
00337
00338 cout << endl;
00339 cout << "Select the desired measuring mode (see telegram listing for descriptions):" << endl;
00340 cout << " [1] Measurement range 8m/80m; field A, field B, and dazzle" << endl;
00341 cout << " [2] Measurement range 8m/80m; reflector bits in 8 levels" << endl;
00342 cout << " [3] Measurement range 8m/80m; field A, field B and field C" << endl;
00343 cout << " [4] Measurement range 16m/theoretically 160m; reflector bits in 4 levels" << endl;
00344 cout << " [5] Measurement range 16m/theoretically 160m; field A and field B" << endl;
00345 cout << " [6] Measurement range 32m/theoretically 320m; reflector bits in 2 levels" << endl;
00346 cout << " [7] Measurement range 32m/theoretically 320m; field A" << endl;
00347 cout << " [8] Measurement range 32m/theoretically 320m; Immediate" << endl;
00348 cout << " [9] Reflectivity/Intensity values" << endl;
00349 cout << " [10] Back to main" << endl;
00350 cout << PROMPT_STRING;
00351
00352 try {
00353
00354 bool is_null_input;
00355 switch(getUserOption(is_null_input)) {
00356
00357 case 1:
00358 if (writeToEEPROM()) {
00359 cout << " Setting Sick LMS Meas. Mode to: Measurement range 8m/80m; field A, field B, and dazzle" << endl;
00360 sick_lms_2xx->SetSickMeasuringMode(SickLMS2xx::SICK_MS_MODE_8_OR_80_FA_FB_DAZZLE);
00361 cout << " Done!" << endl;
00362 }
00363 break;
00364 case 2:
00365 if (writeToEEPROM()) {
00366 cout << " Setting Sick LMS Meas. Mode to: Measurement range 8m/80m; reflector bits in 8 levels" << endl;
00367 sick_lms_2xx->SetSickMeasuringMode(SickLMS2xx::SICK_MS_MODE_8_OR_80_REFLECTOR);
00368 cout << " Done!" << endl;
00369 }
00370 break;
00371 case 3:
00372 if (writeToEEPROM()) {
00373 cout << " Setting Sick LMS Meas. Mode to: Measurement range 8m/80m; field A, field B and field C" << endl;
00374 sick_lms_2xx->SetSickMeasuringMode(SickLMS2xx::SICK_MS_MODE_8_OR_80_FA_FB_FC);
00375 cout << " Done!" << endl;
00376 }
00377 break;
00378 case 4:
00379 if (writeToEEPROM()) {
00380 cout << " Setting Sick LMS Meas. Mode to: Measurement range 16m/theoretically 160m; reflector bits in 4 levels" << endl;
00381 sick_lms_2xx->SetSickMeasuringMode(SickLMS2xx::SICK_MS_MODE_16_REFLECTOR);
00382 cout << " Done!" << endl;
00383 }
00384 break;
00385 case 5:
00386 if (writeToEEPROM()) {
00387 cout << " Setting Sick LMS Meas. Mode to: Measurement range 16m/theoretically 160m; field A and field B" << endl;
00388 sick_lms_2xx->SetSickMeasuringMode(SickLMS2xx::SICK_MS_MODE_16_FA_FB);
00389 cout << " Done!" << endl;
00390 }
00391 break;
00392 case 6:
00393 if (writeToEEPROM()) {
00394 cout << " Setting Sick LMS Meas. Mode to: Measurement range 32m/theoretically 320m; reflector bit in 2 levels" << endl;
00395 sick_lms_2xx->SetSickMeasuringMode(SickLMS2xx::SICK_MS_MODE_32_REFLECTOR);
00396 cout << " Done!" << endl;
00397 }
00398 break;
00399 case 7:
00400 if (writeToEEPROM()) {
00401 cout << " Setting Sick LMS Meas. Mode to: Measurement range 32m/theoretically 320m; field A" << endl;
00402 sick_lms_2xx->SetSickMeasuringMode(SickLMS2xx::SICK_MS_MODE_32_FA);
00403 cout << " Done!" << endl;
00404 }
00405 break;
00406 case 8:
00407 if (writeToEEPROM()) {
00408 cout << " Setting Sick LMS Meas. Mode to: Measurement range 32m/theoretically 320m; Immediate" << endl;
00409 sick_lms_2xx->SetSickMeasuringMode(SickLMS2xx::SICK_MS_MODE_32_IMMEDIATE);
00410 cout << " Done!" << endl;
00411 }
00412 break;
00413 case 9:
00414 if (writeToEEPROM()) {
00415 cout << " Setting Sick LMS Meas. Mode to: Reflectivity/Intensity" << endl;
00416 sick_lms_2xx->SetSickMeasuringMode(SickLMS2xx::SICK_MS_MODE_REFLECTIVITY);
00417 cout << " Done!" << endl;
00418 }
00419 break;
00420 case 10:
00421 keep_running = !keep_running;
00422 break;
00423 default:
00424 if (!is_null_input) {
00425 cerr << INVALID_OPTION_STRING << endl;
00426 }
00427 }
00428
00429 }
00430
00431 catch( SickException &sick_exception ) {
00432 cerr << "A Sick exception occurred!" << endl;
00433 exit(-1);
00434 }
00435
00436 catch(...) {
00437 cerr << "An unknown exception occurred!" << endl;
00438 exit(-1);
00439 }
00440
00441 } while (keep_running);
00442
00443 }
00444
00448 void setAvailabilityLevel() {
00449
00450 bool keep_running = true;
00451
00452 do {
00453
00454 cout << endl;
00455 cout << "Select the desired availability (see telegram listing for descriptions):" << endl;
00456 cout << " [1] Restore to factory default" << endl;
00457 cout << " [2] High" << endl;
00458 cout << " [3] High w/ Real-time indices" << endl;
00459 cout << " [4] High w/ No effect dazzle" << endl;
00460 cout << " [5] High w/ Real-time indices and No effect dazzle" << endl;
00461 cout << " [6] Real-time indices" << endl;
00462 cout << " [7] Real-time indices w/ No effect dazzle" << endl;
00463 cout << " [8] No effect dazzle" << endl;
00464 cout << " [9] Back to main" << endl;
00465 cout << PROMPT_STRING;
00466
00467 try {
00468
00469 bool is_null_input;
00470 switch(getUserOption(is_null_input)) {
00471
00472 case 1:
00473 if (writeToEEPROM()) {
00474 cout << " Setting Sick LMS Availability to: Factory settings" << endl;
00475 sick_lms_2xx->SetSickAvailability();
00476 cout << " Done!" << endl;
00477 }
00478 break;
00479 case 2:
00480 if (writeToEEPROM()) {
00481 cout << " Setting Sick LMS Availability to: High" << endl;
00482 sick_lms_2xx->SetSickAvailability(SickLMS2xx::SICK_FLAG_AVAILABILITY_HIGH);
00483 cout << " Done!" << endl;
00484 }
00485 break;
00486 case 3:
00487 if (writeToEEPROM()) {
00488 cout << " Setting Sick LMS Availability to: High w/ Real-time indices" << endl;
00489 sick_lms_2xx->SetSickAvailability(SickLMS2xx::SICK_FLAG_AVAILABILITY_HIGH | SickLMS2xx::SICK_FLAG_AVAILABILITY_REAL_TIME_INDICES);
00490 cout << " Done!" << endl;
00491 }
00492 break;
00493 case 4:
00494 if (writeToEEPROM()) {
00495 cout << " Setting Sick LMS Availability to: High w/ No effect dazzle" << endl;
00496 sick_lms_2xx->SetSickAvailability(SickLMS2xx::SICK_FLAG_AVAILABILITY_HIGH | SickLMS2xx::SICK_FLAG_AVAILABILITY_DAZZLE_NO_EFFECT);
00497 cout << " Done!" << endl;
00498 }
00499 break;
00500 case 5:
00501 if (writeToEEPROM()) {
00502 cout << " Setting Sick LMS Availability to: High w/ Real-time indices and No effect dazzle" << endl;
00503 sick_lms_2xx->SetSickAvailability(SickLMS2xx::SICK_FLAG_AVAILABILITY_HIGH | SickLMS2xx::SICK_FLAG_AVAILABILITY_REAL_TIME_INDICES | SickLMS2xx::SICK_FLAG_AVAILABILITY_DAZZLE_NO_EFFECT);
00504 cout << " Done!" << endl;
00505 }
00506 break;
00507 case 6:
00508 if (writeToEEPROM()) {
00509 cout << " Setting Sick LMS Availability to: Real-time indices" << endl;
00510 sick_lms_2xx->SetSickAvailability(SickLMS2xx::SICK_FLAG_AVAILABILITY_REAL_TIME_INDICES);
00511 cout << " Done!" << endl;
00512 }
00513 break;
00514 case 7:
00515 if (writeToEEPROM()) {
00516 cout << " Setting Sick LMS Availability to: Real-time indices w/ No effect dazzle" << endl;
00517 sick_lms_2xx->SetSickAvailability(SickLMS2xx::SICK_FLAG_AVAILABILITY_REAL_TIME_INDICES | SickLMS2xx::SICK_FLAG_AVAILABILITY_DAZZLE_NO_EFFECT);
00518 cout << " Done!" << endl;
00519 }
00520 break;
00521 case 8:
00522 if (writeToEEPROM()) {
00523 cout << " Setting Sick LMS Availability to: No effect dazzle" << endl;
00524 sick_lms_2xx->SetSickAvailability(SickLMS2xx::SICK_FLAG_AVAILABILITY_DAZZLE_NO_EFFECT);
00525 cout << " Done!" << endl;
00526 }
00527 break;
00528 case 9:
00529 keep_running = !keep_running;
00530 break;
00531 default:
00532 if (!is_null_input) {
00533 cerr << INVALID_OPTION_STRING << endl;
00534 }
00535 }
00536
00537 }
00538
00539 catch( SickException &sick_exception ) {
00540 cerr << "A Sick exception occurred!" << endl;
00541 exit(-1);
00542 }
00543
00544 catch(...) {
00545 cerr << "An unknown exception occurred!" << endl;
00546 exit(-1);
00547 }
00548
00549 } while (keep_running);
00550
00551 }
00552
00556 void setSensitivityLevel() {
00557
00558 bool keep_running = true;
00559
00560 do {
00561
00562 cout << endl;
00563 cout << "Select the desired sensitivity level:" << endl;
00564 cout << " [1] High (42m @ 10% reflectivity)"<< endl;
00565 cout << " [2] Standard (30m @ 10% reflectivity, factory setting)"<< endl;
00566 cout << " [3] Medium (25m @ 10% reflectivity)"<< endl;
00567 cout << " [4] Low (20m @ 10% reflectivity)"<< endl;
00568 cout << " [5] Back to main"<< endl;
00569 cout << PROMPT_STRING;
00570
00571 try {
00572
00573 bool is_null_input;
00574 switch(getUserOption(is_null_input)) {
00575
00576 case 1:
00577 if (writeToEEPROM()) {
00578 cout << " Setting Sick LMS Sensitivity to: High" << endl;
00579 sick_lms_2xx->SetSickSensitivity(SickLMS2xx::SICK_SENSITIVITY_HIGH);
00580 cout << " Done!" << endl;
00581 }
00582 break;
00583 case 2:
00584 if (writeToEEPROM()) {
00585 cout << " Setting Sick LMS Sensitivity to: Standard (Factory setting)" << endl;
00586 sick_lms_2xx->SetSickSensitivity();
00587 cout << " Done!" << endl;
00588 }
00589 break;
00590 case 3:
00591 if (writeToEEPROM()) {
00592 cout << " Setting Sick LMS Sensitivity to: Medium" << endl;
00593 sick_lms_2xx->SetSickSensitivity(SickLMS2xx::SICK_SENSITIVITY_MEDIUM);
00594 cout << " Done!" << endl;
00595 }
00596 break;
00597 case 4:
00598 if (writeToEEPROM()) {
00599 cout << " Setting Sick LMS Sensitivity to: Low" << endl;
00600 sick_lms_2xx->SetSickSensitivity(SickLMS2xx::SICK_SENSITIVITY_LOW);
00601 cout << " Done!" << endl;
00602 }
00603 break;
00604 case 5:
00605 keep_running = !keep_running;
00606 break;
00607 default:
00608 if (!is_null_input) {
00609 cerr << INVALID_OPTION_STRING << endl;
00610 }
00611 }
00612
00613 }
00614
00615 catch( SickException &sick_exception ) {
00616 cerr << "A Sick exception occurred!" << endl;
00617 exit(-1);
00618 }
00619
00620 catch(...) {
00621 cerr << "An unknown exception occurred!" << endl;
00622 exit(-1);
00623 }
00624
00625 } while (keep_running);
00626
00627 }