32 #include <linux/serial.h>
35 #include <boost/regex.hpp>
44 #define ANGLE_MIN -180
48 #define THETA_Y_MAX 90
52 #define THETA_Y_MIN -90
56 #define LEVER_ARM_MAX 100
60 #define LEVER_ARM_MIN -100
64 #define HEADING_MAX 360
68 #define HEADING_MIN -360
79 #ifndef ATTSTD_DEV_MIN
80 #define ATTSTD_DEV_MIN 0
83 #ifndef ATTSTD_DEV_MAX
84 #define ATTSTD_DEV_MAX 5
87 #ifndef POSSTD_DEV_MIN
88 #define POSSTD_DEV_MIN 0
91 #ifndef POSSTD_DEV_MAX
92 #define POSSTD_DEV_MAX 100
123 node_(node), handlers_(node, settings), settings_(settings), stopping_(false)
133 if (!settings_->read_from_sbf_log && !settings_->read_from_pcap)
135 std::string cmd(
"\x0DSSSSSSSSSSSSSSSSSSS\x0D\x0D");
136 manager_.get()->send(cmd);
137 send(
"sdio, " + mainPort_ +
", auto, none\x0D");
138 for (
auto ntrip : settings_->rtk_settings.ntrip)
140 if (!ntrip.id.empty() && !ntrip.keep_open)
142 send(
"snts, " + ntrip.id +
", off \x0D");
145 for (
auto ip_server : settings_->rtk_settings.ip_server)
147 if (!ip_server.id.empty() && !ip_server.keep_open)
149 send(
"sdio, " + ip_server.id +
", auto, none\x0D");
150 send(
"siss, " + ip_server.id +
", 0\x0D");
153 for (
auto serial : settings_->rtk_settings.serial)
155 if (!serial.port.empty() && !serial.keep_open)
157 send(
"sdio, " + serial.port +
", auto, none\x0D");
158 if (serial.port.rfind(
"COM", 0) == 0)
159 send(
"scs, " + serial.port +
160 ", baud115200, bits8, No, bit1, none\x0D");
163 if (!settings_->ins_vsm_ip_server_id.empty())
165 if (!settings_->ins_vsm_ip_server_keep_open)
167 send(
"sdio, " + settings_->ins_vsm_ip_server_id +
169 send(
"siss, " + settings_->ins_vsm_ip_server_id +
", 0\x0D");
172 if (!settings_->ins_vsm_serial_port.empty())
174 if (!settings_->ins_vsm_serial_keep_open)
176 if (settings_->ins_vsm_serial_port.rfind(
"COM", 0) == 0)
177 send(
"scs, " + settings_->ins_vsm_serial_port +
178 ", baud115200, bits8, No, bit1, none\x0D");
179 send(
"sdio, " + settings_->ins_vsm_serial_port +
188 connectionThread_->join();
195 boost::mutex::scoped_lock lock_cd(
g_cd_mutex);
198 std::string cmd(
"\x0DSSSSSSSSSSSSSSSSSSS\x0D\x0D");
199 manager_.get()->send(cmd);
211 if (boost::regex_match(settings_->device, match,
212 boost::regex(
"(tcp)://(.+):(\\d+)")))
223 tcp_host_ = match[2];
224 tcp_port_ = match[3];
227 connectionThread_.reset(
229 }
else if (boost::regex_match(settings_->device, match,
230 boost::regex(
"(file_name):(/|(?:/[\\w-]+)+.sbf)")))
233 settings_->read_from_sbf_log =
true;
234 settings_->use_gnss_time =
true;
235 connectionThread_.reset(
new boost::thread(
238 }
else if (boost::regex_match(
239 settings_->device, match,
240 boost::regex(
"(file_name):(/|(?:/[\\w-]+)+.pcap)")))
243 settings_->read_from_pcap =
true;
244 settings_->use_gnss_time =
true;
245 connectionThread_.reset(
new boost::thread(
248 }
else if (boost::regex_match(settings_->device, match,
249 boost::regex(
"(serial):(.+)")))
252 std::string proto(match[2]);
253 std::stringstream ss;
254 ss <<
"Searching for serial port" << proto;
255 settings_->device = proto;
257 connectionThread_.reset(
261 std::stringstream ss;
262 ss <<
"Device is unsupported. Perhaps you meant 'tcp://host:port' or 'file_name:xxx.sbf' or 'serial:/path/to/device'?";
272 std::stringstream ss;
273 ss <<
"Setting up everything needed to read from" << file_name;
275 initializeSBFFileReading(file_name);
276 }
catch (std::runtime_error& e)
278 std::stringstream ss;
279 ss <<
"Comm_IO::initializeSBFFileReading() failed for SBF File" << file_name
280 <<
" due to: " << e.what();
289 std::stringstream ss;
290 ss <<
"Setting up everything needed to read from " << file_name;
292 initializePCAPFileReading(file_name);
293 }
catch (std::runtime_error& e)
295 std::stringstream ss;
296 ss <<
"CommIO::initializePCAPFileReading() failed for SBF File " << file_name
297 <<
" due to: " << e.what();
307 "Started timer for calling reconnect() method until connection succeeds");
309 boost::asio::io_service io;
310 boost::posix_time::millisec wait_ms(
311 static_cast<uint32_t
>(settings_->reconnect_delay_s * 1000));
312 while (!connected_ && !stopping_)
314 boost::asio::deadline_timer
t(io, wait_ms);
318 node_->log(
LogLevel::DEBUG,
"Successully connected. Leaving connect() method");
329 bool initialize_serial_return =
false;
334 "Connecting serially to device" + settings_->device +
335 ", targeted baudrate: " + std::to_string(settings_->baudrate));
336 initialize_serial_return = initializeSerial(
337 settings_->device, settings_->baudrate, settings_->hw_flow_control);
338 }
catch (std::runtime_error& e)
341 std::stringstream ss;
342 ss <<
"initializeSerial() failed for device " << settings_->device
343 <<
" due to: " << e.what();
347 if (initialize_serial_return)
349 boost::mutex::scoped_lock lock(connection_mutex_);
352 connection_condition_.notify_one();
356 bool initialize_tcp_return =
false;
360 "Connecting to tcp://" + tcp_host_ +
":" + tcp_port_ +
"...");
361 initialize_tcp_return = initializeTCP(tcp_host_, tcp_port_);
362 }
catch (std::runtime_error& e)
365 std::stringstream ss;
366 ss <<
"initializeTCP() failed for host " << tcp_host_ <<
" on port "
367 << tcp_port_ <<
" due to: " << e.what();
371 if (initialize_tcp_return)
373 boost::mutex::scoped_lock lock(connection_mutex_);
376 connection_condition_.notify_one();
394 boost::mutex::scoped_lock lock(connection_mutex_);
395 connection_condition_.wait(lock, [
this]() {
return connected_; });
401 boost::regex_match(settings_->device, match,
402 boost::regex(
"(tcp)://(.+):(\\d+)"));
403 std::string proto(match[1]);
410 mainPort_ = settings_->rx_serial_port;
414 send(
"lif, Identification \x0D");
418 settings_->polling_period_pvt);
421 settings_->polling_period_rest);
424 if (!settings_->login_user.empty() && !settings_->login_password.empty())
427 send(
"login, " + settings_->login_user +
", \"" +
428 settings_->login_password +
"\" \x0D");
430 send(
"login, " + settings_->login_user +
", " +
431 settings_->login_password +
" \x0D");
435 send(
"sso, all, none, none, off \x0D");
436 send(
"sno, all, none, none, off \x0D");
439 if (settings_->use_gnss_time)
440 send(
"sntp, on \x0D");
446 std::stringstream ss;
448 if (settings_->datum ==
"Default")
449 settings_->datum =
"WGS84";
450 ss <<
"sgd, " << settings_->datum <<
"\x0D";
456 std::stringstream blocks;
457 if (settings_->use_gnss_time)
459 blocks <<
" +ReceiverTime";
461 if (settings_->publish_pvtcartesian)
463 blocks <<
" +PVTCartesian";
465 if (settings_->publish_pvtgeodetic || settings_->publish_twist ||
466 (settings_->publish_navsatfix &&
467 (settings_->septentrio_receiver_type ==
"gnss")) ||
468 (settings_->publish_gpsfix &&
469 (settings_->septentrio_receiver_type ==
"gnss")) ||
470 (settings_->publish_pose &&
471 (settings_->septentrio_receiver_type ==
"gnss")))
473 blocks <<
" +PVTGeodetic";
475 if (settings_->publish_basevectorcart)
477 blocks <<
" +BaseVectorCart";
479 if (settings_->publish_basevectorgeod)
481 blocks <<
" +BaseVectorGeod";
483 if (settings_->publish_poscovcartesian)
485 blocks <<
" +PosCovCartesian";
487 if (settings_->publish_poscovgeodetic ||
488 (settings_->publish_navsatfix &&
489 (settings_->septentrio_receiver_type ==
"gnss")) ||
490 (settings_->publish_gpsfix &&
491 (settings_->septentrio_receiver_type ==
"gnss")) ||
492 (settings_->publish_pose &&
493 (settings_->septentrio_receiver_type ==
"gnss")))
495 blocks <<
" +PosCovGeodetic";
497 if (settings_->publish_velcovgeodetic || settings_->publish_twist ||
498 (settings_->publish_gpsfix &&
499 (settings_->septentrio_receiver_type ==
"gnss")))
501 blocks <<
" +VelCovGeodetic";
503 if (settings_->publish_atteuler ||
504 (settings_->publish_gpsfix &&
505 (settings_->septentrio_receiver_type ==
"gnss")) ||
506 (settings_->publish_pose &&
507 (settings_->septentrio_receiver_type ==
"gnss")))
509 blocks <<
" +AttEuler";
511 if (settings_->publish_attcoveuler ||
512 (settings_->publish_gpsfix &&
513 (settings_->septentrio_receiver_type ==
"gnss")) ||
514 (settings_->publish_pose &&
515 (settings_->septentrio_receiver_type ==
"gnss")))
517 blocks <<
" +AttCovEuler";
519 if (settings_->publish_measepoch || settings_->publish_gpsfix)
521 blocks <<
" +MeasEpoch";
523 if (settings_->publish_gpsfix)
525 blocks <<
" +ChannelStatus +DOP";
529 if (settings_->septentrio_receiver_type ==
"ins")
531 if (settings_->publish_insnavcart)
533 blocks <<
" +INSNavCart";
535 if (settings_->publish_insnavgeod || settings_->publish_navsatfix ||
536 settings_->publish_gpsfix || settings_->publish_pose ||
537 settings_->publish_imu || settings_->publish_localization ||
538 settings_->publish_tf || settings_->publish_twist)
540 blocks <<
" +INSNavGeod";
542 if (settings_->publish_exteventinsnavgeod)
544 blocks <<
" +ExtEventINSNavGeod";
546 if (settings_->publish_exteventinsnavcart)
548 blocks <<
" +ExtEventINSNavCart";
550 if (settings_->publish_extsensormeas || settings_->publish_imu)
552 blocks <<
" +ExtSensorMeas";
555 std::stringstream ss;
556 ss <<
"sso, Stream" << std::to_string(stream) <<
", " << mainPort_ <<
","
557 << blocks.str() <<
", " << pvt_interval <<
"\x0D";
563 std::stringstream blocks;
564 if (settings_->septentrio_receiver_type ==
"ins")
566 if (settings_->publish_imusetup)
568 blocks <<
" +IMUSetup";
570 if (settings_->publish_velsensorsetup)
572 blocks <<
" +VelSensorSetup";
575 if (settings_->publish_diagnostics)
577 blocks <<
" +ReceiverStatus +QualityInd";
580 blocks <<
" +ReceiverSetup";
582 std::stringstream ss;
583 ss <<
"sso, Stream" << std::to_string(stream) <<
", " << mainPort_ <<
","
584 << blocks.str() <<
", " << rest_interval <<
"\x0D";
591 send(
"snti, GP\x0D");
593 std::stringstream blocks;
594 if (settings_->publish_gpgga)
598 if (settings_->publish_gprmc)
602 if (settings_->publish_gpgsa)
606 if (settings_->publish_gpgsv)
611 std::stringstream ss;
612 ss <<
"sno, Stream" << std::to_string(stream) <<
", " << mainPort_ <<
","
613 << blocks.str() <<
", " << pvt_interval <<
"\x0D";
618 if ((settings_->septentrio_receiver_type ==
"ins") ||
619 settings_->ins_in_gnss_mode)
622 std::stringstream ss;
623 ss <<
"sat, Main, \"" << settings_->ant_type <<
"\""
630 std::stringstream ss;
631 ss <<
"sat, Aux1, \"" << settings_->ant_type <<
"\""
635 }
else if (settings_->septentrio_receiver_type ==
"gnss")
641 std::stringstream ss;
646 << settings_->ant_type <<
"\", " << settings_->ant_serial_nr
653 std::stringstream ss;
657 << settings_->ant_aux1_type <<
"\", " << settings_->ant_aux1_serial_nr
664 for (
auto ntrip : settings_->rtk_settings.ntrip)
666 if (!ntrip.id.empty())
669 send(
"snts, " + ntrip.id +
", off \x0D");
671 std::stringstream ss;
672 ss <<
"snts, " << ntrip.id <<
", Client, " << ntrip.caster <<
", "
673 << std::to_string(ntrip.caster_port) <<
", " << ntrip.username
674 <<
", " << ntrip.password <<
", " << ntrip.mountpoint <<
", "
675 << ntrip.version <<
", " << ntrip.send_gga <<
" \x0D";
680 std::stringstream ss;
681 ss <<
"sntt, " << ntrip.id <<
", on, \"" << ntrip.fingerprint
686 std::stringstream ss;
687 ss <<
"sntt, " << ntrip.id <<
", off \x0D";
693 for (
auto ip_server : settings_->rtk_settings.ip_server)
695 if (!ip_server.id.empty())
701 std::stringstream ss;
704 ss <<
"siss, " << ip_server.id <<
", "
705 << std::to_string(ip_server.port) <<
", TCP2Way \x0D";
709 std::stringstream ss;
710 ss <<
"sdio, " << ip_server.id <<
", " << ip_server.rtk_standard
711 <<
", +SBF+NMEA \x0D";
714 if (ip_server.send_gga !=
"off")
716 std::string rate = ip_server.send_gga;
717 if (ip_server.send_gga ==
"auto")
719 std::stringstream ss;
720 ss <<
"sno, Stream" << std::to_string(stream) <<
", " << ip_server.id
721 <<
", GGA, " << rate <<
" \x0D";
728 for (
auto serial : settings_->rtk_settings.serial)
730 if (!serial.port.empty())
732 if (serial.port.rfind(
"COM", 0) == 0)
733 send(
"scs, " + serial.port +
", baud" +
734 std::to_string(serial.baud_rate) +
735 ", bits8, No, bit1, none\x0D");
737 std::stringstream ss;
738 ss <<
"sdio, " << serial.port <<
", " << serial.rtk_standard
739 <<
", +SBF+NMEA \x0D";
741 if (serial.send_gga !=
"off")
743 std::string rate = serial.send_gga;
744 if (serial.send_gga ==
"auto")
746 std::stringstream ss;
747 ss <<
"sno, Stream" << std::to_string(stream) <<
", " << serial.port
748 <<
", GGA, " << rate <<
" \x0D";
756 if (settings_->multi_antenna)
758 send(
"sga, MultiAntenna \x0D");
761 send(
"sga, none \x0D");
771 std::stringstream ss;
781 "Please specify a valid parameter for heading and pitch");
786 if (settings_->septentrio_receiver_type ==
"ins")
790 std::stringstream ss;
807 "Please specify a correct value for IMU orientation angles");
820 std::stringstream ss;
833 "Please specify a correct value for x, y and z in the config file under ant_lever_arm");
846 std::stringstream ss;
857 "Please specify a correct value for poi_x, poi_y and poi_z in the config file under poi_lever_arm");
870 std::stringstream ss;
881 "Please specify a correct value for vsm_x, vsm_y and vsm_z in the config file under vsm_lever_arm");
888 std::stringstream ss;
889 ss <<
"sinc, off, all, MainAnt \x0D";
895 std::stringstream ss;
896 if (settings_->ins_use_poi)
898 ss <<
"sinc, on, all, "
904 ss <<
"sinc, on, all, "
913 std::stringstream ss;
914 if (settings_->ins_initial_heading ==
"auto")
916 ss <<
"siih, " << settings_->ins_initial_heading <<
" \x0D";
918 }
else if (settings_->ins_initial_heading ==
"stored")
920 ss <<
"siih, " << settings_->ins_initial_heading <<
" \x0D";
925 "Invalid mode specified for ins_initial_heading.");
936 std::stringstream ss;
946 "Please specify a valid AttStsDev and PosStdDev");
951 if (settings_->septentrio_receiver_type ==
"ins")
953 if (!settings_->ins_vsm_ip_server_id.empty())
955 send(
"siss, " + settings_->ins_vsm_ip_server_id +
", " +
956 std::to_string(settings_->ins_vsm_ip_server_port) +
958 send(
"sdio, IPS2, NMEA, none\x0D");
960 if (!settings_->ins_vsm_serial_port.empty())
962 if (settings_->ins_vsm_serial_port.rfind(
"COM", 0) == 0)
963 send(
"scs, " + settings_->ins_vsm_serial_port +
", baud" +
964 std::to_string(settings_->ins_vsm_serial_baud_rate) +
965 ", bits8, No, bit1, none\x0D");
966 send(
"sdio, " + settings_->ins_vsm_serial_port +
", NMEA\x0D");
968 if ((settings_->ins_vsm_ros_source ==
"odometry") ||
969 (settings_->ins_vsm_ros_source ==
"twist"))
972 s =
"sdio, " + mainPort_ +
", NMEA, +NMEA +SBF\x0D";
974 nmeaActivated_ =
true;
989 if (settings_->use_gnss_time || settings_->publish_gpst)
993 if (settings_->publish_gpgga)
995 handlers_.callbackmap_ = handlers_.insert<
GpggaMsg>(
"$GPGGA");
997 if (settings_->publish_gprmc)
999 handlers_.callbackmap_ = handlers_.insert<
GprmcMsg>(
"$GPRMC");
1001 if (settings_->publish_gpgsa)
1003 handlers_.callbackmap_ = handlers_.insert<
GpgsaMsg>(
"$GPGSA");
1005 if (settings_->publish_gpgsv)
1007 handlers_.callbackmap_ = handlers_.insert<
GpgsvMsg>(
"$GPGSV");
1008 handlers_.callbackmap_ = handlers_.insert<
GpgsvMsg>(
"$GLGSV");
1009 handlers_.callbackmap_ = handlers_.insert<
GpgsvMsg>(
"$GAGSV");
1010 handlers_.callbackmap_ = handlers_.insert<
GpgsvMsg>(
"$GBGSV");
1012 if (settings_->publish_pvtcartesian)
1016 if (settings_->publish_pvtgeodetic || settings_->publish_twist ||
1017 (settings_->publish_navsatfix &&
1018 (settings_->septentrio_receiver_type ==
"gnss")) ||
1019 (settings_->publish_gpsfix &&
1020 (settings_->septentrio_receiver_type ==
"gnss")) ||
1021 (settings_->publish_pose && (settings_->septentrio_receiver_type ==
"gnss")))
1023 handlers_.callbackmap_ = handlers_.insert<
PVTGeodeticMsg>(
"4007");
1025 if (settings_->publish_basevectorcart)
1029 if (settings_->publish_basevectorgeod)
1033 if (settings_->publish_poscovcartesian)
1037 if (settings_->publish_poscovgeodetic ||
1038 (settings_->publish_navsatfix &&
1039 (settings_->septentrio_receiver_type ==
"gnss")) ||
1040 (settings_->publish_gpsfix &&
1041 (settings_->septentrio_receiver_type ==
"gnss")) ||
1042 (settings_->publish_pose && (settings_->septentrio_receiver_type ==
"gnss")))
1046 if (settings_->publish_velcovgeodetic || settings_->publish_twist ||
1047 (settings_->publish_gpsfix &&
1048 (settings_->septentrio_receiver_type ==
"gnss")))
1052 if (settings_->publish_atteuler ||
1053 (settings_->publish_gpsfix &&
1054 (settings_->septentrio_receiver_type ==
"gnss")) ||
1055 (settings_->publish_pose && (settings_->septentrio_receiver_type ==
"gnss")))
1057 handlers_.callbackmap_ = handlers_.insert<
AttEulerMsg>(
"5938");
1059 if (settings_->publish_attcoveuler ||
1060 (settings_->publish_gpsfix &&
1061 (settings_->septentrio_receiver_type ==
"gnss")) ||
1062 (settings_->publish_pose && (settings_->septentrio_receiver_type ==
"gnss")))
1064 handlers_.callbackmap_ = handlers_.insert<
AttCovEulerMsg>(
"5939");
1066 if (settings_->publish_measepoch || settings_->publish_gpsfix)
1068 handlers_.callbackmap_ =
1069 handlers_.insert<int32_t>(
"4027");
1073 if (settings_->publish_insnavcart)
1075 handlers_.callbackmap_ = handlers_.insert<
INSNavCartMsg>(
"4225");
1077 if (settings_->publish_insnavgeod ||
1078 (settings_->publish_navsatfix &&
1079 (settings_->septentrio_receiver_type ==
"ins")) ||
1080 (settings_->publish_gpsfix &&
1081 (settings_->septentrio_receiver_type ==
"ins")) ||
1082 (settings_->publish_pose &&
1083 (settings_->septentrio_receiver_type ==
"ins")) ||
1084 (settings_->publish_imu && (settings_->septentrio_receiver_type ==
"ins")) ||
1085 (settings_->publish_localization &&
1086 (settings_->septentrio_receiver_type ==
"ins")) ||
1087 (settings_->publish_twist &&
1088 (settings_->septentrio_receiver_type ==
"ins")) ||
1089 (settings_->publish_tf && (settings_->septentrio_receiver_type ==
"ins")))
1091 handlers_.callbackmap_ = handlers_.insert<
INSNavGeodMsg>(
"4226");
1093 if (settings_->publish_imusetup)
1095 handlers_.callbackmap_ = handlers_.insert<
IMUSetupMsg>(
"4224");
1097 if (settings_->publish_extsensormeas || settings_->publish_imu)
1101 if (settings_->publish_exteventinsnavgeod)
1103 handlers_.callbackmap_ = handlers_.insert<
INSNavGeodMsg>(
"4230");
1105 if (settings_->publish_velsensorsetup)
1109 if (settings_->publish_exteventinsnavcart)
1111 handlers_.callbackmap_ = handlers_.insert<
INSNavCartMsg>(
"4229");
1113 if (settings_->publish_gpst)
1115 handlers_.callbackmap_ = handlers_.insert<int32_t>(
"GPST");
1117 if (settings_->septentrio_receiver_type ==
"gnss")
1119 if (settings_->publish_navsatfix)
1121 handlers_.callbackmap_ = handlers_.insert<
NavSatFixMsg>(
"NavSatFix");
1124 if (settings_->septentrio_receiver_type ==
"ins")
1126 if (settings_->publish_navsatfix)
1128 handlers_.callbackmap_ = handlers_.insert<
NavSatFixMsg>(
"INSNavSatFix");
1131 if (settings_->septentrio_receiver_type ==
"gnss")
1133 if (settings_->publish_gpsfix)
1135 handlers_.callbackmap_ = handlers_.insert<
GPSFixMsg>(
"GPSFix");
1138 handlers_.callbackmap_ =
1139 handlers_.insert<int32_t>(
"4013");
1140 handlers_.callbackmap_ = handlers_.insert<int32_t>(
"4001");
1143 if (settings_->septentrio_receiver_type ==
"ins")
1145 if (settings_->publish_gpsfix)
1147 handlers_.callbackmap_ = handlers_.insert<
GPSFixMsg>(
"INSGPSFix");
1148 handlers_.callbackmap_ =
1149 handlers_.insert<int32_t>(
"4013");
1150 handlers_.callbackmap_ = handlers_.insert<int32_t>(
"4001");
1153 if (settings_->septentrio_receiver_type ==
"gnss")
1155 if (settings_->publish_pose)
1158 "PoseWithCovarianceStamped");
1161 if (settings_->septentrio_receiver_type ==
"ins")
1163 if (settings_->publish_pose)
1166 "INSPoseWithCovarianceStamped");
1169 if (settings_->publish_diagnostics)
1171 handlers_.callbackmap_ =
1173 handlers_.callbackmap_ =
1174 handlers_.insert<int32_t>(
"4014");
1175 handlers_.callbackmap_ =
1176 handlers_.insert<int32_t>(
"4082");
1178 if (settings_->septentrio_receiver_type ==
"ins")
1180 if (settings_->publish_localization || settings_->publish_tf)
1182 handlers_.callbackmap_ =
1186 handlers_.callbackmap_ =
1187 handlers_.insert<int32_t>(
"5902");
1198 manager_.get()->send(cmd);
1206 manager_.get()->send(velNmea);
1217 new boost::asio::io_service);
1218 boost::asio::ip::tcp::resolver::iterator endpoint;
1222 boost::asio::ip::tcp::resolver resolver(*io_service);
1229 endpoint = resolver.resolve(boost::asio::ip::tcp::resolver::query(
1231 }
catch (std::runtime_error& e)
1233 throw std::runtime_error(
"Could not resolve " + host +
" on port " + port +
1239 new boost::asio::ip::tcp::socket(*io_service));
1247 socket->connect(*endpoint);
1248 socket->set_option(boost::asio::ip::tcp::no_delay(
true));
1249 }
catch (std::runtime_error& e)
1251 throw std::runtime_error(
"Could not connect to " + endpoint->host_name() +
1252 ": " + endpoint->service_name() +
": " + e.what());
1256 node_->log(
LogLevel::INFO,
"Connected to " + endpoint->host_name() +
":" +
1257 endpoint->service_name() +
".");
1263 "You have called the InitializeTCP() method though an AsyncManager object is already available! Start all anew..");
1274 node_->log(
LogLevel::DEBUG,
"Calling initializeSBFFileReading() method..");
1275 std::size_t buffer_size = 8192;
1276 uint8_t* to_be_parsed;
1277 to_be_parsed =
new uint8_t[buffer_size];
1278 std::ifstream bin_file(file_name, std::ios::binary);
1279 std::vector<uint8_t> vec_buf;
1280 if (bin_file.good())
1284 std::vector<uint8_t> v_buf((std::istreambuf_iterator<char>(bin_file)),
1285 (std::istreambuf_iterator<char>()));
1290 throw std::runtime_error(
"I could not find your file. Or it is corrupted.");
1293 to_be_parsed = vec_buf.data();
1294 std::stringstream ss;
1295 ss <<
"Opened and copied over from " << file_name;
1304 "Calling read_callback_() method, with number of bytes to be parsed being " +
1306 handlers_.readCallback(node_->getTime(), to_be_parsed, buffer_size);
1307 }
catch (std::size_t& parsing_failed_here)
1309 if (to_be_parsed - vec_buf.data() >= vec_buf.size() *
sizeof(uint8_t))
1313 to_be_parsed = to_be_parsed + parsing_failed_here;
1315 "Parsing_failed_here is " + parsing_failed_here);
1318 if (to_be_parsed - vec_buf.data() >= vec_buf.size() *
sizeof(uint8_t))
1322 to_be_parsed = to_be_parsed + buffer_size;
1324 node_->log(
LogLevel::DEBUG,
"Leaving initializeSBFFileReading() method..");
1329 node_->log(
LogLevel::DEBUG,
"Calling initializePCAPFileReading() method..");
1333 if (!device.
connect(file_name.c_str()))
1335 node_->log(
LogLevel::ERROR,
"Unable to find file or either it is corrupted");
1345 uint8_t* to_be_parsed =
new uint8_t[buffer_size];
1346 to_be_parsed = vec_buf.data();
1354 "Calling read_callback_() method, with number of bytes to be parsed being " +
1356 handlers_.readCallback(node_->getTime(), to_be_parsed, buffer_size);
1357 }
catch (std::size_t& parsing_failed_here)
1359 if (to_be_parsed - vec_buf.data() >= vec_buf.size() *
sizeof(uint8_t))
1363 if (!parsing_failed_here)
1364 parsing_failed_here = 1;
1366 to_be_parsed = to_be_parsed + parsing_failed_here;
1368 "Parsing_failed_here is " + parsing_failed_here);
1371 if (to_be_parsed - vec_buf.data() >= vec_buf.size() *
sizeof(uint8_t))
1375 to_be_parsed = to_be_parsed + buffer_size;
1377 node_->log(
LogLevel::DEBUG,
"Leaving initializePCAPFileReading() method..");
1381 std::string flowcontrol)
1384 serial_port_ = port;
1385 baudrate_ = baudrate;
1389 new boost::asio::io_service);
1392 new boost::asio::serial_port(*io_service));
1397 serial->open(serial_port_);
1398 }
catch (std::runtime_error& e)
1401 throw std::runtime_error(
"Could not open serial port : " + serial_port_ +
1406 node_->log(
LogLevel::INFO,
"Opened serial port " + serial_port_);
1408 "Our boost version is " + std::to_string(BOOST_VERSION) +
".");
1409 if (BOOST_VERSION < 106600)
1417 int fd = serial->native_handle();
1421 tcgetattr(fd, &tio);
1424 if (flowcontrol ==
"RTS|CTS")
1426 tio.c_iflag &= ~(IXOFF | IXON);
1427 tio.c_cflag |= CRTSCTS;
1430 tio.c_iflag &= ~(IXOFF | IXON);
1431 tio.c_cflag &= ~CRTSCTS;
1439 tcsetattr(fd, TCSANOW, &tio);
1442 struct serial_struct serialInfo;
1444 ioctl(fd, TIOCGSERIAL, &serialInfo);
1445 serialInfo.flags |= ASYNC_LOW_LATENCY;
1446 ioctl(fd, TIOCSSERIAL, &serialInfo);
1454 "You have called the initializeSerial() method though an AsyncManager object is already available! Start all anew..");
1463 "Gradually increasing the baudrate to the desired value...");
1464 boost::asio::serial_port_base::baud_rate current_baudrate;
1473 }
catch (boost::system::system_error& e)
1477 "get_option failed due to " + std::string(e.what()));
1479 boost::diagnostic_information(e));
1493 "Current baudrate is " + std::to_string(current_baudrate.value()));
1496 if (current_baudrate.value() == baudrate_)
1508 boost::asio::serial_port_base::baud_rate(
BAUDRATES[i]));
1509 }
catch (boost::system::system_error& e)
1513 "set_option failed due to " + std::string(e.what()));
1515 boost::diagnostic_information(e));
1518 usleep(SET_BAUDRATE_SLEEP_);
1524 serial->get_option(current_baudrate);
1525 }
catch (boost::system::system_error& e)
1529 "get_option failed due to " + std::string(e.what()));
1531 boost::diagnostic_information(e));
1542 std::to_string(current_baudrate.value()));
1545 std::to_string(current_baudrate.value()) +
1546 ", leaving InitializeSerial() method");
1552 namespace bp = boost::placeholders;
1559 bp::_1, bp::_2, bp::_3));