31 #ifndef SBFStructs_HPP 32 #define SBFStructs_HPP 37 #ifndef NR_OF_LOGICALCHANNELS 38 #define NR_OF_LOGICALCHANNELS 80 40 #ifndef MAX_NB_INMARSATCHANNELS 42 #define MAX_NB_INMARSATCHANNELS 1 44 #ifndef MAX_NR_OF_SIGNALS_PER_SATELLITE 46 #define MAX_NR_OF_SIGNALS_PER_SATELLITE 7 48 #ifndef NR_OF_ANTENNAS 50 #define NR_OF_ANTENNAS 3 52 #ifndef MAXSB_NBRANTENNA 54 #define MAXSB_NBRANTENNA 4 56 #ifndef MAXSB_CHANNELSATINFO 58 #define MAXSB_CHANNELSATINFO (NR_OF_LOGICALCHANNELS + MAX_NB_INMARSATCHANNELS) 60 #ifndef MAXSB_CHANNELSTATEINFO 62 #define MAXSB_CHANNELSTATEINFO (MAXSB_CHANNELSATINFO * MAXSB_NBRANTENNA) 64 #ifndef MAXSB_MEASEPOCH_T1 66 #define MAXSB_MEASEPOCH_T1 (NR_OF_LOGICALCHANNELS + MAX_NB_INMARSATCHANNELS) 68 #ifndef MAXSB_MEASEPOCH_T2 70 #define MAXSB_MEASEPOCH_T2 ((MAXSB_MEASEPOCH_T1) * (((MAX_NR_OF_SIGNALS_PER_SATELLITE) * (NR_OF_ANTENNAS)) - 1)) 72 #ifndef SBF_INSNAVGEOD_LENGTH_1 74 #define SBF_INSNAVGEOD_LENGTH_1 16 76 #ifndef SBF_INSNAVCART_LENGTH_1 78 #define SBF_INSNAVCART_LENGTH_1 16 80 #ifndef SBF_EXTEVENTINSNAVGEOD_LENGTH_1 82 #define SBF_EXTEVENTINSNAVGEOD_LENGTH_1 16 84 #ifndef SBF_EXTEVENTINSNAVCART_LENGTH_1 86 #define SBF_EXTEVENTINSNAVCART_LENGTH_1 16 88 #ifndef SBF_CHANNELSTATUS_DATA_LENGTH 90 #define SBF_CHANNELSTATUS_DATA_LENGTH \ 91 MAXSB_CHANNELSATINFO * sizeof(ChannelSatInfo) + \ 92 MAXSB_CHANNELSTATEINFO * sizeof(ChannelStateInfo) 94 #ifndef MEASEPOCH_DATA_LENGTH 96 #define MEASEPOCH_DATA_LENGTH \ 97 (MAXSB_MEASEPOCH_T1 * sizeof(MeasEpochChannelType1) + \ 98 MAXSB_MEASEPOCH_T2 * sizeof(MeasEpochChannelType2)) 100 #ifndef SBF_EXTSENSORMEAS_1_0_EXTSENSORMEAS_LENGTH 102 #define SBF_EXTSENSORMEAS_1_0_EXTSENSORMEAS_LENGTH 4 106 #define SBF_INSNAVCART_LENGTH SBF_INSNAVCART_LENGTH_1 107 #define SBF_EXTSENSORMEAS_1_EXTSENSORMEAS_LENGTH SBF_EXTSENSORMEAS_1_0_EXTSENSORMEAS_LENGTH 108 #define SBF_EXTEVENTINSNAVCART_LENGTH SBF_EXTEVENTINSNAVCART_LENGTH_1 109 #define SBF_EXTEVENTINSNAVGEOD_LENGTH SBF_EXTEVENTINSNAVGEOD_LENGTH_1 110 #define SBF_INSNAVGEOD_LENGTH SBF_INSNAVGEOD_LENGTH_1 120 #include <boost/spirit/include/qi.hpp> 292 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108, 0x9129,
293 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210, 0x3273, 0x2252,
294 0x52b5, 0x4294, 0x72f7, 0x62d6, 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c,
295 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
296 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, 0x3653, 0x2672,
297 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,
298 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861,
299 0x2802, 0x3823, 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
300 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,
301 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5,
302 0x2c22, 0x3c03, 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b,
303 0x8d68, 0x9d49, 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
304 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, 0x9188, 0x81a9,
305 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1, 0x30c2, 0x20e3,
306 0x5004, 0x4025, 0x7046, 0x6067, 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c,
307 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
308 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, 0x34e2, 0x24c3,
309 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,
310 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676,
311 0x4615, 0x5634, 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
312 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c,
313 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, 0x4a75, 0x5a54, 0x6a37, 0x7a16,
314 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b,
315 0x9de8, 0x8dc9, 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
316 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 0x6e17, 0x7e36,
317 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0};
319 namespace qi = boost::spirit::qi;
328 static_assert(std::is_same<uint16_t, T>::value ||
329 std::is_same<uint32_t, T>::value ||
330 std::is_same<float, T>::value ||
331 std::is_same<double, T>::value);
332 if (std::is_same<uint16_t, T>::value)
334 return (s != static_cast<uint16_t>(65535));
336 else if (std::is_same<uint32_t, T>::value)
338 return (s != 4294967295u);
340 else if (std::is_same<float, T>::value)
342 return (s != -2e10f);
344 else if (std::is_same<double, T>::value)
357 static_assert(std::is_same<float, T>::value ||
358 std::is_same<double, T>::value);
359 if (std::is_same<float, T>::value)
363 else if (std::is_same<double, T>::value)
373 template<
typename It,
typename Val>
376 static_assert(std::is_same<int8_t, Val>::value ||
377 std::is_same<uint8_t, Val>::value ||
378 std::is_same<int16_t, Val>::value ||
379 std::is_same<uint16_t, Val>::value ||
380 std::is_same<int32_t, Val>::value ||
381 std::is_same<uint32_t, Val>::value ||
382 std::is_same<int64_t, Val>::value ||
383 std::is_same<uint64_t, Val>::value ||
384 std::is_same<float, Val>::value ||
385 std::is_same<double, Val>::value);
387 if (std::is_same<int8_t, Val>::value)
389 return qi::parse(it, it + 1, qi::char_, val);
391 else if (std::is_same<uint8_t, Val>::value)
393 return qi::parse(it, it + 1, qi::byte_, val);
395 else if ((std::is_same<int16_t, Val>::value) || (std::is_same<uint16_t, Val>::value))
397 return qi::parse(it, it + 2, qi::little_word, val);
399 else if ((std::is_same<int32_t, Val>::value) || (std::is_same<uint32_t, Val>::value))
401 return qi::parse(it, it + 4, qi::little_dword, val);
403 else if ((std::is_same<int64_t, Val>::value) || (std::is_same<uint64_t, Val>::value))
405 return qi::parse(it, it + 8, qi::little_qword, val);
407 else if (std::is_same<float, Val>::value)
409 return qi::parse(it, it + 4, qi::little_bin_float, val);
411 else if (std::is_same<double, Val>::value)
413 return qi::parse(it, it + 8, qi::little_bin_double, val);
421 template<
typename It>
424 bool success =
false;
426 success = qi::parse(it, it + num, qi::repeat(num)[qi::char_], val);
428 val.erase(std::remove(val.begin(), val.end(),
'\0'), val.end());
436 template<
typename It,
typename Hdr>
454 block_header.id = ID & 8191;
455 block_header.revision = ID >> 13;
466 template<
typename It>
474 std::advance(it, sb2_length - 8);
481 template<
typename It>
498 std::advance(it, sb1_length - 12);
511 template<
typename It>
524 node->
log(
LogLevel::ERROR,
"Parse error: Too many ChannelSatInfo " + std::to_string(msg.
n));
531 for (
auto& satInfo : msg.
satInfo)
548 template<
typename It>
563 msg.
pdop = temp / 100.0;
565 msg.
tdop = temp / 100.0;
567 msg.
hdop = temp / 100.0;
569 msg.
vdop = temp / 100.0;
584 template<
typename It>
596 std::advance(it, sb2_length - 12);
603 template<
typename It>
618 std::advance(it, sb1_length - 20);
621 node->
log(
LogLevel::ERROR,
"Parse error: Too many MeasEpochChannelType2 " + std::to_string(msg.n2));
624 msg.type2.resize(msg.n2);
625 for (
auto& type2 : msg.type2)
636 template<
typename It>
641 if (msg.block_header.id != 4027)
643 node->
log(
LogLevel::ERROR,
"Parse error: Wrong header ID " + std::to_string(msg.block_header.id));
649 node->
log(
LogLevel::ERROR,
"Parse error: Too many MeasEpochChannelType1 " + std::to_string(msg.n));
655 if (msg.block_header.revision > 0)
658 msg.type1.resize(msg.n);
659 for (
auto& type1 : msg.type1)
676 template<
typename It>
733 template<
typename It>
738 if (msg.block_header.id != 4006)
740 node->
log(
LogLevel::ERROR,
"Parse error: Wrong header ID " + std::to_string(msg.block_header.id));
763 if (msg.block_header.revision > 0)
768 if (msg.block_header.revision > 1)
787 template<
typename It>
792 if (msg.block_header.id != 4007)
794 node->
log(
LogLevel::ERROR,
"Parse error: Wrong header ID " + std::to_string(msg.block_header.id));
817 if (msg.block_header.revision > 0)
822 if (msg.block_header.revision > 1)
841 template<
typename It>
846 if (msg.block_header.id != 5938)
848 node->
log(
LogLevel::ERROR,
"Parse error: Wrong header ID " + std::to_string(msg.block_header.id));
861 if (use_ros_axis_orientation)
864 msg.heading = -msg.heading + 90;
866 msg.pitch = -msg.pitch;
868 msg.pitch_dot = -msg.pitch_dot;
870 msg.heading_dot = -msg.heading_dot;
884 template<
typename It>
889 if (msg.block_header.id != 5939)
891 node->
log(
LogLevel::ERROR,
"Parse error: Wrong header ID " + std::to_string(msg.block_header.id));
902 if (use_ros_axis_orientation)
905 msg.cov_headroll = -msg.cov_headroll;
907 msg.cov_pitchroll = -msg.cov_pitchroll;
921 template<
typename It>
926 if ((msg.block_header.id != 4225) && (msg.block_header.id != 4229))
928 node->
log(
LogLevel::ERROR,
"Parse error: Wrong header ID " + std::to_string(msg.block_header.id));
943 if((msg.sb_list & 1) !=0)
955 if((msg.sb_list & 2) !=0)
960 if (use_ros_axis_orientation)
963 msg.heading = -msg.heading + 90;
965 msg.pitch = -msg.pitch;
974 if((msg.sb_list & 4) !=0)
986 if((msg.sb_list & 8) !=0)
998 if((msg.sb_list & 16) !=0)
1010 if((msg.sb_list & 32) !=0)
1022 if((msg.sb_list & 64) !=0)
1027 if (use_ros_axis_orientation)
1030 msg.heading_roll_cov = -msg.heading_roll_cov;
1032 msg.pitch_roll_cov = -msg.pitch_roll_cov;
1041 if((msg.sb_list & 128) !=0)
1065 template<
typename It>
1070 if (msg.block_header.id != 5905)
1072 node->
log(
LogLevel::ERROR,
"Parse error: Wrong header ID " + std::to_string(msg.block_header.id));
1099 template<
typename It>
1104 if (msg.block_header.id != 5906)
1106 node->
log(
LogLevel::ERROR,
"Parse error: Wrong header ID " + std::to_string(msg.block_header.id));
1133 template<
typename It>
1138 if (msg.block_header.id != 5907)
1140 node->
log(
LogLevel::ERROR,
"Parse error: Wrong header ID " + std::to_string(msg.block_header.id));
1167 template<
typename It>
1172 if (msg.block_header.id != 5908)
1174 node->
log(
LogLevel::ERROR,
"Parse error: Wrong header ID " + std::to_string(msg.block_header.id));
1201 template<
typename It>
1219 std::vector<uint16_t> indicators;
1236 template<
typename It>
1243 std::advance(it, sb_length - 4);
1250 template<
typename It>
1291 template<
typename It>
1296 if ((msg.block_header.id != 4226) && (msg.block_header.id != 4230))
1298 node->
log(
LogLevel::ERROR,
"Parse error: Wrong header ID " + std::to_string(msg.block_header.id));
1314 if((msg.sb_list & 1) !=0)
1326 if((msg.sb_list & 2) !=0)
1331 if (use_ros_axis_orientation)
1334 msg.heading = -msg.heading + 90;
1336 msg.pitch = -msg.pitch;
1345 if((msg.sb_list & 4) !=0)
1357 if((msg.sb_list & 8) !=0)
1369 if((msg.sb_list & 16) !=0)
1381 if((msg.sb_list & 32) !=0)
1393 if((msg.sb_list & 64) !=0)
1398 if (use_ros_axis_orientation)
1401 msg.heading_roll_cov = -msg.heading_roll_cov;
1403 msg.pitch_roll_cov = -msg.pitch_roll_cov;
1412 if((msg.sb_list & 128) !=0)
1436 template<
typename It>
1441 if (msg.block_header.id != 4224)
1443 node->
log(
LogLevel::ERROR,
"Parse error: Wrong header ID " + std::to_string(msg.block_header.id));
1454 if (use_ros_axis_orientation)
1456 msg.ant_lever_arm_y = -msg.ant_lever_arm_y;
1457 msg.ant_lever_arm_z = -msg.ant_lever_arm_z;
1472 template<
typename It>
1477 if (msg.block_header.id != 4244)
1479 node->
log(
LogLevel::ERROR,
"Parse error: Wrong header ID " + std::to_string(msg.block_header.id));
1487 if (use_ros_axis_orientation)
1489 msg.lever_arm_y = -msg.lever_arm_y;
1490 msg.lever_arm_z = -msg.lever_arm_z;
1504 template<
typename It>
1509 if (msg.block_header.id != 4050)
1511 node->
log(
LogLevel::ERROR,
"Parse error: Wrong header ID " + std::to_string(msg.block_header.id));
1516 if (msg.sb_length != 28)
1518 node->
log(
LogLevel::ERROR,
"Parse error: Wrong sb_length " + std::to_string(msg.sb_length));
1522 msg.acceleration_x = std::numeric_limits<double>::quiet_NaN();
1523 msg.acceleration_y = std::numeric_limits<double>::quiet_NaN();
1524 msg.acceleration_z = std::numeric_limits<double>::quiet_NaN();
1526 msg.angular_rate_x = std::numeric_limits<double>::quiet_NaN();
1527 msg.angular_rate_y = std::numeric_limits<double>::quiet_NaN();
1528 msg.angular_rate_z = std::numeric_limits<double>::quiet_NaN();
1530 msg.velocity_x = std::numeric_limits<double>::quiet_NaN();
1531 msg.velocity_y = std::numeric_limits<double>::quiet_NaN();
1532 msg.velocity_z = std::numeric_limits<double>::quiet_NaN();
1534 msg.std_dev_x = std::numeric_limits<double>::quiet_NaN();
1535 msg.std_dev_y = std::numeric_limits<double>::quiet_NaN();
1536 msg.std_dev_z = std::numeric_limits<double>::quiet_NaN();
1538 msg.sensor_temperature = -32768.0f;
1539 msg.zero_velocity_flag = std::numeric_limits<double>::quiet_NaN();
1541 msg.source.resize(msg.n);
1542 msg.sensor_model.resize(msg.n);
1543 msg.type.resize(msg.n);
1544 msg.obs_info.resize(msg.n);
1545 for (
size_t i = 0; i < msg.n; i++)
1552 switch (msg.type[i])
1559 if (!use_ros_axis_orientation)
1562 msg.acceleration_y = -msg.acceleration_y;
1564 msg.acceleration_z = -msg.acceleration_z;
1573 if (!use_ros_axis_orientation)
1576 msg.angular_rate_y = -msg.angular_rate_y;
1578 msg.angular_rate_z = -msg.angular_rate_z;
1584 qi::parse(it, it + 2, qi::little_word, msg.sensor_temperature);
1585 msg.sensor_temperature /= 100.0f;
1586 std::advance(it, 22);
1597 if (use_ros_axis_orientation)
1600 msg.velocity_y = -msg.velocity_y;
1602 msg.velocity_z = -msg.velocity_z;
1609 std::advance(it, 16);
1614 node->
log(
LogLevel::ERROR,
"Unknown external sensor measurement type in SBF ExtSensorMeas.");
1615 std::advance(it, 24);
1628 #endif // SBFStructs_HPP
bool qiCharsToStringParser(It &it, std::string &val, std::size_t num)
Qi parser for char array to string.
septentrio_gnss_driver::VelCovGeodetic VelCovGeodeticMsg
static const std::array< uint16_t, 256 > CRC_LOOK_UP
CRC look-up table for fast computation of the 16-bit CRC for SBF blocks.
septentrio_gnss_driver::AttCovEuler AttCovEulerMsg
std::string ant_serial_nbr
void MeasEpochChannelType2Parser(It &it, MeasEpochChannelType2Msg &msg, uint8_t sb2_length)
Qi based parser for the SBF sub-block "MeasEpochChannelType2".
std::vector< ChannelStateInfo > stateInfo
bool ExtSensorMeasParser(ROSaicNodeBase *node, It it, It itEnd, ExtSensorMeasMsg &msg, bool use_ros_axis_orientation)
Qi based parser for the SBF block "ExtSensorMeas".
bool PVTCartesianParser(ROSaicNodeBase *node, It it, It itEnd, PVTCartesianMsg &msg)
Qi based parser for the SBF block "PVTCartesian".
bool IMUSetupParser(ROSaicNodeBase *node, It it, It itEnd, IMUSetupMsg &msg, bool use_ros_axis_orientation)
Qi based parser for the SBF block "IMUSetup".
void AgcStateParser(It it, AgcState &msg, uint8_t sb_length)
Struct for the SBF sub-block "AGCState".
bool QualityIndParser(ROSaicNodeBase *node, It it, It itEnd, QualityInd &msg)
Qi based parser for the SBF block "QualityInd".
bool PVTGeodeticParser(ROSaicNodeBase *node, It it, It itEnd, PVTGeodeticMsg &msg)
Qi based parser for the SBF block "PVTGeodetic".
septentrio_gnss_driver::PVTGeodetic PVTGeodeticMsg
septentrio_gnss_driver::VelSensorSetup VelSensorSetupMsg
septentrio_gnss_driver::INSNavCart INSNavCartMsg
bool INSNavCartParser(ROSaicNodeBase *node, It it, It itEnd, INSNavCartMsg &msg, bool use_ros_axis_orientation)
Qi based parser for the SBF block "INSNavCart".
std::vector< uint16_t > indicators
Struct for the SBF sub-block "AGCState".
septentrio_gnss_driver::MeasEpoch MeasEpochMsg
septentrio_gnss_driver::ExtSensorMeas ExtSensorMeasMsg
Struct for the SBF block "DOP".
void log(LogLevel logLevel, const std::string &s)
Log function to provide abstraction of ROS loggers.
double wrapAngle180to180(double angle)
Wraps an angle between -180 and 180 degrees.
bool ReceiverStatusParser(ROSaicNodeBase *node, It it, It itEnd, ReceiverStatus &msg)
Struct for the SBF block "ReceiverStatus".
septentrio_gnss_driver::AttEuler AttEulerMsg
bool AttCovEulerParser(ROSaicNodeBase *node, It it, It itEnd, AttCovEulerMsg &msg, bool use_ros_axis_orientation)
Qi based parser for the SBF block "AttCovEuler".
septentrio_gnss_driver::IMUSetup IMUSetupMsg
septentrio_gnss_driver::MeasEpochChannelType2 MeasEpochChannelType2Msg
Struct for the SBF block "QualityInd".
void setDoNotUse(T &s)
Sets scalar to Do-Not-Use value -2e10.
bool VelSensorSetupParser(ROSaicNodeBase *node, It it, It itEnd, VelSensorSetupMsg &msg, bool use_ros_axis_orientation)
Qi based parser for the SBF block "VelSensorSetup".
bool MeasEpochParser(ROSaicNodeBase *node, It it, It itEnd, MeasEpochMsg &msg)
bool ChannelStatusParser(ROSaicNodeBase *node, It it, It itEnd, ChannelStatus &msg)
Qi based parser for the SBF block "ChannelStatus".
bool ChannelSatInfoParser(ROSaicNodeBase *node, It &it, ChannelSatInfo &msg, uint8_t sb1_length, uint8_t sb2_length)
Qi based parser or the SBF sub-block "ChannelSatInfo".
#define MAXSB_MEASEPOCH_T2
Max number of bytes that MeasEpochChannelType2 sub-block can consist of.
bool AttEulerParser(ROSaicNodeBase *node, It it, It itEnd, AttEulerMsg &msg, bool use_ros_axis_orientation)
Qi based parser for the SBF block "AttEuler".
bool PosCovGeodeticParser(ROSaicNodeBase *node, It it, It itEnd, PosCovGeodeticMsg &msg)
Qi based parser for the SBF block "PosCovGeodetic".
static const uint8_t SBF_SYNC_BYTE_1
0x24 is ASCII for $ - 1st byte in each message
bool INSNavGeodParser(ROSaicNodeBase *node, It it, It itEnd, INSNavGeodMsg &msg, bool use_ros_axis_orientation)
Qi based parser for the SBF block "INSNavGeod".
bool BlockHeaderParser(ROSaicNodeBase *node, It &it, Hdr &block_header)
Qi based parser for the SBF block "BlockHeader" plus receiver time stamp.
std::vector< AgcState > agc_state
septentrio_gnss_driver::MeasEpochChannelType1 MeasEpochChannelType1Msg
Declares utility functions used when parsing messages.
bool MeasEpochChannelType1Parser(ROSaicNodeBase *node, It &it, MeasEpochChannelType1Msg &msg, uint8_t sb1_length, uint8_t sb2_length)
bool ReceiverSetupParser(ROSaicNodeBase *node, It it, It itEnd, ReceiverSetup &msg)
Qi based parser for the SBF block "ReceiverSetup".
septentrio_gnss_driver::INSNavGeod INSNavGeodMsg
Struct for the SBF block "ChannelStatus".
septentrio_gnss_driver::VelCovCartesian VelCovCartesianMsg
void ChannelStateInfoParser(It &it, ChannelStateInfo &msg, uint8_t sb2_length)
Qi based parser for the SBF sub-block "ChannelStateInfo".
static const uint8_t SBF_SYNC_BYTE_2
0x40 is ASCII for @ - 2nd byte to indicate SBF block
bool PosCovCartesianParser(ROSaicNodeBase *node, It it, It itEnd, PosCovCartesianMsg &msg)
Qi based parser for the SBF block "PosCovCartesian".
bool VelCovCartesianParser(ROSaicNodeBase *node, It it, It itEnd, VelCovCartesianMsg &msg)
Qi based parser for the SBF block "VelCovCartesian".
septentrio_gnss_driver::PosCovGeodetic PosCovGeodeticMsg
septentrio_gnss_driver::PosCovCartesian PosCovCartesianMsg
bool validValue(T s)
Check if value is not set to Do-Not-Use -2e10.
std::vector< ChannelSatInfo > satInfo
std::string marker_number
Struct for the SBF block "ReceiverStatus".
std::string rx_serial_number
This class is the base class for abstraction.
bool qiLittleEndianParser(It &it, Val &val)
Qi little endian parsers for numeric values.
std::string gnss_fw_version
#define MAXSB_CHANNELSATINFO
Max number of bytes that ChannelSatInfo sub-block can consist of.
Struct for the SBF block "ReceiverSetup".
Struct for the SBF sub-block "ChannelSatInfo".
#define MAXSB_MEASEPOCH_T1
Max number of bytes that MeasEpochChannelType1 sub-block can consist of.
septentrio_gnss_driver::PVTCartesian PVTCartesianMsg
bool VelCovGeodeticParser(ROSaicNodeBase *node, It it, It itEnd, VelCovGeodeticMsg &msg)
Qi based parser for the SBF block "VelCovGeodetic".
bool DOPParser(ROSaicNodeBase *node, It it, It itEnd, DOP &msg)
Qi based parser for the SBF block "DOP".
Struct for the SBF sub-block "ChannelStateInfo".