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