11#include < memory>
22#include < string>
3+ #include < vector>
34
45#include < diagnostic_updater/diagnostic_updater.hpp>
56#include < rclcpp/rclcpp.hpp>
@@ -16,4 +17,106 @@ UbloxFirmware9::UbloxFirmware9(const std::string & frame_id, std::shared_ptr<dia
1617{
1718}
1819
20+ bool UbloxFirmware9::configureUblox (std::shared_ptr<ublox_gps::Gps> gps)
21+ {
22+ if (clear_bbr_)
23+ {
24+ // clear flash memory
25+ if (!gps->clearBbr ())
26+ {
27+ RCLCPP_ERROR (node_->get_logger (), " u-blox failed to clear flash memory" );
28+ }
29+ }
30+
31+ gps->setSaveOnShutdown (save_on_shutdown_);
32+
33+ //
34+ // Configure the GNSS, only if the configuration is different
35+ //
36+ // First, get the current GNSS configuration
37+ ublox_msgs::msg::CfgGNSS cfg_gnss;
38+ if (gps->poll (cfg_gnss))
39+ {
40+ RCLCPP_DEBUG (node_->get_logger (), " Read GNSS config." );
41+ RCLCPP_DEBUG (node_->get_logger (), " Num. tracking channels in hardware: %i" , cfg_gnss.num_trk_ch_hw );
42+ RCLCPP_DEBUG (node_->get_logger (), " Num. tracking channels to use: %i" , cfg_gnss.num_trk_ch_use );
43+ }
44+ else
45+ {
46+ throw std::runtime_error (" Failed to read the GNSS config." );
47+ }
48+
49+ ublox_msgs::msg::CfgVALSET cfg_signal;
50+ cfg_signal.layers = ublox_msgs::msg::CfgVALSET::LAYER_RAM;
51+
52+ using signal = ublox_msgs::msg::CfgVALSETCfgdata;
53+
54+ // Configure GPS Signals
55+ cfg_signal.cfgdata .push_back (generateSignalConfig (signal::GPS_ENABLE, enable_gps_));
56+ cfg_signal.cfgdata .push_back (generateSignalConfig (signal::GPS_L1CA_ENABLE, enable_gps_));
57+ if (gnss_->isSupported (" GPS_L2C" ))
58+ {
59+ cfg_signal.cfgdata .push_back (generateSignalConfig (signal::GPS_L2C_ENABLE, enable_gps_));
60+ }
61+
62+ // Configure SBAS Signals
63+ cfg_signal.cfgdata .push_back (generateSignalConfig (signal::SBAS_ENABLE, enable_gps_));
64+ cfg_signal.cfgdata .push_back (generateSignalConfig (signal::SBAS_L1CA_ENABLE, enable_gps_));
65+
66+ // Configure Galileo Signals
67+ cfg_signal.cfgdata .push_back (generateSignalConfig (signal::GAL_ENABLE, enable_galileo_));
68+ cfg_signal.cfgdata .push_back (generateSignalConfig (signal::GAL_E1_ENABLE, enable_galileo_));
69+ if (gnss_->isSupported (" GAL_E5B" ))
70+ {
71+ cfg_signal.cfgdata .push_back (generateSignalConfig (signal::GAL_E5B_ENABLE, enable_galileo_));
72+ }
73+
74+ // Configure Beidou Signals
75+ cfg_signal.cfgdata .push_back (generateSignalConfig (signal::BDS_ENABLE, enable_beidou_));
76+ cfg_signal.cfgdata .push_back (generateSignalConfig (signal::BDS_B1_ENABLE, enable_beidou_));
77+ if (gnss_->isSupported (" BDS_B2" ))
78+ {
79+ cfg_signal.cfgdata .push_back (generateSignalConfig (signal::BDS_B2_ENABLE, enable_beidou_));
80+ }
81+
82+ // Configure QZSS Signals
83+ cfg_signal.cfgdata .push_back (generateSignalConfig (signal::QZSS_ENABLE, enable_qzss_ && enable_gps_));
84+ cfg_signal.cfgdata .push_back (generateSignalConfig (signal::QZSS_L1CA_ENABLE, enable_qzss_ && enable_gps_));
85+ if (gnss_->isSupported (" QZSS_L2C" ))
86+ {
87+ cfg_signal.cfgdata .push_back (generateSignalConfig (signal::QZSS_L2C_ENABLE, enable_qzss_ && enable_gps_));
88+ }
89+
90+ // Configure GLONASS Signals
91+ cfg_signal.cfgdata .push_back (generateSignalConfig (signal::GLO_ENABLE, enable_glonass_));
92+ cfg_signal.cfgdata .push_back (generateSignalConfig (signal::GLO_L1_ENABLE, enable_glonass_));
93+ if (gnss_->isSupported (" GLO_L2" ))
94+ {
95+ cfg_signal.cfgdata .push_back (generateSignalConfig (signal::GLO_L2_ENABLE, enable_glonass_));
96+ }
97+
98+ RCLCPP_DEBUG (node_->get_logger (), " Ready to configure" );
99+ gps->configure (cfg_signal, false );
100+
101+ //
102+ // NMEA config
103+ //
104+ if (getRosBoolean (node_, " nmea.set" ) && !gps->configure (cfg_nmea_))
105+ {
106+ throw std::runtime_error (" Failed to configure NMEA" );
107+ }
108+
109+ return true ;
110+ }
111+
112+ ublox_msgs::msg::CfgVALSETCfgdata UbloxFirmware9::generateSignalConfig (uint32_t signalID, bool enable)
113+ {
114+ ublox_msgs::msg::CfgVALSETCfgdata signalConfig;
115+ signalConfig.key = signalID;
116+ signalConfig.data .resize (1 );
117+ signalConfig.data [0 ] = enable;
118+ return signalConfig;
119+ }
120+
121+
19122} // namespace ublox_node
0 commit comments