Program Listing for File ubx_cfg_item.hpp

Return to documentation for file (/tmp/ws/src/ublox_dgnss/ublox_dgnss_node/include/ublox_dgnss_node/ubx/ubx_cfg_item.hpp)

// Copyright 2021 Australian Robotics Supplies & Technology
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef UBLOX_DGNSS_NODE__UBX__UBX_CFG_ITEM_HPP_
#define UBLOX_DGNSS_NODE__UBX__UBX_CFG_ITEM_HPP_
#include <unistd.h>
#include <map>
#include <list>
#include <string>
#include <sstream>
#include "ublox_dgnss_node/ubx/ubx_types.hpp"
#include "ublox_dgnss_node/ubx/ubx.hpp"

namespace ubx::cfg
{
size_t storage_size_bytes(u8_t storage_size_id)
{
  size_t size = 0;
  switch (storage_size_id) {
    case 0x01: size = 1; break;
    case 0x02: size = 1; break;
    case 0x03: size = 2; break;
    case 0x04: size = 4; break;
    case 0x05: size = 8; break;
    default:
      size = 0;
  }
  return size;
}

union ubx_key_id_t {
  u4_t all;
  struct  ubx_key_id_bit_t
  {
    u2_t item_id : 12;
    u1_t reserved2 : 4;
    u1_t group_id : 8;
    u1_t reserverd1 : 4;
    u1_t storage_size_id : 3;
    u1_t reserved0 : 1;
  } bits;
  u4_t key_id()
  {
    return all;
  }
  u1_t storage_size_id()
  {
    return bits.storage_size_id;
  }
  u1_t group_id()
  {
    return bits.group_id;
  }
  u2_t item_id()
  {
    return bits.item_id;
  }                                         // actually 12 bits
  size_t storage_size()
  {
    return storage_size_bytes(bits.storage_size_id);
  }
  std::string to_hex()
  {
    std::ostringstream oss;
    oss << "0x" << std::setfill('0') << std::setw(8) << std::right << std::hex << +all;
    return oss.str();
  }
};


struct key_value_t
{
  ubx_key_id_t ubx_key_id;
  value_t ubx_value;
};

enum ubx_unit_t
{
  NA,       // not applicable
  M,       // meters
  Y,       // years
  MONTH,       // months
  D,       // days
  H,       // hours
  MIN,       // minutes
  S,       // seconds
  HZ,       // frquency (Hz)
  MA,       // milli amps (mA)
  MS,       // milliseconds
  DEG,       // degree ie Longitude, Latitude
  MM,       // milimeter
  CM,       // centimeter
  MPS,       // meters per second
};

struct ubx_cfg_item_t
{
  const char * ubx_config_item;
  ubx_key_id_t ubx_key_id;
  ubx_type_t ubx_type;
  double_t scale;
  ubx_unit_t ubx_unit;
};

// cfg infmsg
const ubx_cfg_item_t CFG_INFMSG_UBX_USB = {"CFG_INFMSG_UBX_USB", 0x20920004, X1, 1, NA};
const ubx_cfg_item_t CFG_INFMSG_NMEA_USB = {"CFG_INFMSG_NMEA_USB", 0x20920009, X1, 1, NA};
enum CFG_INFMSG_ENUM
{
  INFMSG_ERROR = 0x01,         // Enable ERROR information messages
  INFMSG_WARNING = 0x02,       // Enable WARNING information messages
  INFMSG_NOTICE = 0x04,        // Enable NOTICE information messages
  INFMSG_TEST = 0x08,          // Enable TEST information messages
  INFMSG_DEBUG = 0x10,         // Enable DEBUG information messages
};

// cfg uart1
const ubx_cfg_item_t CFG_UART1INPROT_UBX = {"CFG_UART1INPROT_UBX", 0x10730001, L, 1, NA};
const ubx_cfg_item_t CFG_UART1INPROT_NMEA = {"CFG_UART1INPROT_NMEA", 0x10730002, L, 1, NA};
const ubx_cfg_item_t CFG_UART1INPROT_RTCM3X = {"CFG_UART1INPROT_RTCM3X", 0x10730004, L, 1, NA};
const ubx_cfg_item_t CFG_UART1OUTPROT_UBX = {"CFG_UART1OUTPROT_UBX", 0x10740001, L, 1, NA};
const ubx_cfg_item_t CFG_UART1OUTPROT_NMEA = {"CFG_UART1OUTPROT_NMEA", 0x10740002, L, 1, NA};
const ubx_cfg_item_t CFG_UART1OUTPROT_RTCM3X = {"CFG_UART1OUTPROT_RTCM3X", 0x10740004, L, 1, NA};

// cfg usb
const ubx_cfg_item_t CFG_USBINPROT_UBX = {"CFG_USBINPROT_UBX", 0x10770001, L, 1, NA};
const ubx_cfg_item_t CFG_USBINPROT_NMEA = {"CFG_USBINPROT_NMEA", 0x10770002, L, 1, NA};
const ubx_cfg_item_t CFG_USBINPROT_RTCM3X = {"CFG_USBINPROT_RTCM3X", 0x10770004, L, 1, NA};
const ubx_cfg_item_t CFG_USBOUTPROT_UBX = {"CFG_USBOUTPROT_UBX", 0x10780001, L, 1, NA};
const ubx_cfg_item_t CFG_USBOUTPROT_NMEA = {"CFG_USBOUTPROT_NMEA", 0x10780002, L, 1, NA};
const ubx_cfg_item_t CFG_USBOUTPROT_RTCM3X = {"CFG_USBOUTPROT_RTCM3X", 0x10780004, L, 1, NA};

// cfg tmode - time mode configuration
const ubx_cfg_item_t CFG_TMODE_MODE = {"CFG_TMODE_MODE", 0x20030001, E1, 1, NA};
enum CFG_TMODE_MODE_ENUM {DISABLED = 0, SURVEY_IN = 1, FIXED = 2};
const ubx_cfg_item_t CFG_TMODE_POS_TYPE = {"CFG_TMODE_POS_TYPE", 0x20030002, E1, 1, NA};
enum CFG_TMODE_POS_TYPE_ENUM {ECEF = 0, LLH = 1};

// cfg navhpg - high precision navigation configuration
const ubx_cfg_item_t CFG_NAVHPG_DGNSSMODE = {"CFG_NAVHPG_DGNSSMODE", 0x20140011, E1, 1, NA};
enum CFG_NAVHPG_DGNSSMODE_ENUM
{
  RTK_FLOAT = 2,       // no attempts made to fix ambiguities
  RTK_FIXED = 3       // Ambiguities are fixed whenever possible
};

// cfg navspg - standard precision navigation configuration
const ubx_cfg_item_t CFG_NAVSPG_FIXMODE = {"CFG_NAVSPG_FIXMODE", 0x20110011, E1, 1, NA};
enum CFG_NAVSPG_FIXMODE_ENUM
{
  ONLY_2D = 1,         // 2D Only
  ONLY_3D = 2,         // 3D only
  AUTO = 3             // Auto 2D/3D
};
const ubx_cfg_item_t CFG_NAVSPG_INIFIX3D = {"CFG_NAVSPG_INIFIX3D", 0x10110013, L, 1, NA};

const ubx_cfg_item_t CFG_NAVSPG_UTCSTANDARD = {"CFG_NAVSPG_UTCSTANDARD", 0x2011001c, E1, 1, NA};
enum CFG_NAVSPG_UTCSTANDARD_ENUM
{
  UTC_AUTO = 0,         // Automatic; receiver selects based on GNSS configuration
  UTC_USNO = 3,         // UTC as operated by the US Naval Observatory (USNO)
                        //  derived from GPS time
  UTC_EU = 5,           // UT as combined from multiple European laboratories
                        //  dervied from Galileo time
  UTC_SU = 6,           // UTC as operated by the former Soviet Unnion (SU)
                        //  derived from GLONASS time
  UTC_NTSC = 7          // UTC as operated by the National Time Service Center (NTSC), Chin
                        //  derived from BeiDou time
};

const ubx_cfg_item_t CFG_NAVSPG_DYNMODEL = {"CFG_NAVSPG_DYNMODEL", 0x20110021, E1, 1, NA};
enum CFG_NAVSPG_DYNMODEL_ENUM
{
  DYN_MODEL_PORT = 0,       // Portable
  DYN_MODEL_STAT = 2,       // Stationary
  DYN_MODEL_PED = 3,       // Pedestrian
  DYN_MODEL_AUTOMOT = 4,       // Automotive
  DYN_MODEL_SEA = 5,          // Sea
  DYN_MODEL_AIR1 = 6,         // Airborne <1g acceleration
  DYN_MODEL_AIR2 = 7,         // Airborne <2g acceleration
  DYN_MODEL_AIR4 = 8,         // Airborne <4g acceleration
  DYN_MODEL_WRIST = 9,        // Wrist-worn watch (not available in all products)
  DYN_MODEL_BIKE = 10,        // Motorbike (not available in all products)
  DYN_MODEL_MOWER = 11,       // Robotic lawn mower (not available in all products)
  DYN_MODEL_ESCOOTER = 12,    // E-scooter (not available in all products)
};

// cfg odo
const ubx_cfg_item_t CFG_ODO_USE_ODO = {"CFG_ODO_USE_ODO", 0x10220001, L, 1, NA};
const ubx_cfg_item_t CFG_ODO_USE_COG = {"CFG_ODO_USE_COG", 0x10220002, L, 1, NA};
const ubx_cfg_item_t CFG_ODO_OUTLPVEL = {"CFG_ODO_OUTLPVEL", 0x10220003, L, 1, NA};
const ubx_cfg_item_t CFG_ODO_OUTLPCOG = {"CFG_ODO_OUTLPCOG", 0x10220004, L, 1, NA};
const ubx_cfg_item_t CFG_ODO_PROFILE = {"CFG_ODO_PROFILE", 0x20220005, E1, 1, NA};
enum CFG_ODO_PROFILE_ENUM
{
  ODO_RUN = 0,          // Running
  ODO_CYCL = 1,         // Cycling
  ODO_SWIM = 2,         // Swimming
  ODO_CAR = 3,          // Car
  ODO_CUSTOM = 4,       // Custom
};
const ubx_cfg_item_t CFG_ODO_COGMAXSPEED = {"CFG_ODO_COGMAXSPEED", 0x20220021, U1, 1, MPS};
const ubx_cfg_item_t CFG_ODO_COGMAXPOSACC = {"CFG_ODO_COGMAXPOSACC", 0x20220022, U1, 1, NA};
const ubx_cfg_item_t CFG_ODO_VELLPGAIN = {"CFG_ODO_VALLPGAIN", 0x20220031, U1, 1, NA};
const ubx_cfg_item_t CFG_ODO_COGLPGAIN = {"CFG_ODO_COGLPGAIN", 0x20220032, U1, 1, NA};


// cfg rate - navigation and measurement rate configuration
const ubx_cfg_item_t CFG_RATE_MEAS = {"CFG_RATE_MEAS", 0x30210001, U2, .001, S};
const ubx_cfg_item_t CFG_RATE_NAV = {"CFG_RATE_NAV", 0x30210002, U2, 1, NA};
const ubx_cfg_item_t CFG_RATE_TIMEREF = {"CFG_RATE_TIMEREF", 0x30210003, E1, 1, NA};
enum CFG_RATE_TIMEREF_ENUM
{
  ALIGN_UTC = 0,         // Align measurements to UTC time
  ALIGN_GPS = 1,         // Align measurements to GPS time
  ALIGN_GLO = 2,         // Align measurements to GLONASS time
  ALIGN_BDS = 3,         // Align measurements to BeiDou time
  ALIGN_GAL = 4,         // Align measurements to Galileo time
};

// cfg sfimu - sensor fusion IMU configuration
const ubx_cfg_item_t CFG_SFIMU_AUTO_MNTALG_ENA =
{"CFG_SFIMU_AUTO_MNTALG_ENA", 0x10060027, L, 0, NA};
const ubx_cfg_item_t CFG_SFIMU_IMU_MNTALG_YAW =
{"CFG_SFIMU_IMU_MNTALG_YAW", 0x4006002d, U4, .001, DEG};
const ubx_cfg_item_t CFG_SFIMU_IMU_MNTALG_PITCH =
{"CFG_SFIMU_IMU_MNTALG_PITCH", 0x3006002e, I2, .001, DEG};
const ubx_cfg_item_t CFG_SFIMU_IMU_MNTALG_ROLL =
{"CFG_SFIMU_IMU_MNTALG_ROLL", 0x3006002f, I2, .001, DEG};

// cfg sfodo - sensor fusion odometer configuration
const ubx_cfg_item_t CFG_SFODO_COMBINE_TICKS =
{"CFG_SFODO_COMBINE_TICKS", 0x10070001, L, 0, NA};
const ubx_cfg_item_t CFG_SFODO_COUNT_MAX =
{"CFG_SFODO_COUNT_MAX", 0x40070009, U4, 0, NA};
const ubx_cfg_item_t CFG_SFODO_DIS_AUTOCOUNTMAX =
{"CFG_SFODO_DIS_AUTOCOUNTMAX", 0x10070004, L, 0, NA};
const ubx_cfg_item_t CFG_SFODO_DIS_AUTODIRPINPOL =
{"CFG_SFODO_DIS_AUTODIRPINPOL", 0x10070005, L, 0, NA};
const ubx_cfg_item_t CFG_SFODO_FACTOR =
{"CFG_SFODO_FACTOR", 0x40070007, U4, 1e-6, NA};
const ubx_cfg_item_t CFG_SFODO_QUANT_ERROR =
{"CFG_SFODO_QUANT_ERROR", 0x40070008, U4, 1e-6, M};
const ubx_cfg_item_t CFG_SFODO_LATENCY =
{"CFG_SFODO_LATENCY", 0x3007000a, U2, 0, MS};

// cfg msgout - msg output rate configurations
const ubx_cfg_item_t CFG_MSGOUT_UBX_NAV_STATUS_USB =
{"CFG_MSGOUT_UBX_NAV_STATUS_USB", 0x2091001d, U1, 0, NA};
const ubx_cfg_item_t CFG_MSGOUT_UBX_NAV_CLOCK_USB =
{"CFG_MSGOUT_UBX_NAV_CLOCK_USB", 0x20910068, U1, 0, NA};
const ubx_cfg_item_t CFG_MSGOUT_UBX_NAV_COV_USB =
{"CFG_MSGOUT_UBX_NAV_COV_USB", 0x20910086, U1, 0, NA};
const ubx_cfg_item_t CFG_MSGOUT_UBX_NAV_DOP_USB =
{"CFG_MSGOUT_UBX_NAV_DOP_USB", 0x2091003b, U1, 0, NA};
const ubx_cfg_item_t CFG_MSGOUT_UBX_NAV_EOE_USB =
{"CFG_MSGOUT_UBX_NAV_EOE_USB", 0x20910162, U1, 0, NA};
const ubx_cfg_item_t CFG_MSGOUT_UBX_NAV_POSECEF_USB =
{"CFG_MSGOUT_UBX_NAV_POSECEF_USB", 0x20910027, U1, 0, NA};
const ubx_cfg_item_t CFG_MSGOUT_UBX_NAV_HPPOSECEF_USB =
{"CFG_MSGOUT_UBX_NAV_HPPOSECEF_USB", 0x20910031, U1, 0, NA};
const ubx_cfg_item_t CFG_MSGOUT_UBX_NAV_POSLLH_USB =
{"CFG_MSGOUT_UBX_NAV_POSLLH_USB", 0x2091002C, U1, 0, NA};
const ubx_cfg_item_t CFG_MSGOUT_UBX_NAV_HPPOSLLH_USB =
{"CFG_MSGOUT_UBX_NAV_HPPOSLLH_USB", 0x20910036, U1, 0, NA};
const ubx_cfg_item_t CFG_MSGOUT_UBX_NAV_ODO_USB =
{"CFG_MSGOUT_UBX_NAV_ODO_USB", 0x20910081, U1, 0, NA};
const ubx_cfg_item_t CFG_MSGOUT_UBX_NAV_PVT_USB =
{"CFG_MSGOUT_UBX_NAV_PVT_USB", 0x20910009, U1, 0, NA};
const ubx_cfg_item_t CFG_MSGOUT_UBX_NAV_RELPOSNED_USB =
{"CFG_MSGOUT_UBX_NAV_RELPOSNED_USB", 0x20910090, U1, 0, NA};
const ubx_cfg_item_t CFG_MSGOUT_UBX_NAV_TIMEUTC_USB =
{"CFG_MSGOUT_UBX_NAV_TIMEUTC_USB", 0x2091005e, U1, 0, NA};
const ubx_cfg_item_t CFG_MSGOUT_UBX_NAV_VELECEF_USB =
{"CFG_MSGOUT_UBX_NAV_VELECEF_USB", 0x20910040, U1, 0, NA};
const ubx_cfg_item_t CFG_MSGOUT_UBX_NAV_VELNED_USB =
{"CFG_MSGOUT_UBX_NAV_VELNED_USB", 0x20910045, U1, 0, NA};
const ubx_cfg_item_t CFG_MSGOUT_UBX_RXM_RTCM_USB =
{"CFG_MSGOUT_UBX_RXM_RTCM_USB", 0x2091026b, U1, 0, NA};
const ubx_cfg_item_t CFG_MSGOUT_UBX_ESF_MEAS_USB =
{"CFG_MSGOUT_UBX_ESF_MEAS_USB", 0x2091027a, U1, 0, NA};
const ubx_cfg_item_t CFG_MSGOUT_UBX_ESF_STATUS_USB =
{"CFG_MSGOUT_UBX_ESF_STATUS_USB", 0x20910108, U1, 0, NA};

std::map<ubx_key_id_t, ubx_cfg_item_t> ubxKeyCfgItemMap = {
  {CFG_INFMSG_UBX_USB.ubx_key_id, CFG_INFMSG_UBX_USB},
  {CFG_INFMSG_NMEA_USB.ubx_key_id, CFG_INFMSG_NMEA_USB},
  {CFG_UART1INPROT_UBX.ubx_key_id, CFG_UART1INPROT_UBX},
  {CFG_UART1INPROT_NMEA.ubx_key_id, CFG_UART1INPROT_NMEA},
  {CFG_UART1INPROT_RTCM3X.ubx_key_id, CFG_UART1INPROT_RTCM3X},
  {CFG_UART1OUTPROT_UBX.ubx_key_id, CFG_UART1OUTPROT_UBX},
  {CFG_UART1OUTPROT_NMEA.ubx_key_id, CFG_UART1OUTPROT_NMEA},
  {CFG_UART1OUTPROT_RTCM3X.ubx_key_id, CFG_UART1OUTPROT_RTCM3X},
  {CFG_USBINPROT_UBX.ubx_key_id, CFG_USBINPROT_UBX},
  {CFG_USBINPROT_NMEA.ubx_key_id, CFG_USBINPROT_NMEA},
  {CFG_USBINPROT_RTCM3X.ubx_key_id, CFG_USBINPROT_RTCM3X},
  {CFG_USBOUTPROT_UBX.ubx_key_id, CFG_USBOUTPROT_UBX},
  {CFG_USBOUTPROT_NMEA.ubx_key_id, CFG_USBOUTPROT_NMEA},
  {CFG_USBOUTPROT_RTCM3X.ubx_key_id, CFG_USBOUTPROT_RTCM3X},
  {CFG_TMODE_MODE.ubx_key_id, CFG_TMODE_MODE},
  {CFG_TMODE_POS_TYPE.ubx_key_id, CFG_TMODE_POS_TYPE},
  {CFG_NAVHPG_DGNSSMODE.ubx_key_id, CFG_NAVHPG_DGNSSMODE},
  {CFG_NAVSPG_FIXMODE.ubx_key_id, CFG_NAVSPG_FIXMODE},
  {CFG_NAVSPG_INIFIX3D.ubx_key_id, CFG_NAVSPG_INIFIX3D},
  {CFG_NAVSPG_UTCSTANDARD.ubx_key_id, CFG_NAVSPG_UTCSTANDARD},
  {CFG_NAVSPG_DYNMODEL.ubx_key_id, CFG_NAVSPG_DYNMODEL},

  {CFG_ODO_USE_ODO.ubx_key_id, CFG_ODO_USE_ODO},
  {CFG_ODO_USE_COG.ubx_key_id, CFG_ODO_USE_COG},
  {CFG_ODO_OUTLPVEL.ubx_key_id, CFG_ODO_OUTLPVEL},
  {CFG_ODO_OUTLPCOG.ubx_key_id, CFG_ODO_OUTLPCOG},
  {CFG_ODO_PROFILE.ubx_key_id, CFG_ODO_PROFILE},
  {CFG_ODO_COGMAXSPEED.ubx_key_id, CFG_ODO_COGMAXSPEED},
  {CFG_ODO_COGMAXPOSACC.ubx_key_id, CFG_ODO_COGMAXPOSACC},
  {CFG_ODO_VELLPGAIN.ubx_key_id, CFG_ODO_VELLPGAIN},
  {CFG_ODO_COGLPGAIN.ubx_key_id, CFG_ODO_COGLPGAIN},

  {CFG_RATE_MEAS.ubx_key_id, CFG_RATE_MEAS},
  {CFG_RATE_NAV.ubx_key_id, CFG_RATE_NAV},
  {CFG_RATE_TIMEREF.ubx_key_id, CFG_RATE_TIMEREF},

  {CFG_SFIMU_AUTO_MNTALG_ENA.ubx_key_id, CFG_SFIMU_AUTO_MNTALG_ENA},
  {CFG_SFIMU_IMU_MNTALG_YAW.ubx_key_id, CFG_SFIMU_IMU_MNTALG_YAW},
  {CFG_SFIMU_IMU_MNTALG_PITCH.ubx_key_id, CFG_SFIMU_IMU_MNTALG_PITCH},
  {CFG_SFIMU_IMU_MNTALG_ROLL.ubx_key_id, CFG_SFIMU_IMU_MNTALG_ROLL},

  {CFG_SFODO_COMBINE_TICKS.ubx_key_id, CFG_SFODO_COMBINE_TICKS},
  {CFG_SFODO_COUNT_MAX.ubx_key_id, CFG_SFODO_COUNT_MAX},
  {CFG_SFODO_DIS_AUTOCOUNTMAX.ubx_key_id, CFG_SFODO_DIS_AUTOCOUNTMAX},
  {CFG_SFODO_DIS_AUTODIRPINPOL.ubx_key_id, CFG_SFODO_DIS_AUTODIRPINPOL},
  {CFG_SFODO_FACTOR.ubx_key_id, CFG_SFODO_FACTOR},
  {CFG_SFODO_LATENCY.ubx_key_id, CFG_SFODO_LATENCY},
  {CFG_SFODO_QUANT_ERROR.ubx_key_id, CFG_SFODO_QUANT_ERROR},

  {CFG_MSGOUT_UBX_NAV_STATUS_USB.ubx_key_id, CFG_MSGOUT_UBX_NAV_STATUS_USB},
  {CFG_MSGOUT_UBX_NAV_CLOCK_USB.ubx_key_id, CFG_MSGOUT_UBX_NAV_CLOCK_USB},
  {CFG_MSGOUT_UBX_NAV_COV_USB.ubx_key_id, CFG_MSGOUT_UBX_NAV_COV_USB},
  {CFG_MSGOUT_UBX_NAV_DOP_USB.ubx_key_id, CFG_MSGOUT_UBX_NAV_DOP_USB},
  {CFG_MSGOUT_UBX_NAV_EOE_USB.ubx_key_id, CFG_MSGOUT_UBX_NAV_EOE_USB},
  {CFG_MSGOUT_UBX_NAV_POSECEF_USB.ubx_key_id, CFG_MSGOUT_UBX_NAV_POSECEF_USB},
  {CFG_MSGOUT_UBX_NAV_HPPOSECEF_USB.ubx_key_id, CFG_MSGOUT_UBX_NAV_HPPOSECEF_USB},
  {CFG_MSGOUT_UBX_NAV_POSLLH_USB.ubx_key_id, CFG_MSGOUT_UBX_NAV_POSLLH_USB},
  {CFG_MSGOUT_UBX_NAV_HPPOSLLH_USB.ubx_key_id, CFG_MSGOUT_UBX_NAV_HPPOSLLH_USB},
  {CFG_MSGOUT_UBX_NAV_ODO_USB.ubx_key_id, CFG_MSGOUT_UBX_NAV_ODO_USB},
  {CFG_MSGOUT_UBX_NAV_PVT_USB.ubx_key_id, CFG_MSGOUT_UBX_NAV_PVT_USB},
  {CFG_MSGOUT_UBX_NAV_RELPOSNED_USB.ubx_key_id, CFG_MSGOUT_UBX_NAV_RELPOSNED_USB},
  {CFG_MSGOUT_UBX_NAV_TIMEUTC_USB.ubx_key_id, CFG_MSGOUT_UBX_NAV_TIMEUTC_USB},
  {CFG_MSGOUT_UBX_NAV_VELECEF_USB.ubx_key_id, CFG_MSGOUT_UBX_NAV_VELECEF_USB},
  {CFG_MSGOUT_UBX_NAV_VELNED_USB.ubx_key_id, CFG_MSGOUT_UBX_NAV_VELNED_USB},
  {CFG_MSGOUT_UBX_RXM_RTCM_USB.ubx_key_id, CFG_MSGOUT_UBX_RXM_RTCM_USB},
  {CFG_MSGOUT_UBX_ESF_MEAS_USB.ubx_key_id, CFG_MSGOUT_UBX_ESF_MEAS_USB},
  {CFG_MSGOUT_UBX_ESF_STATUS_USB.ubx_key_id, CFG_MSGOUT_UBX_ESF_STATUS_USB}
};

bool operator<(const ubx_key_id_t & fk1, const ubx_key_id_t & fk2)
{
  return fk1.all < fk2.all;
}
}  // namespace ubx::cfg

#endif  // UBLOX_DGNSS_NODE__UBX__UBX_CFG_ITEM_HPP_