GNSS-SDR  0.0.19
An Open Source GNSS Software Defined Receiver
gnss_flowgraph.h
Go to the documentation of this file.
1 /*!
2  * \file gnss_flowgraph.h
3  * \brief Interface of a GNSS receiver flow graph.
4  * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com
5  * Luis Esteve, 2011. luis(at)epsilon-formacion.com
6  * Carles Fernandez-Prades, 2014-2020. cfernandez(at)cttc.es
7  * Álvaro Cebrián Juan, 2018. acebrianjuan(at)gmail.com
8  *
9  * It contains a signal source,
10  * a signal conditioner, a set of channels, an observables block and a pvt.
11  *
12  *
13  * -----------------------------------------------------------------------------
14  *
15  * GNSS-SDR is a Global Navigation Satellite System software-defined receiver.
16  * This file is part of GNSS-SDR.
17  *
18  * Copyright (C) 2010-2020 (see AUTHORS file for a list of contributors)
19  * SPDX-License-Identifier: GPL-3.0-or-later
20  *
21  * -----------------------------------------------------------------------------
22  */
23 
24 #ifndef GNSS_SDR_GNSS_FLOWGRAPH_H
25 #define GNSS_SDR_GNSS_FLOWGRAPH_H
26 
28 #include "concurrent_queue.h"
30 #include "galileo_tow_map.h"
32 #include "gnss_signal.h"
33 #include "pvt_interface.h"
34 #include <gnuradio/blocks/null_sink.h> // for null_sink
35 #include <gnuradio/runtime_types.h> // for basic_block_sptr, top_block_sptr
36 #include <pmt/pmt.h> // for pmt_t
37 #include <list> // for list
38 #include <map> // for map
39 #include <memory> // for for shared_ptr, dynamic_pointer_cast
40 #include <mutex> // for mutex
41 #include <string> // for string
42 #include <utility> // for pair
43 #include <vector> // for vector
44 #if ENABLE_FPGA
46 #endif
47 
48 /** \addtogroup Core
49  * \{ */
50 /** \addtogroup Core_Receiver
51  * \{ */
52 
53 
54 class ChannelInterface;
56 class GNSSBlockInterface;
57 class Gnss_Satellite;
59 
60 /*! \brief This class represents a GNSS flow graph.
61  *
62  * It contains a signal source,
63  * a signal conditioner, a set of channels, a PVT and an output filter.
64  */
66 {
67 public:
68  /*!
69  * \brief Constructor that initializes the receiver flow graph
70  */
71  GNSSFlowgraph(std::shared_ptr<ConfigurationInterface> configuration, std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue);
72 
73  /*!
74  * \brief Destructor
75  */
77 
78  /*!
79  * \brief Start the flow graph
80  */
81  void start();
82 
83  /*!
84  * \brief Stop the flow graph
85  */
86  void stop();
87 
88  /*!
89  * \brief Connects the defined blocks in the flow graph
90  *
91  * Signal Source > Signal conditioner > Channels >> Observables >> PVT > Output filter
92  */
93  void connect();
94 
95  /*!
96  * \brief Disconnect the blocks in the flow graph
97  */
98  void disconnect();
99 
100  /*!
101  * \brief Wait for a flowgraph to complete.
102  *
103  * Flowgraphs complete when either
104  * (1) all blocks indicate that they are done, or
105  * (2) after stop() has been called to request shutdown.
106  */
107  void wait();
108 
109  /*!
110  * \brief Manage satellite acquisition
111  *
112  * \param[in] who Channel ID
113  */
114  void acquisition_manager(unsigned int who);
115 
116  /*!
117  * \brief Applies an action to the flow graph
118  *
119  * \param[in] who Who generated the action
120  * \param[in] what What is the action. 0: acquisition failed; 1: acquisition success; 2: tracking lost
121  */
122  void apply_action(unsigned int who, unsigned int what);
123 
124  /*!
125  * \brief Set flow graph configuratiob
126  */
127  void set_configuration(const std::shared_ptr<ConfigurationInterface>& configuration);
128 
129  bool connected() const
130  {
131  return connected_;
132  }
133 
134  bool running() const
135  {
136  return running_;
137  }
138 
139  /*!
140  * \brief Sends a GNU Radio asynchronous message from telemetry to PVT
141  *
142  * It is used to assist the receiver with external ephemeris data
143  */
144  bool send_telemetry_msg(const pmt::pmt_t& msg);
145 
146  /*!
147  * \brief Returns a smart pointer to the PVT object
148  */
149  std::shared_ptr<PvtInterface> get_pvt()
150  {
151  return std::dynamic_pointer_cast<PvtInterface>(pvt_);
152  }
153 
154  /*!
155  * \brief Priorize visible satellites in the specified vector
156  */
157  void priorize_satellites(const std::vector<std::pair<int, Gnss_Satellite>>& visible_satellites);
158 
159 #if ENABLE_FPGA
160  void start_acquisition_helper();
161 
162  void perform_hw_reset();
163 #endif
164 
165 private:
166  void init(); // Populates the SV PRN list available for acquisition and tracking
167  int connect_desktop_flowgraph();
168 
169  int connect_signal_sources();
170  int connect_signal_conditioners();
171  int connect_channels();
172  int connect_observables();
173  int connect_pvt();
174  int connect_sample_counter();
175  int connect_galileo_tow_map();
176 
177  int connect_signal_sources_to_signal_conditioners();
178  int connect_signal_conditioners_to_channels();
179  int connect_channels_to_observables();
180  int connect_observables_to_pvt();
181  int connect_monitors();
182  int connect_gal_e6_has();
183  int connect_gnss_synchro_monitor();
184  int connect_acquisition_monitor();
185  int connect_tracking_monitor();
186  int connect_navdata_monitor();
187 
188 #if ENABLE_FPGA
189  int connect_fpga_flowgraph();
190  int connect_fpga_sample_counter();
191 #endif
192 
193  int assign_channels();
194  void check_signal_conditioners();
195 
196  void set_signals_list();
197  void set_channels_state(); // Initializes the channels state (start acquisition or keep standby)
198  // using the configuration parameters (number of channels and max channels in acquisition)
199  Gnss_Signal search_next_signal(const std::string& searched_signal,
200  bool& is_primary_frequency,
201  bool& assistance_available,
202  float& estimated_doppler,
203  double& RX_time);
204 
205  void push_back_signal(const Gnss_Signal& gs);
206  void remove_signal(const Gnss_Signal& gs);
207  void print_help();
208  void check_desktop_conf_in_fpga_env();
209 
210  double project_doppler(const std::string& searched_signal, double primary_freq_doppler_hz);
211  bool is_multiband() const;
212 
213  std::vector<std::string> split_string(const std::string& s, char delim);
214  std::vector<bool> signal_conditioner_connected_;
215 
216  gr::top_block_sptr top_block_;
217 
218  std::shared_ptr<ConfigurationInterface> configuration_;
219  std::shared_ptr<Concurrent_Queue<pmt::pmt_t>> queue_;
220 
221  std::vector<std::shared_ptr<SignalSourceInterface>> sig_source_;
222  std::vector<std::shared_ptr<GNSSBlockInterface>> sig_conditioner_;
223  std::vector<std::shared_ptr<ChannelInterface>> channels_;
224  std::shared_ptr<GNSSBlockInterface> observables_;
225  std::shared_ptr<GNSSBlockInterface> pvt_;
226 
227  std::map<std::string, gr::basic_block_sptr> acq_resamplers_;
228  std::vector<gr::blocks::null_sink::sptr> null_sinks_;
229 
230  gr::basic_block_sptr GnssSynchroMonitor_;
231  gr::basic_block_sptr GnssSynchroAcquisitionMonitor_;
232  gr::basic_block_sptr GnssSynchroTrackingMonitor_;
233  gr::basic_block_sptr NavDataMonitor_;
234  channel_status_msg_receiver_sptr channels_status_; // class that receives and stores the current status of the receiver channels
235  galileo_e6_has_msg_receiver_sptr gal_e6_has_rx_;
236  galileo_tow_map_sptr galileo_tow_map_;
237 
238  gnss_sdr_sample_counter_sptr ch_out_sample_counter_;
239 #if ENABLE_FPGA
240  gnss_sdr_fpga_sample_counter_sptr ch_out_fpga_sample_counter_;
241 #endif
242 
243  std::vector<unsigned int> channels_state_;
244 
245  std::list<Gnss_Signal> available_GPS_1C_signals_;
246  std::list<Gnss_Signal> available_GPS_2S_signals_;
247  std::list<Gnss_Signal> available_GPS_L5_signals_;
248  std::list<Gnss_Signal> available_SBAS_1C_signals_;
249  std::list<Gnss_Signal> available_GAL_1B_signals_;
250  std::list<Gnss_Signal> available_GAL_5X_signals_;
251  std::list<Gnss_Signal> available_GAL_7X_signals_;
252  std::list<Gnss_Signal> available_GAL_E6_signals_;
253  std::list<Gnss_Signal> available_GLO_1G_signals_;
254  std::list<Gnss_Signal> available_GLO_2G_signals_;
255  std::list<Gnss_Signal> available_BDS_B1_signals_;
256  std::list<Gnss_Signal> available_BDS_B3_signals_;
257 
258  enum StringValue
259  {
260  evGPS_1C,
261  evGPS_2S,
262  evGPS_L5,
263  evSBAS_1C,
264  evGAL_1B,
265  evGAL_5X,
266  evGAL_7X,
267  evGAL_E6,
268  evGLO_1G,
269  evGLO_2G,
270  evBDS_B1,
271  evBDS_B3
272  };
273  std::map<std::string, StringValue> mapStringValues_;
274 
275  std::string config_file_;
276  std::string help_hint_;
277 
278  std::mutex signal_list_mutex_;
279 
280  int sources_count_;
281  int channels_count_;
282  int acq_channels_count_;
283  int max_acq_channels_;
284 
285  bool connected_;
286  bool running_;
287  bool multiband_;
288  bool enable_monitor_;
289  bool enable_acquisition_monitor_;
290  bool enable_tracking_monitor_;
291  bool enable_navdata_monitor_;
292  bool enable_fpga_offloading_;
293  bool enable_e6_has_rx_;
294 };
295 
296 
297 /** \} */
298 /** \} */
299 #endif // GNSS_SDR_GNSS_FLOWGRAPH_H
Interface of a thread-safe std::queue.
void stop()
Stop the flow graph.
This class represents an interface to a PVT block.
Definition: pvt_interface.h:48
This abstract class represents an interface to signal_source GNSS block.
This class represents a GNSS flow graph.
void disconnect()
Disconnect the blocks in the flow graph.
bool send_telemetry_msg(const pmt::pmt_t &msg)
Sends a GNU Radio asynchronous message from telemetry to PVT.
~GNSSFlowgraph()
Destructor.
GNU Radio block that stores TOW for Galileo channels.
Simple block to report the current receiver time based on the output of the tracking or telemetry blo...
void wait()
Wait for a flowgraph to complete.
This class represents an interface to a PVT block.
Implementation of the Gnss_Signal class.
void acquisition_manager(unsigned int who)
Manage satellite acquisition.
This abstract class represents an interface to configuration parameters.
Simple block to report the current receiver time based on the output of the tracking or telemetry blo...
void set_configuration(const std::shared_ptr< ConfigurationInterface > &configuration)
Set flow graph configuratiob.
This class represents a GNSS satellite.
GNSSFlowgraph(std::shared_ptr< ConfigurationInterface > configuration, std::shared_ptr< Concurrent_Queue< pmt::pmt_t >> queue)
Constructor that initializes the receiver flow graph.
This abstract class represents an interface to a channel GNSS block.
std::shared_ptr< PvtInterface > get_pvt()
Returns a smart pointer to the PVT object.
void connect()
Connects the defined blocks in the flow graph.
This class represents a GNSS signal.
Definition: gnss_signal.h:37
This abstract class represents an interface to GNSS blocks.
GNU Radio block that receives asynchronous channel messages from acquisition and tracking blocks...
void start()
Start the flow graph.
void apply_action(unsigned int who, unsigned int what)
Applies an action to the flow graph.
void priorize_satellites(const std::vector< std::pair< int, Gnss_Satellite >> &visible_satellites)
Priorize visible satellites in the specified vector.
GNU Radio block that processes Galileo HAS message pages received from Galileo E6B telemetry blocks...