GNSS-SDR  0.0.21
An Open Source GNSS Software Defined Receiver
ad936x_iio_custom.h
Go to the documentation of this file.
1 /*!
2  * \file ad936x_iio_custom.h
3  * \brief A direct IIO custom front-end driver for the AD936x AD front-end
4  * family with special FPGA custom functionalities.
5  * \author Javier Arribas, jarribas(at)cttc.es
6  * -----------------------------------------------------------------------------
7  *
8  * GNSS-SDR is a Global Navigation Satellite System software-defined receiver.
9  * This file is part of GNSS-SDR.
10  *
11  * Copyright (C) 2010-2022 (see AUTHORS file for a list of contributors)
12  * SPDX-License-Identifier: GPL-3.0-or-later
13  *
14  * -----------------------------------------------------------------------------
15  */
16 
17 
18 #ifndef GNSS_SDR_AD936X_IIO_CUSTOM_H
19 #define GNSS_SDR_AD936X_IIO_CUSTOM_H
20 
21 #include "ad936x_iio_samples.h"
22 #include "concurrent_queue.h"
23 #include "gnss_time.h"
24 #include "pps_samplestamp.h"
25 #include <boost/atomic.hpp>
26 #include <iio.h>
27 #include <ad9361.h> // multichip sync and high level functions
28 #include <memory>
29 #include <string>
30 #include <thread>
31 #include <vector>
32 
33 /** \addtogroup Signal_Source
34  * \{ */
35 /** \addtogroup Signal_Source_libs
36  * \{ */
37 
38 
40 {
41 public:
42  ad936x_iio_custom(int debug_level_, int log_level_);
43  virtual ~ad936x_iio_custom();
44  bool initialize_device(const std::string &pluto_device_uri, const std::string &board_type);
45 
46  bool init_config_ad9361_rx(long long bandwidth_,
47  long long sample_rate_,
48  long long freq_,
49  const std::string &rf_port_select_,
50  const std::string &rf_filter,
51  const std::string &gain_mode_rx0_,
52  const std::string &gain_mode_rx1_,
53  double rf_gain_rx0_,
54  double rf_gain_rx1_,
55  bool enable_ch0,
56  bool enable_ch1,
57  long long freq_2ch,
58  double lo_attenuation_db_,
59  bool high_side_lo_,
60  int tx_lo_channel_);
61 
62  bool calibrate(int ch, double bw_hz);
63 
64  double get_rx_gain(int ch_num);
65  bool setRXGain(int ch_num, const std::string &gain_mode, double gain_dB);
66 
67  bool set_antenna_port(int ch, int antenna_idx);
68  double get_frequency(int ch);
69  bool set_frequency(int ch, double freq_hz);
70 
71  bool start_sample_rx(bool ppsmode);
72  void stop_record();
73 
74  void set_gnsstime_queue(std::shared_ptr<Concurrent_Queue<GnssTime>> queue);
75  void set_pps_samplestamp_queue(std::shared_ptr<Concurrent_Queue<PpsSamplestamp>> queue);
76 
77  bool get_rx_frequency(long long &freq_hz);
78  bool set_rx_frequency(long long freq_hz);
79  bool read_die_temp(double &temp_c);
80 
81  void pop_sample_buffer(std::shared_ptr<ad936x_iio_samples> &current_buffer);
82 
83  void push_sample_buffer(std::shared_ptr<ad936x_iio_samples> &current_buffer);
84  int n_channels;
85 
86 private:
87  std::shared_ptr<Concurrent_Queue<GnssTime>> GnssTime_queue;
88  std::shared_ptr<Concurrent_Queue<PpsSamplestamp>> Pps_queue;
89  bool check_device();
90  bool get_iio_param(iio_device *dev, const std::string &param, std::string &value);
91  void configure_params(struct iio_device *phy,
92  const std::vector<std::string> &params);
93  void set_params_rx(struct iio_device *phy_device,
94  unsigned long long frequency,
95  unsigned long samplerate, unsigned long bandwidth,
96  bool quadrature, bool rfdc, bool bbdc,
97  const std::string &gain1, double gain1_value,
98  const std::string &gain2, double gain2_value,
99  const std::string &port_select);
100 
101  bool config_ad9361_dds(uint64_t freq_rf_tx_hz_,
102  double tx_attenuation_db_,
103  int64_t freq_dds_tx_hz_,
104  double scale_dds_,
105  double phase_dds_deg_,
106  int channel);
107 
108  void get_PPS_timestamp();
109  void capture(const std::vector<std::string> &channels);
110 
111  bool select_rf_filter(const std::string &rf_filter);
112 
113  void monitor_thread_fn();
114 
115  void PlutoTxEnable(bool txon);
116  void setPlutoGpo(int p);
117 
118  // Device structure
119  struct iio_context *ctx;
120  struct iio_device *phy;
121  struct iio_device *stream_dev;
122  struct iio_device *dds_dev;
123 
124  std::mutex mtx;
125  std::condition_variable cv;
126 
127  boost::atomic<bool> receive_samples;
128 
129  boost::atomic<bool> fpga_overflow;
130  // using queues of smart pointers to preallocated buffers
133 
134  std::thread capture_samples_thread;
135  std::thread overflow_monitor_thread;
136  std::thread capture_time_thread;
137 
138  // stream
139  uint64_t sample_rate_sps;
140  int debug_level;
141  int log_level;
142  bool PPS_mode;
143 };
144 
145 /** \} */
146 /** \} */
147 #endif // GNSS_SDR_AD936X_IIO_CUSTOM_H
Interface of a thread-safe std::queue.
class that stores both the receiver time, relative to the receiver start and the GNSS time (absolute)...
A class that holds a custom sample buffer for Analog Devices AD936x family front-ends.
A simple container for the sample count associated to PPS rising edge.
This class implements a thread-safe std::queue.