GNSS-SDR 0.0.21
An Open Source GNSS Software Defined Receiver
Loading...
Searching...
No Matches
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
39class ad936x_iio_custom
40{
41public:
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
86private:
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
A class that holds a custom sample buffer for Analog Devices AD936x family front-ends.
This class implements a thread-safe std::queue.
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 simple container for the sample count associated to PPS rising edge.