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