diff --git a/CMakeLists.txt b/CMakeLists.txt index 9c2cffe..a5dd8f5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -121,7 +121,6 @@ endif(APPLE) # components required to the list of GR_REQUIRED_COMPONENTS (in all # caps such as FILTER or FFT) and change the version to the minimum # API compatible version required. -find_package(CppUnit) find_package(Doxygen) MESSAGE(STATUS "Configuring GNU Radio C++ Libraries...") @@ -132,10 +131,6 @@ if("${Gnuradio_VERSION}" VERSION_LESS MIN_GR_VERSION) MESSAGE(FATAL_ERROR "GnuRadio version required: >=\"" ${MIN_GR_VERSION} "\" found: \"" ${Gnuradio_VERSION} "\"") endif() -if(NOT CPPUNIT_FOUND) - message(FATAL_ERROR "CppUnit required to compile limesdr") -endif() - ######################################################################## # Find LimeSuite ######################################################################## @@ -178,14 +173,12 @@ include_directories( ${CMAKE_BINARY_DIR}/lib ${CMAKE_BINARY_DIR}/include ${Boost_INCLUDE_DIRS} - ${CPPUNIT_INCLUDE_DIRS} ${GNURADIO_ALL_INCLUDE_DIRS} ${LIMESUITE_INCLUDE_DIRS} ) link_directories( ${Boost_LIBRARY_DIRS} - ${CPPUNIT_LIBRARY_DIRS} ${GNURADIO_RUNTIME_LIBRARY_DIRS} ${LIMESUITE_LIB} ) diff --git a/README.md b/README.md index b0a7439..a90d53b 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# gr-limesdr v0.9 beta +# gr-limesdr 1.0.0-RC Package includes GNU Radio blocks for LimeSDR-USB/LimeSDR-Mini boards. Various settings are hidden or shown, depending on the @@ -8,12 +8,6 @@ selected device type. * [MyriadRF Wiki page](https://wiki.myriadrf.org/Gr-limesdr_Plugin_for_GNURadio) -## Currently under development - -* Callback functions -* NCO setting -* Windows OS support - ## Dependencies * GNU Radio @@ -23,6 +17,8 @@ selected device type. ## Installation process +* Linux +
 cd gr-limesdr
 mkdir build
@@ -33,6 +29,21 @@ sudo make install
 sudo ldconfig
 
+* Windows + +If you have "GNU Radio", merge windows\GNU_Radio folders with folders located in + +
+C:\Program Files\GNURadio-3.7
+
+ +If you have "Pothos SDR dev environment", merge windows\Pothos_SDR folders with +folders located in + +
+C:\Program Files\PothosSDR
+
+ ## Known issues Known issues are located in: @@ -42,5 +53,3 @@ gr-limesdr/docs/known_issues.txt GNU Radio-Companion examples are located in: gr-limesdr/examples - -Select .wav file path before running any of the TX examples. diff --git a/docs/known_issues.txt b/docs/known_issues.txt index fe98b87..7edc123 100644 --- a/docs/known_issues.txt +++ b/docs/known_issues.txt @@ -5,7 +5,5 @@ this line is need to be added in the end of .bashrc file. 2. Blocks work with LimeSuite version 17.10.0 and above. -3. LimeSuite libraries ar not in /usr/local/lib. Delete libraries from usr/lib and reinstall LimeSuite. - -4. While running GNU Radio flowgraph “aUaU” message is thrown. This means audio underrun (not enough +3. While running GNU Radio flowgraph “aUaU” message is thrown. This means audio underrun (not enough samples ready to send to sound sink. diff --git a/examples/FM_RDS.grc b/examples/FM_RDS.grc new file mode 100644 index 0000000..fcd359f --- /dev/null +++ b/examples/FM_RDS.grc @@ -0,0 +1,3558 @@ + + + + Thu Aug 28 08:24:49 2014 + + options + + author + Lime Microsystems + + + window_size + 4096,4096 + + + category + Custom + + + comment + + + + description + + + + _enabled + True + + + _coordinate + (14, 9) + + + _rotation + 0 + + + generate_options + wx_gui + + + hier_block_src_path + .: + + + id + rds_rx + + + max_nouts + 0 + + + qt_qss_theme + + + + realtime_scheduling + + + + run_command + {python} -u {filename} + + + run_options + prompt + + + run + True + + + sizing_mode + fixed + + + thread_safe_setters + + + + title + FM RDS receiver + + + placement + (0,0) + + + + variable + + comment + + + + _enabled + True + + + _coordinate + (560, 4) + + + _rotation + 0 + + + id + audio_decim + + + value + 5 + + + + variable + + comment + + + + _enabled + True + + + _coordinate + (368, 1380) + + + _rotation + 0 + + + id + audio_decim_rate + + + value + baseband_rate/audio_decim + + + + variable + + comment + + + + _enabled + True + + + _coordinate + (272, 1380) + + + _rotation + 0 + + + id + audio_rate + + + value + 48000 + + + + variable + + comment + + + + _enabled + True + + + _coordinate + (448, 4) + + + _rotation + 0 + + + id + baseband_rate + + + value + samp_rate/bb_decim + + + + variable + + comment + + + + _enabled + True + + + _coordinate + (664, 4) + + + _rotation + 0 + + + id + bb_decim + + + value + 4 + + + + variable_slider + + comment + + + + converver + float_converter + + + value + 100.1e6 + + + _enabled + True + + + _coordinate + (1360, 16) + + + _rotation + 0 + + + grid_pos + (1,0,1,2) + + + id + freq + + + label + Frequency + + + max + 108e6 + + + min + 88e6 + + + notebook + + + + num_steps + 1000 + + + style + wx.SL_HORIZONTAL + + + + variable_slider + + comment + + + + converver + int_converter + + + value + 40 + + + _enabled + True + + + _coordinate + (1216, 16) + + + _rotation + 0 + + + grid_pos + (0,0,1,1) + + + id + gain + + + label + RF Gain + + + max + 70 + + + min + 0 + + + notebook + + + + num_steps + 70 + + + style + wx.SL_HORIZONTAL + + + + variable + + comment + + + + _enabled + True + + + _coordinate + (344, 4) + + + _rotation + 0 + + + id + samp_rate + + + value + 1000000 + + + + variable_slider + + comment + + + + converver + float_converter + + + value + 0.5 + + + _enabled + True + + + _coordinate + (1504, 16) + + + _rotation + 0 + + + grid_pos + (0,1,1,1) + + + id + volume + + + label + Volume + + + max + 2 + + + min + 0 + + + notebook + + + + num_steps + 51 + + + style + wx.SL_HORIZONTAL + + + + variable + + comment + + + + _enabled + True + + + _coordinate + (280, 308) + + + _rotation + 0 + + + id + xlate_bandwidth + + + value + 100000 + + + + analog_fm_deemph + + alias + + + + comment + + + + affinity + + + + _enabled + True + + + _coordinate + (632, 1308) + + + _rotation + 180 + + + id + analog_fm_deemph_0_0 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + samp_rate + audio_decim_rate + + + tau + 75e-6 + + + + analog_fm_deemph + + alias + + + + comment + + + + affinity + + + + _enabled + True + + + _coordinate + (640, 1460) + + + _rotation + 180 + + + id + analog_fm_deemph_0_0_0 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + samp_rate + audio_decim_rate + + + tau + 75e-6 + + + + analog_pll_refout_cc + + alias + + + + comment + + + + affinity + + + + _enabled + True + + + _coordinate + (864, 532) + + + _rotation + 0 + + + id + analog_pll_refout_cc_0 + + + w + 0.001 + + + max_freq + 2 * math.pi * (19000+200) / baseband_rate + + + maxoutbuf + 0 + + + min_freq + 2 * math.pi * (19000-200) / baseband_rate + + + minoutbuf + 0 + + + + analog_wfm_rcv + + audio_decimation + bb_decim + + + alias + + + + comment + + + + affinity + + + + _enabled + True + + + _coordinate + (536, 380) + + + _rotation + 0 + + + id + analog_wfm_rcv_0 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + quad_rate + samp_rate + + + + audio_sink + + alias + + + + comment + + + + affinity + + + + device_name + + + + _enabled + True + + + _coordinate + (48, 1352) + + + _rotation + 180 + + + id + audio_sink_0 + + + num_inputs + 2 + + + ok_to_block + True + + + samp_rate + audio_rate + + + + blocks_add_xx + + alias + + + + comment + + + + affinity + + + + _enabled + True + + + _coordinate + (824, 1456) + + + _rotation + 180 + + + id + blocks_add_xx_0 + + + type + float + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + num_inputs + 2 + + + vlen + 1 + + + + blocks_complex_to_imag + + alias + + + + comment + + + + affinity + + + + _enabled + True + + + _coordinate + (872, 680) + + + _rotation + 0 + + + id + blocks_complex_to_imag_0 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + vlen + 1 + + + + blocks_complex_to_real + + alias + + + + comment + + + + affinity + + + + _enabled + True + + + _coordinate + (272, 1056) + + + _rotation + 0 + + + id + blocks_complex_to_real_0 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + vlen + 1 + + + + blocks_keep_one_in_n + + alias + + + + comment + + + + affinity + + + + _enabled + True + + + _coordinate + (232, 1100) + + + _rotation + 0 + + + id + blocks_keep_one_in_n_0 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + n + 2 + + + type + byte + + + vlen + 1 + + + + blocks_multiply_const_vxx + + alias + + + + comment + + + + const + volume + + + affinity + + + + _enabled + True + + + _coordinate + (472, 1468) + + + _rotation + 180 + + + id + blocks_multiply_const_vxx_0 + + + type + float + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + vlen + 1 + + + + blocks_multiply_const_vxx + + alias + + + + comment + + + + const + volume + + + affinity + + + + _enabled + True + + + _coordinate + (472, 1316) + + + _rotation + 180 + + + id + blocks_multiply_const_vxx_0_0 + + + type + float + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + vlen + 1 + + + + blocks_multiply_xx + + alias + + + + comment + + + + affinity + + + + _enabled + True + + + _coordinate + (1264, 736) + + + _rotation + 270 + + + id + blocks_multiply_xx_0 + + + type + float + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + num_inputs + 2 + + + vlen + 1 + + + + blocks_multiply_xx + + alias + + + + comment + + + + affinity + + + + _enabled + True + + + _coordinate + (928, 608) + + + _rotation + 180 + + + id + blocks_multiply_xx_1 + + + type + complex + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + num_inputs + 2 + + + vlen + 1 + + + + blocks_sub_xx + + alias + + + + comment + + + + affinity + + + + _enabled + True + + + _coordinate + (808, 1304) + + + _rotation + 180 + + + id + blocks_sub_xx_0 + + + type + float + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + num_inputs + 2 + + + vlen + 1 + + + + digital_binary_slicer_fb + + alias + + + + comment + + + + affinity + + + + _enabled + True + + + _coordinate + (80, 1104) + + + _rotation + 0 + + + id + digital_binary_slicer_fb_0 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + + digital_diff_decoder_bb + + alias + + + + comment + + + + affinity + + + + _enabled + True + + + _coordinate + (368, 1100) + + + _rotation + 0 + + + id + digital_diff_decoder_bb_0 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + modulus + 2 + + + + digital_mpsk_receiver_cc + + alias + + + + comment + + + + affinity + + + + _enabled + True + + + _coordinate + (48, 884) + + + _rotation + 0 + + + gain_mu + 0.05 + + + gain_omega + 0.001 + + + id + digital_mpsk_receiver_cc_0 + + + w + 1*cmath.pi/100.0 + + + M + 2 + + + fmax + 0.06 + + + maxoutbuf + 0 + + + fmin + -0.06 + + + minoutbuf + 0 + + + mu + 0.5 + + + omega_relative_limit + 0.005 + + + omega + samp_rate/bb_decim/audio_decim/ 2375.0 + + + theta + 0 + + + + fir_filter_xxx + + alias + + + + comment + + + + affinity + + + + decim + audio_decim + + + _enabled + True + + + _coordinate + (668, 696) + + + _rotation + 270 + + + id + fir_filter_xxx_1 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + samp_delay + 0 + + + taps + firdes.low_pass(1.0,baseband_rate,13e3,3e3,firdes.WIN_HAMMING) + + + type + fff + + + + fir_filter_xxx + + alias + + + + comment + + + + affinity + + + + decim + 1 + + + _enabled + True + + + _coordinate + (864, 412) + + + _rotation + 180 + + + id + fir_filter_xxx_2 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + samp_delay + 0 + + + taps + firdes.complex_band_pass(1.0,baseband_rate,19e3-500,19e3+500,1e3,firdes.WIN_HAMMING) + + + type + fcc + + + + fir_filter_xxx + + alias + + + + comment + + + + affinity + + + + decim + 1 + + + _enabled + True + + + _coordinate + (1272, 380) + + + _rotation + 0 + + + id + fir_filter_xxx_3 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + samp_delay + 0 + + + taps + firdes.band_pass(1.0,baseband_rate,38e3-13e3,38e3+13e3,3e3,firdes.WIN_HAMMING) + + + type + fff + + + + fir_filter_xxx + + alias + + + + comment + + + + affinity + + + + decim + audio_decim + + + _enabled + True + + + _coordinate + (1268, 1144) + + + _rotation + 270 + + + id + fir_filter_xxx_5 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + samp_delay + 0 + + + taps + firdes.low_pass(1.0,baseband_rate,20e3,40e3,firdes.WIN_HAMMING) + + + type + fff + + + + freq_xlating_fir_filter_xxx + + alias + + + + center_freq + 0 + + + comment + + + + affinity + + + + decim + 1 + + + _enabled + True + + + _coordinate + (240, 368) + + + _rotation + 0 + + + id + freq_xlating_fir_filter_xxx_0 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + samp_rate + samp_rate + + + taps + firdes.low_pass(1, samp_rate, xlate_bandwidth, 100000) + + + type + ccc + + + + freq_xlating_fir_filter_xxx + + alias + + + + center_freq + 57e3 + + + comment + + + + affinity + + + + decim + audio_decim + + + _enabled + True + + + _coordinate + (48, 648) + + + _rotation + 0 + + + id + freq_xlating_fir_filter_xxx_1 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + samp_rate + baseband_rate + + + taps + firdes.low_pass(2500.0,baseband_rate,2.4e3,2e3,firdes.WIN_HAMMING) + + + type + fcc + + + + gr_rds_decoder + + alias + + + + comment + + + + affinity + + + + debug + False + + + _enabled + True + + + _coordinate + (408, 1156) + + + _rotation + 180 + + + id + gr_rds_decoder_0 + + + log + True + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + + gr_rds_panel + + alias + + + + comment + + + + affinity + + + + _enabled + True + + + freq + freq + + + _coordinate + (40, 1168) + + + _rotation + 180 + + + grid_pos + + + + id + gr_rds_panel_0 + + + notebook + + + + + gr_rds_parser + + alias + + + + comment + + + + affinity + + + + debug + False + + + _enabled + True + + + _coordinate + (224, 1148) + + + _rotation + 180 + + + id + gr_rds_parser_0 + + + log + True + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + pty_locale + 0 + + + reset + 0 + + + + import + + alias + + + + comment + + + + _enabled + True + + + _coordinate + (888, 484) + + + _rotation + 0 + + + id + import_0 + + + import + import math + + + + limesdr_source + + alias + + + + channel + 0 + + + analog_bandw_ch0 + 1.5e6 + + + analog_filter_ch0 + 1 + + + cmix_mode_ch0 + 0 + + + calibr_bandw_ch0 + 2.5e6 + + + calibration_ch0 + 1 + + + digital_bandw_ch0 + 100e3 + + + digital_filter_ch0 + 1 + + + gain_dB_ch0 + gain + + + lna_path_ch0 + 2 + + + lna_path_mini + 3 + + + nco_freq_ch0 + 0 + + + analog_bandw_ch1 + 10e6 + + + analog_filter_ch1 + 0 + + + cmix_mode_ch1 + 0 + + + calibr_bandw_ch1 + 10e6 + + + calibration_ch1 + 0 + + + digital_bandw_ch1 + 0 + + + digital_filter_ch1 + 0 + + + gain_dB_ch1 + 60 + + + lna_path_ch1 + 1 + + + nco_freq_ch1 + 100e6 + + + chip_mode + 1 + + + comment + + + + affinity + + + + serial + + + + device_type + 1 + + + _enabled + True + + + filename + + + + _coordinate + (8, 260) + + + _rotation + 0 + + + id + limesdr_source_0 + + + file_switch + 0 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + oversample + 0 + + + rf_freq + freq + + + samp_rate + samp_rate + + + + notebook + + alias + + + + comment + + + + _enabled + True + + + _coordinate + (184, 6) + + + _rotation + 0 + + + grid_pos + (2,0,1,2) + + + id + nb + + + labels + ['BB', 'Demod', 'L+R', 'L-R', 'Pilot', 'DSBSC', 'RDS', 'RDS constellation','Waterfall'] + + + notebook + + + + style + wx.NB_TOP + + + + note + + alias + + + + comment + L+R for +stereo +receivers + + + _enabled + True + + + _coordinate + (776, 900) + + + _rotation + 180 + + + id + note_0 + + + note + L+R + + + + note + + alias + + + + comment + In FM stereo broadcasting, +a pilot tone of 19 kHz indicates +that there is stereophonic +information at 38 kHz +(19×2, the second harmonic of the pilot). +The receiver doubles the frequency +of the pilot tone and uses it as a +frequency and phase reference to +demodulate the stereo information. + + + _enabled + True + + + _coordinate + (1048, 460) + + + _rotation + 180 + + + id + note_0_0 + + + note + Pilot + + + + note + + alias + + + + comment + DSBSC modulation +of 38 kHz sinewave +for mono + + + _enabled + True + + + _coordinate + (1272, 276) + + + _rotation + 180 + + + id + note_0_0_0 + + + note + DSBSC + + + + note + + alias + + + + comment + L-R for +mono +receivers + + + _enabled + True + + + _coordinate + (1136, 900) + + + _rotation + 0 + + + id + note_0_1 + + + note + L-R + + + + note + + alias + + + + comment + Digital signal which +includes information such +as the name of the station, +or free text such as the title +of the program or the music. + + + _enabled + True + + + _coordinate + (264, 548) + + + _rotation + 180 + + + id + note_0_2 + + + note + RDS + + + + note + + alias + + + + comment + We use lowest possible +analog filter bandwidth +and +100 kHz digital filter bandwidth + + + _enabled + True + + + _coordinate + (8, 140) + + + _rotation + 180 + + + id + note_10 + + + note + LimeSDR + + + + rational_resampler_xxx + + alias + + + + comment + + + + affinity + + + + decim + audio_decim_rate + + + _enabled + True + + + fbw + 0 + + + _coordinate + (280, 1448) + + + _rotation + 180 + + + id + rational_resampler_xxx_0 + + + interp + audio_rate + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + taps + [] + + + type + fff + + + + rational_resampler_xxx + + alias + + + + comment + + + + affinity + + + + decim + audio_decim_rate + + + _enabled + True + + + fbw + 0 + + + _coordinate + (280, 1296) + + + _rotation + 180 + + + id + rational_resampler_xxx_0_0 + + + interp + audio_rate + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + taps + [] + + + type + fff + + + + root_raised_cosine_filter + + alpha + 1 + + + alias + + + + comment + + + + affinity + + + + decim + 1 + + + _enabled + True + + + type + fir_filter_ccf + + + _coordinate + (48, 760) + + + _rotation + 180 + + + gain + 1 + + + id + root_raised_cosine_filter_0 + + + interp + 1 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + ntaps + 100 + + + samp_rate + samp_rate/bb_decim/audio_decim + + + sym_rate + 2375 + + + + wxgui_fftsink2 + + avg_alpha + 0.8 + + + average + True + + + baseband_freq + 0 + + + alias + + + + comment + + + + affinity + + + + _enabled + True + + + fft_size + 1024 + + + freqvar + None + + + _coordinate + (544, 120) + + + _rotation + 0 + + + grid_pos + + + + id + wxgui_fftsink2_0 + + + notebook + nb, 0 + + + peak_hold + False + + + ref_level + -30 + + + ref_scale + 2.0 + + + fft_rate + 15 + + + samp_rate + samp_rate + + + title + Baseband + + + type + complex + + + win_size + + + + win + None + + + y_divs + 10 + + + y_per_div + 10 + + + + wxgui_fftsink2 + + avg_alpha + 0.8 + + + average + True + + + baseband_freq + 0 + + + alias + + + + comment + + + + affinity + + + + _enabled + True + + + fft_size + 1024 + + + freqvar + None + + + _coordinate + (904, 120) + + + _rotation + 180 + + + grid_pos + + + + id + wxgui_fftsink2_0_0 + + + notebook + nb, 1 + + + peak_hold + False + + + ref_level + 0 + + + ref_scale + 2.0 + + + fft_rate + 15 + + + samp_rate + baseband_rate + + + title + FM Demod + + + type + float + + + win_size + + + + win + None + + + y_divs + 10 + + + y_per_div + 10 + + + + wxgui_fftsink2 + + avg_alpha + 0 + + + average + False + + + baseband_freq + 0 + + + alias + + + + comment + + + + affinity + + + + _enabled + True + + + fft_size + 1024 + + + freqvar + None + + + _coordinate + (736, 1012) + + + _rotation + 0 + + + grid_pos + + + + id + wxgui_fftsink2_0_0_0 + + + notebook + nb, 2 + + + peak_hold + False + + + ref_level + 0 + + + ref_scale + 2.0 + + + fft_rate + 15 + + + samp_rate + audio_decim_rate + + + title + L+R + + + type + float + + + win_size + + + + win + None + + + y_divs + 10 + + + y_per_div + 10 + + + + wxgui_fftsink2 + + avg_alpha + 0 + + + average + False + + + baseband_freq + 0 + + + alias + + + + comment + + + + affinity + + + + _enabled + True + + + fft_size + 1024 + + + freqvar + None + + + _coordinate + (1504, 316) + + + _rotation + 0 + + + grid_pos + + + + id + wxgui_fftsink2_0_0_0_1 + + + notebook + nb, 5 + + + peak_hold + False + + + ref_level + 0 + + + ref_scale + 2.0 + + + fft_rate + 15 + + + samp_rate + baseband_rate + + + title + DSBSC Sub-carrier + + + type + float + + + win_size + + + + win + None + + + y_divs + 10 + + + y_per_div + 10 + + + + wxgui_fftsink2 + + avg_alpha + 0 + + + average + False + + + baseband_freq + 0 + + + alias + + + + comment + + + + affinity + + + + _enabled + True + + + fft_size + 1024 + + + freqvar + None + + + _coordinate + (1096, 1012) + + + _rotation + 180 + + + grid_pos + + + + id + wxgui_fftsink2_0_0_0_1_0_0 + + + notebook + nb, 3 + + + peak_hold + False + + + ref_level + -50 + + + ref_scale + 2.0 + + + fft_rate + 15 + + + samp_rate + baseband_rate + + + title + L-R + + + type + float + + + win_size + + + + win + None + + + y_divs + 10 + + + y_per_div + 10 + + + + wxgui_fftsink2 + + avg_alpha + 0 + + + average + False + + + baseband_freq + 0 + + + alias + + + + comment + + + + affinity + + + + _enabled + True + + + fft_size + 1024 + + + freqvar + None + + + _coordinate + (312, 684) + + + _rotation + 0 + + + grid_pos + + + + id + wxgui_fftsink2_0_0_0_1_0_1 + + + notebook + nb,6 + + + peak_hold + False + + + ref_level + 0 + + + ref_scale + 2.0 + + + fft_rate + 15 + + + samp_rate + audio_rate + + + title + RDS + + + type + complex + + + win_size + + + + win + None + + + y_divs + 10 + + + y_per_div + 10 + + + + wxgui_scopesink2 + + ac_couple + False + + + alias + + + + comment + + + + affinity + + + + _enabled + 1 + + + _coordinate + (864, 728) + + + _rotation + 180 + + + grid_pos + + + + id + wxgui_scopesink2_0 + + + notebook + nb, 4 + + + num_inputs + 1 + + + samp_rate + baseband_rate + + + t_scale + 0 + + + title + Pilot + + + trig_mode + wxgui.TRIG_MODE_AUTO + + + type + float + + + v_offset + 0 + + + v_scale + 0 + + + win_size + + + + xy_mode + False + + + y_axis_label + Counts + + + + wxgui_scopesink2 + + ac_couple + False + + + alias + + + + comment + + + + affinity + + + + _enabled + True + + + _coordinate + (320, 904) + + + _rotation + 0 + + + grid_pos + + + + id + wxgui_scopesink2_1 + + + notebook + nb,7 + + + num_inputs + 1 + + + samp_rate + 2375 + + + t_scale + 0 + + + title + Scope Plot + + + trig_mode + wxgui.TRIG_MODE_AUTO + + + type + complex + + + v_offset + 0 + + + v_scale + 0.4 + + + win_size + + + + xy_mode + True + + + y_axis_label + Counts + + + + wxgui_waterfallsink2 + + avg_alpha + 0 + + + average + False + + + baseband_freq + 0 + + + alias + + + + comment + + + + affinity + + + + dynamic_range + 100 + + + _enabled + True + + + fft_rate + 15 + + + fft_size + 512 + + + freqvar + None + + + _coordinate + (736, 124) + + + _rotation + 0 + + + grid_pos + + + + id + wxgui_waterfallsink2_0 + + + notebook + nb,8 + + + ref_scale + 2.0 + + + ref_level + 0 + + + samp_rate + baseband_rate + + + title + Waterfall Plot + + + type + float + + + win_size + + + + win + None + + + + analog_fm_deemph_0_0 + blocks_multiply_const_vxx_0_0 + 0 + 0 + + + analog_fm_deemph_0_0_0 + blocks_multiply_const_vxx_0 + 0 + 0 + + + analog_pll_refout_cc_0 + blocks_multiply_xx_1 + 0 + 0 + + + analog_pll_refout_cc_0 + blocks_multiply_xx_1 + 0 + 1 + + + analog_wfm_rcv_0 + fir_filter_xxx_1 + 0 + 0 + + + analog_wfm_rcv_0 + fir_filter_xxx_2 + 0 + 0 + + + analog_wfm_rcv_0 + fir_filter_xxx_3 + 0 + 0 + + + analog_wfm_rcv_0 + freq_xlating_fir_filter_xxx_1 + 0 + 0 + + + analog_wfm_rcv_0 + wxgui_fftsink2_0_0 + 0 + 0 + + + analog_wfm_rcv_0 + wxgui_waterfallsink2_0 + 0 + 0 + + + blocks_add_xx_0 + analog_fm_deemph_0_0_0 + 0 + 0 + + + blocks_complex_to_imag_0 + blocks_multiply_xx_0 + 0 + 1 + + + blocks_complex_to_imag_0 + wxgui_scopesink2_0 + 0 + 0 + + + blocks_complex_to_real_0 + digital_binary_slicer_fb_0 + 0 + 0 + + + blocks_keep_one_in_n_0 + digital_diff_decoder_bb_0 + 0 + 0 + + + blocks_multiply_const_vxx_0 + rational_resampler_xxx_0 + 0 + 0 + + + blocks_multiply_const_vxx_0_0 + rational_resampler_xxx_0_0 + 0 + 0 + + + blocks_multiply_xx_0 + fir_filter_xxx_5 + 0 + 0 + + + blocks_multiply_xx_0 + wxgui_fftsink2_0_0_0_1_0_0 + 0 + 0 + + + blocks_multiply_xx_1 + blocks_complex_to_imag_0 + 0 + 0 + + + blocks_sub_xx_0 + analog_fm_deemph_0_0 + 0 + 0 + + + digital_binary_slicer_fb_0 + blocks_keep_one_in_n_0 + 0 + 0 + + + digital_diff_decoder_bb_0 + gr_rds_decoder_0 + 0 + 0 + + + digital_mpsk_receiver_cc_0 + blocks_complex_to_real_0 + 0 + 0 + + + digital_mpsk_receiver_cc_0 + wxgui_scopesink2_1 + 0 + 0 + + + fir_filter_xxx_1 + blocks_add_xx_0 + 0 + 0 + + + fir_filter_xxx_1 + blocks_sub_xx_0 + 0 + 0 + + + fir_filter_xxx_1 + wxgui_fftsink2_0_0_0 + 0 + 0 + + + fir_filter_xxx_2 + analog_pll_refout_cc_0 + 0 + 0 + + + fir_filter_xxx_3 + blocks_multiply_xx_0 + 0 + 0 + + + fir_filter_xxx_3 + wxgui_fftsink2_0_0_0_1 + 0 + 0 + + + fir_filter_xxx_5 + blocks_add_xx_0 + 0 + 1 + + + fir_filter_xxx_5 + blocks_sub_xx_0 + 0 + 1 + + + freq_xlating_fir_filter_xxx_0 + analog_wfm_rcv_0 + 0 + 0 + + + freq_xlating_fir_filter_xxx_0 + wxgui_fftsink2_0 + 0 + 0 + + + freq_xlating_fir_filter_xxx_1 + root_raised_cosine_filter_0 + 0 + 0 + + + freq_xlating_fir_filter_xxx_1 + wxgui_fftsink2_0_0_0_1_0_1 + 0 + 0 + + + gr_rds_decoder_0 + gr_rds_parser_0 + out + in + + + gr_rds_parser_0 + gr_rds_panel_0 + out + in + + + limesdr_source_0 + freq_xlating_fir_filter_xxx_0 + 0 + 0 + + + rational_resampler_xxx_0 + audio_sink_0 + 0 + 0 + + + rational_resampler_xxx_0_0 + audio_sink_0 + 0 + 1 + + + root_raised_cosine_filter_0 + digital_mpsk_receiver_cc_0 + 0 + 0 + + diff --git a/examples/FM_receiver.grc b/examples/FM_receiver.grc index 707890e..020a348 100644 --- a/examples/FM_receiver.grc +++ b/examples/FM_receiver.grc @@ -1,5 +1,5 @@ - + Tue Feb 20 16:15:20 2018 @@ -10,7 +10,7 @@ window_size - + (1200,500) category @@ -72,6 +72,10 @@ run True + + sizing_mode + fixed + thread_safe_setters @@ -80,6 +84,10 @@ title FM receiver + + placement + (0,0) + variable_slider @@ -101,7 +109,7 @@ _coordinate - (584, 17) + (248, 368) _rotation @@ -160,7 +168,7 @@ _coordinate - (728, 17) + (392, 368) _rotation @@ -219,7 +227,7 @@ _coordinate - (864, 17) + (896, 152) _rotation @@ -282,7 +290,7 @@ _coordinate - (616, 205) + (704, 260) _rotation @@ -329,7 +337,7 @@ _coordinate - (840, 140) + (1056, 268) _rotation @@ -376,7 +384,7 @@ _coordinate - (792, 212) + (896, 268) _rotation @@ -421,6 +429,10 @@ analog_filter_ch0 1 + + cmix_mode_ch0 + 0 + calibr_bandw_ch0 2.5e6 @@ -449,6 +461,10 @@ lna_path_mini 3 + + nco_freq_ch0 + 0 + analog_bandw_ch1 2e6 @@ -457,6 +473,10 @@ analog_filter_ch1 1 + + cmix_mode_ch1 + 0 + calibr_bandw_ch1 2.5e6 @@ -482,8 +502,8 @@ 2 - rf_freq - 100.1e6 + nco_freq_ch1 + 0 chip_mode @@ -498,8 +518,8 @@ - device_number - 0 + serial + device_type @@ -515,7 +535,7 @@ _coordinate - (8, 107) + (8, 148) _rotation @@ -541,6 +561,10 @@ oversample 0 + + rf_freq + 100.1e6 + samp_rate 2e6 @@ -582,7 +606,7 @@ _coordinate - (248, 170) + (288, 224) _rotation @@ -649,7 +673,7 @@ _coordinate - (440, 191) + (520, 248) _rotation @@ -720,7 +744,7 @@ _coordinate - (424, 13) + (520, 12) _rotation diff --git a/examples/FM_transmitter.grc b/examples/FM_transmitter.grc index 46106bd..edd6fcb 100644 --- a/examples/FM_transmitter.grc +++ b/examples/FM_transmitter.grc @@ -1,5 +1,5 @@ - + Tue Feb 20 16:22:48 2018 @@ -10,7 +10,7 @@ window_size - + (1000,500) category @@ -72,6 +72,10 @@ run True + + sizing_mode + fixed + thread_safe_setters @@ -80,6 +84,10 @@ title FM transmitter + + placement + (0,0) + analog_nbfm_tx @@ -105,7 +113,7 @@ _coordinate - (216, 199) + (200, 200) _rotation @@ -127,6 +135,10 @@ minoutbuf 0 + + fh + -1.0 + quad_rate 480000 @@ -160,7 +172,7 @@ _coordinate - (8, 213) + (16, 220) _rotation @@ -205,6 +217,10 @@ analog_filter_ch0 1 + + cmix_mode_ch0 + 0 + calibr_bandw_ch0 2.5e6 @@ -225,6 +241,10 @@ gain_dB_ch0 60 + + nco_freq_ch0 + 0 + pa_path_ch0 1 @@ -241,6 +261,10 @@ analog_filter_ch1 1 + + cmix_mode_ch1 + 0 + calibr_bandw_ch1 10e6 @@ -262,12 +286,12 @@ 0 - pa_path_ch1 - 1 + nco_freq_ch1 + 0 - rf_freq - 446.09375e6 + pa_path_ch1 + 1 chip_mode @@ -282,8 +306,8 @@ - device_number - 0 + serial + device_type @@ -299,7 +323,7 @@ _coordinate - (608, 19) + (696, 20) _rotation @@ -317,6 +341,10 @@ oversample 0 + + rf_freq + 446.09375e6 + samp_rate 2e6 @@ -350,7 +378,7 @@ _coordinate - (400, 199) + (448, 208) _rotation @@ -421,7 +449,7 @@ _coordinate - (608, 285) + (696, 308) _rotation diff --git a/examples/GFSK.grc b/examples/GFSK.grc new file mode 100644 index 0000000..891f9e8 --- /dev/null +++ b/examples/GFSK.grc @@ -0,0 +1,1640 @@ + + + + Thu May 24 14:58:19 2018 + + options + + author + Lime Microsystems + + + window_size + (1000,500) + + + category + Custom + + + comment + + + + description + + + + _enabled + True + + + _coordinate + (8, 8) + + + _rotation + 0 + + + generate_options + qt_gui + + + hier_block_src_path + .: + + + id + top_block + + + max_nouts + 0 + + + qt_qss_theme + + + + realtime_scheduling + + + + run_command + {python} -u {filename} + + + run_options + prompt + + + run + True + + + sizing_mode + fixed + + + thread_safe_setters + + + + title + GFSK loopback + + + placement + (0,0) + + + + analog_quadrature_demod_cf + + alias + + + + comment + + + + affinity + + + + _enabled + True + + + _coordinate + (656, 52) + + + _rotation + 0 + + + gain + 1 + + + id + analog_quadrature_demod_cf_0 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + + analog_quadrature_demod_cf + + alias + + + + comment + + + + affinity + + + + _enabled + True + + + _coordinate + (256, 292) + + + _rotation + 0 + + + gain + 1 + + + id + analog_quadrature_demod_cf_0_0 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + + blks2_packet_decoder + + access_code + + + + alias + + + + comment + + + + affinity + + + + _enabled + 1 + + + _coordinate + (472, 388) + + + _rotation + 0 + + + id + blks2_packet_decoder_0 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + type + byte + + + threshold + -1 + + + + blks2_packet_encoder + + access_code + + + + bits_per_symbol + 1 + + + alias + + + + comment + + + + affinity + + + + _enabled + True + + + _coordinate + (240, 96) + + + _rotation + 0 + + + id + blks2_packet_encoder_0 + + + type + byte + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + pad_for_usrp + False + + + payload_length + 16 + + + preamble + + + + samples_per_symbol + 4 + + + + blocks_file_sink + + append + False + + + alias + + + + comment + + + + affinity + + + + _enabled + 1 + + + file + + + + _coordinate + (640, 380) + + + _rotation + 0 + + + id + blocks_file_sink_0 + + + type + byte + + + unbuffered + True + + + vlen + 1 + + + + blocks_file_source + + begin_tag + pmt.PMT_NIL + + + alias + + + + comment + + + + affinity + + + + _enabled + True + + + file + + + + _coordinate + (72, 116) + + + _rotation + 0 + + + id + blocks_file_source_0 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + type + byte + + + repeat + True + + + vlen + 1 + + + + digital_gfsk_demod + + alias + + + + comment + + + + affinity + + + + _enabled + 1 + + + freq_error + 0.0 + + + _coordinate + (256, 360) + + + _rotation + 0 + + + gain_mu + 0.175 + + + id + digital_gfsk_demod_0 + + + log + False + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + mu + 0.5 + + + omega_relative_limit + 0.005 + + + samples_per_symbol + 4 + + + sensitivity + 1 + + + verbose + False + + + + digital_gfsk_mod + + bt + 0.35 + + + alias + + + + comment + + + + affinity + + + + _enabled + True + + + _coordinate + (448, 112) + + + _rotation + 0 + + + id + digital_gfsk_mod_0 + + + log + False + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + samples_per_symbol + 4 + + + sensitivity + 1 + + + verbose + True + + + + limesdr_sink + + alias + + + + channel + 0 + + + analog_bandw_ch0 + 10e6 + + + analog_filter_ch0 + 0 + + + cmix_mode_ch0 + 0 + + + calibr_bandw_ch0 + 10e6 + + + calibration_ch0 + 0 + + + digital_bandw_ch0 + 0 + + + digital_filter_ch0 + 0 + + + gain_dB_ch0 + 40 + + + nco_freq_ch0 + 0 + + + pa_path_ch0 + 1 + + + pa_path_mini + 1 + + + analog_bandw_ch1 + 10e6 + + + analog_filter_ch1 + 0 + + + cmix_mode_ch1 + 0 + + + calibr_bandw_ch1 + 10e6 + + + calibration_ch1 + 0 + + + digital_bandw_ch1 + 0 + + + digital_filter_ch1 + 0 + + + gain_dB_ch1 + 60 + + + nco_freq_ch1 + 100e6 + + + pa_path_ch1 + 1 + + + chip_mode + 1 + + + comment + + + + affinity + + + + serial + + + + device_type + 2 + + + _enabled + 1 + + + filename + + + + _coordinate + (816, 120) + + + _rotation + 0 + + + id + limesdr_sink_0 + + + file_switch + 0 + + + oversample + 0 + + + rf_freq + 1e9 + + + samp_rate + 0.5e6 + + + + limesdr_source + + alias + + + + channel + 0 + + + analog_bandw_ch0 + 10e6 + + + analog_filter_ch0 + 0 + + + cmix_mode_ch0 + 0 + + + calibr_bandw_ch0 + 10e6 + + + calibration_ch0 + 0 + + + digital_bandw_ch0 + 0 + + + digital_filter_ch0 + 0 + + + gain_dB_ch0 + 40 + + + lna_path_ch0 + 2 + + + lna_path_mini + 3 + + + nco_freq_ch0 + 0 + + + analog_bandw_ch1 + 10e6 + + + analog_filter_ch1 + 0 + + + cmix_mode_ch1 + 0 + + + calibr_bandw_ch1 + 10e6 + + + calibration_ch1 + 0 + + + digital_bandw_ch1 + 0 + + + digital_filter_ch1 + 0 + + + gain_dB_ch1 + 60 + + + lna_path_ch1 + 1 + + + nco_freq_ch1 + 100e6 + + + chip_mode + 1 + + + comment + + + + affinity + + + + serial + + + + device_type + 2 + + + _enabled + 1 + + + filename + + + + _coordinate + (8, 240) + + + _rotation + 0 + + + id + limesdr_source_0 + + + file_switch + 0 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + oversample + 0 + + + rf_freq + 1e9 + + + samp_rate + 0.5e6 + + + + qtgui_time_sink_x + + autoscale + False + + + axislabels + True + + + alias + + + + comment + + + + ctrlpanel + False + + + affinity + + + + entags + True + + + _enabled + True + + + _coordinate + (832, 32) + + + gui_hint + + + + _rotation + 0 + + + grid + False + + + id + qtgui_time_sink_x_0 + + + legend + True + + + alpha1 + 1.0 + + + color1 + "blue" + + + label1 + + + + marker1 + -1 + + + style1 + 1 + + + width1 + 1 + + + alpha10 + 1.0 + + + color10 + "blue" + + + label10 + + + + marker10 + -1 + + + style10 + 1 + + + width10 + 1 + + + alpha2 + 1.0 + + + color2 + "red" + + + label2 + + + + marker2 + -1 + + + style2 + 1 + + + width2 + 1 + + + alpha3 + 1.0 + + + color3 + "green" + + + label3 + + + + marker3 + -1 + + + style3 + 1 + + + width3 + 1 + + + alpha4 + 1.0 + + + color4 + "black" + + + label4 + + + + marker4 + -1 + + + style4 + 1 + + + width4 + 1 + + + alpha5 + 1.0 + + + color5 + "cyan" + + + label5 + + + + marker5 + -1 + + + style5 + 1 + + + width5 + 1 + + + alpha6 + 1.0 + + + color6 + "magenta" + + + label6 + + + + marker6 + -1 + + + style6 + 1 + + + width6 + 1 + + + alpha7 + 1.0 + + + color7 + "yellow" + + + label7 + + + + marker7 + -1 + + + style7 + 1 + + + width7 + 1 + + + alpha8 + 1.0 + + + color8 + "dark red" + + + label8 + + + + marker8 + -1 + + + style8 + 1 + + + width8 + 1 + + + alpha9 + 1.0 + + + color9 + "dark green" + + + label9 + + + + marker9 + -1 + + + style9 + 1 + + + width9 + 1 + + + name + Sent Signal + + + nconnections + 1 + + + size + 1024 + + + srate + 2.4e6 + + + stemplot + False + + + tr_chan + 0 + + + tr_delay + 0 + + + tr_level + 0.0 + + + tr_mode + qtgui.TRIG_MODE_FREE + + + tr_slope + qtgui.TRIG_SLOPE_POS + + + tr_tag + "" + + + type + float + + + update_time + 0.10 + + + ylabel + Amplitude + + + yunit + "" + + + ymax + 1 + + + ymin + -1 + + + + qtgui_time_sink_x + + autoscale + False + + + axislabels + True + + + alias + + + + comment + + + + ctrlpanel + False + + + affinity + + + + entags + True + + + _enabled + True + + + _coordinate + (440, 272) + + + gui_hint + + + + _rotation + 0 + + + grid + False + + + id + qtgui_time_sink_x_0_0 + + + legend + True + + + alpha1 + 1.0 + + + color1 + "blue" + + + label1 + + + + marker1 + -1 + + + style1 + 1 + + + width1 + 1 + + + alpha10 + 1.0 + + + color10 + "blue" + + + label10 + + + + marker10 + -1 + + + style10 + 1 + + + width10 + 1 + + + alpha2 + 1.0 + + + color2 + "red" + + + label2 + + + + marker2 + -1 + + + style2 + 1 + + + width2 + 1 + + + alpha3 + 1.0 + + + color3 + "green" + + + label3 + + + + marker3 + -1 + + + style3 + 1 + + + width3 + 1 + + + alpha4 + 1.0 + + + color4 + "black" + + + label4 + + + + marker4 + -1 + + + style4 + 1 + + + width4 + 1 + + + alpha5 + 1.0 + + + color5 + "cyan" + + + label5 + + + + marker5 + -1 + + + style5 + 1 + + + width5 + 1 + + + alpha6 + 1.0 + + + color6 + "magenta" + + + label6 + + + + marker6 + -1 + + + style6 + 1 + + + width6 + 1 + + + alpha7 + 1.0 + + + color7 + "yellow" + + + label7 + + + + marker7 + -1 + + + style7 + 1 + + + width7 + 1 + + + alpha8 + 1.0 + + + color8 + "dark red" + + + label8 + + + + marker8 + -1 + + + style8 + 1 + + + width8 + 1 + + + alpha9 + 1.0 + + + color9 + "dark green" + + + label9 + + + + marker9 + -1 + + + style9 + 1 + + + width9 + 1 + + + name + Received Signal + + + nconnections + 1 + + + size + 1024 + + + srate + 2.4e6 + + + stemplot + False + + + tr_chan + 0 + + + tr_delay + 0 + + + tr_level + 0.0 + + + tr_mode + qtgui.TRIG_MODE_FREE + + + tr_slope + qtgui.TRIG_SLOPE_POS + + + tr_tag + "" + + + type + float + + + update_time + 0.10 + + + ylabel + Amplitude + + + yunit + "" + + + ymax + 1 + + + ymin + -1 + + + + analog_quadrature_demod_cf_0 + qtgui_time_sink_x_0 + 0 + 0 + + + analog_quadrature_demod_cf_0_0 + qtgui_time_sink_x_0_0 + 0 + 0 + + + blks2_packet_decoder_0 + blocks_file_sink_0 + 0 + 0 + + + blks2_packet_encoder_0 + digital_gfsk_mod_0 + 0 + 0 + + + blocks_file_source_0 + blks2_packet_encoder_0 + 0 + 0 + + + digital_gfsk_demod_0 + blks2_packet_decoder_0 + 0 + 0 + + + digital_gfsk_mod_0 + analog_quadrature_demod_cf_0 + 0 + 0 + + + digital_gfsk_mod_0 + limesdr_sink_0 + 0 + 0 + + + limesdr_source_0 + analog_quadrature_demod_cf_0_0 + 0 + 0 + + + limesdr_source_0 + digital_gfsk_demod_0 + 0 + 0 + + diff --git a/examples/signal_analyzer.grc b/examples/signal_analyzer.grc new file mode 100644 index 0000000..00c6b3a --- /dev/null +++ b/examples/signal_analyzer.grc @@ -0,0 +1,915 @@ + + + + Mon May 21 21:44:03 2018 + + options + + author + Lime Microsystems + + + window_size + (1000,500) + + + category + Custom + + + comment + + + + description + + + + _enabled + True + + + _coordinate + (8, 8) + + + _rotation + 0 + + + generate_options + qt_gui + + + hier_block_src_path + .: + + + id + top_block + + + max_nouts + 0 + + + qt_qss_theme + + + + realtime_scheduling + + + + run_command + {python} -u {filename} + + + run_options + prompt + + + run + True + + + sizing_mode + fixed + + + thread_safe_setters + + + + title + Signal analyzer + + + placement + (0,0) + + + + variable_qtgui_entry + + comment + + + + value + 10 + + + _enabled + True + + + _coordinate + (176, 206) + + + gui_hint + 0,4,1,1 + + + _rotation + 0 + + + id + analog_filter_bandwidth_rx + + + label + RX analog filter bandwidth [MHz] + + + type + real + + + + variable_qtgui_chooser + + comment + + + + value + 0 + + + _enabled + True + + + _coordinate + (200, 283) + + + gui_hint + + + + _rotation + 0 + + + id + analog_filter_rx + + + label0 + "OFF" + + + label1 + "ON" + + + label2 + + + + label3 + + + + label4 + + + + label + RX analog filter + + + labels + [] + + + num_opts + 2 + + + option0 + 0 + + + option1 + 1 + + + option2 + 2 + + + option3 + 3 + + + option4 + 4 + + + options + [0, 1, 2] + + + orient + Qt.QHBoxLayout + + + type + int + + + widget + radio_buttons + + + + variable_qtgui_entry + + comment + + + + value + 600 + + + _enabled + True + + + _coordinate + (176, 118) + + + gui_hint + 0,1,1,1 + + + _rotation + 0 + + + id + baseband_rx + + + label + RX baseband [MHz] + + + type + real + + + + variable_qtgui_entry + + comment + + + + value + sample_rate/2e6 + + + _enabled + True + + + _coordinate + (368, 206) + + + gui_hint + 0,6,1,1 + + + _rotation + 0 + + + id + digital_filter_bandwidth_rx + + + label + RX digital filter bandwidth [MHz] + + + type + real + + + + variable_qtgui_chooser + + comment + + + + value + 0 + + + _enabled + True + + + _coordinate + (384, 283) + + + gui_hint + + + + _rotation + 0 + + + id + digital_filter_rx + + + label0 + "OFF" + + + label1 + "ON" + + + label2 + + + + label3 + + + + label4 + + + + label + RX digital filter + + + labels + [] + + + num_opts + 2 + + + option0 + 0 + + + option1 + 1 + + + option2 + 2 + + + option3 + 3 + + + option4 + 4 + + + options + [0, 1, 2] + + + orient + Qt.QHBoxLayout + + + type + int + + + widget + radio_buttons + + + + variable_qtgui_range + + comment + + + + value + 0 + + + _enabled + 1 + + + _coordinate + (392, 73) + + + gui_hint + 0,8,1,1 + + + _rotation + 0 + + + id + gain_rx + + + label + RX gain + + + min_len + 200 + + + orient + Qt.Horizontal + + + start + 0 + + + step + 1 + + + stop + 70 + + + rangeType + int + + + widget + counter_slider + + + + variable_qtgui_chooser + + comment + + + + value + 0 + + + _enabled + True + + + _coordinate + (8, 283) + + + gui_hint + 0,3,1,1 + + + _rotation + 0 + + + id + nco_direction_rx + + + label0 + "UPCONVERT" + + + label1 + "DOWNCONVERT" + + + label2 + + + + label3 + + + + label4 + + + + label + RX NCO direction + + + labels + [] + + + num_opts + 2 + + + option0 + 0 + + + option1 + 1 + + + option2 + 2 + + + option3 + 3 + + + option4 + 4 + + + options + [0, 1, 2] + + + orient + Qt.QHBoxLayout + + + type + int + + + widget + radio_buttons + + + + variable_qtgui_entry + + comment + + + + value + 0 + + + _enabled + True + + + _coordinate + (16, 206) + + + gui_hint + 0,2,1,1 + + + _rotation + 0 + + + id + nco_freq_rx + + + label + RX NCO [MHz] + + + type + real + + + + variable_qtgui_label + + comment + + + + value + 5e6 + + + _enabled + True + + + formatter + None + + + _coordinate + (192, 14) + + + gui_hint + 0,0,1,1 + + + _rotation + 0 + + + id + sample_rate + + + label + Sample rate [S/s] + + + type + raw + + + + limesdr_source + + alias + + + + channel + 0 + + + analog_bandw_ch0 + analog_filter_bandwidth_rx*1e6 + + + analog_filter_ch0 + analog_filter_rx + + + cmix_mode_ch0 + nco_direction_rx + + + calibr_bandw_ch0 + 5e6 + + + calibration_ch0 + 0 + + + digital_bandw_ch0 + digital_filter_bandwidth_rx*1e6 + + + digital_filter_ch0 + digital_filter_rx + + + gain_dB_ch0 + gain_rx + + + lna_path_ch0 + 2 + + + lna_path_mini + 1 + + + nco_freq_ch0 + nco_freq_rx*1e6 + + + analog_bandw_ch1 + 10e6 + + + analog_filter_ch1 + 0 + + + cmix_mode_ch1 + 0 + + + calibr_bandw_ch1 + 5e6 + + + calibration_ch1 + 0 + + + digital_bandw_ch1 + 0 + + + digital_filter_ch1 + 0 + + + gain_dB_ch1 + 0 + + + lna_path_ch1 + 2 + + + nco_freq_ch1 + 0 + + + chip_mode + 1 + + + comment + + + + affinity + + + + serial + + + + device_type + 2 + + + _enabled + 1 + + + filename + + + + _coordinate + (552, 120) + + + _rotation + 0 + + + id + limesdr_source_0 + + + file_switch + 0 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + oversample + 0 + + + rf_freq + baseband_rx*1e6 + + + samp_rate + sample_rate + + + + qtgui_sink_x + + bw + sample_rate + + + alias + + + + fc + baseband_rx*1e6 + + + freqchangevar + None + + + comment + + + + affinity + + + + _enabled + True + + + fftsize + 4096 + + + _coordinate + (776, 200) + + + gui_hint + 1,0,8,8 + + + _rotation + 0 + + + id + qtgui_sink_x_0 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + name + + + + plotconst + True + + + plotfreq + True + + + plottime + True + + + plotwaterfall + True + + + showports + True + + + showrf + True + + + type + complex + + + rate + 10 + + + wintype + firdes.WIN_BLACKMAN_hARRIS + + + + limesdr_source_0 + qtgui_sink_x_0 + 0 + 0 + + diff --git a/examples/signal_generator.grc b/examples/signal_generator.grc new file mode 100644 index 0000000..c3e5a94 --- /dev/null +++ b/examples/signal_generator.grc @@ -0,0 +1,1102 @@ + + + + Mon May 21 21:11:53 2018 + + options + + author + Lime Microsystems + + + window_size + (1200,400) + + + category + Custom + + + comment + + + + description + + + + _enabled + True + + + _coordinate + (16, 23) + + + _rotation + 0 + + + generate_options + qt_gui + + + hier_block_src_path + .: + + + id + top_block + + + max_nouts + 0 + + + qt_qss_theme + + + + realtime_scheduling + + + + run_command + {python} -u {filename} + + + run_options + prompt + + + run + True + + + sizing_mode + fixed + + + thread_safe_setters + + + + title + Signal generator + + + placement + (0,0) + + + + variable_qtgui_entry + + comment + + + + value + 10 + + + _enabled + True + + + _coordinate + (776, 166) + + + gui_hint + + + + _rotation + 0 + + + id + analog_filter_bandwidth_tx + + + label + TX analog filter bandwidth [MHz] + + + type + real + + + + variable_qtgui_chooser + + comment + + + + value + 0 + + + _enabled + True + + + _coordinate + (792, 251) + + + gui_hint + + + + _rotation + 0 + + + id + analog_filter_tx + + + label0 + "OFF" + + + label1 + "ON" + + + label2 + + + + label3 + + + + label4 + + + + label + TX analog filter + + + labels + [] + + + num_opts + 2 + + + option0 + 0 + + + option1 + 1 + + + option2 + 2 + + + option3 + 3 + + + option4 + 4 + + + options + [0, 1, 2] + + + orient + Qt.QHBoxLayout + + + type + int + + + widget + radio_buttons + + + + variable_qtgui_entry + + comment + + + + value + 600 + + + _enabled + True + + + _coordinate + (784, 86) + + + gui_hint + 1,0,2,2 + + + _rotation + 0 + + + id + baseband_tx + + + label + TX:Baseband [MHz] + + + type + real + + + + variable_qtgui_entry + + comment + + + + value + sample_rate/2e6 + + + _enabled + True + + + _coordinate + (944, 166) + + + gui_hint + + + + _rotation + 0 + + + id + digital_filter_bandwidth_tx + + + label + TX digital filter bandwidth [MHz] + + + type + real + + + + variable_qtgui_chooser + + comment + + + + value + 0 + + + _enabled + True + + + _coordinate + (960, 251) + + + gui_hint + + + + _rotation + 0 + + + id + digital_filter_tx + + + label0 + "OFF" + + + label1 + "ON" + + + label2 + + + + label3 + + + + label4 + + + + label + TX digital filter + + + labels + [] + + + num_opts + 2 + + + option0 + 0 + + + option1 + 1 + + + option2 + 2 + + + option3 + 3 + + + option4 + 4 + + + options + [0, 1, 2] + + + orient + Qt.QHBoxLayout + + + type + int + + + widget + radio_buttons + + + + variable_qtgui_range + + comment + + + + value + 0 + + + _enabled + True + + + _coordinate + (16, 113) + + + gui_hint + 6,0,1,2 + + + _rotation + 0 + + + id + frequency + + + label + Signal source frequency + + + min_len + 200 + + + orient + Qt.Horizontal + + + start + 0 + + + step + 0.05e6 + + + stop + 20e6 + + + rangeType + float + + + widget + counter_slider + + + + variable_qtgui_range + + comment + + + + value + 30 + + + _enabled + True + + + _coordinate + (976, 41) + + + gui_hint + 3,1,1,1 + + + _rotation + 0 + + + id + gain_tx + + + label + TX gain + + + min_len + 200 + + + orient + Qt.Horizontal + + + start + 0 + + + step + 1 + + + stop + 60 + + + rangeType + int + + + widget + counter_slider + + + + variable_qtgui_chooser + + comment + + + + value + 0 + + + _enabled + True + + + _coordinate + (624, 251) + + + gui_hint + + + + _rotation + 0 + + + id + nco_direction_tx + + + label0 + "UPCONVERT" + + + label1 + "DOWNCONVERT" + + + label2 + + + + label3 + + + + label4 + + + + label + TX NCO direction + + + labels + [] + + + num_opts + 2 + + + option0 + 0 + + + option1 + 1 + + + option2 + 2 + + + option3 + 3 + + + option4 + 4 + + + options + [0, 1, 2] + + + orient + Qt.QHBoxLayout + + + type + int + + + widget + radio_buttons + + + + variable_qtgui_entry + + comment + + + + value + 0 + + + _enabled + True + + + _coordinate + (616, 166) + + + gui_hint + 4,1,1,1 + + + _rotation + 0 + + + id + nco_freq_tx + + + label + TX NCO value [MHz] + + + type + real + + + + variable_qtgui_range + + comment + + + + value + sample_rate + + + _enabled + True + + + _coordinate + (16, 233) + + + gui_hint + 6,2,1,2 + + + _rotation + 0 + + + id + samp_rate_sig_source + + + label + Signal source sample rate + + + min_len + 2000 + + + orient + Qt.Horizontal + + + start + 0 + + + step + 0.1e6 + + + stop + 20e6 + + + rangeType + float + + + widget + counter_slider + + + + variable_qtgui_label + + comment + + + + value + 5e6 + + + _enabled + True + + + formatter + None + + + _coordinate + (192, 30) + + + gui_hint + + + + _rotation + 0 + + + id + sample_rate + + + label + Sample rate [S/s] + + + type + real + + + + analog_sig_source_x + + amp + 1 + + + alias + + + + comment + + + + affinity + + + + _enabled + 1 + + + freq + frequency + + + _coordinate + (216, 216) + + + _rotation + 0 + + + id + analog_sig_source_x_0_0_0 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + offset + 0 + + + type + complex + + + samp_rate + samp_rate_sig_source + + + waveform + analog.GR_COS_WAVE + + + + limesdr_sink + + alias + + + + channel + 0 + + + analog_bandw_ch0 + analog_filter_bandwidth_tx*1e6 + + + analog_filter_ch0 + analog_filter_tx + + + cmix_mode_ch0 + nco_direction_tx + + + calibr_bandw_ch0 + 5e6 + + + calibration_ch0 + 0 + + + digital_bandw_ch0 + digital_filter_bandwidth_tx*1e6 + + + digital_filter_ch0 + digital_filter_tx + + + gain_dB_ch0 + gain_tx + + + nco_freq_ch0 + nco_freq_tx*1e6 + + + pa_path_ch0 + 1 + + + pa_path_mini + 1 + + + analog_bandw_ch1 + 10e6 + + + analog_filter_ch1 + 0 + + + cmix_mode_ch1 + 0 + + + calibr_bandw_ch1 + 5e6 + + + calibration_ch1 + 0 + + + digital_bandw_ch1 + 0 + + + digital_filter_ch1 + 0 + + + gain_dB_ch1 + 0 + + + nco_freq_ch1 + 0 + + + pa_path_ch1 + 1 + + + chip_mode + 1 + + + comment + + + + affinity + + + + serial + + + + device_type + 2 + + + _enabled + 1 + + + filename + + + + _coordinate + (416, 144) + + + _rotation + 0 + + + id + limesdr_sink_0 + + + file_switch + 0 + + + oversample + 0 + + + rf_freq + baseband_tx*1e6 + + + samp_rate + sample_rate + + + + qtgui_sink_x + + bw + sample_rate + + + alias + + + + fc + baseband_tx*1e6 + + + freqchangevar + None + + + comment + + + + affinity + + + + _enabled + 1 + + + fftsize + 4096 + + + _coordinate + (416, 32) + + + gui_hint + + + + _rotation + 0 + + + id + qtgui_sink_x_0_1 + + + maxoutbuf + 0 + + + minoutbuf + 0 + + + name + "Signal Source" + + + plotconst + True + + + plotfreq + True + + + plottime + True + + + plotwaterfall + True + + + showports + True + + + showrf + True + + + type + complex + + + rate + 10 + + + wintype + firdes.WIN_BLACKMAN_hARRIS + + + + analog_sig_source_x_0_0_0 + limesdr_sink_0 + 0 + 0 + + + analog_sig_source_x_0_0_0 + qtgui_sink_x_0_1 + 0 + 0 + + diff --git a/grc/limesdr_sink.xml b/grc/limesdr_sink.xml index 01d0912..f973b70 100644 --- a/grc/limesdr_sink.xml +++ b/grc/limesdr_sink.xml @@ -2,10 +2,10 @@ LimeSuite Sink (TX) limesdr_sink - LimeSuite + [LimeSuite] throttle import limesdr - limesdr.sink($device_number, + limesdr.sink($serial, $device_type, $chip_mode, $channel, @@ -30,13 +30,36 @@ $digital_filter_ch1, $digital_bandw_ch1, $gain_dB_ch0, - $gain_dB_ch1) + $gain_dB_ch1, + $nco_freq_ch0, + $nco_freq_ch1, + $cmix_mode_ch0, + $cmix_mode_ch1) + + set_rf_freq($rf_freq) + set_pa_path($pa_path_mini,0) + set_pa_path($pa_path_ch0,0) + set_pa_path($pa_path_ch1,1) + set_nco($nco_freq_ch0,$cmix_mode_ch0,0) + set_nco($nco_freq_ch1,$cmix_mode_ch1,1) + set_analog_filter($analog_filter_ch0,$analog_bandw_ch0,0) + set_analog_filter($analog_filter_ch1,$analog_bandw_ch1,1) + set_digital_filter($digital_filter_ch0,$digital_bandw_ch0,0) + set_digital_filter($digital_filter_ch1,$digital_bandw_ch1,1) + set_gain($gain_dB_ch0,0) + set_gain($gain_dB_ch1,1) + + + General + CH0 + CH1 + - Device number - device_number - 0 - int + Device serial + serial + + string none @@ -76,7 +99,7 @@ CH0 channel 0 - enum + int #if $device_type() == 1 all @@ -127,7 +150,7 @@ - Center frequency + RF frequency rf_freq 100e6 float @@ -143,7 +166,7 @@ Sample rate samp_rate - 10e6 + samp_rate float #if $file_switch() == 1 @@ -158,7 +181,7 @@ Oversample oversample 0 - enum + int #if $file_switch() == 1 all @@ -195,12 +218,50 @@ 32 - + + + CH0:NCO frequency + nco_freq_ch0 + 0 + float + + #if $file_switch() == 1 + all + #else + none + #end if + + CH0 + + + + CH0:CMIX mode + cmix_mode_ch0 + 0 + int + + #if $file_switch() == 1 + all + #else + none + #end if + + + + CH0 + + CH0:Calibration calibration_ch0 0 - enum + int #if $file_switch() == 1 all @@ -216,6 +277,7 @@ ON 1 + CH0 @@ -232,13 +294,14 @@ none #end if + CH0 CH0:PA path pa_path_mini 1 - enum + int #if $device_type() == 2 all @@ -254,13 +317,14 @@ Band2 2 + CH0 CH0:PA path pa_path_ch0 1 - enum + int #if $device_type() == 1 all @@ -278,13 +342,14 @@ Band2 2 + CH0 CH0:Analog filter analog_filter_ch0 - 0 - enum + 1 + int #if $file_switch() == 1 all @@ -300,12 +365,13 @@ ON 1 + CH0 CH0:Analog filter bandw. analog_bandw_ch0 - 10e6 + 5e6 float #if $analog_filter_ch0() == 0 @@ -316,13 +382,14 @@ none #end if + CH0 CH0:Digital filter digital_filter_ch0 0 - enum + int #if $file_switch() == 1 all @@ -338,6 +405,7 @@ ON 1 + CH0 @@ -354,12 +422,13 @@ none #end if + CH0 CH0:Gain,dB gain_dB_ch0 - 60 + 30 int #if $file_switch() == 1 @@ -368,13 +437,60 @@ none #end if + CH0 - + + + CH1:NCO frequency + nco_freq_ch1 + 0 + float + + #if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + CH1 + + + + CH1:CMIX mode + cmix_mode_ch1 + 0 + int + + #if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + + + CH1 + + CH1:Calibration calibration_ch1 0 - enum + int #if $chip_mode() == 1 all @@ -394,6 +510,7 @@ ON 1 + CH1 @@ -414,13 +531,14 @@ none #end if + CH1 CH1:PA path pa_path_ch1 1 - enum + int #if $chip_mode() == 1 all @@ -440,13 +558,14 @@ Band2 2 + CH1 CH1:Analog filter analog_filter_ch1 - 0 - enum + 1 + int #if $chip_mode() == 1 all @@ -466,12 +585,13 @@ ON 1 + CH1 CH1:Analog filter bandw. analog_bandw_ch1 - 10e6 + 5e6 float #if $analog_filter_ch1() == 0 @@ -486,13 +606,14 @@ none #end if + CH1 CH1:Digital filter digital_filter_ch1 0 - enum + int #if $chip_mode() == 1 all @@ -512,6 +633,7 @@ ON 1 + CH1 @@ -532,12 +654,13 @@ none #end if + CH1 CH1:Gain,dB gain_dB_ch1 - 60 + 30 int #if $chip_mode() == 1 @@ -550,9 +673,9 @@ none #end if + CH1 - $device_number >= 0 $device_type >= $chip_mode $device_type >= 1 2 >= $device_type @@ -597,13 +720,13 @@ ------------------------------------------------------------------------------------------------------------------- -DEVICE NUMBER +DEVICE SERIAL -Device number obtained by running +Device serial number obtained by running LimeUtil --find -List numbering begins by 0. +Cannot be left blank. ------------------------------------------------------------------------------------------------------------------- DEVICE TYPE @@ -655,6 +778,14 @@ Here you can select oversampling value for TX. Default value uses highest possib Note: LimeSDR-Mini supports only the same oversampling value for TX and RX. ------------------------------------------------------------------------------------------------------------------- +NCO FREQUENCY + +Adjust numerically controlled oscillator for each channel. 0 means that NCO is OFF. +------------------------------------------------------------------------------------------------------------------- +CMIX MODE + +Controls NCO direction for each channel. +------------------------------------------------------------------------------------------------------------------- CALIBRATION Turn DC offset and IQ imbalance calibration ON/OFF for each channel. diff --git a/grc/limesdr_source.xml b/grc/limesdr_source.xml index 136aadf..3e436cc 100644 --- a/grc/limesdr_source.xml +++ b/grc/limesdr_source.xml @@ -2,10 +2,10 @@ LimeSuite Source (RX) limesdr_source - LimeSuite + [LimeSuite] throttle import limesdr - limesdr.source($device_number, + limesdr.source($serial, $device_type, $chip_mode, $channel, @@ -30,13 +30,36 @@ $digital_filter_ch1, $digital_bandw_ch1, $gain_dB_ch0, - $gain_dB_ch1) - + $gain_dB_ch1, + $nco_freq_ch0, + $nco_freq_ch1, + $cmix_mode_ch0, + $cmix_mode_ch1) + + set_rf_freq($rf_freq) + set_lna_path($lna_path_mini,0) + set_lna_path($lna_path_ch0,0) + set_lna_path($lna_path_ch1,1) + set_nco($nco_freq_ch0,$cmix_mode_ch0,0) + set_nco($nco_freq_ch1,$cmix_mode_ch1,1) + set_analog_filter($analog_filter_ch0,$analog_bandw_ch0,0) + set_analog_filter($analog_filter_ch1,$analog_bandw_ch1,1) + set_digital_filter($digital_filter_ch0,$digital_bandw_ch0,0) + set_digital_filter($digital_filter_ch1,$digital_bandw_ch1,1) + set_gain($gain_dB_ch0,0) + set_gain($gain_dB_ch1,1) + + + General + CH0 + CH1 + + - Device number - device_number - 0 - int + Device serial + serial + + string none @@ -76,7 +99,7 @@ CH0 channel 0 - enum + int #if $device_type() == 1 all @@ -127,7 +150,7 @@ - Center frequency + RF frequency rf_freq 100e6 float @@ -143,7 +166,7 @@ Sample rate samp_rate - 10e6 + samp_rate float #if $file_switch() == 1 @@ -158,7 +181,7 @@ Oversample oversample 0 - enum + int #if $file_switch() == 1 all @@ -196,11 +219,49 @@ + + CH0:NCO frequency + nco_freq_ch0 + 0 + float + + #if $file_switch() == 1 + all + #else + none + #end if + + CH0 + + + + CH0:CMIX mode + cmix_mode_ch0 + 0 + int + + #if $file_switch() == 1 + all + #else + none + #end if + + + + CH0 + + CH0:Calibration calibration_ch0 0 - enum + int #if $file_switch() == 1 all @@ -216,6 +277,7 @@ ON 1 + CH0 @@ -232,13 +294,14 @@ none #end if + CH0 CH0:LNA path lna_path_mini - 1 - enum + 3 + int #if $device_type() == 2 all @@ -254,13 +317,14 @@ W 3 + CH0 CH0:LNA path lna_path_ch0 - 1 - enum + 2 + int #if $device_type() == 1 all @@ -282,13 +346,14 @@ W 3 + CH0 CH0:Analog filter analog_filter_ch0 1 - enum + int #if $file_switch() == 1 all @@ -304,12 +369,13 @@ ON 1 + CH0 CH0:Analog filter bandw. analog_bandw_ch0 - 10e6 + 5e6 float #if $analog_filter_ch0() == 0 @@ -320,13 +386,14 @@ none #end if + CH0 CH0:Digital filter digital_filter_ch0 0 - enum + int #if $file_switch() == 1 all @@ -342,6 +409,7 @@ ON 1 + CH0 @@ -358,12 +426,13 @@ none #end if + CH0 CH0:Gain,dB gain_dB_ch0 - 60 + 30 int #if $file_switch() == 1 @@ -372,13 +441,60 @@ none #end if + CH0 - + + + CH1:NCO frequency + nco_freq_ch1 + 0 + float + + #if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + CH1 + + + + CH1:CMIX mode + cmix_mode_ch1 + 0 + int + + #if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + + + CH1 + + CH1:Calibration calibration_ch1 0 - enum + int #if $chip_mode() == 1 all @@ -398,6 +514,7 @@ ON 1 + CH1 @@ -418,13 +535,14 @@ none #end if + CH1 CH1:LNA path lna_path_ch1 - 1 - enum + 2 + int #if $chip_mode() == 1 all @@ -448,13 +566,14 @@ W 3 + CH1 CH1:Analog filter analog_filter_ch1 1 - enum + int #if $chip_mode() == 1 all @@ -474,12 +593,13 @@ ON 1 + CH1 CH1:Analog filter bandw. analog_bandw_ch1 - 10e6 + 5e6 float #if $analog_filter_ch1() == 0 @@ -494,13 +614,14 @@ none #end if + CH1 CH1:Digital filter digital_filter_ch1 0 - enum + int #if $chip_mode() == 1 all @@ -520,6 +641,7 @@ ON 1 + CH1 @@ -540,12 +662,13 @@ none #end if + CH1 CH1:Gain,dB gain_dB_ch1 - 60 + 30 int #if $chip_mode() == 1 @@ -558,9 +681,9 @@ none #end if + CH1 - $device_number >= 0 $device_type >= $chip_mode $device_type >= 1 2 >= $device_type @@ -605,13 +728,13 @@ ------------------------------------------------------------------------------------------------------------------- -DEVICE NUMBER +DEVICE SERIAL -Device number obtained by running +Device serial number obtained by running LimeUtil --find -List numbering begins by 0. +Cannot be left blank. ------------------------------------------------------------------------------------------------------------------- DEVICE TYPE @@ -642,7 +765,7 @@ Generate .ini file with LimeSuite and select path. Note: setting must match in LimeSuite Source and Sink for the same device. ------------------------------------------------------------------------------------------------------------------- -CENTER FREQUENCY +RF FREQUENCY Set RF center frequency for RX (both channels). LimeSDR-USB supports [100e3,3800e6] Hz. @@ -663,6 +786,14 @@ Here you can select oversampling value for RX. Default value uses highest possib Note: LimeSDR-Mini supports only the same oversampling value for TX and RX. ------------------------------------------------------------------------------------------------------------------- +NCO FREQUENCY + +Adjust numerically controlled oscillator for each channel. 0 means that NCO is OFF. +------------------------------------------------------------------------------------------------------------------- +CMIX MODE + +Controls NCO direction for each channel. +------------------------------------------------------------------------------------------------------------------- CALIBRATION Turn DC offset and IQ imbalance calibration ON/OFF for each channel. diff --git a/include/limesdr/api.h b/include/limesdr/api.h index 6dfe0cb..3e9ba84 100644 --- a/include/limesdr/api.h +++ b/include/limesdr/api.h @@ -22,7 +22,6 @@ #define INCLUDED_LIMESDR_API_H #include -#include #ifdef gnuradio_limesdr_EXPORTS # define LIMESDR_API __GR_ATTR_EXPORT diff --git a/include/limesdr/sink.h b/include/limesdr/sink.h index 9dbefe0..f2e9db5 100644 --- a/include/limesdr/sink.h +++ b/include/limesdr/sink.h @@ -22,13 +22,13 @@ #define INCLUDED_LIMESDR_SINK_H #include -#include +#include namespace gr { namespace limesdr { - class LIMESDR_API sink : virtual public gr::sync_block + class LIMESDR_API sink : virtual public gr::block { public: typedef boost::shared_ptr sptr; @@ -38,6 +38,8 @@ namespace gr * To avoid accidental use of raw pointers, sink's * constructor is private. limesdr::sink::make is the public * interface for creating new instances. + * + * @param serial Device serial number. Cannot be left blank. * * @param device_type LimeSDR-Mini(1), LimeSDR-USB(2). * @@ -89,9 +91,17 @@ namespace gr * * @param gain_dB_ch1 Input TX gain channel 1 [0,60] dB. * + * @param nco_freq_ch0 NCO frequency channel 0 in Hz. + * + * @param nco_freq_ch1 NCO frequency channel 1 in Hz. + * + * @param cmix_mode_ch0 CMIX mode channel 0: UPCONVERT(0), DOWNCONVERT(1). + * + * @param cmix_mode_ch1 CMIX mode channel 1: UPCONVERT(0), DOWNCONVERT(1). + * * @return a new limesdr sink block object */ - static sptr make(int device_number, + static sptr make(std::string serial, int device_type, int chip_mode, int channel, @@ -116,7 +126,23 @@ namespace gr int digital_filter_ch1, double digital_bandw_ch1, int gain_dB_ch0, - int gain_dB_ch1); + int gain_dB_ch1, + float nco_freq_ch0, + float nco_freq_ch1, + int cmix_mode_ch0, + int cmix_mode_ch1); + + virtual void set_rf_freq(float rf_freq) = 0; + + virtual void set_pa_path(int pa_path, int channel) = 0; + + virtual void set_nco(float nco_freq, int cmix_mode, int channel) = 0; + + virtual void set_analog_filter(int analog_filter, float analog_bandw, int channel) = 0; + + virtual void set_digital_filter(int digital_filter, float digital_bandw, int channel) = 0; + + virtual void set_gain(int gain_dB, int channel) = 0; }; } } diff --git a/include/limesdr/source.h b/include/limesdr/source.h index 9d677d7..751e11d 100644 --- a/include/limesdr/source.h +++ b/include/limesdr/source.h @@ -22,13 +22,13 @@ #define INCLUDED_LIMESDR_SOURCE_H #include -#include +#include namespace gr { namespace limesdr { - class LIMESDR_API source : virtual public gr::sync_block + class LIMESDR_API source : virtual public gr::block { public: typedef boost::shared_ptr sptr; @@ -39,6 +39,8 @@ namespace gr * To avoid accidental use of raw pointers, source's * constructor is private. limesdr::source::make is the public * interface for creating new instances. + * + * @param serial Device serial number. Cannot be left blank. * * @param device_type LimeSDR-Mini(1),LimeSDR-USB(2). * @@ -90,9 +92,17 @@ namespace gr * * @param gain_dB_ch1 Input RX gain channel 1 [0,70] dB. * + * @param nco_freq_ch0 NCO frequency channel 0 in Hz. + * + * @param nco_freq_ch1 NCO frequency channel 1 in Hz. + * + * @param cmix_mode_ch0 CMIX mode channel 0: UPCONVERT(0), DOWNCONVERT(1). + * + * @param cmix_mode_ch1 CMIX mode channel 1: UPCONVERT(0), DOWNCONVERT(1). + * * @return a new limesdr source block object */ - static sptr make(int device_number, + static sptr make(std::string serial, int device_type, int chip_mode, int channel, @@ -117,7 +127,23 @@ namespace gr int digital_filter_ch1, double digital_bandw_ch1, int gain_dB_ch0, - int gain_dB_ch1); + int gain_dB_ch1, + float nco_freq_ch0, + float nco_freq_ch1, + int cmix_mode_ch0, + int cmix_mode_ch1); + + virtual void set_rf_freq(float rf_freq) = 0; + + virtual void set_lna_path(int lna_path, int channel) = 0; + + virtual void set_nco(float nco_freq, int cmix_mode, int channel) = 0; + + virtual void set_analog_filter(int analog_filter, float analog_bandw, int channel) = 0; + + virtual void set_digital_filter(int digital_filter, float digital_bandw, int channel) = 0; + + virtual void set_gain(int gain_dB, int channel) = 0; }; } } diff --git a/lib/common/device_handler.cc b/lib/common/device_handler.cc index e17270e..568cf18 100644 --- a/lib/common/device_handler.cc +++ b/lib/common/device_handler.cc @@ -26,42 +26,36 @@ void device_handler::error(int device_number) std::cout << "ERROR: " << LMS_GetLastErrorMessage() << std::endl; if (this->device_vector[device_number].address != NULL) close_all_devices(); - exit(0); } device_handler::~device_handler() -{ - close_all_devices(); -} +{} lms_device_t* device_handler::get_device(int device_number) { return this->device_vector[device_number].address; } -void device_handler::open_device(int device_number, int device_type) +int device_handler::open_device(std::string serial, int device_type) { - // Check device_number value - if(device_number < 0) - { - std::cout << "ERROR: device_handler::open_device(): device number cannot be lower than 0." << std::endl; - close_all_devices(); - exit(0); - } - + std::string search_name; + std::string start_string; + int last; + int device_number; + + std::cout << "##################" << std::endl; + std::cout << "Connecting to device" << std::endl; + // Read device list once if(list_read == false) { - if ((device_count = LMS_GetDeviceList(NULL)) < LMS_SUCCESS) - error(device_number); + device_count = LMS_GetDeviceList(list); std::cout << "##################" << std::endl; std::cout << "Devices found: " << device_count << std::endl; - - if (device_count < 1) - std::exit(0); std::cout << "##################" << std::endl; + if (device_count < 1) + exit(0); std::cout << "Device list:" << std::endl; - LMS_GetDeviceList(list); for (int i = 0; i < device_count; i++) { @@ -72,61 +66,82 @@ void device_handler::open_device(int device_number, int device_type) list_read = true; } - // Compare maximum device list value with device_number value - if(device_number > device_count-1) + // Serial must not be empty + if(serial.empty()) { - std::cout << "ERROR: device_handler::open_device(): device number " << device_number << " is not connected to this system. Please check the device list." << std::endl; - close_all_devices(); - std::cout << "---------------------------------------------------------------" << std::endl; - exit(0); + std::cout << "ERROR: device_handler::open_device(): no serial number." << std::endl; + std::cout << "INFO: device_handler::open_device(): use \"LimeUtil -- find\" in terminal to find device serial." << std::endl; + std::cout << "##################" << std::endl; + close_all_devices(); } - + + // Set device string search parameters + if (device_type == 1) + { + search_name = "LimeSDR Mini"; + start_string = "serial="; + last = 14; // length of LimeSDR-Mini serial + } + else if (device_type == 2) + { + search_name = "LimeSDR-USB"; + start_string = "serial="; + last = 16; // length of LimeSDR-USB serial + } + else + { + std::cout << "ERROR: device_handler::open_device(): wrong device_type." << std::endl; + close_all_devices(); + } + + // Identify device by device type and serial number + for (int i = 0; i < device_count; i++) + { + std::string device_string(list[i]); + unsigned first = device_string.find(start_string); + std::string aquired_serial = device_string.substr (first+7,last); + + // If device_type and serial match found acquire device number + if (device_string.find(search_name) != std::string::npos && aquired_serial == serial) + { + device_number = i; + break; + } + // If program was unable to find serial in list print error and stop program + else if ((i == device_count-1 && aquired_serial != serial) || (device_string.find(search_name) == std::string::npos && aquired_serial == serial)) + { + std::cout << "Unable to find " << search_name << " with device serial " << serial << "." << std::endl; + std::cout << "##################" << std::endl; + close_all_devices(); + } + } + // If device slot is empty, open and initialize device if(device_vector[device_number].address == NULL) { - std::string search_name; - if (device_type == 1) - search_name = "LimeSDR Mini"; - else if (device_type == 2) - search_name = "LimeSDR-USB"; - else - { - std::cout << "ERROR: device_handler::open_device(): wrong device_type." << std::endl; - close_all_devices(); - exit(0); - } - std::cout << "##################" << std::endl; - std::cout << "New connection" << std::endl; - - std::string device_string(list[device_number]); - - if (device_string.find(search_name) != std::string::npos) - { - if (LMS_Open(&device_vector[device_number].address, list[device_number], NULL)) - error(device_number); - - std::cout << "Device number " << device_number << " from the list is used." << std::endl; - - if (LMS_Init(device_vector[device_number].address) != LMS_SUCCESS) - error(device_number); - - std::cout << "##################" << std::endl; - std::cout << std::endl; - - ++open_devices; // Count open devices - } - else if ((device_string.find(search_name) == std::string::npos)) - { - std::cout << "Device number " << device_number << " from the list is not " << search_name << "." << std::endl; - close_all_devices(); - exit(0); - std::cout << "---------------------------------------------------------------" << std::endl; - } + std::cout << "Device number " << device_number << " from the list is used." << std::endl; + LMS_Open(&device_vector[device_number].address, list[device_number], NULL); + LMS_Init(device_vector[device_number].address); + ++open_devices; // Count open devices + std::cout << "##################" << std::endl; + std::cout << std::endl; + } + // If device is open do nothing + else + { + std::cout << "Previously connected device number " << device_number << " from the list is used." << std::endl; + std::cout << "##################" << std::endl; + std::cout << std::endl; } + + return device_number; // return device number to identify device_vector[device_number].address connection in other functions } -void device_handler::close_device(int device_number) +void device_handler::close_device(int device_number, int block_type) { + // Check if other block finished and close device + if(device_vector[device_number].source_flag == false || device_vector[device_number].sink_flag == false) + { if(this->device_vector[device_number].address != NULL) { std::cout << std::endl; @@ -139,117 +154,143 @@ void device_handler::close_device(int device_number) device_vector[device_number].address = NULL; std::cout << "##################" << std::endl; std::cout << std::endl; - } + } + } + // If two blocks used switch one block flag and let other block finish work + else + { + // Switch flag when closing device + switch(block_type) + { + case 1: + device_vector[device_number].source_flag = false; + break; + case 2: + device_vector[device_number].sink_flag = false; + break; + } + } } void device_handler::close_all_devices() { + if(close_flag == false) + { for(int i = 0; i <= open_devices; i++) - this->close_device(i); + { + if(this->device_vector[i].address != NULL) + { + LMS_Reset(this->device_vector[i].address); + LMS_Close(this->device_vector[i].address); + } + } + close_flag == true; + exit(0); + } } void device_handler::check_blocks(int device_number, int block_type, int device_type, int chip_mode, double sample_rate, size_t oversample, int file_switch, const char *filename) { - // Check how many blocks of each type are used for each device + // Get each block settings switch(block_type) { - case 1: // Source block - if(device_vector[device_number].source_flag == true) - { - std::cout << "ERROR: device_handler::check_blocks(): only one LimeSuite Source (RX) block is allowed per device." << std::endl; - close_all_devices(); - exit(0); - } - else - { - device_vector[device_number].source_flag = true; - device_vector[device_number].source_device_type = device_type; - device_vector[device_number].source_chip_mode = chip_mode; - if(file_switch == 0) - { - device_vector[device_number].source_sample_rate = sample_rate; - device_vector[device_number].source_oversample = oversample; - } - else - { - device_vector[device_number].source_file_switch = file_switch; - device_vector[device_number].source_filename = filename; - } - } - break; - - case 2: // Sink block - if(device_vector[device_number].sink_flag == true) - { - std::cout << "ERROR: device_handler::check_blocks(): only one LimeSuite Sink (TX) block is allowed per device." << std::endl; - device_handler::getInstance().close_device(device_number); - exit(0); - } - else - { - device_vector[device_number].sink_flag = true; - device_vector[device_number].sink_device_type = device_type; - device_vector[device_number].sink_chip_mode = chip_mode; - if(file_switch == 0) - { - device_vector[device_number].sink_sample_rate = sample_rate; - device_vector[device_number].sink_oversample = oversample; - } - else - { - device_vector[device_number].sink_file_switch = file_switch; - device_vector[device_number].sink_filename = filename; - } - } - break; - - default: - std::cout << "ERROR: device_handler::check_blocks(): incorrect block_type value." << std::endl; - close_all_devices(); - exit(0); + case 1: // Source block + if(device_vector[device_number].source_flag == true) + { + std::cout << "ERROR: device_handler::check_blocks(): only one LimeSuite Source (RX) block is allowed per device." << std::endl; + close_all_devices(); + } + else + { + device_vector[device_number].source_flag = true; + device_vector[device_number].source_device_type = device_type; + device_vector[device_number].source_chip_mode = chip_mode; + device_vector[device_number].source_file_switch = file_switch; + if(file_switch == 0) + { + device_vector[device_number].source_sample_rate = sample_rate; + device_vector[device_number].source_oversample = oversample; + } + else + { + device_vector[device_number].source_filename = filename; + } + } + break; + + case 2: // Sink block + if(device_vector[device_number].sink_flag == true) + { + std::cout << "ERROR: device_handler::check_blocks(): only one LimeSuite Sink (TX) block is allowed per device." << std::endl; + close_all_devices(); + } + else + { + device_vector[device_number].sink_flag = true; + device_vector[device_number].sink_device_type = device_type; + device_vector[device_number].sink_chip_mode = chip_mode; + device_vector[device_number].sink_file_switch = file_switch; + if(file_switch == 0) + { + device_vector[device_number].sink_sample_rate = sample_rate; + device_vector[device_number].sink_oversample = oversample; + } + else + { + device_vector[device_number].sink_filename = filename; + } + } + break; + + default: + std::cout << "ERROR: device_handler::check_blocks(): incorrect block_type value." << std::endl; + close_all_devices(); } - // Check matching block settings + // Check block settings which must match if(device_vector[device_number].source_flag && device_vector[device_number].sink_flag) { + // Device_type must match in blocks with the same serial if(device_vector[device_number].source_device_type != device_vector[device_number].sink_device_type) { std::cout << "ERROR: device_handler::check_blocks(): device_type mismatch in LimeSuite Source (RX) and LimeSuite Sink (TX) blocks." << std::endl; close_all_devices(); - exit(0); } - else if(device_vector[device_number].source_chip_mode != device_vector[device_number].sink_chip_mode) + + // Chip_mode must match in blocks with the same serial + if(device_vector[device_number].source_chip_mode != device_vector[device_number].sink_chip_mode) { std::cout << "ERROR: device_handler::check_blocks(): chip_mode mismatch in LimeSuite Source (RX) and LimeSuite Sink (TX)." << std::endl; close_all_devices(); - exit(0); } - else if(device_vector[device_number].source_file_switch != device_vector[device_number].sink_file_switch) + + // File_switch must match in blocks with the same serial + if(device_vector[device_number].source_file_switch != device_vector[device_number].sink_file_switch) { std::cout << "ERROR: device_handler::check_blocks(): file_switch must match in LimeSuite Source (RX) and LimeSuite Sink (TX)." << std::endl; close_all_devices(); - exit(0); } - else if(device_vector[device_number].source_file_switch && device_vector[device_number].sink_file_switch == 0) + + // When file_switch is 0 check LimeSDR-Mini sample_rate and oversample match throughout the blocks with the same serial + if( (device_vector[device_number].source_file_switch == 0) && (device_vector[device_number].sink_file_switch == 0)) { if((device_vector[device_number].source_sample_rate != device_vector[device_number].sink_sample_rate) && (device_type == 1)) { std::cout << "ERROR: device_handler::check_blocks(): sample_rate must match in LimeSuite Source (RX) and LimeSuite Sink (TX) when using LimeSDR-Mini." << std::endl; close_all_devices(); - exit(0); } else if((device_vector[device_number].source_oversample != device_vector[device_number].sink_oversample) && (device_type == 1)) { std::cout << "ERROR: device_handler::check_blocks(): oversample must match in LimeSuite Source (RX) and LimeSuite Sink (TX) when using LimeSDR-Mini." << std::endl; close_all_devices(); - exit(0); } } - else if(device_vector[device_number].source_filename != device_vector[device_number].sink_filename && device_vector[device_number].source_file_switch && device_vector[device_number].sink_file_switch == 1) + + // When file_switch is 1 check filename match throughout the blocks with the same serial + if(device_vector[device_number].source_filename != device_vector[device_number].sink_filename && (device_vector[device_number].source_file_switch == 1) && (device_vector[device_number].sink_file_switch == 1)) { std::cout << "ERROR: device_handler::check_blocks(): file must match in LimeSuite Source (RX) and LimeSuite Sink (TX)." << std::endl; close_all_devices(); - exit(0); } } } @@ -258,6 +299,15 @@ void device_handler::settings_from_file(int device_number, const char *filename) { if(LMS_LoadConfig(device_handler::getInstance().get_device(device_number),filename)) device_handler::getInstance().error(device_number); + + // Set LimeSDR-Mini switches based on .ini file + int antenna_ch0_tx; + int antenna_ch0_rx; + antenna_ch0_tx = LMS_GetAntenna(device_handler::getInstance().get_device(device_number),LMS_CH_TX,LMS_CH_0); + antenna_ch0_rx = LMS_GetAntenna(device_handler::getInstance().get_device(device_number),LMS_CH_RX,LMS_CH_0); + + LMS_SetAntenna(device_handler::getInstance().get_device(device_number),LMS_CH_TX,LMS_CH_0,antenna_ch0_tx); + LMS_SetAntenna(device_handler::getInstance().get_device(device_number),LMS_CH_RX,LMS_CH_0,antenna_ch0_rx); } void device_handler::set_chip_mode(int device_number, int device_type, int chip_mode, int channel, bool direction) @@ -301,28 +351,55 @@ void device_handler::set_samp_rate(int device_number, const double rate, size_t { std::cout << "ERROR: device_handler::set_samp_rate(): when LimeSDR-Mini samp_rate is more than 15.36e6 S/s and less or equal 30.72e6 S/s, oversample cannot be higher than 4." << std::endl; close_all_devices(); - exit(0); } else if(7.68e6 < rate && rate <= 15.36e6 && oversample != 0 && oversample != 1 && oversample != 2 && oversample != 4 && oversample != 8) { std::cout << "ERROR: device_handler::set_samp_rate(): when LimeSDR-Mini samp_rate is more than 7.68e6 S/s and less or equal 15.36e6 S/s, oversample cannot be higher than 8." << std::endl; close_all_devices(); - exit(0); } else if(3.84e6 < rate && rate <= 7.68e6 && oversample != 0 && oversample != 1 && oversample != 2 && oversample != 4 && oversample != 8 && oversample != 16) { std::cout << "ERROR: device_handler::set_samp_rate(): when LimeSDR-Mini samp_rate is more than 3.84e6 S/s and less or equal 7.68e6 S/s, oversample cannot be higher than 16." << std::endl; close_all_devices(); - exit(0); } - if(LMS_SetSampleRate(device_handler::getInstance().get_device(device_number),rate,oversample)!=LMS_SUCCESS) - device_handler::getInstance().error(device_number); + else if(oversample == 0) + { + if(15.36e6 < rate && rate <= 30.72e6) + { + if(LMS_SetSampleRate(device_handler::getInstance().get_device(device_number),rate,4)!=LMS_SUCCESS) + device_handler::getInstance().error(device_number); + } + else if(7.68e6 < rate && rate <= 15.36e6) + { + if(LMS_SetSampleRate(device_handler::getInstance().get_device(device_number),rate,8)!=LMS_SUCCESS) + device_handler::getInstance().error(device_number); + } + else if(3.84e6 < rate && rate <= 7.68e6) + { + if(LMS_SetSampleRate(device_handler::getInstance().get_device(device_number),rate,16)!=LMS_SUCCESS) + device_handler::getInstance().error(device_number); + } + else if(rate <= 3.84e6) + { + if(LMS_SetSampleRate(device_handler::getInstance().get_device(device_number),rate,32)!=LMS_SUCCESS) + device_handler::getInstance().error(device_number); + } + } + else + { + if(LMS_SetSampleRate(device_handler::getInstance().get_device(device_number),rate,oversample)!=LMS_SUCCESS) + device_handler::getInstance().error(device_number); + } + double host_value; + double rf_value; + if(LMS_GetSampleRate(device_handler::getInstance().get_device(device_number),LMS_CH_RX,LMS_CH_0,&host_value,&rf_value)) + device_handler::getInstance().error(device_number); + std::cout << "INFO: device_handler::set_samp_rate(): set sampling rate: " << host_value/1e6 << " MS/s." << std::endl; } else { std::cout << "ERROR: device_handler::set_samp_rate(): valid oversample values are: 0,1,2,4,8,16,32." << std::endl; close_all_devices(); - exit(0); } } @@ -336,34 +413,65 @@ void device_handler::set_samp_rate_dir(int device_number, const int direction, c { std::cout << "ERROR: device_handler::set_samp_rate(): RX samp_rate cannot be more than 61.44e6 S/s." << std::endl; close_all_devices(); - exit(0); } else if(30.72e6 < rate && rate <= 61.44e6 && oversample != 0 && oversample != 1 && oversample != 2) { std::cout << "ERROR: device_handler::set_samp_rate(): when RX samp_rate is more than 30.72e6 S/s and less or equal 61.44e6 S/s, oversample cannot be higher than 2." << std::endl; close_all_devices(); - exit(0); } else if(15.36e6 < rate && rate <= 30.72e6 && oversample != 0 && oversample != 1 && oversample != 2 && oversample != 4) { std::cout << "ERROR: device_handler::set_samp_rate(): when RX samp_rate is more than 15.36e6 S/s and less or equal 30.72e6 S/s, oversample cannot be higher than 4." << std::endl; close_all_devices(); - exit(0); } else if(7.68e6 < rate && rate <= 15.36e6 && oversample != 0 && oversample != 1 && oversample != 2 && oversample != 4 && oversample != 8) { std::cout << "ERROR: device_handler::set_samp_rate(): when RX samp_rate is more than 7.68e6 S/s and less or equal 15.36e6 S/s, oversample cannot be higher than 8." << std::endl; close_all_devices(); - exit(0); } else if(3.84e6 < rate && rate <= 7.68e6 && oversample != 0 && oversample != 1 && oversample != 2 && oversample != 4 && oversample != 8 && oversample != 16) { std::cout << "ERROR: device_handler::set_samp_rate(): when RX samp_rate is more than 3.84e6 S/s and less or equal 7.68e6 S/s, oversample cannot be higher than 16." << std::endl; close_all_devices(); - exit(0); } - else if(LMS_SetSampleRateDir(device_handler::getInstance().get_device(device_number),direction,rate,oversample)!=LMS_SUCCESS) + else if(oversample == 0) + { + if(30.72e6 < rate && rate <= 61.44e6) + { + if(LMS_SetSampleRateDir(device_handler::getInstance().get_device(device_number),direction,rate,2)!=LMS_SUCCESS) + device_handler::getInstance().error(device_number); + } + else if(15.36e6 < rate && rate <= 30.72e6) + { + if(LMS_SetSampleRateDir(device_handler::getInstance().get_device(device_number),direction,rate,4)!=LMS_SUCCESS) + device_handler::getInstance().error(device_number); + } + else if(7.68e6 < rate && rate <= 15.36e6) + { + if(LMS_SetSampleRateDir(device_handler::getInstance().get_device(device_number),direction,rate,8)!=LMS_SUCCESS) + device_handler::getInstance().error(device_number); + } + else if(3.84e6 < rate && rate <= 7.68e6) + { + if(LMS_SetSampleRateDir(device_handler::getInstance().get_device(device_number),direction,rate,16)!=LMS_SUCCESS) + device_handler::getInstance().error(device_number); + } + else if(rate <= 3.84e6) + { + if(LMS_SetSampleRateDir(device_handler::getInstance().get_device(device_number),direction,rate,32)!=LMS_SUCCESS) + device_handler::getInstance().error(device_number); + } + } + else + { + if(LMS_SetSampleRateDir(device_handler::getInstance().get_device(device_number),direction,rate,oversample)!=LMS_SUCCESS) device_handler::getInstance().error(device_number); + } + double host_value; + double rf_value; + if(LMS_GetSampleRate(device_handler::getInstance().get_device(device_number),LMS_CH_RX,LMS_CH_0,&host_value,&rf_value)) + device_handler::getInstance().error(device_number); + std::cout << "INFO: device_handler::set_samp_rate(): set [RX] sampling rate: " << host_value/1e6 << " MS/s." << std::endl; } else if(direction == LMS_CH_TX) { @@ -371,29 +479,51 @@ void device_handler::set_samp_rate_dir(int device_number, const int direction, c { std::cout << "ERROR: device_handler::set_samp_rate(): TX samp_rate cannot be more than 61.44e6 S/s." << std::endl; close_all_devices(); - exit(0); } else if(30.72e6 < rate && rate <= 61.44e6 && oversample != 0 && oversample != 1 && oversample != 2 && oversample != 4 && oversample != 8) { std::cout << "ERROR: device_handler::set_samp_rate(): when TX samp_rate is more than 30.72e6 S/s and less or equal 61.44e6 S/s, oversample cannot be higher than 8." << std::endl; close_all_devices(); - exit(0); } else if(15.36e6 < rate && rate <= 30.72e6 && oversample != 0 && oversample != 1 && oversample != 2 && oversample != 4 && oversample != 8 && oversample != 16) { std::cout << "ERROR: device_handler::set_samp_rate(): when TX samp_rate is more than 15.36e6 S/s and less or equal 30.72e6 S/s, oversample cannot be higher than 16." << std::endl; close_all_devices(); - exit(0); } - else if(LMS_SetSampleRateDir(device_handler::getInstance().get_device(device_number),direction,rate,oversample)!=LMS_SUCCESS) + else if(oversample == 0) + { + if(30.72e6 < rate && rate <= 61.44e6) + { + if(LMS_SetSampleRateDir(device_handler::getInstance().get_device(device_number),direction,rate,8)!=LMS_SUCCESS) + device_handler::getInstance().error(device_number); + } + else if(15.36e6 < rate && rate <= 30.72e6) + { + if(LMS_SetSampleRateDir(device_handler::getInstance().get_device(device_number),direction,rate,16)!=LMS_SUCCESS) + device_handler::getInstance().error(device_number); + } + else if(rate <= 15.36e6) + { + if(LMS_SetSampleRateDir(device_handler::getInstance().get_device(device_number),direction,rate,32)!=LMS_SUCCESS) + device_handler::getInstance().error(device_number); + } + } + else + { + if(LMS_SetSampleRateDir(device_handler::getInstance().get_device(device_number),direction,rate,oversample)!=LMS_SUCCESS) device_handler::getInstance().error(device_number); + } + double host_value; + double rf_value; + if(LMS_GetSampleRate(device_handler::getInstance().get_device(device_number),LMS_CH_TX,LMS_CH_0,&host_value,&rf_value)) + device_handler::getInstance().error(device_number); + std::cout << "INFO: device_handler::set_samp_rate(): set [TX] sampling rate: " << host_value/1e6 << " MS/s." << std::endl; } } else { std::cout << "ERROR: device_handler::set_samp_rate_dir() valid oversample values are: 0,1,2,4,8,16,32." << std::endl; close_all_devices(); - exit(0); } } @@ -403,12 +533,19 @@ void device_handler::set_rf_freq(int device_number, int device_type, bool direct { std::cout << "ERROR: device_handler::set_rf_freq(): rf_freq must be more than 0 Hz." << std::endl; close_all_devices(); - exit(0); } else { - if (LMS_SetLOFrequency(device_handler::getInstance().get_device(device_number), direction, channel, rf_freq) != LMS_SUCCESS) - device_handler::error(device_number); + int status = LMS_SetLOFrequency(device_handler::getInstance().get_device(device_number), direction, channel, rf_freq); + double value = 0; + LMS_GetLOFrequency(device_handler::getInstance().get_device(device_number), direction, channel, &value); + std::string direction_string; + if(direction == LMS_CH_RX) + direction_string = "RX"; + else if(direction == LMS_CH_TX) + direction_string = "TX"; + + std::cout << "INFO: device_handler::set_rf_freq(): RF frequency set [" << direction_string << "]: " << value/1e6 << " MHz." << std::endl; } } @@ -419,35 +556,25 @@ void device_handler::calibrate(int device_number, int device_type, int calibrati std::cout << "INFO: device_handler::calibrate(): "; if(device_type == 2 && path == 2) // LNAL matching workaround [LimeSDR-USB] { - if (LMS_SetLOFrequency(device_handler::getInstance().get_device(device_number), LMS_CH_RX, channel, 200e6) != LMS_SUCCESS) - device_handler::error(device_number); - if(LMS_Calibrate(device_handler::getInstance().get_device(device_number), LMS_CH_RX, channel, bandwidth, 0)!= LMS_SUCCESS) - device_handler::getInstance().error(device_number); - if (LMS_SetLOFrequency(device_handler::getInstance().get_device(device_number), LMS_CH_RX, channel, rf_freq) != LMS_SUCCESS) - device_handler::error(device_number); + LMS_SetLOFrequency(device_handler::getInstance().get_device(device_number), LMS_CH_RX, channel, 200e6); + LMS_Calibrate(device_handler::getInstance().get_device(device_number), LMS_CH_RX, channel, bandwidth, 0); + LMS_SetLOFrequency(device_handler::getInstance().get_device(device_number), LMS_CH_RX, channel, rf_freq); } else if(rf_freq >= 31e6) // Normal calibration { - if(LMS_Calibrate(device_handler::getInstance().get_device(device_number), LMS_CH_RX, channel, bandwidth, 0)!= LMS_SUCCESS) - device_handler::getInstance().error(device_number); + LMS_Calibrate(device_handler::getInstance().get_device(device_number), LMS_CH_RX, channel, bandwidth, 0); } else if(device_type == 1)// Lower than 31 MHz center frequency workaround [LimeSDR-Mini] { - if (LMS_SetLOFrequency(device_handler::getInstance().get_device(device_number), LMS_CH_RX, channel, 100e6) != LMS_SUCCESS) - device_handler::error(device_number); - if(LMS_Calibrate(device_handler::getInstance().get_device(device_number), LMS_CH_RX, channel, bandwidth, 0)!= LMS_SUCCESS) - device_handler::getInstance().error(device_number); - if (LMS_SetLOFrequency(device_handler::getInstance().get_device(device_number), LMS_CH_RX, channel, rf_freq) != LMS_SUCCESS) - device_handler::error(device_number); + LMS_SetLOFrequency(device_handler::getInstance().get_device(device_number), LMS_CH_RX, channel, 100e6); + LMS_Calibrate(device_handler::getInstance().get_device(device_number), LMS_CH_RX, channel, bandwidth, 0); + LMS_SetLOFrequency(device_handler::getInstance().get_device(device_number), LMS_CH_RX, channel, rf_freq); } else if(device_type == 2)// Lower than 31 MHz center frequency workaround [LimeSDR-USB] { - if (LMS_SetLOFrequency(device_handler::getInstance().get_device(device_number), LMS_CH_RX, channel, 50e6) != LMS_SUCCESS) - device_handler::error(device_number); - if(LMS_Calibrate(device_handler::getInstance().get_device(device_number), LMS_CH_RX, channel, bandwidth, 0)!= LMS_SUCCESS) - device_handler::getInstance().error(device_number); - if (LMS_SetLOFrequency(device_handler::getInstance().get_device(device_number), LMS_CH_RX, channel, rf_freq) != LMS_SUCCESS) - device_handler::error(device_number); + LMS_SetLOFrequency(device_handler::getInstance().get_device(device_number), LMS_CH_RX, channel, 50e6); + LMS_Calibrate(device_handler::getInstance().get_device(device_number), LMS_CH_RX, channel, bandwidth, 0); + LMS_SetLOFrequency(device_handler::getInstance().get_device(device_number), LMS_CH_RX, channel, rf_freq); } } else if(calibration == 1 && direction == LMS_CH_TX) @@ -455,191 +582,74 @@ void device_handler::calibrate(int device_number, int device_type, int calibrati std::cout << "INFO: device_handler::calibrate(): "; if(rf_freq >= 31e6) { - if(LMS_Calibrate(device_handler::getInstance().get_device(device_number), LMS_CH_TX, channel, bandwidth, 0)!= LMS_SUCCESS) - device_handler::getInstance().error(device_number); + LMS_Calibrate(device_handler::getInstance().get_device(device_number), LMS_CH_TX, channel, bandwidth, 0); } else { - if (LMS_SetLOFrequency(device_handler::getInstance().get_device(device_number), LMS_CH_TX, channel, 50e6) != LMS_SUCCESS) - device_handler::error(device_number); - if(LMS_Calibrate(device_handler::getInstance().get_device(device_number), LMS_CH_TX, channel, bandwidth, 0)!= LMS_SUCCESS) - device_handler::getInstance().error(device_number); - if (LMS_SetLOFrequency(device_handler::getInstance().get_device(device_number), LMS_CH_TX, channel, rf_freq) != LMS_SUCCESS) - device_handler::error(device_number); + LMS_SetLOFrequency(device_handler::getInstance().get_device(device_number), LMS_CH_TX, channel, 50e6); + LMS_Calibrate(device_handler::getInstance().get_device(device_number), LMS_CH_TX, channel, bandwidth, 0); + LMS_SetLOFrequency(device_handler::getInstance().get_device(device_number), LMS_CH_TX, channel, rf_freq); } } -} - -void device_handler::mini_switch_workaround(int device_number) -{ - if(device_vector[device_number].mini_switch_workaround_flag == false) - { - device_vector[device_number].mini_switch_workaround_flag = true; - - uint16_t addr = 0x0017; - uint16_t default_value = 0; - uint16_t value = 0x2204; - - if(LMS_ReadFPGAReg(device_handler::getInstance().get_device(device_number),addr, &default_value)) - device_handler::error(device_number); - - if(LMS_WriteFPGAReg(device_handler::getInstance().get_device(device_number),addr, value)) - device_handler::error(device_number); - - if(LMS_WriteFPGAReg(device_handler::getInstance().get_device(device_number),addr, default_value)) - device_handler::error(device_number); - } -} - -void device_handler::set_lna_path_mini(int device_number, int lna_path_mini) -{ - - if(lna_path_mini == 1 || lna_path_mini == 3) - { - uint16_t addr = 0x0017; - uint16_t value = 0; - int bit = 0; - if(LMS_ReadFPGAReg(device_handler::getInstance().get_device(device_number),addr, &value)) - device_handler::error(device_number); - - if(lna_path_mini==1) - { - bit = (value >> 8) & 1UL; - if(bit == 0) - { - value |= 1UL << 8; - value &= ~(1UL << 9); - } - else if(bit == 1) - { - - } - else - { - std::cout << "ERROR: device_handler::set_lna_path_mini(): failed to read 8th bit in 0x0017 registry." << std::endl; - close_all_devices(); - exit(0); - } - } - else if(lna_path_mini==3) - { - bit = (value >> 9) & 1UL; - if(bit == 0) - { - value |= 1UL << 9; - value &= ~(1UL << 8); - } - else if(bit == 1) - { - - } - else - { - std::cout << "ERROR: device_handler::set_lna_path_mini(): failed to read 9th bit in 0x0017 registry." << std::endl; - close_all_devices(); - exit(0); - } - } - - if(LMS_WriteFPGAReg(device_handler::getInstance().get_device(device_number),addr, value)) - device_handler::error(device_number); - } - else - { - std::cout << "ERROR: device_handler::set_lna_path_mini(): lna_path_mini must be 1 or 3." << std::endl; - close_all_devices(); - exit(0); - } -} - -void device_handler::set_lna_path(int device_number, int channel, int lna_path) -{ - if(lna_path == 1 || lna_path == 2 || lna_path == 3) - { - if(LMS_SetAntenna(device_handler::getInstance().get_device(device_number),LMS_CH_RX,channel,lna_path)) - device_handler::error(device_number); - } - else - { - std::cout << "ERROR: device_handler::set_lna_path(): lna_path value must be 1,2,3." << std::endl; - close_all_devices(); - exit(0); - } -} - -void device_handler::set_pa_path_mini(int device_number, int pa_path_mini) -{ - if(pa_path_mini == 1 || pa_path_mini == 2) + else if(calibration == 0) { - uint16_t addr = 0x0017; - uint16_t value = 0; - int bit = 0; - - if(LMS_ReadFPGAReg(device_handler::getInstance().get_device(device_number),addr, &value)) - device_handler::error(device_number); - if(pa_path_mini==1) - { - bit = (value >> 12) & 1UL; - if(bit == 0) - { - value |= 1UL << 12; - value &= ~(1UL << 13); - } - else if(bit == 1) - { - - } - else - { - std::cout << "ERROR: device_handler::set_pa_path_mini(): failed to read 12th bit in 0x0017 registry." << std::endl; - close_all_devices(); - exit(0); - } - } - else if(pa_path_mini==2) - { - bit = (value >> 13) & 1UL; - if(bit == 0) - { - value |= 1UL << 13; - value &= ~(1UL << 12); - } - else if(bit == 1) - { - - } - else - { - std::cout << "ERROR: device_handler::set_pa_path_mini(): failed to read 13th bit in 0x0017 registry." << std::endl; - close_all_devices(); - exit(0); - } - } - - if(LMS_WriteFPGAReg(device_handler::getInstance().get_device(device_number),addr, value)) - device_handler::error(device_number); + std::string direction_string; + if(direction == LMS_CH_RX) + direction_string = "RX"; + else if(direction == LMS_CH_TX) + direction_string = "TX"; + std::cout << "INFO: device_handler::calibrate(): calibration channel " << channel << " [" << direction_string << "]: disabled." << std::endl; } else { - std::cout << "ERROR: device_handler::set_pa_path_mini(): pa_path_mini must be 1 or 2." << std::endl; - close_all_devices(); - exit(0); + std::cout << "ERROR: device_handler::calibrate(): calibration must be either enabled (1) or disabled (0). Disabling calibration due to incorrect parameters." << std::endl; } } -void device_handler::set_pa_path(int device_number, int channel, int pa_path) +void device_handler::set_antenna(int device_number, int channel, int direction, int antenna) { - if(pa_path == 1 || pa_path == 2) + LMS_SetAntenna(device_handler::getInstance().get_device(device_number),direction,channel,antenna); + int antenna_value = LMS_GetAntenna(device_handler::getInstance().get_device(device_number),direction,channel); + lms_range_t range; + LMS_GetAntennaBW(device_handler::getInstance().get_device(device_number),direction,channel,antenna,&range); + std::string antenna_string; + std::string direction_string; + if(direction == LMS_CH_RX) { - if(LMS_SetAntenna(device_handler::getInstance().get_device(device_number),LMS_CH_TX,channel,pa_path)) - device_handler::error(device_number); + direction_string = "RX"; + switch(antenna_value) + { + case 1: + antenna_string = "LNAH"; + break; + case 2: + antenna_string = "LNAL"; + break; + case 3: + antenna_string = "LNAW"; + break; + default: + antenna_string = "NONE"; + break; + } } - else + else if(direction == LMS_CH_TX) { - std::cout << "ERROR: device_handler::set_pa_path(): pa_path value must be 1,2." << std::endl; - close_all_devices(); - exit(0); + direction_string = "TX"; + switch(antenna_value) + { + case 1: + antenna_string = "BAND1"; + break; + case 2: + antenna_string = "BAND2"; + break; + default: + antenna_string = "NONE"; + break; + } } + std::cout << "INFO: device_handler::set_antenna(): channel " << channel << " antenna set [" << direction_string << "]: " << antenna_string << "." << std::endl; } void device_handler::set_analog_filter(int device_number, bool direction, int channel, int analog_filter, float analog_bandw) @@ -654,13 +664,15 @@ void device_handler::set_analog_filter(int device_number, bool direction, int ch { std::cout << "ERROR: device_handler::set_analog_filter(): analog_bandw TX value must be [5e6,130e6]." << std::endl; close_all_devices(); - exit(0); } else { std::cout << "INFO: device_handler::set_analog_filter(): "; - if(LMS_SetLPFBW(device_handler::getInstance().get_device(device_number),direction,channel,analog_bandw)!=LMS_SUCCESS) - device_handler::error(device_number); + LMS_SetLPFBW(device_handler::getInstance().get_device(device_number),direction,channel,analog_bandw); + + double analog_value; + LMS_GetLPFBW(device_handler::getInstance().get_device(device_number),direction,channel,&analog_value); + std::cout << "Configured bandwidth: " << analog_value/1e6 << " MHz." << std::endl; } } else if(direction == LMS_CH_RX) @@ -669,39 +681,44 @@ void device_handler::set_analog_filter(int device_number, bool direction, int ch { std::cout << "ERROR: device_handler::set_analog_filter(): analog_bandw RX value must be [1.5e6,130e6]." << std::endl; close_all_devices(); - exit(0); } else { std::cout << "INFO: device_handler::set_analog_filter(): "; - if(LMS_SetLPFBW(device_handler::getInstance().get_device(device_number),direction,channel,analog_bandw)!=LMS_SUCCESS) - device_handler::error(device_number); + LMS_SetLPFBW(device_handler::getInstance().get_device(device_number),direction,channel,analog_bandw); + + double analog_value; + LMS_GetLPFBW(device_handler::getInstance().get_device(device_number),direction,channel,&analog_value); + std::cout << "Configured bandwidth: " << analog_value/1e6 << " MHz." << std::endl; } } else { std::cout << "ERROR: device_handler::set_analog_filter(): direction must be 0(LMS_CH_RX) or 1(LMS_CH_TX)." << std::endl; close_all_devices(); - exit(0); } } else { std::cout << "ERROR: device_handler::set_analog_filter(): channel must be 0 or 1." << std::endl; close_all_devices(); - exit(0); } } else if(analog_filter == 0) { - if(LMS_SetLPF(device_handler::getInstance().get_device(device_number), direction, channel, false)!=LMS_SUCCESS) - device_handler::error(device_number); + std::string direction_string; + if(direction == LMS_CH_RX) + direction_string = "RX"; + else if(direction == LMS_CH_TX) + direction_string = "TX"; + + std::cout << "INFO: device_handler::set_analog_filter(): analog filter channel " << channel << " [" << direction_string << "]: disabled (maximum value set)." << std::endl; + LMS_SetLPF(device_handler::getInstance().get_device(device_number),direction,channel,false); } else { - std::cout << "ERROR: device_handler::set_analog_filter(): analog_filter must be 0(OFF) or 1(ON)." << std::endl; - close_all_devices(); - exit(0); + std::cout << "ERROR: device_handler::set_analog_filter(): analog_filter must be either enabled (1) or disabled (0). Disabling analog_filter due to incorrect parameters." << std::endl; + LMS_SetLPF(device_handler::getInstance().get_device(device_number),direction,channel,false); } } @@ -709,35 +726,93 @@ void device_handler::set_digital_filter(int device_number, bool direction, int c { if(digital_filter != 0 && digital_filter != 1) { - std::cout << "ERROR: device_handler::set_digital_filter(): digital_filter must be 0(OFF) or 1(ON)." << std::endl; - close_all_devices(); - exit(0); + std::cout << "ERROR: device_handler::set_digital_filter(): digital_filter must be either enabled (1) or disabled (0). Disabling digital_filter due to incorrect parameters." << std::endl; + LMS_SetGFIRLPF(device_handler::getInstance().get_device(device_number),direction,channel,0,digital_bandw); } else if(digital_bandw < 0) { std::cout << "ERROR: device_handler::set_digital_filter(): digital_bandw must be more than 0." << std::endl; close_all_devices(); - exit(0); } - else + else if(digital_filter == 1) { - if(LMS_SetGFIRLPF(device_handler::getInstance().get_device(device_number),direction,channel,digital_filter,digital_bandw)!=LMS_SUCCESS) - device_handler::error(device_number); + LMS_SetGFIRLPF(device_handler::getInstance().get_device(device_number),direction,channel,digital_filter,digital_bandw); + + std::string direction_string; + if(direction == LMS_CH_RX) + direction_string = "RX"; + else if(direction == LMS_CH_TX) + direction_string = "TX"; + + std::cout << "INFO: device_handler::set_digital_filter(): digital filter channel " << channel << " [" << direction_string << "]: " << digital_bandw/1e6 << " MHz." << std::endl; } + else if(digital_filter == 0) + { + + LMS_SetGFIRLPF(device_handler::getInstance().get_device(device_number),direction,channel,digital_filter,digital_bandw); + + std::string direction_string; + if(direction == LMS_CH_RX) + direction_string = "RX"; + else if(direction == LMS_CH_TX) + direction_string = "TX"; + + std::cout << "INFO: device_handler::set_digital_filter(): digital filter channel " << channel << " set [" << direction_string << "]: disabled." << std::endl; + } } -void device_handler::set_gain(int device_number, bool direction, int channel, unsigned gain_dB) +void device_handler::set_gain(int device_number, bool direction, int channel, unsigned int gain_dB) { if((direction==LMS_CH_RX && gain_dB >= 0 && gain_dB <= 70)||(direction==LMS_CH_TX && gain_dB >= 0 && gain_dB <= 60)) { if(LMS_SetGaindB(device_handler::getInstance().get_device(device_number),direction,channel,gain_dB)!=LMS_SUCCESS) - device_handler::error(device_number); + device_handler::error(device_number); + + std::string direction_string; + if(direction == LMS_CH_RX) + direction_string = "RX"; + else if(direction == LMS_CH_TX) + direction_string = "TX"; + + unsigned int gain_value; + LMS_GetGaindB(device_handler::getInstance().get_device(device_number),direction,channel,&gain_value); + std::cout << "INFO: device_handler::set_gain(): set gain [" << direction_string << "]: " << gain_value << " dB." << std::endl; } else { std::cout << "ERROR: device_handler::set_gain(): valid RX gain range [0, 70], TX gain range [0, 60]." << std::endl; close_all_devices(); - exit(0); } } + +void device_handler::set_nco(int device_number, bool direction, int channel, float nco_freq, float nco_pho, int cmix_mode) +{ + if(nco_freq == 0) + { + LMS_SetNCOIndex(device_handler::getInstance().get_device(device_number),direction,channel,-1,cmix_mode); + } + else + { + double freq_value_in[16]; + for (int i = 0; i < 16; ++i) + { + if(i==0) + freq_value_in[i]=nco_freq; + else + freq_value_in[i]=0; + } + LMS_SetNCOFrequency(device_handler::getInstance().get_device(device_number),direction,channel,freq_value_in,nco_pho); + LMS_SetNCOIndex(device_handler::getInstance().get_device(device_number),direction,channel,0,cmix_mode); + std::string direction_string; + if(direction == LMS_CH_RX) + direction_string = "RX"; + else if(direction == LMS_CH_TX); + direction_string = "TX"; + + double freq_value_out[16]; + double pho_value_out[16]; + LMS_GetNCOFrequency(device_handler::getInstance().get_device(device_number),direction,channel,freq_value_out,pho_value_out); + std::cout << "INFO: device_handler::set_nco(): set channel " << channel << " NCO [" << direction_string << "]: " << freq_value_out[0]/1e6 << " MHz (" << pho_value_out[0] << " deg.)." << std::endl; + } +} diff --git a/lib/common/device_handler.h b/lib/common/device_handler.h index a503826..e2dbb39 100644 --- a/lib/common/device_handler.h +++ b/lib/common/device_handler.h @@ -25,16 +25,18 @@ #include #include #include +#include +#include +#include #include -#include class device_handler { -private: - +private: int open_devices = 0; - + // Read device list once flag bool list_read = false; + // Calculate open devices to close them all on close_all_devices int device_count; struct device @@ -62,9 +64,11 @@ class device_handler }; //Device list - lms_info_str_t* list = new lms_info_str_t[5]; + lms_info_str_t* list = new lms_info_str_t[20]; // Device vector. Adds devices from the list std::vector device_vector; + // Run close_all_devices once with this flag + bool close_flag = false; device_handler() {}; device_handler(device_handler const&); @@ -80,6 +84,8 @@ class device_handler return instance; } ~device_handler(); + + mutable std::recursive_mutex block_mutex; /** * Print device error and close all devices. @@ -102,14 +108,14 @@ class device_handler * * @param device_type LimeSDR-Mini(1), LimeSDR-USB(2). */ - void open_device(int device_number, int device_type); + int open_device(std::string serial, int device_type); /** * Disconnect from the device. * * @param device_number Device number from the list of LMS_GetDeviceList. */ - void close_device(int device_number); + void close_device(int device_number, int block_type); /** * Disconnect from all devices. @@ -216,53 +222,9 @@ class device_handler * and center frequencies below 30 MHz (NCO). */ void calibrate(int device_number, int device_type, int calibration, int direction, int channel, double bandwidth, float rf_freq, int path); - - /** - * Workaround for LimeSDR-Mini switch bug. Call upon implementation. - * - * @param device_number Device number from the list of LMS_GetDeviceList. - */ - void mini_switch_workaround(int device_number); - - /** - * LNA switch for LimeSDR-Mini. - * - * @param device_number Device number from the list of LMS_GetDeviceList. - * - * @param lna_path_mini LNA switch: LNAH(1),LNAW(3). - */ - void set_lna_path_mini(int device_number, int lna_path_mini); - - /** - * Set LNA path. - * - * @param device_number Device number from the list of LMS_GetDeviceList. - * - * @param channel Channel selection: A(LMS_CH_0),B(LMS_CH_1). - * - * @param lna_path LNA path: no path(0),LNAH(1),LNAL(2),LNAW(3). - */ - void set_lna_path(int device_number, int channel, int lna_path); - - /** - * PA switch for LimeSDR-Mini. - * - * @param device_number Device number from the list of LMS_GetDeviceList. - * - * @param pa_path_mini PA path: BAND1(1),BAND2(2). - */ - void set_pa_path_mini(int device_number, int pa_path_mini); - - /** - * Set PA path. - * - * @param device_number Device number from the list of LMS_GetDeviceList. - * - * @param channel Channel selection: A(LMS_CH_0),B(LMS_CH_1). - * - * @param pa_path PA path: BAND1(1),BAND2(2). - */ - void set_pa_path(int device_number, int channel, int pa_path); + + + void set_antenna(int device_number, int channel, int direction, int antenna); /** * Set analog filters. @@ -311,6 +273,25 @@ class device_handler * @param gain_dB Desired gain: [0,70] RX, [0,60] TX. */ void set_gain(int device_number, bool direction, int channel, unsigned int gain_dB); + + /** + * Set NCO (numerically controlled oscillator). + * By selecting NCO frequency, phase offset and CMIX mode + * configure NCO. When NCO frequency is 0, NCO is off. + * + * @param device_number Device number from the list of LMS_GetDeviceList. + * + * @param direction Select RX or TX. + * + * @param channel Channel index. + * + * @param nco_freq NCO frequency in Hz. + * + * @param nco_pho NCO phase offset in deg. + * + * @param cmix_mode CMIX mode: UPCONVERT(0), DOWNCONVERT(1). + */ + void set_nco(int device_number, bool direction, int channel, float nco_freq, float nco_pho, int cmix_mode); }; diff --git a/lib/sink_impl.cc b/lib/sink_impl.cc index 3d146a5..11ee8e5 100644 --- a/lib/sink_impl.cc +++ b/lib/sink_impl.cc @@ -30,7 +30,7 @@ namespace gr namespace limesdr { sink::sptr - sink::make(int device_number, + sink::make(std::string serial, int device_type, int chip_mode, int channel, @@ -55,10 +55,14 @@ namespace gr int digital_filter_ch1, double digital_bandw_ch1, int gain_dB_ch0, - int gain_dB_ch1) + int gain_dB_ch1, + float nco_freq_ch0, + float nco_freq_ch1, + int cmix_mode_ch0, + int cmix_mode_ch1) { return gnuradio::get_initial_sptr - (new sink_impl(device_number, + (new sink_impl(serial, device_type, chip_mode, channel, @@ -83,10 +87,14 @@ namespace gr digital_filter_ch1, digital_bandw_ch1, gain_dB_ch0, - gain_dB_ch1)); + gain_dB_ch1, + nco_freq_ch0, + nco_freq_ch1, + cmix_mode_ch0, + cmix_mode_ch1)); } - sink_impl::sink_impl(int device_number, + sink_impl::sink_impl(std::string serial, int device_type, int chip_mode, int channel, @@ -111,8 +119,12 @@ namespace gr int digital_filter_ch1, double digital_bandw_ch1, int gain_dB_ch0, - int gain_dB_ch1) - : gr::sync_block("sink", + int gain_dB_ch1, + float nco_freq_ch0, + float nco_freq_ch1, + int cmix_mode_ch0, + int cmix_mode_ch1) + : gr::block("sink", args_to_io_signature(chip_mode), // Based on chip_mode SISO/MIMO use appropriate input signature gr::io_signature::make(0, 0, 0)) { @@ -121,9 +133,10 @@ namespace gr std::cout << std::endl; // 1. Store private variables upon implementation to protect from changing them later - stored.device_number = device_number; + stored.serial = serial; stored.device_type = device_type; stored.chip_mode = chip_mode; + stored.samp_rate = samp_rate; if(stored.device_type == 1) // LimeSDR-Mini stored.channel = LMS_CH_0; @@ -135,17 +148,18 @@ namespace gr stored.channel = LMS_CH_0; } + if(channel != 0 && channel != 1) + { + std::cout << "ERROR: sink_impl::sink_impl(): CH0 must be either 0 (A) or 1 (B)." << std::endl; + exit(0); + } + // 2. Open device if not opened - device_handler::getInstance().open_device(stored.device_number,stored.device_type); + stored.device_number = device_handler::getInstance().open_device(stored.serial,stored.device_type); // 3. Check where to load settings from (file or block) if(file_switch == 1) { - if(stored.device_type == 1) - { - device_handler::getInstance().mini_switch_workaround(stored.device_number); - device_handler::getInstance().set_pa_path_mini(stored.device_number,pa_path_mini); - } device_handler::getInstance().settings_from_file(stored.device_number,filename); device_handler::getInstance().check_blocks(stored.device_number,sink_block,stored.device_type, stored.chip_mode, 0, 0, file_switch,filename); } @@ -171,126 +185,176 @@ namespace gr device_handler::getInstance().set_digital_filter(stored.device_number,LMS_CH_TX,stored.channel,digital_filter_ch0, digital_bandw_ch0); - // 9. Set PA path switches and settings + // 9. Set PA path if(stored.device_type == 1) // LimeSDR-Mini - { - device_handler::getInstance().mini_switch_workaround(stored.device_number); - device_handler::getInstance().set_pa_path_mini(stored.device_number,pa_path_mini); - device_handler::getInstance().set_pa_path(stored.device_number,stored.channel,pa_path_mini); - } + device_handler::getInstance().set_antenna(stored.device_number,stored.channel,LMS_CH_TX,pa_path_mini); else if(stored.device_type == 2) // LimeSDR-USB - device_handler::getInstance().set_pa_path(stored.device_number,stored.channel,pa_path_ch0); + device_handler::getInstance().set_antenna(stored.device_number,stored.channel,LMS_CH_TX,pa_path_ch0); // 10. Set GAIN device_handler::getInstance().set_gain(stored.device_number,LMS_CH_TX,stored.channel,gain_dB_ch0); - + // 11. Perform calibration device_handler::getInstance().calibrate(stored.device_number,stored.device_type,calibration_ch0,LMS_CH_TX,stored.channel,calibr_bandw_ch0,rf_freq,pa_path_ch0); - - // 12. Begin configuring device for channel 1 (if chip_mode is MIMO) + + // 12. Set NCO + device_handler::getInstance().set_nco(stored.device_number,LMS_CH_TX,stored.channel,nco_freq_ch0,0,cmix_mode_ch0); + + // 13. Begin configuring device for channel 1 (if chip_mode is MIMO) if(stored.chip_mode == 2 && stored.device_type == 2) { - device_handler::getInstance().set_pa_path(stored.device_number,LMS_CH_1,pa_path_ch1); + device_handler::getInstance().set_antenna(stored.device_number,LMS_CH_1,LMS_CH_TX,pa_path_ch1); device_handler::getInstance().set_analog_filter(stored.device_number,LMS_CH_TX,LMS_CH_1,analog_filter_ch1,analog_bandw_ch1); device_handler::getInstance().set_digital_filter(stored.device_number,LMS_CH_TX,LMS_CH_1,digital_filter_ch1, digital_bandw_ch1); device_handler::getInstance().set_gain(stored.device_number,LMS_CH_TX,LMS_CH_1,gain_dB_ch1); device_handler::getInstance().calibrate(stored.device_number,stored.device_type,calibration_ch1,LMS_CH_TX,LMS_CH_1,calibr_bandw_ch1,rf_freq,pa_path_ch1); + device_handler::getInstance().set_nco(stored.device_number,LMS_CH_TX,LMS_CH_1,nco_freq_ch1,0,cmix_mode_ch1); } } - + + // 14. Initialize stream for channel 0 (if chip_mode is SISO) + if(stored.chip_mode == 1) + { + this->init_stream(stored.device_number,stored.channel,stored.samp_rate); + } + + // 15. Initialize both channels streams (if chip_mode is MIMO) + else if(stored.chip_mode == 2 && stored.device_type == 2) + { + this->init_stream(stored.device_number,LMS_CH_0,stored.samp_rate); + this->init_stream(stored.device_number,LMS_CH_1,stored.samp_rate); + } std::cout << "---------------------------------------------------------------" << std::endl; } sink_impl::~sink_impl() { - device_handler::getInstance().close_device(stored.device_number); + // Stop and destroy stream for channel 0 (if chip_mode is SISO) + if(stored.chip_mode == 1) + { + LMS_StopStream(&streamId[stored.channel]); + LMS_DestroyStream(device_handler::getInstance().get_device(stored.device_number),&streamId[stored.channel]); + } + // Stop and destroy stream for channels 0 & 1 (if chip_mode is MIMO) + else if(stored.chip_mode == 2) + { + LMS_StopStream(&streamId[LMS_CH_0]); + LMS_StopStream(&streamId[LMS_CH_1]); + LMS_DestroyStream(device_handler::getInstance().get_device(stored.device_number),&streamId[LMS_CH_0]); + LMS_DestroyStream(device_handler::getInstance().get_device(stored.device_number),&streamId[LMS_CH_1]); + } + device_handler::getInstance().close_device(stored.device_number,sink_block); } - bool sink_impl::start(void) - { - // Initialize and start stream for channel 0 (if chip_mode is SISO) - if(stored.chip_mode == 1) // If SISO configure prefered channel - { - this->init_stream(stored.device_number,stored.channel); - if(LMS_StartStream(&streamId[stored.channel]) != LMS_SUCCESS) - device_handler::getInstance().error(stored.device_number); - } + bool sink_impl::start(void) + { + std::unique_lock lock(device_handler::getInstance().block_mutex); + // Initialize and start stream for channel 0 (if chip_mode is SISO) + if(stored.chip_mode == 1) // If SISO configure prefered channel + { + LMS_StartStream(&streamId[stored.channel]); + } - // Initialize and start stream for channels 0 & 1 (if chip_mode is MIMO) - else if(stored.chip_mode == 2 && stored.device_type == 2) - { - this->init_stream(stored.device_number,LMS_CH_0); - this->init_stream(stored.device_number,LMS_CH_1); - if(LMS_StartStream(&streamId[LMS_CH_0]) != LMS_SUCCESS) - device_handler::getInstance().error(stored.device_number); - if(LMS_StartStream(&streamId[LMS_CH_1]) != LMS_SUCCESS) - device_handler::getInstance().error(stored.device_number); - } - return true; - } + // Initialize and start stream for channels 0 & 1 (if chip_mode is MIMO) + else if(stored.chip_mode == 2 && stored.device_type == 2) + { + LMS_StartStream(&streamId[LMS_CH_0]); + LMS_StartStream(&streamId[LMS_CH_1]); + } + std::unique_lock unlock(device_handler::getInstance().block_mutex); + return true; + } bool sink_impl::stop(void) { - // Stop and destroy stream for channel 0 (if chip_mode is SISO) - if(stored.chip_mode == 1) - { - LMS_StopStream(&streamId[stored.channel]); - LMS_DestroyStream(device_handler::getInstance().get_device(stored.device_number), &streamId[stored.channel]); - } - // Stop and destroy stream for channels 0 & 1 (if chip_mode is MIMO) - else if(stored.chip_mode == 2) - { - LMS_StopStream(&streamId[LMS_CH_0]); - LMS_DestroyStream(device_handler::getInstance().get_device(stored.device_number), &streamId[LMS_CH_0]); - LMS_StopStream(&streamId[LMS_CH_1]); - LMS_DestroyStream(device_handler::getInstance().get_device(stored.device_number), &streamId[LMS_CH_1]); - } + std::unique_lock lock(device_handler::getInstance().block_mutex); + // Stop stream for channel 0 (if chip_mode is SISO) + if(stored.chip_mode == 1) + { + LMS_StopStream(&streamId[stored.channel]); + } + // Stop streams for channels 0 & 1 (if chip_mode is MIMO) + else if(stored.chip_mode == 2) + { + LMS_StopStream(&streamId[LMS_CH_0]); + LMS_StopStream(&streamId[LMS_CH_1]); + } + std::unique_lock unlock(device_handler::getInstance().block_mutex); return true; } - + int - sink_impl::work(int noutput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items) + sink_impl::general_work(int noutput_items, + gr_vector_int &ninput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items) { - // Send stream for channel 0 (if chip_mode is SISO) + // Send stream for channel 0 (if chip_mode is SISO) if(stored.chip_mode == 1) { - int ret = LMS_SendStream(&streamId[stored.channel], + //Print stream stats to debug + if (stream_analyzer == true && std::time(0)>t) + { + lms_stream_status_t status; + LMS_GetStreamStatus(&streamId[stored.channel], &status); + std::cout << std::endl; + std::cout << "TX rate: " << status.linkRate / 1e6 << " MB/s "; + std::cout << "dropped packets: " << status.droppedPackets << " "; + std::cout << "FIFO: " << 100 * status.fifoFilledCount / status.fifoSize << "% "; + std::cout << "underrun: " << status.underrun << " overrun: " << status.overrun; + std::cout << " FIFO size: " << status.fifoSize << std::endl; + t = std::time(0); + } + + int ret0 = LMS_SendStream(&streamId[stored.channel], input_items[0], noutput_items, - NULL, 0); - if (ret < 0) + NULL, 100); + if(ret0 < 0) { - return 0; //call again + return 0; } - consume(0,ret); + consume(0,ret0); } // Send stream for channels 0 & 1 (if chip_mode is MIMO) else if(stored.chip_mode == 2) { + //Print stream stats to debug + if (stream_analyzer == true && std::time(0)>t) + { + lms_stream_status_t status; + LMS_GetStreamStatus(&streamId[LMS_CH_0], &status); + std::cout << std::endl; + std::cout << "TX rate: " << status.linkRate / 1e6 << " MB/s "; + std::cout << "dropped packets: " << status.droppedPackets << " "; + std::cout << "FIFO: " << 100 * status.fifoFilledCount / status.fifoSize << "% "; + std::cout << "underrun: " << status.underrun << " overrun: " << status.overrun << std::endl; + t = std::time(0); + } + int ret0 = LMS_SendStream(&streamId[LMS_CH_0], input_items[0], noutput_items, - NULL, 0); + NULL, 100); int ret1 = LMS_SendStream(&streamId[LMS_CH_1], input_items[1], noutput_items, - NULL, 0); + NULL, 100); if(ret0 < 0 || ret1 < 0) { - return 0; //call again + return 0; } consume(0,ret0); consume(1,ret1); } + return 0; } // Setup stream - void sink_impl::init_stream(int device_number, int channel) + void sink_impl::init_stream(int device_number, int channel, float samp_rate) { streamId[channel].channel = channel; - streamId[channel].fifoSize = fifosize; + streamId[channel].fifoSize = samp_rate/1e4; streamId[channel].throughputVsLatency = 0.5; streamId[channel].isTx = LMS_CH_TX; streamId[channel].dataFmt = lms_stream_t::LMS_FMT_F32; @@ -298,7 +362,7 @@ namespace gr if (LMS_SetupStream(device_handler::getInstance().get_device(device_number),&streamId[channel])!=LMS_SUCCESS) device_handler::getInstance().error(device_number); - std::cout << "INFO: sink_impl::init_stream(): sink channel " << channel << " (device nr. " << device_number << ") stream setup done." << std::endl; + std::cout << "INFO: sink_impl::init_stream(): sink channel " << channel << " (device nr. " << device_number << ") stream setup done." << std::endl; } // Return io_signature to manage module input count @@ -319,6 +383,76 @@ namespace gr exit(0); } } + + void sink_impl::set_rf_freq(float rf_freq) + { + device_handler::getInstance().set_rf_freq(stored.device_number,stored.device_type,LMS_CH_TX,LMS_CH_0,rf_freq); + } + + void sink_impl::set_pa_path(int pa_path, int channel) + { + if(stored.device_type == 1 && channel == 1) + { + // IGNORE CHANNEL 1 FOR LIMESDR-MINI + std::cout << "sink_impl::set_pa_path(): INFO: Setting bypassed. LimeSDR-Mini does not support channel 1 configuration." << std::endl; + } + else + { + device_handler::getInstance().set_antenna(stored.device_number,channel,LMS_CH_TX,pa_path); + } + } + + void sink_impl::set_nco(float nco_freq, int cmix_mode, int channel) + { + if(stored.device_type == 1 && channel == 1) + { + // IGNORE CHANNEL 1 FOR LIMESDR-MINI + std::cout << "sink_impl::set_nco(): INFO: Setting bypassed. LimeSDR-Mini does not support channel 1 configuration." << std::endl; + } + else + { + device_handler::getInstance().set_nco(stored.device_number,LMS_CH_TX,channel,nco_freq,0,cmix_mode); + } + } + + void sink_impl::set_analog_filter(int analog_filter, float analog_bandw, int channel) + { + if(stored.device_type == 1 && channel == 1) + { + // IGNORE CHANNEL 1 FOR LIMESDR-MINI + std::cout << "sink_impl::set_analog_filter(): INFO: Setting bypassed. LimeSDR-Mini does not support channel 1 configuration." << std::endl; + } + else + { + device_handler::getInstance().set_analog_filter(stored.device_number,LMS_CH_TX,channel,analog_filter,analog_bandw); + } + } + + void sink_impl::set_digital_filter(int digital_filter, float digital_bandw, int channel) + { + if(stored.device_type == 1 && channel == 1) + { + // IGNORE CHANNEL 1 FOR LIMESDR-MINI + std::cout << "sink_impl::set_digital_filter(): INFO: Setting bypassed. LimeSDR-Mini does not support channel 1 configuration." << std::endl; + } + else + { + device_handler::getInstance().set_digital_filter(stored.device_number,LMS_CH_TX,channel,digital_filter,digital_bandw); + } + } + + void sink_impl::set_gain(int gain_dB, int channel) + { + if(stored.device_type == 1 && channel == 1) + { + // IGNORE CHANNEL 1 FOR LIMESDR-MINI + std::cout << "sink_impl::set_gain(): INFO: Setting bypassed. LimeSDR-Mini does not support channel 1 configuration." << std::endl; + } + else + { + device_handler::getInstance().set_gain(stored.device_number,LMS_CH_TX,channel,gain_dB); + } + } } } diff --git a/lib/sink_impl.h b/lib/sink_impl.h index 95a41dd..736d765 100644 --- a/lib/sink_impl.h +++ b/lib/sink_impl.h @@ -21,6 +21,7 @@ #ifndef INCLUDED_LIMESDR_SINK_IMPL_H #define INCLUDED_LIMESDR_SINK_IMPL_H +#include #include #include "common/device_handler.h" @@ -32,22 +33,26 @@ namespace gr { private: lms_stream_t streamId[2]; - uint32_t fifosize = 4096*10; + + long t = std::time(0); + bool stream_analyzer = false; + int LMS_CH_0 = 0; + int LMS_CH_1 = 1; + int sink_block = 2; + struct constant_data { + std::string serial; int device_number; int device_type; int chip_mode; int channel; + float samp_rate; } stored; - - int LMS_CH_0 = 0; - int LMS_CH_1 = 1; - int sink_block = 2; public: - sink_impl(int device_number, + sink_impl(std::string serial, int device_type, int chip_mode, int channel, @@ -72,20 +77,37 @@ namespace gr int digital_filter_ch1, double digital_bandw_ch1, int gain_dB_ch0, - int gain_dB_ch1); + int gain_dB_ch1, + float nco_freq_ch0, + float nco_freq_ch1, + int cmix_mode_ch0, + int cmix_mode_ch1); ~sink_impl(); - int work(int noutput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items); + int general_work(int noutput_items, + gr_vector_int &ninput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items); bool start(void); - bool stop(void); - - void init_stream(int device_number, int channel); + bool stop(void); inline gr::io_signature::sptr args_to_io_signature(int channel_number); + + void init_stream(int device_number, int channel, float samp_rate); + + void set_rf_freq(float rf_freq); + + void set_pa_path(int pa_path, int channel); + + void set_nco(float nco_freq, int cmix_mode, int channel); + + void set_analog_filter(int analog_filter, float analog_bandw, int channel); + + void set_digital_filter(int digital_filter, float digital_bandw, int channel); + + void set_gain(int gain_dB, int channel); }; } } diff --git a/lib/source_impl.cc b/lib/source_impl.cc index 8884e81..f3b6240 100644 --- a/lib/source_impl.cc +++ b/lib/source_impl.cc @@ -30,7 +30,7 @@ namespace gr namespace limesdr { source::sptr - source::make(int device_number, + source::make(std::string serial, int device_type, int chip_mode, int channel, @@ -55,10 +55,14 @@ namespace gr int digital_filter_ch1, double digital_bandw_ch1, int gain_dB_ch0, - int gain_dB_ch1) + int gain_dB_ch1, + float nco_freq_ch0, + float nco_freq_ch1, + int cmix_mode_ch0, + int cmix_mode_ch1) { return gnuradio::get_initial_sptr - (new source_impl(device_number, + (new source_impl(serial, device_type, chip_mode, channel, @@ -83,10 +87,14 @@ namespace gr digital_filter_ch1, digital_bandw_ch1, gain_dB_ch0, - gain_dB_ch1)); + gain_dB_ch1, + nco_freq_ch0, + nco_freq_ch1, + cmix_mode_ch0, + cmix_mode_ch1)); } - source_impl::source_impl(int device_number, + source_impl::source_impl(std::string serial, int device_type, int chip_mode, int channel, @@ -111,8 +119,12 @@ namespace gr int digital_filter_ch1, double digital_bandw_ch1, int gain_dB_ch0, - int gain_dB_ch1) - : gr::sync_block("source", + int gain_dB_ch1, + float nco_freq_ch0, + float nco_freq_ch1, + int cmix_mode_ch0, + int cmix_mode_ch1) + : gr::block("source", gr::io_signature::make(0, 0, 0), // Based on chip_mode SISO/MIMO use appropriate output signature args_to_io_signature(chip_mode)) { @@ -121,10 +133,11 @@ namespace gr std::cout << std::endl; // 1. Store private variables upon implementation to protect from changing them later - stored.device_number = device_number; + stored.serial = serial; stored.device_type = device_type; stored.chip_mode = chip_mode; - + stored.samp_rate = samp_rate; + if(stored.device_type == 1) // LimeSDR-Mini stored.channel = LMS_CH_0; else if(stored.device_type == 2) // LimeSDR-USB @@ -135,18 +148,18 @@ namespace gr stored.channel = LMS_CH_0; } + if(channel != 0 && channel != 1) + { + std::cout << "ERROR: source_impl::source_impl(): CH0 must be either 0 (A) or 1 (B)." << std::endl; + exit(0); + } + // 2. Open device if not opened - device_handler::getInstance().open_device(stored.device_number,stored.device_type); + stored.device_number = device_handler::getInstance().open_device(stored.serial,stored.device_type); // 3. Check where to load settings from (file or block) if(file_switch == 1) { - if(stored.device_type == 1) - { - device_handler::getInstance().mini_switch_workaround(stored.device_number); - device_handler::getInstance().set_lna_path_mini(stored.device_number,lna_path_mini); - } - device_handler::getInstance().settings_from_file(stored.device_number,filename); device_handler::getInstance().check_blocks(stored.device_number,source_block,stored.device_type, stored.chip_mode, 0, 0, file_switch,filename); } @@ -173,139 +186,188 @@ namespace gr device_handler::getInstance().set_digital_filter(stored.device_number,LMS_CH_RX,stored.channel,digital_filter_ch0, digital_bandw_ch0); - // 9. Set LNA path switches and settings + // 9. Set LNA path if(stored.device_type == 1) // LimeSDR-Mini - { - device_handler::getInstance().mini_switch_workaround(stored.device_number); - device_handler::getInstance().set_lna_path_mini(stored.device_number,lna_path_mini); - device_handler::getInstance().set_lna_path(stored.device_number,stored.channel,lna_path_mini); - } + device_handler::getInstance().set_antenna(stored.device_number,stored.channel,LMS_CH_RX,lna_path_mini); else if(stored.device_type == 2) // LimeSDR-USB - device_handler::getInstance().set_lna_path(stored.device_number,stored.channel,lna_path_ch0); - + device_handler::getInstance().set_antenna(stored.device_number,stored.channel,LMS_CH_RX,lna_path_ch0); // 10. Set GAIN device_handler::getInstance().set_gain(stored.device_number,LMS_CH_RX,stored.channel,gain_dB_ch0); - - + // 11. Perform calibration device_handler::getInstance().calibrate(stored.device_number,stored.device_type,calibration_ch0,LMS_CH_RX,stored.channel,calibr_bandw_ch0,rf_freq,lna_path_ch0); - - - // 12. Begin configuring device for channel 1 (if chip_mode is MIMO) + + // 12. Set NCO + device_handler::getInstance().set_nco(stored.device_number,LMS_CH_RX,stored.channel,nco_freq_ch0,0,cmix_mode_ch0); + + // 13. Begin configuring device for channel 1 (if chip_mode is MIMO) if(stored.chip_mode == 2 && stored.device_type == 2) { device_handler::getInstance().set_analog_filter(stored.device_number,LMS_CH_RX,LMS_CH_1,analog_filter_ch1, analog_bandw_ch1); device_handler::getInstance().set_digital_filter(stored.device_number,LMS_CH_RX,LMS_CH_1,digital_filter_ch1, digital_bandw_ch1); - device_handler::getInstance().set_lna_path(stored.device_number,LMS_CH_1,lna_path_ch1); + device_handler::getInstance().set_antenna(stored.device_number,LMS_CH_1,LMS_CH_RX,lna_path_ch1); device_handler::getInstance().set_gain(stored.device_number,LMS_CH_RX,LMS_CH_1,gain_dB_ch1); device_handler::getInstance().calibrate(stored.device_number,stored.device_type,calibration_ch1,LMS_CH_RX,LMS_CH_1,calibr_bandw_ch1,rf_freq,lna_path_ch1); + device_handler::getInstance().set_nco(stored.device_number,LMS_CH_RX,LMS_CH_1,nco_freq_ch1,0,cmix_mode_ch1); } } + // 14. Initialize stream for channel 0 (if chip_mode is SISO) + if(stored.chip_mode == 1) + { + this->init_stream(stored.device_number,stored.channel,stored.samp_rate); + } + + // 15. Initialize both channels streams (if chip_mode is MIMO) + else if(stored.chip_mode == 2 && stored.device_type == 2) + { + this->init_stream(stored.device_number,LMS_CH_0,stored.samp_rate); + this->init_stream(stored.device_number,LMS_CH_1,stored.samp_rate); + } std::cout << "---------------------------------------------------------------" << std::endl; } source_impl::~source_impl() { - device_handler::getInstance().close_device(stored.device_number); + // Stop and destroy stream for channel 0 (if chip_mode is SISO) + if(stored.chip_mode == 1) + { + LMS_StopStream(&streamId[stored.channel]); + LMS_DestroyStream(device_handler::getInstance().get_device(stored.device_number),&streamId[stored.channel]); + } + // Stop and destroy stream for channels 0 & 1 (if chip_mode is MIMO) + else if(stored.chip_mode == 2) + { + LMS_StopStream(&streamId[LMS_CH_0]); + LMS_StopStream(&streamId[LMS_CH_1]); + LMS_DestroyStream(device_handler::getInstance().get_device(stored.device_number),&streamId[LMS_CH_0]); + LMS_DestroyStream(device_handler::getInstance().get_device(stored.device_number),&streamId[LMS_CH_1]); + } + device_handler::getInstance().close_device(stored.device_number,source_block); } - bool source_impl::start(void) - { - // Initialize and start stream for channel 0 (if chip_mode is SISO) - if(stored.chip_mode == 1) // If SISO configure prefered channel - { - this->init_stream(stored.device_number,stored.channel); - if(LMS_StartStream(&streamId[stored.channel]) != LMS_SUCCESS) - device_handler::getInstance().error(stored.device_number); - } + bool source_impl::start(void) + { + std::unique_lock lock(device_handler::getInstance().block_mutex); + // Initialize and start stream for channel 0 (if chip_mode is SISO) + if(stored.chip_mode == 1) // If SISO configure prefered channel + { + if(LMS_StartStream(&streamId[stored.channel]) != LMS_SUCCESS) + device_handler::getInstance().error(stored.device_number); + } - // Initialize and start stream for channels 0 & 1 (if chip_mode is MIMO) - else if(stored.chip_mode == 2 && stored.device_type == 2) - { - this->init_stream(stored.device_number,LMS_CH_0); - this->init_stream(stored.device_number,LMS_CH_1); - if(LMS_StartStream(&streamId[LMS_CH_0]) != LMS_SUCCESS) - device_handler::getInstance().error(stored.device_number); - if(LMS_StartStream(&streamId[LMS_CH_1]) != LMS_SUCCESS) - device_handler::getInstance().error(stored.device_number); - } - return true; - } + // Initialize and start stream for channels 0 & 1 (if chip_mode is MIMO) + else if(stored.chip_mode == 2 && stored.device_type == 2) + { + if(LMS_StartStream(&streamId[LMS_CH_0]) != LMS_SUCCESS) + device_handler::getInstance().error(stored.device_number); + if(LMS_StartStream(&streamId[LMS_CH_1]) != LMS_SUCCESS) + device_handler::getInstance().error(stored.device_number); + } + std::unique_lock unlock(device_handler::getInstance().block_mutex); + return true; + } bool source_impl::stop(void) { - // Stop and destroy stream for channel 0 (if chip_mode is SISO) - if(stored.chip_mode == 1) - { - LMS_StopStream(&streamId[stored.channel]); - LMS_DestroyStream(device_handler::getInstance().get_device(stored.device_number), &streamId[stored.channel]); - } - // Stop and destroy stream for channels 0 & 1 (if chip_mode is MIMO) - else if(stored.chip_mode == 2) - { - LMS_StopStream(&streamId[LMS_CH_0]); - LMS_DestroyStream(device_handler::getInstance().get_device(stored.device_number), &streamId[LMS_CH_0]); - LMS_StopStream(&streamId[LMS_CH_1]); - LMS_DestroyStream(device_handler::getInstance().get_device(stored.device_number), &streamId[LMS_CH_1]); - } - return true; + std::unique_lock lock(device_handler::getInstance().block_mutex); + // Stop stream for channel 0 (if chip_mode is SISO) + if(stored.chip_mode == 1) + { + LMS_StopStream(&streamId[stored.channel]); + } + // Stop streams for channels 0 & 1 (if chip_mode is MIMO) + else if(stored.chip_mode == 2) + { + LMS_StopStream(&streamId[LMS_CH_0]); + LMS_StopStream(&streamId[LMS_CH_1]); + } + std::unique_lock unlock(device_handler::getInstance().block_mutex); + return true; } int - source_impl::work(int noutput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items) + source_impl::general_work(int noutput_items, + gr_vector_int &ninput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items) { // Receive stream for channel 0 (if chip_mode is SISO) if(stored.chip_mode == 1) { - int ret = LMS_RecvStream(&streamId[stored.channel], + //Print stream stats to debug + if (stream_analyzer == true && std::time(0)>t) + { + lms_stream_status_t status; + LMS_GetStreamStatus(&streamId[stored.channel], &status); + std::cout << std::endl; + std::cout << "RX rate: " << status.linkRate / 1e6 << " MB/s "; + std::cout << "dropped packets: " << status.droppedPackets << " "; + std::cout << "FIFO: " << 100 * status.fifoFilledCount / status.fifoSize << "% "; + std::cout << "underrun: " << status.underrun << " overrun: " << status.overrun; + std::cout << " FIFO size: " << status.fifoSize << std::endl; + t = std::time(0); + } + + int ret0 = LMS_RecvStream(&streamId[stored.channel], output_items[0], noutput_items, - NULL, 0); - - if (ret < 0) - return 0; //call again - - produce(0,ret); + NULL, 100); + if(ret0 < 0) + { + return 0; + } + produce(0,ret0); return WORK_CALLED_PRODUCE; - } // Receive stream for channels 0 & 1 (if chip_mode is MIMO) else if(stored.chip_mode == 2) { + //Print stream stats to debug + if (stream_analyzer == true && std::time(0)>t) + { + lms_stream_status_t status; + LMS_GetStreamStatus(&streamId[LMS_CH_0], &status); + std::cout << std::endl; + std::cout << "RX rate: " << status.linkRate / 1e6 << " MB/s "; + std::cout << "dropped packets: " << status.droppedPackets << " "; + std::cout << "FIFO: " << 100 * status.fifoFilledCount / status.fifoSize << "% "; + std::cout << "underrun: " << status.underrun << " overrun: " << status.overrun << std::endl; + t = std::time(0); + } + int ret0 = LMS_RecvStream(&streamId[LMS_CH_0], output_items[0], noutput_items, - NULL, 0); + NULL, 100); int ret1 = LMS_RecvStream(&streamId[LMS_CH_1], output_items[1], noutput_items, - NULL, 0); - - if(ret0 < 0 || ret1 < 0) - return 0; //call again - - produce(0,ret0); - produce(1,ret1); + NULL, 100); + if(ret0 <= 0 || ret1 <= 0) + { + return 0; + } + this->produce(0,ret0); + this->produce(1,ret1); return WORK_CALLED_PRODUCE; } + return 0; } // Setup stream - void source_impl::init_stream(int device_number, int channel) + void source_impl::init_stream(int device_number, int channel, float samp_rate) { - this->streamId[channel].channel = channel; - this->streamId[channel].fifoSize = fifosize; - this->streamId[channel].throughputVsLatency = 0.5; - this->streamId[channel].isTx = LMS_CH_RX; - this->streamId[channel].dataFmt = lms_stream_t::LMS_FMT_F32; + streamId[channel].channel = channel; + streamId[channel].fifoSize = samp_rate/1e4; + streamId[channel].throughputVsLatency = 0.5; + streamId[channel].isTx = LMS_CH_RX; + streamId[channel].dataFmt = lms_stream_t::LMS_FMT_F32; if (LMS_SetupStream(device_handler::getInstance().get_device(stored.device_number),&streamId[channel])!=LMS_SUCCESS) device_handler::getInstance().error(stored.device_number); - std::cout << "INFO: source_impl::init_stream(): source channel " << channel << " (device nr. " << device_number << ") stream setup done." << std::endl; + std::cout << "INFO: source_impl::init_stream(): source channel " << channel << " (device nr. " << device_number << ") stream setup done." << std::endl; } // Return io_signature to manage module output count @@ -326,6 +388,75 @@ namespace gr exit(0); } } + void source_impl::set_rf_freq(float rf_freq) + { + device_handler::getInstance().set_rf_freq(stored.device_number,stored.device_type,LMS_CH_RX,LMS_CH_0,rf_freq); + } + + void source_impl::set_nco(float nco_freq, int cmix_mode, int channel) + { + if(stored.device_type == 1 && channel == 1) + { + // IGNORE CHANNEL 1 FOR LIMESDR-MINI + std::cout << "source_impl::set_nco(): INFO: Setting bypassed. LimeSDR-Mini does not support channel 1 configuration." << std::endl; + } + else + { + device_handler::getInstance().set_nco(stored.device_number,LMS_CH_RX,channel,nco_freq,0,cmix_mode); + } + } + + void source_impl::set_lna_path(int lna_path, int channel) + { + if(stored.device_type == 1 && channel == 1) + { + // IGNORE CHANNEL 1 FOR LIMESDR-MINI + std::cout << "source_impl::set_lna_path(): INFO: Setting bypassed. LimeSDR-Mini does not support channel 1 configuration." << std::endl; + } + else + { + device_handler::getInstance().set_antenna(stored.device_number,channel,LMS_CH_RX,lna_path); + } + } + + void source_impl::set_analog_filter(int analog_filter, float analog_bandw, int channel) + { + if(stored.device_type == 1 && channel == 1) + { + // IGNORE CHANNEL 1 FOR LIMESDR-MINI + std::cout << "source_impl::set_analog_filter(): INFO: Setting bypassed. LimeSDR-Mini does not support channel 1 configuration." << std::endl; + } + else + { + device_handler::getInstance().set_analog_filter(stored.device_number,LMS_CH_RX,channel,analog_filter,analog_bandw); + } + } + + void source_impl::set_digital_filter(int digital_filter, float digital_bandw, int channel) + { + if(stored.device_type == 1 && channel == 1) + { + // IGNORE CHANNEL 1 FOR LIMESDR-MINI + std::cout << "source_impl::set_digital_filter(): INFO: Setting bypassed. LimeSDR-Mini does not support channel 1 configuration." << std::endl; + } + else + { + device_handler::getInstance().set_digital_filter(stored.device_number,LMS_CH_RX,channel,digital_filter,digital_bandw); + } + } + + void source_impl::set_gain(int gain_dB, int channel) + { + if(stored.device_type == 1 && channel == 1) + { + // IGNORE CHANNEL 1 FOR LIMESDR-MINI + std::cout << "source_impl::set_gain(): INFO: Setting bypassed. LimeSDR-Mini does not support channel 1 configuration." << std::endl; + } + else + { + device_handler::getInstance().set_gain(stored.device_number,LMS_CH_RX,channel,gain_dB); + } + } } } diff --git a/lib/source_impl.h b/lib/source_impl.h index 280a297..0bdf6be 100644 --- a/lib/source_impl.h +++ b/lib/source_impl.h @@ -21,6 +21,7 @@ #ifndef INCLUDED_LIMESDR_SOURCE_IMPL_H #define INCLUDED_LIMESDR_SOURCE_IMPL_H +#include #include #include "common/device_handler.h" @@ -32,24 +33,26 @@ namespace gr { private: lms_stream_t streamId[2]; - uint32_t fifosize = 4096*10; - - - + + long t = std::time(0); + bool stream_analyzer = false; + int LMS_CH_0 = 0; int LMS_CH_1 = 1; int source_block = 1; struct constant_data { + std::string serial; int device_number; int device_type; int chip_mode; int channel; + float samp_rate; } stored; public: - source_impl(int device_number, + source_impl(std::string serial, int device_type, int chip_mode, int channel, @@ -74,20 +77,37 @@ namespace gr int digital_filter_ch1, double digital_bandw_ch1, int gain_dB_ch0, - int gain_dB_ch1); + int gain_dB_ch1, + float nco_freq_ch0, + float nco_freq_ch1, + int cmix_mode_ch0, + int cmix_mode_ch1); ~source_impl(); - int work(int noutput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items); + int general_work(int noutput_items, + gr_vector_int &ninput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items); bool start(void); - - bool stop(void); - void init_stream(int device_number, int channel); + bool stop(void); inline gr::io_signature::sptr args_to_io_signature(int channel_number); + + void init_stream(int device_number, int channel, float samp_rate); + + void set_rf_freq(float rf_freq); + + void set_lna_path(int lna_path, int channel); + + void set_nco(float nco_freq, int cmix_mode, int channel); + + void set_analog_filter(int analog_filter, float analog_bandw, int channel); + + void set_digital_filter(int digital_filter, float digital_bandw, int channel); + + void set_gain(int gain_dB, int channel); }; } } diff --git a/windows/GNU_Radio/bin/LimeSuite.dll b/windows/GNU_Radio/bin/LimeSuite.dll new file mode 100644 index 0000000..233ce41 Binary files /dev/null and b/windows/GNU_Radio/bin/LimeSuite.dll differ diff --git a/windows/GNU_Radio/bin/gnuradio-limesdr.dll b/windows/GNU_Radio/bin/gnuradio-limesdr.dll new file mode 100644 index 0000000..b50bf2a Binary files /dev/null and b/windows/GNU_Radio/bin/gnuradio-limesdr.dll differ diff --git a/windows/GNU_Radio/lib/site-packages/limesdr/__init__.pyc b/windows/GNU_Radio/lib/site-packages/limesdr/__init__.pyc new file mode 100644 index 0000000..3c8a71d Binary files /dev/null and b/windows/GNU_Radio/lib/site-packages/limesdr/__init__.pyc differ diff --git a/windows/GNU_Radio/lib/site-packages/limesdr/__init__.pyo b/windows/GNU_Radio/lib/site-packages/limesdr/__init__.pyo new file mode 100644 index 0000000..3c8a71d Binary files /dev/null and b/windows/GNU_Radio/lib/site-packages/limesdr/__init__.pyo differ diff --git a/windows/GNU_Radio/lib/site-packages/limesdr/_limesdr_swig.pyd b/windows/GNU_Radio/lib/site-packages/limesdr/_limesdr_swig.pyd new file mode 100644 index 0000000..6934dad Binary files /dev/null and b/windows/GNU_Radio/lib/site-packages/limesdr/_limesdr_swig.pyd differ diff --git a/windows/GNU_Radio/lib/site-packages/limesdr/limesdr_swig.py b/windows/GNU_Radio/lib/site-packages/limesdr/limesdr_swig.py new file mode 100644 index 0000000..1268fb6 --- /dev/null +++ b/windows/GNU_Radio/lib/site-packages/limesdr/limesdr_swig.py @@ -0,0 +1,956 @@ +# This file was automatically generated by SWIG (http://www.swig.org). +# Version 3.0.12 +# +# Do not make changes to this file unless you know what you are doing--modify +# the SWIG interface file instead. + +from sys import version_info as _swig_python_version_info +if _swig_python_version_info >= (2, 7, 0): + def swig_import_helper(): + import importlib + pkg = __name__.rpartition('.')[0] + mname = '.'.join((pkg, '_limesdr_swig')).lstrip('.') + try: + return importlib.import_module(mname) + except ImportError: + return importlib.import_module('_limesdr_swig') + _limesdr_swig = swig_import_helper() + del swig_import_helper +elif _swig_python_version_info >= (2, 6, 0): + def swig_import_helper(): + from os.path import dirname + import imp + fp = None + try: + fp, pathname, description = imp.find_module('_limesdr_swig', [dirname(__file__)]) + except ImportError: + import _limesdr_swig + return _limesdr_swig + try: + _mod = imp.load_module('_limesdr_swig', fp, pathname, description) + finally: + if fp is not None: + fp.close() + return _mod + _limesdr_swig = swig_import_helper() + del swig_import_helper +else: + import _limesdr_swig +del _swig_python_version_info + +try: + _swig_property = property +except NameError: + pass # Python < 2.2 doesn't have 'property'. + +try: + import builtins as __builtin__ +except ImportError: + import __builtin__ + +def _swig_setattr_nondynamic(self, class_type, name, value, static=1): + if (name == "thisown"): + return self.this.own(value) + if (name == "this"): + if type(value).__name__ == 'SwigPyObject': + self.__dict__[name] = value + return + method = class_type.__swig_setmethods__.get(name, None) + if method: + return method(self, value) + if (not static): + object.__setattr__(self, name, value) + else: + raise AttributeError("You cannot add attributes to %s" % self) + + +def _swig_setattr(self, class_type, name, value): + return _swig_setattr_nondynamic(self, class_type, name, value, 0) + + +def _swig_getattr(self, class_type, name): + if (name == "thisown"): + return self.this.own() + method = class_type.__swig_getmethods__.get(name, None) + if method: + return method(self) + raise AttributeError("'%s' object has no attribute '%s'" % (class_type.__name__, name)) + + +def _swig_repr(self): + try: + strthis = "proxy of " + self.this.__repr__() + except __builtin__.Exception: + strthis = "" + return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,) + + +def _swig_setattr_nondynamic_method(set): + def set_attr(self, name, value): + if (name == "thisown"): + return self.this.own(value) + if hasattr(self, name) or (name == "this"): + set(self, name, value) + else: + raise AttributeError("You cannot add attributes to %s" % self) + return set_attr + + + +def high_res_timer_now(): + """high_res_timer_now() -> gr::high_res_timer_type""" + return _limesdr_swig.high_res_timer_now() + +def high_res_timer_now_perfmon(): + """high_res_timer_now_perfmon() -> gr::high_res_timer_type""" + return _limesdr_swig.high_res_timer_now_perfmon() + +def high_res_timer_tps(): + """high_res_timer_tps() -> gr::high_res_timer_type""" + return _limesdr_swig.high_res_timer_tps() + +def high_res_timer_epoch(): + """high_res_timer_epoch() -> gr::high_res_timer_type""" + return _limesdr_swig.high_res_timer_epoch() +class source(object): + """Proxy of C++ gr::limesdr::source class.""" + + thisown = _swig_property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc='The membership flag') + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + def make(serial, device_type, chip_mode, channel, file_switch, filename, rf_freq, samp_rate, oversample, calibration_ch0, calibr_bandw_ch0, calibration_ch1, calibr_bandw_ch1, lna_path_mini, lna_path_ch0, lna_path_ch1, analog_filter_ch0, analog_bandw_ch0, analog_filter_ch1, analog_bandw_ch1, digital_filter_ch0, digital_bandw_ch0, digital_filter_ch1, digital_bandw_ch1, gain_dB_ch0, gain_dB_ch1, nco_freq_ch0, nco_freq_ch1, cmix_mode_ch0, cmix_mode_ch1): + """make(std::string serial, int device_type, int chip_mode, int channel, int file_switch, char const * filename, double rf_freq, double samp_rate, size_t oversample, int calibration_ch0, double calibr_bandw_ch0, int calibration_ch1, double calibr_bandw_ch1, int lna_path_mini, int lna_path_ch0, int lna_path_ch1, int analog_filter_ch0, double analog_bandw_ch0, int analog_filter_ch1, double analog_bandw_ch1, int digital_filter_ch0, double digital_bandw_ch0, int digital_filter_ch1, double digital_bandw_ch1, int gain_dB_ch0, int gain_dB_ch1, float nco_freq_ch0, float nco_freq_ch1, int cmix_mode_ch0, int cmix_mode_ch1) -> source_sptr""" + return _limesdr_swig.source_make(serial, device_type, chip_mode, channel, file_switch, filename, rf_freq, samp_rate, oversample, calibration_ch0, calibr_bandw_ch0, calibration_ch1, calibr_bandw_ch1, lna_path_mini, lna_path_ch0, lna_path_ch1, analog_filter_ch0, analog_bandw_ch0, analog_filter_ch1, analog_bandw_ch1, digital_filter_ch0, digital_bandw_ch0, digital_filter_ch1, digital_bandw_ch1, gain_dB_ch0, gain_dB_ch1, nco_freq_ch0, nco_freq_ch1, cmix_mode_ch0, cmix_mode_ch1) + + make = staticmethod(make) + + def set_rf_freq(self, rf_freq): + """set_rf_freq(source self, float rf_freq)""" + return _limesdr_swig.source_set_rf_freq(self, rf_freq) + + + def set_lna_path(self, lna_path, channel): + """set_lna_path(source self, int lna_path, int channel)""" + return _limesdr_swig.source_set_lna_path(self, lna_path, channel) + + + def set_nco(self, nco_freq, cmix_mode, channel): + """set_nco(source self, float nco_freq, int cmix_mode, int channel)""" + return _limesdr_swig.source_set_nco(self, nco_freq, cmix_mode, channel) + + + def set_analog_filter(self, analog_filter, analog_bandw, channel): + """set_analog_filter(source self, int analog_filter, float analog_bandw, int channel)""" + return _limesdr_swig.source_set_analog_filter(self, analog_filter, analog_bandw, channel) + + + def set_digital_filter(self, digital_filter, digital_bandw, channel): + """set_digital_filter(source self, int digital_filter, float digital_bandw, int channel)""" + return _limesdr_swig.source_set_digital_filter(self, digital_filter, digital_bandw, channel) + + + def set_gain(self, gain_dB, channel): + """set_gain(source self, int gain_dB, int channel)""" + return _limesdr_swig.source_set_gain(self, gain_dB, channel) + + __swig_destroy__ = _limesdr_swig.delete_source + __del__ = lambda self: None +source_swigregister = _limesdr_swig.source_swigregister +source_swigregister(source) + +def source_make(serial, device_type, chip_mode, channel, file_switch, filename, rf_freq, samp_rate, oversample, calibration_ch0, calibr_bandw_ch0, calibration_ch1, calibr_bandw_ch1, lna_path_mini, lna_path_ch0, lna_path_ch1, analog_filter_ch0, analog_bandw_ch0, analog_filter_ch1, analog_bandw_ch1, digital_filter_ch0, digital_bandw_ch0, digital_filter_ch1, digital_bandw_ch1, gain_dB_ch0, gain_dB_ch1, nco_freq_ch0, nco_freq_ch1, cmix_mode_ch0, cmix_mode_ch1): + """source_make(std::string serial, int device_type, int chip_mode, int channel, int file_switch, char const * filename, double rf_freq, double samp_rate, size_t oversample, int calibration_ch0, double calibr_bandw_ch0, int calibration_ch1, double calibr_bandw_ch1, int lna_path_mini, int lna_path_ch0, int lna_path_ch1, int analog_filter_ch0, double analog_bandw_ch0, int analog_filter_ch1, double analog_bandw_ch1, int digital_filter_ch0, double digital_bandw_ch0, int digital_filter_ch1, double digital_bandw_ch1, int gain_dB_ch0, int gain_dB_ch1, float nco_freq_ch0, float nco_freq_ch1, int cmix_mode_ch0, int cmix_mode_ch1) -> source_sptr""" + return _limesdr_swig.source_make(serial, device_type, chip_mode, channel, file_switch, filename, rf_freq, samp_rate, oversample, calibration_ch0, calibr_bandw_ch0, calibration_ch1, calibr_bandw_ch1, lna_path_mini, lna_path_ch0, lna_path_ch1, analog_filter_ch0, analog_bandw_ch0, analog_filter_ch1, analog_bandw_ch1, digital_filter_ch0, digital_bandw_ch0, digital_filter_ch1, digital_bandw_ch1, gain_dB_ch0, gain_dB_ch1, nco_freq_ch0, nco_freq_ch1, cmix_mode_ch0, cmix_mode_ch1) + +class source_sptr(object): + """Proxy of C++ boost::shared_ptr<(gr::limesdr::source)> class.""" + + thisown = _swig_property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc='The membership flag') + __repr__ = _swig_repr + + def __init__(self, *args): + """ + __init__(boost::shared_ptr<(gr::limesdr::source)> self) -> source_sptr + __init__(boost::shared_ptr<(gr::limesdr::source)> self, source p) -> source_sptr + """ + this = _limesdr_swig.new_source_sptr(*args) + try: + self.this.append(this) + except __builtin__.Exception: + self.this = this + + def __deref__(self): + """__deref__(source_sptr self) -> source""" + return _limesdr_swig.source_sptr___deref__(self) + + __swig_destroy__ = _limesdr_swig.delete_source_sptr + __del__ = lambda self: None + + def make(self, serial, device_type, chip_mode, channel, file_switch, filename, rf_freq, samp_rate, oversample, calibration_ch0, calibr_bandw_ch0, calibration_ch1, calibr_bandw_ch1, lna_path_mini, lna_path_ch0, lna_path_ch1, analog_filter_ch0, analog_bandw_ch0, analog_filter_ch1, analog_bandw_ch1, digital_filter_ch0, digital_bandw_ch0, digital_filter_ch1, digital_bandw_ch1, gain_dB_ch0, gain_dB_ch1, nco_freq_ch0, nco_freq_ch1, cmix_mode_ch0, cmix_mode_ch1): + """make(source_sptr self, std::string serial, int device_type, int chip_mode, int channel, int file_switch, char const * filename, double rf_freq, double samp_rate, size_t oversample, int calibration_ch0, double calibr_bandw_ch0, int calibration_ch1, double calibr_bandw_ch1, int lna_path_mini, int lna_path_ch0, int lna_path_ch1, int analog_filter_ch0, double analog_bandw_ch0, int analog_filter_ch1, double analog_bandw_ch1, int digital_filter_ch0, double digital_bandw_ch0, int digital_filter_ch1, double digital_bandw_ch1, int gain_dB_ch0, int gain_dB_ch1, float nco_freq_ch0, float nco_freq_ch1, int cmix_mode_ch0, int cmix_mode_ch1) -> source_sptr""" + return _limesdr_swig.source_sptr_make(self, serial, device_type, chip_mode, channel, file_switch, filename, rf_freq, samp_rate, oversample, calibration_ch0, calibr_bandw_ch0, calibration_ch1, calibr_bandw_ch1, lna_path_mini, lna_path_ch0, lna_path_ch1, analog_filter_ch0, analog_bandw_ch0, analog_filter_ch1, analog_bandw_ch1, digital_filter_ch0, digital_bandw_ch0, digital_filter_ch1, digital_bandw_ch1, gain_dB_ch0, gain_dB_ch1, nco_freq_ch0, nco_freq_ch1, cmix_mode_ch0, cmix_mode_ch1) + + + def set_rf_freq(self, rf_freq): + """set_rf_freq(source_sptr self, float rf_freq)""" + return _limesdr_swig.source_sptr_set_rf_freq(self, rf_freq) + + + def set_lna_path(self, lna_path, channel): + """set_lna_path(source_sptr self, int lna_path, int channel)""" + return _limesdr_swig.source_sptr_set_lna_path(self, lna_path, channel) + + + def set_nco(self, nco_freq, cmix_mode, channel): + """set_nco(source_sptr self, float nco_freq, int cmix_mode, int channel)""" + return _limesdr_swig.source_sptr_set_nco(self, nco_freq, cmix_mode, channel) + + + def set_analog_filter(self, analog_filter, analog_bandw, channel): + """set_analog_filter(source_sptr self, int analog_filter, float analog_bandw, int channel)""" + return _limesdr_swig.source_sptr_set_analog_filter(self, analog_filter, analog_bandw, channel) + + + def set_digital_filter(self, digital_filter, digital_bandw, channel): + """set_digital_filter(source_sptr self, int digital_filter, float digital_bandw, int channel)""" + return _limesdr_swig.source_sptr_set_digital_filter(self, digital_filter, digital_bandw, channel) + + + def set_gain(self, gain_dB, channel): + """set_gain(source_sptr self, int gain_dB, int channel)""" + return _limesdr_swig.source_sptr_set_gain(self, gain_dB, channel) + + + def history(self): + """history(source_sptr self) -> unsigned int""" + return _limesdr_swig.source_sptr_history(self) + + + def declare_sample_delay(self, *args): + """ + declare_sample_delay(source_sptr self, int which, int delay) + declare_sample_delay(source_sptr self, unsigned int delay) + """ + return _limesdr_swig.source_sptr_declare_sample_delay(self, *args) + + + def sample_delay(self, which): + """sample_delay(source_sptr self, int which) -> unsigned int""" + return _limesdr_swig.source_sptr_sample_delay(self, which) + + + def output_multiple(self): + """output_multiple(source_sptr self) -> int""" + return _limesdr_swig.source_sptr_output_multiple(self) + + + def relative_rate(self): + """relative_rate(source_sptr self) -> double""" + return _limesdr_swig.source_sptr_relative_rate(self) + + + def start(self): + """start(source_sptr self) -> bool""" + return _limesdr_swig.source_sptr_start(self) + + + def stop(self): + """stop(source_sptr self) -> bool""" + return _limesdr_swig.source_sptr_stop(self) + + + def nitems_read(self, which_input): + """nitems_read(source_sptr self, unsigned int which_input) -> uint64_t""" + return _limesdr_swig.source_sptr_nitems_read(self, which_input) + + + def nitems_written(self, which_output): + """nitems_written(source_sptr self, unsigned int which_output) -> uint64_t""" + return _limesdr_swig.source_sptr_nitems_written(self, which_output) + + + def max_noutput_items(self): + """max_noutput_items(source_sptr self) -> int""" + return _limesdr_swig.source_sptr_max_noutput_items(self) + + + def set_max_noutput_items(self, m): + """set_max_noutput_items(source_sptr self, int m)""" + return _limesdr_swig.source_sptr_set_max_noutput_items(self, m) + + + def unset_max_noutput_items(self): + """unset_max_noutput_items(source_sptr self)""" + return _limesdr_swig.source_sptr_unset_max_noutput_items(self) + + + def is_set_max_noutput_items(self): + """is_set_max_noutput_items(source_sptr self) -> bool""" + return _limesdr_swig.source_sptr_is_set_max_noutput_items(self) + + + def set_min_noutput_items(self, m): + """set_min_noutput_items(source_sptr self, int m)""" + return _limesdr_swig.source_sptr_set_min_noutput_items(self, m) + + + def min_noutput_items(self): + """min_noutput_items(source_sptr self) -> int""" + return _limesdr_swig.source_sptr_min_noutput_items(self) + + + def max_output_buffer(self, i): + """max_output_buffer(source_sptr self, int i) -> long""" + return _limesdr_swig.source_sptr_max_output_buffer(self, i) + + + def set_max_output_buffer(self, *args): + """ + set_max_output_buffer(source_sptr self, long max_output_buffer) + set_max_output_buffer(source_sptr self, int port, long max_output_buffer) + """ + return _limesdr_swig.source_sptr_set_max_output_buffer(self, *args) + + + def min_output_buffer(self, i): + """min_output_buffer(source_sptr self, int i) -> long""" + return _limesdr_swig.source_sptr_min_output_buffer(self, i) + + + def set_min_output_buffer(self, *args): + """ + set_min_output_buffer(source_sptr self, long min_output_buffer) + set_min_output_buffer(source_sptr self, int port, long min_output_buffer) + """ + return _limesdr_swig.source_sptr_set_min_output_buffer(self, *args) + + + def pc_noutput_items(self): + """pc_noutput_items(source_sptr self) -> float""" + return _limesdr_swig.source_sptr_pc_noutput_items(self) + + + def pc_noutput_items_avg(self): + """pc_noutput_items_avg(source_sptr self) -> float""" + return _limesdr_swig.source_sptr_pc_noutput_items_avg(self) + + + def pc_noutput_items_var(self): + """pc_noutput_items_var(source_sptr self) -> float""" + return _limesdr_swig.source_sptr_pc_noutput_items_var(self) + + + def pc_nproduced(self): + """pc_nproduced(source_sptr self) -> float""" + return _limesdr_swig.source_sptr_pc_nproduced(self) + + + def pc_nproduced_avg(self): + """pc_nproduced_avg(source_sptr self) -> float""" + return _limesdr_swig.source_sptr_pc_nproduced_avg(self) + + + def pc_nproduced_var(self): + """pc_nproduced_var(source_sptr self) -> float""" + return _limesdr_swig.source_sptr_pc_nproduced_var(self) + + + def pc_input_buffers_full(self, *args): + """ + pc_input_buffers_full(source_sptr self, int which) -> float + pc_input_buffers_full(source_sptr self) -> pmt_vector_float + """ + return _limesdr_swig.source_sptr_pc_input_buffers_full(self, *args) + + + def pc_input_buffers_full_avg(self, *args): + """ + pc_input_buffers_full_avg(source_sptr self, int which) -> float + pc_input_buffers_full_avg(source_sptr self) -> pmt_vector_float + """ + return _limesdr_swig.source_sptr_pc_input_buffers_full_avg(self, *args) + + + def pc_input_buffers_full_var(self, *args): + """ + pc_input_buffers_full_var(source_sptr self, int which) -> float + pc_input_buffers_full_var(source_sptr self) -> pmt_vector_float + """ + return _limesdr_swig.source_sptr_pc_input_buffers_full_var(self, *args) + + + def pc_output_buffers_full(self, *args): + """ + pc_output_buffers_full(source_sptr self, int which) -> float + pc_output_buffers_full(source_sptr self) -> pmt_vector_float + """ + return _limesdr_swig.source_sptr_pc_output_buffers_full(self, *args) + + + def pc_output_buffers_full_avg(self, *args): + """ + pc_output_buffers_full_avg(source_sptr self, int which) -> float + pc_output_buffers_full_avg(source_sptr self) -> pmt_vector_float + """ + return _limesdr_swig.source_sptr_pc_output_buffers_full_avg(self, *args) + + + def pc_output_buffers_full_var(self, *args): + """ + pc_output_buffers_full_var(source_sptr self, int which) -> float + pc_output_buffers_full_var(source_sptr self) -> pmt_vector_float + """ + return _limesdr_swig.source_sptr_pc_output_buffers_full_var(self, *args) + + + def pc_work_time(self): + """pc_work_time(source_sptr self) -> float""" + return _limesdr_swig.source_sptr_pc_work_time(self) + + + def pc_work_time_avg(self): + """pc_work_time_avg(source_sptr self) -> float""" + return _limesdr_swig.source_sptr_pc_work_time_avg(self) + + + def pc_work_time_var(self): + """pc_work_time_var(source_sptr self) -> float""" + return _limesdr_swig.source_sptr_pc_work_time_var(self) + + + def pc_work_time_total(self): + """pc_work_time_total(source_sptr self) -> float""" + return _limesdr_swig.source_sptr_pc_work_time_total(self) + + + def pc_throughput_avg(self): + """pc_throughput_avg(source_sptr self) -> float""" + return _limesdr_swig.source_sptr_pc_throughput_avg(self) + + + def set_processor_affinity(self, mask): + """set_processor_affinity(source_sptr self, std::vector< int,std::allocator< int > > const & mask)""" + return _limesdr_swig.source_sptr_set_processor_affinity(self, mask) + + + def unset_processor_affinity(self): + """unset_processor_affinity(source_sptr self)""" + return _limesdr_swig.source_sptr_unset_processor_affinity(self) + + + def processor_affinity(self): + """processor_affinity(source_sptr self) -> std::vector< int,std::allocator< int > >""" + return _limesdr_swig.source_sptr_processor_affinity(self) + + + def active_thread_priority(self): + """active_thread_priority(source_sptr self) -> int""" + return _limesdr_swig.source_sptr_active_thread_priority(self) + + + def thread_priority(self): + """thread_priority(source_sptr self) -> int""" + return _limesdr_swig.source_sptr_thread_priority(self) + + + def set_thread_priority(self, priority): + """set_thread_priority(source_sptr self, int priority) -> int""" + return _limesdr_swig.source_sptr_set_thread_priority(self, priority) + + + def name(self): + """name(source_sptr self) -> std::string""" + return _limesdr_swig.source_sptr_name(self) + + + def symbol_name(self): + """symbol_name(source_sptr self) -> std::string""" + return _limesdr_swig.source_sptr_symbol_name(self) + + + def input_signature(self): + """input_signature(source_sptr self) -> io_signature_sptr""" + return _limesdr_swig.source_sptr_input_signature(self) + + + def output_signature(self): + """output_signature(source_sptr self) -> io_signature_sptr""" + return _limesdr_swig.source_sptr_output_signature(self) + + + def unique_id(self): + """unique_id(source_sptr self) -> long""" + return _limesdr_swig.source_sptr_unique_id(self) + + + def to_basic_block(self): + """to_basic_block(source_sptr self) -> basic_block_sptr""" + return _limesdr_swig.source_sptr_to_basic_block(self) + + + def check_topology(self, ninputs, noutputs): + """check_topology(source_sptr self, int ninputs, int noutputs) -> bool""" + return _limesdr_swig.source_sptr_check_topology(self, ninputs, noutputs) + + + def alias(self): + """alias(source_sptr self) -> std::string""" + return _limesdr_swig.source_sptr_alias(self) + + + def set_block_alias(self, name): + """set_block_alias(source_sptr self, std::string name)""" + return _limesdr_swig.source_sptr_set_block_alias(self, name) + + + def _post(self, which_port, msg): + """_post(source_sptr self, swig_int_ptr which_port, swig_int_ptr msg)""" + return _limesdr_swig.source_sptr__post(self, which_port, msg) + + + def message_ports_in(self): + """message_ports_in(source_sptr self) -> swig_int_ptr""" + return _limesdr_swig.source_sptr_message_ports_in(self) + + + def message_ports_out(self): + """message_ports_out(source_sptr self) -> swig_int_ptr""" + return _limesdr_swig.source_sptr_message_ports_out(self) + + + def message_subscribers(self, which_port): + """message_subscribers(source_sptr self, swig_int_ptr which_port) -> swig_int_ptr""" + return _limesdr_swig.source_sptr_message_subscribers(self, which_port) + +source_sptr_swigregister = _limesdr_swig.source_sptr_swigregister +source_sptr_swigregister(source_sptr) + + +source_sptr.__repr__ = lambda self: "" % (self.name(), self.unique_id()) +source = source.make; + +class sink(object): + """Proxy of C++ gr::limesdr::sink class.""" + + thisown = _swig_property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc='The membership flag') + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + def make(serial, device_type, chip_mode, channel, file_switch, filename, rf_freq, samp_rate, oversample, calibration_ch0, calibr_bandw_ch0, calibration_ch1, calibr_bandw_ch1, pa_path_mini, pa_path_ch0, pa_path_ch1, analog_filter_ch0, analog_bandw_ch0, analog_filter_ch1, analog_bandw_ch1, digital_filter_ch0, digital_bandw_ch0, digital_filter_ch1, digital_bandw_ch1, gain_dB_ch0, gain_dB_ch1, nco_freq_ch0, nco_freq_ch1, cmix_mode_ch0, cmix_mode_ch1): + """make(std::string serial, int device_type, int chip_mode, int channel, int file_switch, char const * filename, double rf_freq, double samp_rate, size_t oversample, int calibration_ch0, double calibr_bandw_ch0, int calibration_ch1, double calibr_bandw_ch1, int pa_path_mini, int pa_path_ch0, int pa_path_ch1, int analog_filter_ch0, double analog_bandw_ch0, int analog_filter_ch1, double analog_bandw_ch1, int digital_filter_ch0, double digital_bandw_ch0, int digital_filter_ch1, double digital_bandw_ch1, int gain_dB_ch0, int gain_dB_ch1, float nco_freq_ch0, float nco_freq_ch1, int cmix_mode_ch0, int cmix_mode_ch1) -> sink_sptr""" + return _limesdr_swig.sink_make(serial, device_type, chip_mode, channel, file_switch, filename, rf_freq, samp_rate, oversample, calibration_ch0, calibr_bandw_ch0, calibration_ch1, calibr_bandw_ch1, pa_path_mini, pa_path_ch0, pa_path_ch1, analog_filter_ch0, analog_bandw_ch0, analog_filter_ch1, analog_bandw_ch1, digital_filter_ch0, digital_bandw_ch0, digital_filter_ch1, digital_bandw_ch1, gain_dB_ch0, gain_dB_ch1, nco_freq_ch0, nco_freq_ch1, cmix_mode_ch0, cmix_mode_ch1) + + make = staticmethod(make) + + def set_rf_freq(self, rf_freq): + """set_rf_freq(sink self, float rf_freq)""" + return _limesdr_swig.sink_set_rf_freq(self, rf_freq) + + + def set_pa_path(self, pa_path, channel): + """set_pa_path(sink self, int pa_path, int channel)""" + return _limesdr_swig.sink_set_pa_path(self, pa_path, channel) + + + def set_nco(self, nco_freq, cmix_mode, channel): + """set_nco(sink self, float nco_freq, int cmix_mode, int channel)""" + return _limesdr_swig.sink_set_nco(self, nco_freq, cmix_mode, channel) + + + def set_analog_filter(self, analog_filter, analog_bandw, channel): + """set_analog_filter(sink self, int analog_filter, float analog_bandw, int channel)""" + return _limesdr_swig.sink_set_analog_filter(self, analog_filter, analog_bandw, channel) + + + def set_digital_filter(self, digital_filter, digital_bandw, channel): + """set_digital_filter(sink self, int digital_filter, float digital_bandw, int channel)""" + return _limesdr_swig.sink_set_digital_filter(self, digital_filter, digital_bandw, channel) + + + def set_gain(self, gain_dB, channel): + """set_gain(sink self, int gain_dB, int channel)""" + return _limesdr_swig.sink_set_gain(self, gain_dB, channel) + + __swig_destroy__ = _limesdr_swig.delete_sink + __del__ = lambda self: None +sink_swigregister = _limesdr_swig.sink_swigregister +sink_swigregister(sink) + +def sink_make(serial, device_type, chip_mode, channel, file_switch, filename, rf_freq, samp_rate, oversample, calibration_ch0, calibr_bandw_ch0, calibration_ch1, calibr_bandw_ch1, pa_path_mini, pa_path_ch0, pa_path_ch1, analog_filter_ch0, analog_bandw_ch0, analog_filter_ch1, analog_bandw_ch1, digital_filter_ch0, digital_bandw_ch0, digital_filter_ch1, digital_bandw_ch1, gain_dB_ch0, gain_dB_ch1, nco_freq_ch0, nco_freq_ch1, cmix_mode_ch0, cmix_mode_ch1): + """sink_make(std::string serial, int device_type, int chip_mode, int channel, int file_switch, char const * filename, double rf_freq, double samp_rate, size_t oversample, int calibration_ch0, double calibr_bandw_ch0, int calibration_ch1, double calibr_bandw_ch1, int pa_path_mini, int pa_path_ch0, int pa_path_ch1, int analog_filter_ch0, double analog_bandw_ch0, int analog_filter_ch1, double analog_bandw_ch1, int digital_filter_ch0, double digital_bandw_ch0, int digital_filter_ch1, double digital_bandw_ch1, int gain_dB_ch0, int gain_dB_ch1, float nco_freq_ch0, float nco_freq_ch1, int cmix_mode_ch0, int cmix_mode_ch1) -> sink_sptr""" + return _limesdr_swig.sink_make(serial, device_type, chip_mode, channel, file_switch, filename, rf_freq, samp_rate, oversample, calibration_ch0, calibr_bandw_ch0, calibration_ch1, calibr_bandw_ch1, pa_path_mini, pa_path_ch0, pa_path_ch1, analog_filter_ch0, analog_bandw_ch0, analog_filter_ch1, analog_bandw_ch1, digital_filter_ch0, digital_bandw_ch0, digital_filter_ch1, digital_bandw_ch1, gain_dB_ch0, gain_dB_ch1, nco_freq_ch0, nco_freq_ch1, cmix_mode_ch0, cmix_mode_ch1) + +class sink_sptr(object): + """Proxy of C++ boost::shared_ptr<(gr::limesdr::sink)> class.""" + + thisown = _swig_property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc='The membership flag') + __repr__ = _swig_repr + + def __init__(self, *args): + """ + __init__(boost::shared_ptr<(gr::limesdr::sink)> self) -> sink_sptr + __init__(boost::shared_ptr<(gr::limesdr::sink)> self, sink p) -> sink_sptr + """ + this = _limesdr_swig.new_sink_sptr(*args) + try: + self.this.append(this) + except __builtin__.Exception: + self.this = this + + def __deref__(self): + """__deref__(sink_sptr self) -> sink""" + return _limesdr_swig.sink_sptr___deref__(self) + + __swig_destroy__ = _limesdr_swig.delete_sink_sptr + __del__ = lambda self: None + + def make(self, serial, device_type, chip_mode, channel, file_switch, filename, rf_freq, samp_rate, oversample, calibration_ch0, calibr_bandw_ch0, calibration_ch1, calibr_bandw_ch1, pa_path_mini, pa_path_ch0, pa_path_ch1, analog_filter_ch0, analog_bandw_ch0, analog_filter_ch1, analog_bandw_ch1, digital_filter_ch0, digital_bandw_ch0, digital_filter_ch1, digital_bandw_ch1, gain_dB_ch0, gain_dB_ch1, nco_freq_ch0, nco_freq_ch1, cmix_mode_ch0, cmix_mode_ch1): + """make(sink_sptr self, std::string serial, int device_type, int chip_mode, int channel, int file_switch, char const * filename, double rf_freq, double samp_rate, size_t oversample, int calibration_ch0, double calibr_bandw_ch0, int calibration_ch1, double calibr_bandw_ch1, int pa_path_mini, int pa_path_ch0, int pa_path_ch1, int analog_filter_ch0, double analog_bandw_ch0, int analog_filter_ch1, double analog_bandw_ch1, int digital_filter_ch0, double digital_bandw_ch0, int digital_filter_ch1, double digital_bandw_ch1, int gain_dB_ch0, int gain_dB_ch1, float nco_freq_ch0, float nco_freq_ch1, int cmix_mode_ch0, int cmix_mode_ch1) -> sink_sptr""" + return _limesdr_swig.sink_sptr_make(self, serial, device_type, chip_mode, channel, file_switch, filename, rf_freq, samp_rate, oversample, calibration_ch0, calibr_bandw_ch0, calibration_ch1, calibr_bandw_ch1, pa_path_mini, pa_path_ch0, pa_path_ch1, analog_filter_ch0, analog_bandw_ch0, analog_filter_ch1, analog_bandw_ch1, digital_filter_ch0, digital_bandw_ch0, digital_filter_ch1, digital_bandw_ch1, gain_dB_ch0, gain_dB_ch1, nco_freq_ch0, nco_freq_ch1, cmix_mode_ch0, cmix_mode_ch1) + + + def set_rf_freq(self, rf_freq): + """set_rf_freq(sink_sptr self, float rf_freq)""" + return _limesdr_swig.sink_sptr_set_rf_freq(self, rf_freq) + + + def set_pa_path(self, pa_path, channel): + """set_pa_path(sink_sptr self, int pa_path, int channel)""" + return _limesdr_swig.sink_sptr_set_pa_path(self, pa_path, channel) + + + def set_nco(self, nco_freq, cmix_mode, channel): + """set_nco(sink_sptr self, float nco_freq, int cmix_mode, int channel)""" + return _limesdr_swig.sink_sptr_set_nco(self, nco_freq, cmix_mode, channel) + + + def set_analog_filter(self, analog_filter, analog_bandw, channel): + """set_analog_filter(sink_sptr self, int analog_filter, float analog_bandw, int channel)""" + return _limesdr_swig.sink_sptr_set_analog_filter(self, analog_filter, analog_bandw, channel) + + + def set_digital_filter(self, digital_filter, digital_bandw, channel): + """set_digital_filter(sink_sptr self, int digital_filter, float digital_bandw, int channel)""" + return _limesdr_swig.sink_sptr_set_digital_filter(self, digital_filter, digital_bandw, channel) + + + def set_gain(self, gain_dB, channel): + """set_gain(sink_sptr self, int gain_dB, int channel)""" + return _limesdr_swig.sink_sptr_set_gain(self, gain_dB, channel) + + + def history(self): + """history(sink_sptr self) -> unsigned int""" + return _limesdr_swig.sink_sptr_history(self) + + + def declare_sample_delay(self, *args): + """ + declare_sample_delay(sink_sptr self, int which, int delay) + declare_sample_delay(sink_sptr self, unsigned int delay) + """ + return _limesdr_swig.sink_sptr_declare_sample_delay(self, *args) + + + def sample_delay(self, which): + """sample_delay(sink_sptr self, int which) -> unsigned int""" + return _limesdr_swig.sink_sptr_sample_delay(self, which) + + + def output_multiple(self): + """output_multiple(sink_sptr self) -> int""" + return _limesdr_swig.sink_sptr_output_multiple(self) + + + def relative_rate(self): + """relative_rate(sink_sptr self) -> double""" + return _limesdr_swig.sink_sptr_relative_rate(self) + + + def start(self): + """start(sink_sptr self) -> bool""" + return _limesdr_swig.sink_sptr_start(self) + + + def stop(self): + """stop(sink_sptr self) -> bool""" + return _limesdr_swig.sink_sptr_stop(self) + + + def nitems_read(self, which_input): + """nitems_read(sink_sptr self, unsigned int which_input) -> uint64_t""" + return _limesdr_swig.sink_sptr_nitems_read(self, which_input) + + + def nitems_written(self, which_output): + """nitems_written(sink_sptr self, unsigned int which_output) -> uint64_t""" + return _limesdr_swig.sink_sptr_nitems_written(self, which_output) + + + def max_noutput_items(self): + """max_noutput_items(sink_sptr self) -> int""" + return _limesdr_swig.sink_sptr_max_noutput_items(self) + + + def set_max_noutput_items(self, m): + """set_max_noutput_items(sink_sptr self, int m)""" + return _limesdr_swig.sink_sptr_set_max_noutput_items(self, m) + + + def unset_max_noutput_items(self): + """unset_max_noutput_items(sink_sptr self)""" + return _limesdr_swig.sink_sptr_unset_max_noutput_items(self) + + + def is_set_max_noutput_items(self): + """is_set_max_noutput_items(sink_sptr self) -> bool""" + return _limesdr_swig.sink_sptr_is_set_max_noutput_items(self) + + + def set_min_noutput_items(self, m): + """set_min_noutput_items(sink_sptr self, int m)""" + return _limesdr_swig.sink_sptr_set_min_noutput_items(self, m) + + + def min_noutput_items(self): + """min_noutput_items(sink_sptr self) -> int""" + return _limesdr_swig.sink_sptr_min_noutput_items(self) + + + def max_output_buffer(self, i): + """max_output_buffer(sink_sptr self, int i) -> long""" + return _limesdr_swig.sink_sptr_max_output_buffer(self, i) + + + def set_max_output_buffer(self, *args): + """ + set_max_output_buffer(sink_sptr self, long max_output_buffer) + set_max_output_buffer(sink_sptr self, int port, long max_output_buffer) + """ + return _limesdr_swig.sink_sptr_set_max_output_buffer(self, *args) + + + def min_output_buffer(self, i): + """min_output_buffer(sink_sptr self, int i) -> long""" + return _limesdr_swig.sink_sptr_min_output_buffer(self, i) + + + def set_min_output_buffer(self, *args): + """ + set_min_output_buffer(sink_sptr self, long min_output_buffer) + set_min_output_buffer(sink_sptr self, int port, long min_output_buffer) + """ + return _limesdr_swig.sink_sptr_set_min_output_buffer(self, *args) + + + def pc_noutput_items(self): + """pc_noutput_items(sink_sptr self) -> float""" + return _limesdr_swig.sink_sptr_pc_noutput_items(self) + + + def pc_noutput_items_avg(self): + """pc_noutput_items_avg(sink_sptr self) -> float""" + return _limesdr_swig.sink_sptr_pc_noutput_items_avg(self) + + + def pc_noutput_items_var(self): + """pc_noutput_items_var(sink_sptr self) -> float""" + return _limesdr_swig.sink_sptr_pc_noutput_items_var(self) + + + def pc_nproduced(self): + """pc_nproduced(sink_sptr self) -> float""" + return _limesdr_swig.sink_sptr_pc_nproduced(self) + + + def pc_nproduced_avg(self): + """pc_nproduced_avg(sink_sptr self) -> float""" + return _limesdr_swig.sink_sptr_pc_nproduced_avg(self) + + + def pc_nproduced_var(self): + """pc_nproduced_var(sink_sptr self) -> float""" + return _limesdr_swig.sink_sptr_pc_nproduced_var(self) + + + def pc_input_buffers_full(self, *args): + """ + pc_input_buffers_full(sink_sptr self, int which) -> float + pc_input_buffers_full(sink_sptr self) -> pmt_vector_float + """ + return _limesdr_swig.sink_sptr_pc_input_buffers_full(self, *args) + + + def pc_input_buffers_full_avg(self, *args): + """ + pc_input_buffers_full_avg(sink_sptr self, int which) -> float + pc_input_buffers_full_avg(sink_sptr self) -> pmt_vector_float + """ + return _limesdr_swig.sink_sptr_pc_input_buffers_full_avg(self, *args) + + + def pc_input_buffers_full_var(self, *args): + """ + pc_input_buffers_full_var(sink_sptr self, int which) -> float + pc_input_buffers_full_var(sink_sptr self) -> pmt_vector_float + """ + return _limesdr_swig.sink_sptr_pc_input_buffers_full_var(self, *args) + + + def pc_output_buffers_full(self, *args): + """ + pc_output_buffers_full(sink_sptr self, int which) -> float + pc_output_buffers_full(sink_sptr self) -> pmt_vector_float + """ + return _limesdr_swig.sink_sptr_pc_output_buffers_full(self, *args) + + + def pc_output_buffers_full_avg(self, *args): + """ + pc_output_buffers_full_avg(sink_sptr self, int which) -> float + pc_output_buffers_full_avg(sink_sptr self) -> pmt_vector_float + """ + return _limesdr_swig.sink_sptr_pc_output_buffers_full_avg(self, *args) + + + def pc_output_buffers_full_var(self, *args): + """ + pc_output_buffers_full_var(sink_sptr self, int which) -> float + pc_output_buffers_full_var(sink_sptr self) -> pmt_vector_float + """ + return _limesdr_swig.sink_sptr_pc_output_buffers_full_var(self, *args) + + + def pc_work_time(self): + """pc_work_time(sink_sptr self) -> float""" + return _limesdr_swig.sink_sptr_pc_work_time(self) + + + def pc_work_time_avg(self): + """pc_work_time_avg(sink_sptr self) -> float""" + return _limesdr_swig.sink_sptr_pc_work_time_avg(self) + + + def pc_work_time_var(self): + """pc_work_time_var(sink_sptr self) -> float""" + return _limesdr_swig.sink_sptr_pc_work_time_var(self) + + + def pc_work_time_total(self): + """pc_work_time_total(sink_sptr self) -> float""" + return _limesdr_swig.sink_sptr_pc_work_time_total(self) + + + def pc_throughput_avg(self): + """pc_throughput_avg(sink_sptr self) -> float""" + return _limesdr_swig.sink_sptr_pc_throughput_avg(self) + + + def set_processor_affinity(self, mask): + """set_processor_affinity(sink_sptr self, std::vector< int,std::allocator< int > > const & mask)""" + return _limesdr_swig.sink_sptr_set_processor_affinity(self, mask) + + + def unset_processor_affinity(self): + """unset_processor_affinity(sink_sptr self)""" + return _limesdr_swig.sink_sptr_unset_processor_affinity(self) + + + def processor_affinity(self): + """processor_affinity(sink_sptr self) -> std::vector< int,std::allocator< int > >""" + return _limesdr_swig.sink_sptr_processor_affinity(self) + + + def active_thread_priority(self): + """active_thread_priority(sink_sptr self) -> int""" + return _limesdr_swig.sink_sptr_active_thread_priority(self) + + + def thread_priority(self): + """thread_priority(sink_sptr self) -> int""" + return _limesdr_swig.sink_sptr_thread_priority(self) + + + def set_thread_priority(self, priority): + """set_thread_priority(sink_sptr self, int priority) -> int""" + return _limesdr_swig.sink_sptr_set_thread_priority(self, priority) + + + def name(self): + """name(sink_sptr self) -> std::string""" + return _limesdr_swig.sink_sptr_name(self) + + + def symbol_name(self): + """symbol_name(sink_sptr self) -> std::string""" + return _limesdr_swig.sink_sptr_symbol_name(self) + + + def input_signature(self): + """input_signature(sink_sptr self) -> io_signature_sptr""" + return _limesdr_swig.sink_sptr_input_signature(self) + + + def output_signature(self): + """output_signature(sink_sptr self) -> io_signature_sptr""" + return _limesdr_swig.sink_sptr_output_signature(self) + + + def unique_id(self): + """unique_id(sink_sptr self) -> long""" + return _limesdr_swig.sink_sptr_unique_id(self) + + + def to_basic_block(self): + """to_basic_block(sink_sptr self) -> basic_block_sptr""" + return _limesdr_swig.sink_sptr_to_basic_block(self) + + + def check_topology(self, ninputs, noutputs): + """check_topology(sink_sptr self, int ninputs, int noutputs) -> bool""" + return _limesdr_swig.sink_sptr_check_topology(self, ninputs, noutputs) + + + def alias(self): + """alias(sink_sptr self) -> std::string""" + return _limesdr_swig.sink_sptr_alias(self) + + + def set_block_alias(self, name): + """set_block_alias(sink_sptr self, std::string name)""" + return _limesdr_swig.sink_sptr_set_block_alias(self, name) + + + def _post(self, which_port, msg): + """_post(sink_sptr self, swig_int_ptr which_port, swig_int_ptr msg)""" + return _limesdr_swig.sink_sptr__post(self, which_port, msg) + + + def message_ports_in(self): + """message_ports_in(sink_sptr self) -> swig_int_ptr""" + return _limesdr_swig.sink_sptr_message_ports_in(self) + + + def message_ports_out(self): + """message_ports_out(sink_sptr self) -> swig_int_ptr""" + return _limesdr_swig.sink_sptr_message_ports_out(self) + + + def message_subscribers(self, which_port): + """message_subscribers(sink_sptr self, swig_int_ptr which_port) -> swig_int_ptr""" + return _limesdr_swig.sink_sptr_message_subscribers(self, which_port) + +sink_sptr_swigregister = _limesdr_swig.sink_sptr_swigregister +sink_sptr_swigregister(sink_sptr) + + +sink_sptr.__repr__ = lambda self: "" % (self.name(), self.unique_id()) +sink = sink.make; + + + diff --git a/windows/GNU_Radio/lib/site-packages/limesdr/limesdr_swig.pyc b/windows/GNU_Radio/lib/site-packages/limesdr/limesdr_swig.pyc new file mode 100644 index 0000000..61aa2dd Binary files /dev/null and b/windows/GNU_Radio/lib/site-packages/limesdr/limesdr_swig.pyc differ diff --git a/windows/GNU_Radio/lib/site-packages/limesdr/limesdr_swig.pyo b/windows/GNU_Radio/lib/site-packages/limesdr/limesdr_swig.pyo new file mode 100644 index 0000000..61aa2dd Binary files /dev/null and b/windows/GNU_Radio/lib/site-packages/limesdr/limesdr_swig.pyo differ diff --git a/windows/GNU_Radio/share/gnuradio/grc/blocks/limesdr_sink.xml b/windows/GNU_Radio/share/gnuradio/grc/blocks/limesdr_sink.xml new file mode 100644 index 0000000..f973b70 --- /dev/null +++ b/windows/GNU_Radio/share/gnuradio/grc/blocks/limesdr_sink.xml @@ -0,0 +1,825 @@ + + + LimeSuite Sink (TX) + limesdr_sink + [LimeSuite] + throttle + import limesdr + limesdr.sink($serial, + $device_type, + $chip_mode, + $channel, + $file_switch, + $filename, + $rf_freq, + $samp_rate, + $oversample, + $calibration_ch0, + $calibr_bandw_ch0, + $calibration_ch1, + $calibr_bandw_ch1, + $pa_path_mini, + $pa_path_ch0, + $pa_path_ch1, + $analog_filter_ch0, + $analog_bandw_ch0, + $analog_filter_ch1, + $analog_bandw_ch1, + $digital_filter_ch0, + $digital_bandw_ch0, + $digital_filter_ch1, + $digital_bandw_ch1, + $gain_dB_ch0, + $gain_dB_ch1, + $nco_freq_ch0, + $nco_freq_ch1, + $cmix_mode_ch0, + $cmix_mode_ch1) + + set_rf_freq($rf_freq) + set_pa_path($pa_path_mini,0) + set_pa_path($pa_path_ch0,0) + set_pa_path($pa_path_ch1,1) + set_nco($nco_freq_ch0,$cmix_mode_ch0,0) + set_nco($nco_freq_ch1,$cmix_mode_ch1,1) + set_analog_filter($analog_filter_ch0,$analog_bandw_ch0,0) + set_analog_filter($analog_filter_ch1,$analog_bandw_ch1,1) + set_digital_filter($digital_filter_ch0,$digital_bandw_ch0,0) + set_digital_filter($digital_filter_ch1,$digital_bandw_ch1,1) + set_gain($gain_dB_ch0,0) + set_gain($gain_dB_ch1,1) + + + General + CH0 + CH1 + + + + Device serial + serial + + string + none + + + + Device type + device_type + 2 + int + none + + + + + + Chip mode + chip_mode + 1 + int + none + + + + + + CH0 + channel + 0 + int + + #if $device_type() == 1 + all + #else if $chip_mode() == 2 + all + #else + none + #end if + + + + + + + Load settings + file_switch + 0 + int + none + + + + + + File + filename + + file_open + + #if $file_switch() == 0 + all + #else + none + #end if + + + + + RF frequency + rf_freq + 100e6 + float + + #if $file_switch() == 1 + all + #else + none + #end if + + + + + Sample rate + samp_rate + samp_rate + float + + #if $file_switch() == 1 + all + #else + none + #end if + + + + + Oversample + oversample + 0 + int + + #if $file_switch() == 1 + all + #else + none + #end if + + + + + + + + + + + + CH0:NCO frequency + nco_freq_ch0 + 0 + float + + #if $file_switch() == 1 + all + #else + none + #end if + + CH0 + + + + CH0:CMIX mode + cmix_mode_ch0 + 0 + int + + #if $file_switch() == 1 + all + #else + none + #end if + + + + CH0 + + + + CH0:Calibration + calibration_ch0 + 0 + int + + #if $file_switch() == 1 + all + #else + none + #end if + + + + CH0 + + + + CH0:Calibration bandw. + calibr_bandw_ch0 + 10e6 + float + + #if $calibration_ch0() == 0 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + CH0 + + + + CH0:PA path + pa_path_mini + 1 + int + + #if $device_type() == 2 + all + #else + none + #end if + + + + CH0 + + + + CH0:PA path + pa_path_ch0 + 1 + int + + #if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + + + CH0 + + + + CH0:Analog filter + analog_filter_ch0 + 1 + int + + #if $file_switch() == 1 + all + #else + none + #end if + + + + CH0 + + + + CH0:Analog filter bandw. + analog_bandw_ch0 + 5e6 + float + + #if $analog_filter_ch0() == 0 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + CH0 + + + + CH0:Digital filter + digital_filter_ch0 + 0 + int + + #if $file_switch() == 1 + all + #else + none + #end if + + + + CH0 + + + + CH0:Digital filter bandw. + digital_bandw_ch0 + 0 + float + + #if $digital_filter_ch0() == 0 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + CH0 + + + + CH0:Gain,dB + gain_dB_ch0 + 30 + int + + #if $file_switch() == 1 + all + #else + none + #end if + + CH0 + + + + CH1:NCO frequency + nco_freq_ch1 + 0 + float + + #if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + CH1 + + + + CH1:CMIX mode + cmix_mode_ch1 + 0 + int + + #if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + + + CH1 + + + + CH1:Calibration + calibration_ch1 + 0 + int + + #if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + + + CH1 + + + + CH1:Calibration bandw. + calibr_bandw_ch1 + 10e6 + float + + #if $calibration_ch1() == 0 + all + #else if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + CH1 + + + + CH1:PA path + pa_path_ch1 + 1 + int + + #if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + + + CH1 + + + + CH1:Analog filter + analog_filter_ch1 + 1 + int + + #if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + + + CH1 + + + + CH1:Analog filter bandw. + analog_bandw_ch1 + 5e6 + float + + #if $analog_filter_ch1() == 0 + all + #else if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + CH1 + + + + CH1:Digital filter + digital_filter_ch1 + 0 + int + + #if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + + + CH1 + + + + CH1:Digital filter bandw. + digital_bandw_ch1 + 0 + float + + #if $digital_filter_ch1() == 0 + all + #else if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + CH1 + + + + CH1:Gain,dB + gain_dB_ch1 + 30 + int + + #if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + CH1 + + + $device_type >= $chip_mode + $device_type >= 1 + 2 >= $device_type + + $chip_mode >= 1 + 2 >= $chip_mode + + $rf_freq > 0 + + $calibr_bandw_ch0 >= 2.5e6 + 120e6 >= $calibr_bandw_ch0 + + $calibr_bandw_ch1 >= 2.5e6 + 120e6 >= $calibr_bandw_ch1 + + $analog_bandw_ch0 >= 5e6 + 130e6 >= $analog_bandw_ch0 + + $analog_bandw_ch1 >= 5e6 + 130e6 >= $analog_bandw_ch1 + + $digital_bandw_ch0 >= 0 + $samp_rate >= $digital_bandw_ch0 + + $digital_bandw_ch1 >= 0 + $samp_rate >= $digital_bandw_ch1 + + $gain_dB_ch0 >= 0 + 60 >= $gain_dB_ch0 + + $gain_dB_ch1 >= 0 + 60 >= $gain_dB_ch1 + + $samp_rate > 0 + 61.44e6 >= $samp_rate + + + in + complex + $chip_mode + + + +------------------------------------------------------------------------------------------------------------------- +DEVICE SERIAL + +Device serial number obtained by running + + LimeUtil --find + +Cannot be left blank. +------------------------------------------------------------------------------------------------------------------- +DEVICE TYPE + +This setting lets you choose from predefined device type list and loads appropriate settings for the selected device. +Currently supported device types: LimeSDR-USB, LimeSDR-Mini. +------------------------------------------------------------------------------------------------------------------- +CHIP MODE + +Use this setting to choose between single-input and single-output (SISO)/multiple-input and multiple-output (MIMO) chip modes. + +Note: not all devices support MIMO mode. +------------------------------------------------------------------------------------------------------------------- +CH0 + +When in SISO mode select active channel as CH0. + +Note: not all devices have more than one channel. +------------------------------------------------------------------------------------------------------------------- +LOAD SETTINGS + +Enable loading settings from file. + +Note: setting must match in LimeSuite Source and Sink for the same device. +------------------------------------------------------------------------------------------------------------------- +FILE + +Generate .ini file with LimeSuite and select path. + +Note: setting must match in LimeSuite Source and Sink for the same device. +------------------------------------------------------------------------------------------------------------------- +CENTER FREQUENCY + +Set RF center frequency for TX (both channels). +LimeSDR-USB supports [100e3,3800e6] Hz. +LimeSDR-Mini supports [10e6,3800e6] Hz. +------------------------------------------------------------------------------------------------------------------- +SAMPLE RATE + +Here you can select sample rate for TX. + +LimeSDR-USB sample rate must be no more than 61.44e6 S/s. +LimeSDR-Mini sample rate must be no more than 30.72e6 S/s. + +Note: LimeSDR-Mini supports only the same sample rate for TX and RX. +------------------------------------------------------------------------------------------------------------------- +OVERSAMPLE + +Here you can select oversampling value for TX. Default value uses highest possible oversampling value. + +Note: LimeSDR-Mini supports only the same oversampling value for TX and RX. +------------------------------------------------------------------------------------------------------------------- +NCO FREQUENCY + +Adjust numerically controlled oscillator for each channel. 0 means that NCO is OFF. +------------------------------------------------------------------------------------------------------------------- +CMIX MODE + +Controls NCO direction for each channel. +------------------------------------------------------------------------------------------------------------------- +CALIBRATION + +Turn DC offset and IQ imbalance calibration ON/OFF for each channel. +------------------------------------------------------------------------------------------------------------------- +CALIBRATION BANDW. + +When calibration is turned ON this setting is used to set bandwidth for calibration for each channel. This value should be equal to your signal bandwidth. + +Calibration bandwidth range must be [2.5e6,120e6] Hz. +------------------------------------------------------------------------------------------------------------------- +PA PATH + +Select active power amplifier path of each channel. +------------------------------------------------------------------------------------------------------------------- +ANALOG FILTER + +Turn low-pass filter ON/OFF for each channel. +------------------------------------------------------------------------------------------------------------------- +ANALOG FILTER BANDW. + +Enter analog filter bandwidth for each channel. +Analog filter bandwidth range must be [5e6,130e6] Hz. +------------------------------------------------------------------------------------------------------------------- +DIGITAL FILTER + +Turn digital filters (GFIR) ON/OFF for each channel. +------------------------------------------------------------------------------------------------------------------- +DIGITAL FILTER BANDW. + +Enter digital filter bandwidth for each channel. Bandwidth should not be higher than sample rate. +------------------------------------------------------------------------------------------------------------------- +GAIN + +Controls combined TX gain settings. Gain range must be [0,60] dB. +------------------------------------------------------------------------------------------------------------------- + + diff --git a/windows/GNU_Radio/share/gnuradio/grc/blocks/limesdr_source.xml b/windows/GNU_Radio/share/gnuradio/grc/blocks/limesdr_source.xml new file mode 100644 index 0000000..3e436cc --- /dev/null +++ b/windows/GNU_Radio/share/gnuradio/grc/blocks/limesdr_source.xml @@ -0,0 +1,833 @@ + + + LimeSuite Source (RX) + limesdr_source + [LimeSuite] + throttle + import limesdr + limesdr.source($serial, + $device_type, + $chip_mode, + $channel, + $file_switch, + $filename, + $rf_freq, + $samp_rate, + $oversample, + $calibration_ch0, + $calibr_bandw_ch0, + $calibration_ch1, + $calibr_bandw_ch1, + $lna_path_mini, + $lna_path_ch0, + $lna_path_ch1, + $analog_filter_ch0, + $analog_bandw_ch0, + $analog_filter_ch1, + $analog_bandw_ch1, + $digital_filter_ch0, + $digital_bandw_ch0, + $digital_filter_ch1, + $digital_bandw_ch1, + $gain_dB_ch0, + $gain_dB_ch1, + $nco_freq_ch0, + $nco_freq_ch1, + $cmix_mode_ch0, + $cmix_mode_ch1) + + set_rf_freq($rf_freq) + set_lna_path($lna_path_mini,0) + set_lna_path($lna_path_ch0,0) + set_lna_path($lna_path_ch1,1) + set_nco($nco_freq_ch0,$cmix_mode_ch0,0) + set_nco($nco_freq_ch1,$cmix_mode_ch1,1) + set_analog_filter($analog_filter_ch0,$analog_bandw_ch0,0) + set_analog_filter($analog_filter_ch1,$analog_bandw_ch1,1) + set_digital_filter($digital_filter_ch0,$digital_bandw_ch0,0) + set_digital_filter($digital_filter_ch1,$digital_bandw_ch1,1) + set_gain($gain_dB_ch0,0) + set_gain($gain_dB_ch1,1) + + + General + CH0 + CH1 + + + + Device serial + serial + + string + none + + + + Device type + device_type + 2 + int + none + + + + + + Chip mode + chip_mode + 1 + int + none + + + + + + CH0 + channel + 0 + int + + #if $device_type() == 1 + all + #else if $chip_mode() == 2 + all + #else + none + #end if + + + + + + + Load settings + file_switch + 0 + int + none + + + + + + File + filename + + file_open + + #if $file_switch() == 0 + all + #else + none + #end if + + + + + RF frequency + rf_freq + 100e6 + float + + #if $file_switch() == 1 + all + #else + none + #end if + + + + + Sample rate + samp_rate + samp_rate + float + + #if $file_switch() == 1 + all + #else + none + #end if + + + + + Oversample + oversample + 0 + int + + #if $file_switch() == 1 + all + #else + none + #end if + + + + + + + + + + + + CH0:NCO frequency + nco_freq_ch0 + 0 + float + + #if $file_switch() == 1 + all + #else + none + #end if + + CH0 + + + + CH0:CMIX mode + cmix_mode_ch0 + 0 + int + + #if $file_switch() == 1 + all + #else + none + #end if + + + + CH0 + + + + CH0:Calibration + calibration_ch0 + 0 + int + + #if $file_switch() == 1 + all + #else + none + #end if + + + + CH0 + + + + CH0:Calibration bandw. + calibr_bandw_ch0 + 10e6 + float + + #if $calibration_ch0() == 0 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + CH0 + + + + CH0:LNA path + lna_path_mini + 3 + int + + #if $device_type() == 2 + all + #else + none + #end if + + + + CH0 + + + + CH0:LNA path + lna_path_ch0 + 2 + int + + #if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + + + + CH0 + + + + CH0:Analog filter + analog_filter_ch0 + 1 + int + + #if $file_switch() == 1 + all + #else + none + #end if + + + + CH0 + + + + CH0:Analog filter bandw. + analog_bandw_ch0 + 5e6 + float + + #if $analog_filter_ch0() == 0 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + CH0 + + + + CH0:Digital filter + digital_filter_ch0 + 0 + int + + #if $file_switch() == 1 + all + #else + none + #end if + + + + CH0 + + + + CH0:Digital filter bandw. + digital_bandw_ch0 + 0 + float + + #if $digital_filter_ch0() == 0 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + CH0 + + + + CH0:Gain,dB + gain_dB_ch0 + 30 + int + + #if $file_switch() == 1 + all + #else + none + #end if + + CH0 + + + + CH1:NCO frequency + nco_freq_ch1 + 0 + float + + #if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + CH1 + + + + CH1:CMIX mode + cmix_mode_ch1 + 0 + int + + #if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + + + CH1 + + + + CH1:Calibration + calibration_ch1 + 0 + int + + #if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + + + CH1 + + + + CH1:Calibration bandw. + calibr_bandw_ch1 + 10e6 + float + + #if $calibration_ch1() == 0 + all + #else if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + CH1 + + + + CH1:LNA path + lna_path_ch1 + 2 + int + + #if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + + + + CH1 + + + + CH1:Analog filter + analog_filter_ch1 + 1 + int + + #if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + + + CH1 + + + + CH1:Analog filter bandw. + analog_bandw_ch1 + 5e6 + float + + #if $analog_filter_ch1() == 0 + all + #else if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + CH1 + + + + CH1:Digital filter + digital_filter_ch1 + 0 + int + + #if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + + + CH1 + + + + CH1:Digital filter bandw. + digital_bandw_ch1 + 0 + float + + #if $digital_filter_ch1() == 0 + all + #else if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + CH1 + + + + CH1:Gain,dB + gain_dB_ch1 + 30 + int + + #if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + CH1 + + + $device_type >= $chip_mode + $device_type >= 1 + 2 >= $device_type + + $chip_mode >= 1 + 2 >= $chip_mode + + $rf_freq > 0 + + $calibr_bandw_ch0 >= 2.5e6 + 120e6 >= $calibr_bandw_ch0 + + $calibr_bandw_ch1 >= 2.5e6 + 120e6 >= $calibr_bandw_ch1 + + $analog_bandw_ch0 >= 1.5e6 + 130e6 >= $analog_bandw_ch0 + + $analog_bandw_ch1 >= 1.5e6 + 130e6 >= $analog_bandw_ch1 + + $digital_bandw_ch0 >= 0 + $samp_rate >= $digital_bandw_ch0 + + $digital_bandw_ch1 >= 0 + $samp_rate >= $digital_bandw_ch1 + + $gain_dB_ch0 >= 0 + 70 >= $gain_dB_ch0 + + $gain_dB_ch1 >= 0 + 70 >= $gain_dB_ch1 + + $samp_rate > 0 + 61.44e6 >= $samp_rate + + + out + complex + $chip_mode + + + +------------------------------------------------------------------------------------------------------------------- +DEVICE SERIAL + +Device serial number obtained by running + + LimeUtil --find + +Cannot be left blank. +------------------------------------------------------------------------------------------------------------------- +DEVICE TYPE + +This setting lets you choose from predefined device type list and loads appropriate settings for the selected device. +Currently supported device types: LimeSDR-USB, LimeSDR-Mini. +------------------------------------------------------------------------------------------------------------------- +CHIP MODE + +Use this setting to choose between single-input and single-output (SISO)/multiple-input and multiple-output (MIMO) chip modes. + +Note: not all devices support MIMO mode. +------------------------------------------------------------------------------------------------------------------- +CH0 + +When in SISO mode select active channel as CH0. + +Note: not all devices have more than one channel. +------------------------------------------------------------------------------------------------------------------- +LOAD SETTINGS + +Enable loading settings from file. + +Note: setting must match in LimeSuite Source and Sink for the same device. +------------------------------------------------------------------------------------------------------------------- +FILE + +Generate .ini file with LimeSuite and select path. + +Note: setting must match in LimeSuite Source and Sink for the same device. +------------------------------------------------------------------------------------------------------------------- +RF FREQUENCY + +Set RF center frequency for RX (both channels). +LimeSDR-USB supports [100e3,3800e6] Hz. +LimeSDR-Mini supports [10e6,3800e6] Hz. +------------------------------------------------------------------------------------------------------------------- +SAMPLE RATE + +Here you can select sample rate for RX. + +LimeSDR-USB sample rate must be no more than 61.44e6 S/s. +LimeSDR-Mini sample rate must be no more than 30.72e6 S/s. + +Note: LimeSDR-Mini supports only the same sample rate for TX and RX. +------------------------------------------------------------------------------------------------------------------- +OVERSAMPLE + +Here you can select oversampling value for RX. Default value uses highest possible oversampling value. + +Note: LimeSDR-Mini supports only the same oversampling value for TX and RX. +------------------------------------------------------------------------------------------------------------------- +NCO FREQUENCY + +Adjust numerically controlled oscillator for each channel. 0 means that NCO is OFF. +------------------------------------------------------------------------------------------------------------------- +CMIX MODE + +Controls NCO direction for each channel. +------------------------------------------------------------------------------------------------------------------- +CALIBRATION + +Turn DC offset and IQ imbalance calibration ON/OFF for each channel. +------------------------------------------------------------------------------------------------------------------- +CALIBRATION BANDW. + +When calibration is turned ON this setting is used to set bandwidth for calibration for each channel. This value should be equal to your signal bandwidth. + +Calibration bandwidth range must be [2.5e6,120e6] Hz. +------------------------------------------------------------------------------------------------------------------- +LNA PATH + +Select active low-noise amplifier path of each channel. +------------------------------------------------------------------------------------------------------------------- +ANALOG FILTER + +Turn low-pass filter ON/OFF for each channel. When OFF device uses default values. +------------------------------------------------------------------------------------------------------------------- +ANALOG FILTER BANDW. + +Enter analog filter bandwidth for each channel. +Analog filter bandwidth range must be [1.5e6,130e6] Hz. +------------------------------------------------------------------------------------------------------------------- +DIGITAL FILTER + +Turn digital filters (GFIR) ON/OFF for each channel. +------------------------------------------------------------------------------------------------------------------- +DIGITAL FILTER BANDW. + +Enter digital filter bandwidth for each channel. Bandwidth should not be higher than sample rate. +------------------------------------------------------------------------------------------------------------------- +GAIN + +Controls combined RX gain settings. Gain range must be [0,70] dB. +------------------------------------------------------------------------------------------------------------------- + + diff --git a/windows/Pothos_SDR/bin/gnuradio-limesdr.dll b/windows/Pothos_SDR/bin/gnuradio-limesdr.dll new file mode 100644 index 0000000..b5bd8bf Binary files /dev/null and b/windows/Pothos_SDR/bin/gnuradio-limesdr.dll differ diff --git a/windows/Pothos_SDR/lib/python2.7/site-packages/limesdr/__init__.pyc b/windows/Pothos_SDR/lib/python2.7/site-packages/limesdr/__init__.pyc new file mode 100644 index 0000000..3c8a71d Binary files /dev/null and b/windows/Pothos_SDR/lib/python2.7/site-packages/limesdr/__init__.pyc differ diff --git a/windows/Pothos_SDR/lib/python2.7/site-packages/limesdr/__init__.pyo b/windows/Pothos_SDR/lib/python2.7/site-packages/limesdr/__init__.pyo new file mode 100644 index 0000000..3c8a71d Binary files /dev/null and b/windows/Pothos_SDR/lib/python2.7/site-packages/limesdr/__init__.pyo differ diff --git a/windows/Pothos_SDR/lib/python2.7/site-packages/limesdr/_limesdr_swig.pyd b/windows/Pothos_SDR/lib/python2.7/site-packages/limesdr/_limesdr_swig.pyd new file mode 100644 index 0000000..2174650 Binary files /dev/null and b/windows/Pothos_SDR/lib/python2.7/site-packages/limesdr/_limesdr_swig.pyd differ diff --git a/windows/Pothos_SDR/lib/python2.7/site-packages/limesdr/limesdr_swig.py b/windows/Pothos_SDR/lib/python2.7/site-packages/limesdr/limesdr_swig.py new file mode 100644 index 0000000..1268fb6 --- /dev/null +++ b/windows/Pothos_SDR/lib/python2.7/site-packages/limesdr/limesdr_swig.py @@ -0,0 +1,956 @@ +# This file was automatically generated by SWIG (http://www.swig.org). +# Version 3.0.12 +# +# Do not make changes to this file unless you know what you are doing--modify +# the SWIG interface file instead. + +from sys import version_info as _swig_python_version_info +if _swig_python_version_info >= (2, 7, 0): + def swig_import_helper(): + import importlib + pkg = __name__.rpartition('.')[0] + mname = '.'.join((pkg, '_limesdr_swig')).lstrip('.') + try: + return importlib.import_module(mname) + except ImportError: + return importlib.import_module('_limesdr_swig') + _limesdr_swig = swig_import_helper() + del swig_import_helper +elif _swig_python_version_info >= (2, 6, 0): + def swig_import_helper(): + from os.path import dirname + import imp + fp = None + try: + fp, pathname, description = imp.find_module('_limesdr_swig', [dirname(__file__)]) + except ImportError: + import _limesdr_swig + return _limesdr_swig + try: + _mod = imp.load_module('_limesdr_swig', fp, pathname, description) + finally: + if fp is not None: + fp.close() + return _mod + _limesdr_swig = swig_import_helper() + del swig_import_helper +else: + import _limesdr_swig +del _swig_python_version_info + +try: + _swig_property = property +except NameError: + pass # Python < 2.2 doesn't have 'property'. + +try: + import builtins as __builtin__ +except ImportError: + import __builtin__ + +def _swig_setattr_nondynamic(self, class_type, name, value, static=1): + if (name == "thisown"): + return self.this.own(value) + if (name == "this"): + if type(value).__name__ == 'SwigPyObject': + self.__dict__[name] = value + return + method = class_type.__swig_setmethods__.get(name, None) + if method: + return method(self, value) + if (not static): + object.__setattr__(self, name, value) + else: + raise AttributeError("You cannot add attributes to %s" % self) + + +def _swig_setattr(self, class_type, name, value): + return _swig_setattr_nondynamic(self, class_type, name, value, 0) + + +def _swig_getattr(self, class_type, name): + if (name == "thisown"): + return self.this.own() + method = class_type.__swig_getmethods__.get(name, None) + if method: + return method(self) + raise AttributeError("'%s' object has no attribute '%s'" % (class_type.__name__, name)) + + +def _swig_repr(self): + try: + strthis = "proxy of " + self.this.__repr__() + except __builtin__.Exception: + strthis = "" + return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,) + + +def _swig_setattr_nondynamic_method(set): + def set_attr(self, name, value): + if (name == "thisown"): + return self.this.own(value) + if hasattr(self, name) or (name == "this"): + set(self, name, value) + else: + raise AttributeError("You cannot add attributes to %s" % self) + return set_attr + + + +def high_res_timer_now(): + """high_res_timer_now() -> gr::high_res_timer_type""" + return _limesdr_swig.high_res_timer_now() + +def high_res_timer_now_perfmon(): + """high_res_timer_now_perfmon() -> gr::high_res_timer_type""" + return _limesdr_swig.high_res_timer_now_perfmon() + +def high_res_timer_tps(): + """high_res_timer_tps() -> gr::high_res_timer_type""" + return _limesdr_swig.high_res_timer_tps() + +def high_res_timer_epoch(): + """high_res_timer_epoch() -> gr::high_res_timer_type""" + return _limesdr_swig.high_res_timer_epoch() +class source(object): + """Proxy of C++ gr::limesdr::source class.""" + + thisown = _swig_property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc='The membership flag') + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + def make(serial, device_type, chip_mode, channel, file_switch, filename, rf_freq, samp_rate, oversample, calibration_ch0, calibr_bandw_ch0, calibration_ch1, calibr_bandw_ch1, lna_path_mini, lna_path_ch0, lna_path_ch1, analog_filter_ch0, analog_bandw_ch0, analog_filter_ch1, analog_bandw_ch1, digital_filter_ch0, digital_bandw_ch0, digital_filter_ch1, digital_bandw_ch1, gain_dB_ch0, gain_dB_ch1, nco_freq_ch0, nco_freq_ch1, cmix_mode_ch0, cmix_mode_ch1): + """make(std::string serial, int device_type, int chip_mode, int channel, int file_switch, char const * filename, double rf_freq, double samp_rate, size_t oversample, int calibration_ch0, double calibr_bandw_ch0, int calibration_ch1, double calibr_bandw_ch1, int lna_path_mini, int lna_path_ch0, int lna_path_ch1, int analog_filter_ch0, double analog_bandw_ch0, int analog_filter_ch1, double analog_bandw_ch1, int digital_filter_ch0, double digital_bandw_ch0, int digital_filter_ch1, double digital_bandw_ch1, int gain_dB_ch0, int gain_dB_ch1, float nco_freq_ch0, float nco_freq_ch1, int cmix_mode_ch0, int cmix_mode_ch1) -> source_sptr""" + return _limesdr_swig.source_make(serial, device_type, chip_mode, channel, file_switch, filename, rf_freq, samp_rate, oversample, calibration_ch0, calibr_bandw_ch0, calibration_ch1, calibr_bandw_ch1, lna_path_mini, lna_path_ch0, lna_path_ch1, analog_filter_ch0, analog_bandw_ch0, analog_filter_ch1, analog_bandw_ch1, digital_filter_ch0, digital_bandw_ch0, digital_filter_ch1, digital_bandw_ch1, gain_dB_ch0, gain_dB_ch1, nco_freq_ch0, nco_freq_ch1, cmix_mode_ch0, cmix_mode_ch1) + + make = staticmethod(make) + + def set_rf_freq(self, rf_freq): + """set_rf_freq(source self, float rf_freq)""" + return _limesdr_swig.source_set_rf_freq(self, rf_freq) + + + def set_lna_path(self, lna_path, channel): + """set_lna_path(source self, int lna_path, int channel)""" + return _limesdr_swig.source_set_lna_path(self, lna_path, channel) + + + def set_nco(self, nco_freq, cmix_mode, channel): + """set_nco(source self, float nco_freq, int cmix_mode, int channel)""" + return _limesdr_swig.source_set_nco(self, nco_freq, cmix_mode, channel) + + + def set_analog_filter(self, analog_filter, analog_bandw, channel): + """set_analog_filter(source self, int analog_filter, float analog_bandw, int channel)""" + return _limesdr_swig.source_set_analog_filter(self, analog_filter, analog_bandw, channel) + + + def set_digital_filter(self, digital_filter, digital_bandw, channel): + """set_digital_filter(source self, int digital_filter, float digital_bandw, int channel)""" + return _limesdr_swig.source_set_digital_filter(self, digital_filter, digital_bandw, channel) + + + def set_gain(self, gain_dB, channel): + """set_gain(source self, int gain_dB, int channel)""" + return _limesdr_swig.source_set_gain(self, gain_dB, channel) + + __swig_destroy__ = _limesdr_swig.delete_source + __del__ = lambda self: None +source_swigregister = _limesdr_swig.source_swigregister +source_swigregister(source) + +def source_make(serial, device_type, chip_mode, channel, file_switch, filename, rf_freq, samp_rate, oversample, calibration_ch0, calibr_bandw_ch0, calibration_ch1, calibr_bandw_ch1, lna_path_mini, lna_path_ch0, lna_path_ch1, analog_filter_ch0, analog_bandw_ch0, analog_filter_ch1, analog_bandw_ch1, digital_filter_ch0, digital_bandw_ch0, digital_filter_ch1, digital_bandw_ch1, gain_dB_ch0, gain_dB_ch1, nco_freq_ch0, nco_freq_ch1, cmix_mode_ch0, cmix_mode_ch1): + """source_make(std::string serial, int device_type, int chip_mode, int channel, int file_switch, char const * filename, double rf_freq, double samp_rate, size_t oversample, int calibration_ch0, double calibr_bandw_ch0, int calibration_ch1, double calibr_bandw_ch1, int lna_path_mini, int lna_path_ch0, int lna_path_ch1, int analog_filter_ch0, double analog_bandw_ch0, int analog_filter_ch1, double analog_bandw_ch1, int digital_filter_ch0, double digital_bandw_ch0, int digital_filter_ch1, double digital_bandw_ch1, int gain_dB_ch0, int gain_dB_ch1, float nco_freq_ch0, float nco_freq_ch1, int cmix_mode_ch0, int cmix_mode_ch1) -> source_sptr""" + return _limesdr_swig.source_make(serial, device_type, chip_mode, channel, file_switch, filename, rf_freq, samp_rate, oversample, calibration_ch0, calibr_bandw_ch0, calibration_ch1, calibr_bandw_ch1, lna_path_mini, lna_path_ch0, lna_path_ch1, analog_filter_ch0, analog_bandw_ch0, analog_filter_ch1, analog_bandw_ch1, digital_filter_ch0, digital_bandw_ch0, digital_filter_ch1, digital_bandw_ch1, gain_dB_ch0, gain_dB_ch1, nco_freq_ch0, nco_freq_ch1, cmix_mode_ch0, cmix_mode_ch1) + +class source_sptr(object): + """Proxy of C++ boost::shared_ptr<(gr::limesdr::source)> class.""" + + thisown = _swig_property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc='The membership flag') + __repr__ = _swig_repr + + def __init__(self, *args): + """ + __init__(boost::shared_ptr<(gr::limesdr::source)> self) -> source_sptr + __init__(boost::shared_ptr<(gr::limesdr::source)> self, source p) -> source_sptr + """ + this = _limesdr_swig.new_source_sptr(*args) + try: + self.this.append(this) + except __builtin__.Exception: + self.this = this + + def __deref__(self): + """__deref__(source_sptr self) -> source""" + return _limesdr_swig.source_sptr___deref__(self) + + __swig_destroy__ = _limesdr_swig.delete_source_sptr + __del__ = lambda self: None + + def make(self, serial, device_type, chip_mode, channel, file_switch, filename, rf_freq, samp_rate, oversample, calibration_ch0, calibr_bandw_ch0, calibration_ch1, calibr_bandw_ch1, lna_path_mini, lna_path_ch0, lna_path_ch1, analog_filter_ch0, analog_bandw_ch0, analog_filter_ch1, analog_bandw_ch1, digital_filter_ch0, digital_bandw_ch0, digital_filter_ch1, digital_bandw_ch1, gain_dB_ch0, gain_dB_ch1, nco_freq_ch0, nco_freq_ch1, cmix_mode_ch0, cmix_mode_ch1): + """make(source_sptr self, std::string serial, int device_type, int chip_mode, int channel, int file_switch, char const * filename, double rf_freq, double samp_rate, size_t oversample, int calibration_ch0, double calibr_bandw_ch0, int calibration_ch1, double calibr_bandw_ch1, int lna_path_mini, int lna_path_ch0, int lna_path_ch1, int analog_filter_ch0, double analog_bandw_ch0, int analog_filter_ch1, double analog_bandw_ch1, int digital_filter_ch0, double digital_bandw_ch0, int digital_filter_ch1, double digital_bandw_ch1, int gain_dB_ch0, int gain_dB_ch1, float nco_freq_ch0, float nco_freq_ch1, int cmix_mode_ch0, int cmix_mode_ch1) -> source_sptr""" + return _limesdr_swig.source_sptr_make(self, serial, device_type, chip_mode, channel, file_switch, filename, rf_freq, samp_rate, oversample, calibration_ch0, calibr_bandw_ch0, calibration_ch1, calibr_bandw_ch1, lna_path_mini, lna_path_ch0, lna_path_ch1, analog_filter_ch0, analog_bandw_ch0, analog_filter_ch1, analog_bandw_ch1, digital_filter_ch0, digital_bandw_ch0, digital_filter_ch1, digital_bandw_ch1, gain_dB_ch0, gain_dB_ch1, nco_freq_ch0, nco_freq_ch1, cmix_mode_ch0, cmix_mode_ch1) + + + def set_rf_freq(self, rf_freq): + """set_rf_freq(source_sptr self, float rf_freq)""" + return _limesdr_swig.source_sptr_set_rf_freq(self, rf_freq) + + + def set_lna_path(self, lna_path, channel): + """set_lna_path(source_sptr self, int lna_path, int channel)""" + return _limesdr_swig.source_sptr_set_lna_path(self, lna_path, channel) + + + def set_nco(self, nco_freq, cmix_mode, channel): + """set_nco(source_sptr self, float nco_freq, int cmix_mode, int channel)""" + return _limesdr_swig.source_sptr_set_nco(self, nco_freq, cmix_mode, channel) + + + def set_analog_filter(self, analog_filter, analog_bandw, channel): + """set_analog_filter(source_sptr self, int analog_filter, float analog_bandw, int channel)""" + return _limesdr_swig.source_sptr_set_analog_filter(self, analog_filter, analog_bandw, channel) + + + def set_digital_filter(self, digital_filter, digital_bandw, channel): + """set_digital_filter(source_sptr self, int digital_filter, float digital_bandw, int channel)""" + return _limesdr_swig.source_sptr_set_digital_filter(self, digital_filter, digital_bandw, channel) + + + def set_gain(self, gain_dB, channel): + """set_gain(source_sptr self, int gain_dB, int channel)""" + return _limesdr_swig.source_sptr_set_gain(self, gain_dB, channel) + + + def history(self): + """history(source_sptr self) -> unsigned int""" + return _limesdr_swig.source_sptr_history(self) + + + def declare_sample_delay(self, *args): + """ + declare_sample_delay(source_sptr self, int which, int delay) + declare_sample_delay(source_sptr self, unsigned int delay) + """ + return _limesdr_swig.source_sptr_declare_sample_delay(self, *args) + + + def sample_delay(self, which): + """sample_delay(source_sptr self, int which) -> unsigned int""" + return _limesdr_swig.source_sptr_sample_delay(self, which) + + + def output_multiple(self): + """output_multiple(source_sptr self) -> int""" + return _limesdr_swig.source_sptr_output_multiple(self) + + + def relative_rate(self): + """relative_rate(source_sptr self) -> double""" + return _limesdr_swig.source_sptr_relative_rate(self) + + + def start(self): + """start(source_sptr self) -> bool""" + return _limesdr_swig.source_sptr_start(self) + + + def stop(self): + """stop(source_sptr self) -> bool""" + return _limesdr_swig.source_sptr_stop(self) + + + def nitems_read(self, which_input): + """nitems_read(source_sptr self, unsigned int which_input) -> uint64_t""" + return _limesdr_swig.source_sptr_nitems_read(self, which_input) + + + def nitems_written(self, which_output): + """nitems_written(source_sptr self, unsigned int which_output) -> uint64_t""" + return _limesdr_swig.source_sptr_nitems_written(self, which_output) + + + def max_noutput_items(self): + """max_noutput_items(source_sptr self) -> int""" + return _limesdr_swig.source_sptr_max_noutput_items(self) + + + def set_max_noutput_items(self, m): + """set_max_noutput_items(source_sptr self, int m)""" + return _limesdr_swig.source_sptr_set_max_noutput_items(self, m) + + + def unset_max_noutput_items(self): + """unset_max_noutput_items(source_sptr self)""" + return _limesdr_swig.source_sptr_unset_max_noutput_items(self) + + + def is_set_max_noutput_items(self): + """is_set_max_noutput_items(source_sptr self) -> bool""" + return _limesdr_swig.source_sptr_is_set_max_noutput_items(self) + + + def set_min_noutput_items(self, m): + """set_min_noutput_items(source_sptr self, int m)""" + return _limesdr_swig.source_sptr_set_min_noutput_items(self, m) + + + def min_noutput_items(self): + """min_noutput_items(source_sptr self) -> int""" + return _limesdr_swig.source_sptr_min_noutput_items(self) + + + def max_output_buffer(self, i): + """max_output_buffer(source_sptr self, int i) -> long""" + return _limesdr_swig.source_sptr_max_output_buffer(self, i) + + + def set_max_output_buffer(self, *args): + """ + set_max_output_buffer(source_sptr self, long max_output_buffer) + set_max_output_buffer(source_sptr self, int port, long max_output_buffer) + """ + return _limesdr_swig.source_sptr_set_max_output_buffer(self, *args) + + + def min_output_buffer(self, i): + """min_output_buffer(source_sptr self, int i) -> long""" + return _limesdr_swig.source_sptr_min_output_buffer(self, i) + + + def set_min_output_buffer(self, *args): + """ + set_min_output_buffer(source_sptr self, long min_output_buffer) + set_min_output_buffer(source_sptr self, int port, long min_output_buffer) + """ + return _limesdr_swig.source_sptr_set_min_output_buffer(self, *args) + + + def pc_noutput_items(self): + """pc_noutput_items(source_sptr self) -> float""" + return _limesdr_swig.source_sptr_pc_noutput_items(self) + + + def pc_noutput_items_avg(self): + """pc_noutput_items_avg(source_sptr self) -> float""" + return _limesdr_swig.source_sptr_pc_noutput_items_avg(self) + + + def pc_noutput_items_var(self): + """pc_noutput_items_var(source_sptr self) -> float""" + return _limesdr_swig.source_sptr_pc_noutput_items_var(self) + + + def pc_nproduced(self): + """pc_nproduced(source_sptr self) -> float""" + return _limesdr_swig.source_sptr_pc_nproduced(self) + + + def pc_nproduced_avg(self): + """pc_nproduced_avg(source_sptr self) -> float""" + return _limesdr_swig.source_sptr_pc_nproduced_avg(self) + + + def pc_nproduced_var(self): + """pc_nproduced_var(source_sptr self) -> float""" + return _limesdr_swig.source_sptr_pc_nproduced_var(self) + + + def pc_input_buffers_full(self, *args): + """ + pc_input_buffers_full(source_sptr self, int which) -> float + pc_input_buffers_full(source_sptr self) -> pmt_vector_float + """ + return _limesdr_swig.source_sptr_pc_input_buffers_full(self, *args) + + + def pc_input_buffers_full_avg(self, *args): + """ + pc_input_buffers_full_avg(source_sptr self, int which) -> float + pc_input_buffers_full_avg(source_sptr self) -> pmt_vector_float + """ + return _limesdr_swig.source_sptr_pc_input_buffers_full_avg(self, *args) + + + def pc_input_buffers_full_var(self, *args): + """ + pc_input_buffers_full_var(source_sptr self, int which) -> float + pc_input_buffers_full_var(source_sptr self) -> pmt_vector_float + """ + return _limesdr_swig.source_sptr_pc_input_buffers_full_var(self, *args) + + + def pc_output_buffers_full(self, *args): + """ + pc_output_buffers_full(source_sptr self, int which) -> float + pc_output_buffers_full(source_sptr self) -> pmt_vector_float + """ + return _limesdr_swig.source_sptr_pc_output_buffers_full(self, *args) + + + def pc_output_buffers_full_avg(self, *args): + """ + pc_output_buffers_full_avg(source_sptr self, int which) -> float + pc_output_buffers_full_avg(source_sptr self) -> pmt_vector_float + """ + return _limesdr_swig.source_sptr_pc_output_buffers_full_avg(self, *args) + + + def pc_output_buffers_full_var(self, *args): + """ + pc_output_buffers_full_var(source_sptr self, int which) -> float + pc_output_buffers_full_var(source_sptr self) -> pmt_vector_float + """ + return _limesdr_swig.source_sptr_pc_output_buffers_full_var(self, *args) + + + def pc_work_time(self): + """pc_work_time(source_sptr self) -> float""" + return _limesdr_swig.source_sptr_pc_work_time(self) + + + def pc_work_time_avg(self): + """pc_work_time_avg(source_sptr self) -> float""" + return _limesdr_swig.source_sptr_pc_work_time_avg(self) + + + def pc_work_time_var(self): + """pc_work_time_var(source_sptr self) -> float""" + return _limesdr_swig.source_sptr_pc_work_time_var(self) + + + def pc_work_time_total(self): + """pc_work_time_total(source_sptr self) -> float""" + return _limesdr_swig.source_sptr_pc_work_time_total(self) + + + def pc_throughput_avg(self): + """pc_throughput_avg(source_sptr self) -> float""" + return _limesdr_swig.source_sptr_pc_throughput_avg(self) + + + def set_processor_affinity(self, mask): + """set_processor_affinity(source_sptr self, std::vector< int,std::allocator< int > > const & mask)""" + return _limesdr_swig.source_sptr_set_processor_affinity(self, mask) + + + def unset_processor_affinity(self): + """unset_processor_affinity(source_sptr self)""" + return _limesdr_swig.source_sptr_unset_processor_affinity(self) + + + def processor_affinity(self): + """processor_affinity(source_sptr self) -> std::vector< int,std::allocator< int > >""" + return _limesdr_swig.source_sptr_processor_affinity(self) + + + def active_thread_priority(self): + """active_thread_priority(source_sptr self) -> int""" + return _limesdr_swig.source_sptr_active_thread_priority(self) + + + def thread_priority(self): + """thread_priority(source_sptr self) -> int""" + return _limesdr_swig.source_sptr_thread_priority(self) + + + def set_thread_priority(self, priority): + """set_thread_priority(source_sptr self, int priority) -> int""" + return _limesdr_swig.source_sptr_set_thread_priority(self, priority) + + + def name(self): + """name(source_sptr self) -> std::string""" + return _limesdr_swig.source_sptr_name(self) + + + def symbol_name(self): + """symbol_name(source_sptr self) -> std::string""" + return _limesdr_swig.source_sptr_symbol_name(self) + + + def input_signature(self): + """input_signature(source_sptr self) -> io_signature_sptr""" + return _limesdr_swig.source_sptr_input_signature(self) + + + def output_signature(self): + """output_signature(source_sptr self) -> io_signature_sptr""" + return _limesdr_swig.source_sptr_output_signature(self) + + + def unique_id(self): + """unique_id(source_sptr self) -> long""" + return _limesdr_swig.source_sptr_unique_id(self) + + + def to_basic_block(self): + """to_basic_block(source_sptr self) -> basic_block_sptr""" + return _limesdr_swig.source_sptr_to_basic_block(self) + + + def check_topology(self, ninputs, noutputs): + """check_topology(source_sptr self, int ninputs, int noutputs) -> bool""" + return _limesdr_swig.source_sptr_check_topology(self, ninputs, noutputs) + + + def alias(self): + """alias(source_sptr self) -> std::string""" + return _limesdr_swig.source_sptr_alias(self) + + + def set_block_alias(self, name): + """set_block_alias(source_sptr self, std::string name)""" + return _limesdr_swig.source_sptr_set_block_alias(self, name) + + + def _post(self, which_port, msg): + """_post(source_sptr self, swig_int_ptr which_port, swig_int_ptr msg)""" + return _limesdr_swig.source_sptr__post(self, which_port, msg) + + + def message_ports_in(self): + """message_ports_in(source_sptr self) -> swig_int_ptr""" + return _limesdr_swig.source_sptr_message_ports_in(self) + + + def message_ports_out(self): + """message_ports_out(source_sptr self) -> swig_int_ptr""" + return _limesdr_swig.source_sptr_message_ports_out(self) + + + def message_subscribers(self, which_port): + """message_subscribers(source_sptr self, swig_int_ptr which_port) -> swig_int_ptr""" + return _limesdr_swig.source_sptr_message_subscribers(self, which_port) + +source_sptr_swigregister = _limesdr_swig.source_sptr_swigregister +source_sptr_swigregister(source_sptr) + + +source_sptr.__repr__ = lambda self: "" % (self.name(), self.unique_id()) +source = source.make; + +class sink(object): + """Proxy of C++ gr::limesdr::sink class.""" + + thisown = _swig_property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc='The membership flag') + + def __init__(self, *args, **kwargs): + raise AttributeError("No constructor defined - class is abstract") + __repr__ = _swig_repr + + def make(serial, device_type, chip_mode, channel, file_switch, filename, rf_freq, samp_rate, oversample, calibration_ch0, calibr_bandw_ch0, calibration_ch1, calibr_bandw_ch1, pa_path_mini, pa_path_ch0, pa_path_ch1, analog_filter_ch0, analog_bandw_ch0, analog_filter_ch1, analog_bandw_ch1, digital_filter_ch0, digital_bandw_ch0, digital_filter_ch1, digital_bandw_ch1, gain_dB_ch0, gain_dB_ch1, nco_freq_ch0, nco_freq_ch1, cmix_mode_ch0, cmix_mode_ch1): + """make(std::string serial, int device_type, int chip_mode, int channel, int file_switch, char const * filename, double rf_freq, double samp_rate, size_t oversample, int calibration_ch0, double calibr_bandw_ch0, int calibration_ch1, double calibr_bandw_ch1, int pa_path_mini, int pa_path_ch0, int pa_path_ch1, int analog_filter_ch0, double analog_bandw_ch0, int analog_filter_ch1, double analog_bandw_ch1, int digital_filter_ch0, double digital_bandw_ch0, int digital_filter_ch1, double digital_bandw_ch1, int gain_dB_ch0, int gain_dB_ch1, float nco_freq_ch0, float nco_freq_ch1, int cmix_mode_ch0, int cmix_mode_ch1) -> sink_sptr""" + return _limesdr_swig.sink_make(serial, device_type, chip_mode, channel, file_switch, filename, rf_freq, samp_rate, oversample, calibration_ch0, calibr_bandw_ch0, calibration_ch1, calibr_bandw_ch1, pa_path_mini, pa_path_ch0, pa_path_ch1, analog_filter_ch0, analog_bandw_ch0, analog_filter_ch1, analog_bandw_ch1, digital_filter_ch0, digital_bandw_ch0, digital_filter_ch1, digital_bandw_ch1, gain_dB_ch0, gain_dB_ch1, nco_freq_ch0, nco_freq_ch1, cmix_mode_ch0, cmix_mode_ch1) + + make = staticmethod(make) + + def set_rf_freq(self, rf_freq): + """set_rf_freq(sink self, float rf_freq)""" + return _limesdr_swig.sink_set_rf_freq(self, rf_freq) + + + def set_pa_path(self, pa_path, channel): + """set_pa_path(sink self, int pa_path, int channel)""" + return _limesdr_swig.sink_set_pa_path(self, pa_path, channel) + + + def set_nco(self, nco_freq, cmix_mode, channel): + """set_nco(sink self, float nco_freq, int cmix_mode, int channel)""" + return _limesdr_swig.sink_set_nco(self, nco_freq, cmix_mode, channel) + + + def set_analog_filter(self, analog_filter, analog_bandw, channel): + """set_analog_filter(sink self, int analog_filter, float analog_bandw, int channel)""" + return _limesdr_swig.sink_set_analog_filter(self, analog_filter, analog_bandw, channel) + + + def set_digital_filter(self, digital_filter, digital_bandw, channel): + """set_digital_filter(sink self, int digital_filter, float digital_bandw, int channel)""" + return _limesdr_swig.sink_set_digital_filter(self, digital_filter, digital_bandw, channel) + + + def set_gain(self, gain_dB, channel): + """set_gain(sink self, int gain_dB, int channel)""" + return _limesdr_swig.sink_set_gain(self, gain_dB, channel) + + __swig_destroy__ = _limesdr_swig.delete_sink + __del__ = lambda self: None +sink_swigregister = _limesdr_swig.sink_swigregister +sink_swigregister(sink) + +def sink_make(serial, device_type, chip_mode, channel, file_switch, filename, rf_freq, samp_rate, oversample, calibration_ch0, calibr_bandw_ch0, calibration_ch1, calibr_bandw_ch1, pa_path_mini, pa_path_ch0, pa_path_ch1, analog_filter_ch0, analog_bandw_ch0, analog_filter_ch1, analog_bandw_ch1, digital_filter_ch0, digital_bandw_ch0, digital_filter_ch1, digital_bandw_ch1, gain_dB_ch0, gain_dB_ch1, nco_freq_ch0, nco_freq_ch1, cmix_mode_ch0, cmix_mode_ch1): + """sink_make(std::string serial, int device_type, int chip_mode, int channel, int file_switch, char const * filename, double rf_freq, double samp_rate, size_t oversample, int calibration_ch0, double calibr_bandw_ch0, int calibration_ch1, double calibr_bandw_ch1, int pa_path_mini, int pa_path_ch0, int pa_path_ch1, int analog_filter_ch0, double analog_bandw_ch0, int analog_filter_ch1, double analog_bandw_ch1, int digital_filter_ch0, double digital_bandw_ch0, int digital_filter_ch1, double digital_bandw_ch1, int gain_dB_ch0, int gain_dB_ch1, float nco_freq_ch0, float nco_freq_ch1, int cmix_mode_ch0, int cmix_mode_ch1) -> sink_sptr""" + return _limesdr_swig.sink_make(serial, device_type, chip_mode, channel, file_switch, filename, rf_freq, samp_rate, oversample, calibration_ch0, calibr_bandw_ch0, calibration_ch1, calibr_bandw_ch1, pa_path_mini, pa_path_ch0, pa_path_ch1, analog_filter_ch0, analog_bandw_ch0, analog_filter_ch1, analog_bandw_ch1, digital_filter_ch0, digital_bandw_ch0, digital_filter_ch1, digital_bandw_ch1, gain_dB_ch0, gain_dB_ch1, nco_freq_ch0, nco_freq_ch1, cmix_mode_ch0, cmix_mode_ch1) + +class sink_sptr(object): + """Proxy of C++ boost::shared_ptr<(gr::limesdr::sink)> class.""" + + thisown = _swig_property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc='The membership flag') + __repr__ = _swig_repr + + def __init__(self, *args): + """ + __init__(boost::shared_ptr<(gr::limesdr::sink)> self) -> sink_sptr + __init__(boost::shared_ptr<(gr::limesdr::sink)> self, sink p) -> sink_sptr + """ + this = _limesdr_swig.new_sink_sptr(*args) + try: + self.this.append(this) + except __builtin__.Exception: + self.this = this + + def __deref__(self): + """__deref__(sink_sptr self) -> sink""" + return _limesdr_swig.sink_sptr___deref__(self) + + __swig_destroy__ = _limesdr_swig.delete_sink_sptr + __del__ = lambda self: None + + def make(self, serial, device_type, chip_mode, channel, file_switch, filename, rf_freq, samp_rate, oversample, calibration_ch0, calibr_bandw_ch0, calibration_ch1, calibr_bandw_ch1, pa_path_mini, pa_path_ch0, pa_path_ch1, analog_filter_ch0, analog_bandw_ch0, analog_filter_ch1, analog_bandw_ch1, digital_filter_ch0, digital_bandw_ch0, digital_filter_ch1, digital_bandw_ch1, gain_dB_ch0, gain_dB_ch1, nco_freq_ch0, nco_freq_ch1, cmix_mode_ch0, cmix_mode_ch1): + """make(sink_sptr self, std::string serial, int device_type, int chip_mode, int channel, int file_switch, char const * filename, double rf_freq, double samp_rate, size_t oversample, int calibration_ch0, double calibr_bandw_ch0, int calibration_ch1, double calibr_bandw_ch1, int pa_path_mini, int pa_path_ch0, int pa_path_ch1, int analog_filter_ch0, double analog_bandw_ch0, int analog_filter_ch1, double analog_bandw_ch1, int digital_filter_ch0, double digital_bandw_ch0, int digital_filter_ch1, double digital_bandw_ch1, int gain_dB_ch0, int gain_dB_ch1, float nco_freq_ch0, float nco_freq_ch1, int cmix_mode_ch0, int cmix_mode_ch1) -> sink_sptr""" + return _limesdr_swig.sink_sptr_make(self, serial, device_type, chip_mode, channel, file_switch, filename, rf_freq, samp_rate, oversample, calibration_ch0, calibr_bandw_ch0, calibration_ch1, calibr_bandw_ch1, pa_path_mini, pa_path_ch0, pa_path_ch1, analog_filter_ch0, analog_bandw_ch0, analog_filter_ch1, analog_bandw_ch1, digital_filter_ch0, digital_bandw_ch0, digital_filter_ch1, digital_bandw_ch1, gain_dB_ch0, gain_dB_ch1, nco_freq_ch0, nco_freq_ch1, cmix_mode_ch0, cmix_mode_ch1) + + + def set_rf_freq(self, rf_freq): + """set_rf_freq(sink_sptr self, float rf_freq)""" + return _limesdr_swig.sink_sptr_set_rf_freq(self, rf_freq) + + + def set_pa_path(self, pa_path, channel): + """set_pa_path(sink_sptr self, int pa_path, int channel)""" + return _limesdr_swig.sink_sptr_set_pa_path(self, pa_path, channel) + + + def set_nco(self, nco_freq, cmix_mode, channel): + """set_nco(sink_sptr self, float nco_freq, int cmix_mode, int channel)""" + return _limesdr_swig.sink_sptr_set_nco(self, nco_freq, cmix_mode, channel) + + + def set_analog_filter(self, analog_filter, analog_bandw, channel): + """set_analog_filter(sink_sptr self, int analog_filter, float analog_bandw, int channel)""" + return _limesdr_swig.sink_sptr_set_analog_filter(self, analog_filter, analog_bandw, channel) + + + def set_digital_filter(self, digital_filter, digital_bandw, channel): + """set_digital_filter(sink_sptr self, int digital_filter, float digital_bandw, int channel)""" + return _limesdr_swig.sink_sptr_set_digital_filter(self, digital_filter, digital_bandw, channel) + + + def set_gain(self, gain_dB, channel): + """set_gain(sink_sptr self, int gain_dB, int channel)""" + return _limesdr_swig.sink_sptr_set_gain(self, gain_dB, channel) + + + def history(self): + """history(sink_sptr self) -> unsigned int""" + return _limesdr_swig.sink_sptr_history(self) + + + def declare_sample_delay(self, *args): + """ + declare_sample_delay(sink_sptr self, int which, int delay) + declare_sample_delay(sink_sptr self, unsigned int delay) + """ + return _limesdr_swig.sink_sptr_declare_sample_delay(self, *args) + + + def sample_delay(self, which): + """sample_delay(sink_sptr self, int which) -> unsigned int""" + return _limesdr_swig.sink_sptr_sample_delay(self, which) + + + def output_multiple(self): + """output_multiple(sink_sptr self) -> int""" + return _limesdr_swig.sink_sptr_output_multiple(self) + + + def relative_rate(self): + """relative_rate(sink_sptr self) -> double""" + return _limesdr_swig.sink_sptr_relative_rate(self) + + + def start(self): + """start(sink_sptr self) -> bool""" + return _limesdr_swig.sink_sptr_start(self) + + + def stop(self): + """stop(sink_sptr self) -> bool""" + return _limesdr_swig.sink_sptr_stop(self) + + + def nitems_read(self, which_input): + """nitems_read(sink_sptr self, unsigned int which_input) -> uint64_t""" + return _limesdr_swig.sink_sptr_nitems_read(self, which_input) + + + def nitems_written(self, which_output): + """nitems_written(sink_sptr self, unsigned int which_output) -> uint64_t""" + return _limesdr_swig.sink_sptr_nitems_written(self, which_output) + + + def max_noutput_items(self): + """max_noutput_items(sink_sptr self) -> int""" + return _limesdr_swig.sink_sptr_max_noutput_items(self) + + + def set_max_noutput_items(self, m): + """set_max_noutput_items(sink_sptr self, int m)""" + return _limesdr_swig.sink_sptr_set_max_noutput_items(self, m) + + + def unset_max_noutput_items(self): + """unset_max_noutput_items(sink_sptr self)""" + return _limesdr_swig.sink_sptr_unset_max_noutput_items(self) + + + def is_set_max_noutput_items(self): + """is_set_max_noutput_items(sink_sptr self) -> bool""" + return _limesdr_swig.sink_sptr_is_set_max_noutput_items(self) + + + def set_min_noutput_items(self, m): + """set_min_noutput_items(sink_sptr self, int m)""" + return _limesdr_swig.sink_sptr_set_min_noutput_items(self, m) + + + def min_noutput_items(self): + """min_noutput_items(sink_sptr self) -> int""" + return _limesdr_swig.sink_sptr_min_noutput_items(self) + + + def max_output_buffer(self, i): + """max_output_buffer(sink_sptr self, int i) -> long""" + return _limesdr_swig.sink_sptr_max_output_buffer(self, i) + + + def set_max_output_buffer(self, *args): + """ + set_max_output_buffer(sink_sptr self, long max_output_buffer) + set_max_output_buffer(sink_sptr self, int port, long max_output_buffer) + """ + return _limesdr_swig.sink_sptr_set_max_output_buffer(self, *args) + + + def min_output_buffer(self, i): + """min_output_buffer(sink_sptr self, int i) -> long""" + return _limesdr_swig.sink_sptr_min_output_buffer(self, i) + + + def set_min_output_buffer(self, *args): + """ + set_min_output_buffer(sink_sptr self, long min_output_buffer) + set_min_output_buffer(sink_sptr self, int port, long min_output_buffer) + """ + return _limesdr_swig.sink_sptr_set_min_output_buffer(self, *args) + + + def pc_noutput_items(self): + """pc_noutput_items(sink_sptr self) -> float""" + return _limesdr_swig.sink_sptr_pc_noutput_items(self) + + + def pc_noutput_items_avg(self): + """pc_noutput_items_avg(sink_sptr self) -> float""" + return _limesdr_swig.sink_sptr_pc_noutput_items_avg(self) + + + def pc_noutput_items_var(self): + """pc_noutput_items_var(sink_sptr self) -> float""" + return _limesdr_swig.sink_sptr_pc_noutput_items_var(self) + + + def pc_nproduced(self): + """pc_nproduced(sink_sptr self) -> float""" + return _limesdr_swig.sink_sptr_pc_nproduced(self) + + + def pc_nproduced_avg(self): + """pc_nproduced_avg(sink_sptr self) -> float""" + return _limesdr_swig.sink_sptr_pc_nproduced_avg(self) + + + def pc_nproduced_var(self): + """pc_nproduced_var(sink_sptr self) -> float""" + return _limesdr_swig.sink_sptr_pc_nproduced_var(self) + + + def pc_input_buffers_full(self, *args): + """ + pc_input_buffers_full(sink_sptr self, int which) -> float + pc_input_buffers_full(sink_sptr self) -> pmt_vector_float + """ + return _limesdr_swig.sink_sptr_pc_input_buffers_full(self, *args) + + + def pc_input_buffers_full_avg(self, *args): + """ + pc_input_buffers_full_avg(sink_sptr self, int which) -> float + pc_input_buffers_full_avg(sink_sptr self) -> pmt_vector_float + """ + return _limesdr_swig.sink_sptr_pc_input_buffers_full_avg(self, *args) + + + def pc_input_buffers_full_var(self, *args): + """ + pc_input_buffers_full_var(sink_sptr self, int which) -> float + pc_input_buffers_full_var(sink_sptr self) -> pmt_vector_float + """ + return _limesdr_swig.sink_sptr_pc_input_buffers_full_var(self, *args) + + + def pc_output_buffers_full(self, *args): + """ + pc_output_buffers_full(sink_sptr self, int which) -> float + pc_output_buffers_full(sink_sptr self) -> pmt_vector_float + """ + return _limesdr_swig.sink_sptr_pc_output_buffers_full(self, *args) + + + def pc_output_buffers_full_avg(self, *args): + """ + pc_output_buffers_full_avg(sink_sptr self, int which) -> float + pc_output_buffers_full_avg(sink_sptr self) -> pmt_vector_float + """ + return _limesdr_swig.sink_sptr_pc_output_buffers_full_avg(self, *args) + + + def pc_output_buffers_full_var(self, *args): + """ + pc_output_buffers_full_var(sink_sptr self, int which) -> float + pc_output_buffers_full_var(sink_sptr self) -> pmt_vector_float + """ + return _limesdr_swig.sink_sptr_pc_output_buffers_full_var(self, *args) + + + def pc_work_time(self): + """pc_work_time(sink_sptr self) -> float""" + return _limesdr_swig.sink_sptr_pc_work_time(self) + + + def pc_work_time_avg(self): + """pc_work_time_avg(sink_sptr self) -> float""" + return _limesdr_swig.sink_sptr_pc_work_time_avg(self) + + + def pc_work_time_var(self): + """pc_work_time_var(sink_sptr self) -> float""" + return _limesdr_swig.sink_sptr_pc_work_time_var(self) + + + def pc_work_time_total(self): + """pc_work_time_total(sink_sptr self) -> float""" + return _limesdr_swig.sink_sptr_pc_work_time_total(self) + + + def pc_throughput_avg(self): + """pc_throughput_avg(sink_sptr self) -> float""" + return _limesdr_swig.sink_sptr_pc_throughput_avg(self) + + + def set_processor_affinity(self, mask): + """set_processor_affinity(sink_sptr self, std::vector< int,std::allocator< int > > const & mask)""" + return _limesdr_swig.sink_sptr_set_processor_affinity(self, mask) + + + def unset_processor_affinity(self): + """unset_processor_affinity(sink_sptr self)""" + return _limesdr_swig.sink_sptr_unset_processor_affinity(self) + + + def processor_affinity(self): + """processor_affinity(sink_sptr self) -> std::vector< int,std::allocator< int > >""" + return _limesdr_swig.sink_sptr_processor_affinity(self) + + + def active_thread_priority(self): + """active_thread_priority(sink_sptr self) -> int""" + return _limesdr_swig.sink_sptr_active_thread_priority(self) + + + def thread_priority(self): + """thread_priority(sink_sptr self) -> int""" + return _limesdr_swig.sink_sptr_thread_priority(self) + + + def set_thread_priority(self, priority): + """set_thread_priority(sink_sptr self, int priority) -> int""" + return _limesdr_swig.sink_sptr_set_thread_priority(self, priority) + + + def name(self): + """name(sink_sptr self) -> std::string""" + return _limesdr_swig.sink_sptr_name(self) + + + def symbol_name(self): + """symbol_name(sink_sptr self) -> std::string""" + return _limesdr_swig.sink_sptr_symbol_name(self) + + + def input_signature(self): + """input_signature(sink_sptr self) -> io_signature_sptr""" + return _limesdr_swig.sink_sptr_input_signature(self) + + + def output_signature(self): + """output_signature(sink_sptr self) -> io_signature_sptr""" + return _limesdr_swig.sink_sptr_output_signature(self) + + + def unique_id(self): + """unique_id(sink_sptr self) -> long""" + return _limesdr_swig.sink_sptr_unique_id(self) + + + def to_basic_block(self): + """to_basic_block(sink_sptr self) -> basic_block_sptr""" + return _limesdr_swig.sink_sptr_to_basic_block(self) + + + def check_topology(self, ninputs, noutputs): + """check_topology(sink_sptr self, int ninputs, int noutputs) -> bool""" + return _limesdr_swig.sink_sptr_check_topology(self, ninputs, noutputs) + + + def alias(self): + """alias(sink_sptr self) -> std::string""" + return _limesdr_swig.sink_sptr_alias(self) + + + def set_block_alias(self, name): + """set_block_alias(sink_sptr self, std::string name)""" + return _limesdr_swig.sink_sptr_set_block_alias(self, name) + + + def _post(self, which_port, msg): + """_post(sink_sptr self, swig_int_ptr which_port, swig_int_ptr msg)""" + return _limesdr_swig.sink_sptr__post(self, which_port, msg) + + + def message_ports_in(self): + """message_ports_in(sink_sptr self) -> swig_int_ptr""" + return _limesdr_swig.sink_sptr_message_ports_in(self) + + + def message_ports_out(self): + """message_ports_out(sink_sptr self) -> swig_int_ptr""" + return _limesdr_swig.sink_sptr_message_ports_out(self) + + + def message_subscribers(self, which_port): + """message_subscribers(sink_sptr self, swig_int_ptr which_port) -> swig_int_ptr""" + return _limesdr_swig.sink_sptr_message_subscribers(self, which_port) + +sink_sptr_swigregister = _limesdr_swig.sink_sptr_swigregister +sink_sptr_swigregister(sink_sptr) + + +sink_sptr.__repr__ = lambda self: "" % (self.name(), self.unique_id()) +sink = sink.make; + + + diff --git a/windows/Pothos_SDR/lib/python2.7/site-packages/limesdr/limesdr_swig.pyc b/windows/Pothos_SDR/lib/python2.7/site-packages/limesdr/limesdr_swig.pyc new file mode 100644 index 0000000..23b361b Binary files /dev/null and b/windows/Pothos_SDR/lib/python2.7/site-packages/limesdr/limesdr_swig.pyc differ diff --git a/windows/Pothos_SDR/lib/python2.7/site-packages/limesdr/limesdr_swig.pyo b/windows/Pothos_SDR/lib/python2.7/site-packages/limesdr/limesdr_swig.pyo new file mode 100644 index 0000000..23b361b Binary files /dev/null and b/windows/Pothos_SDR/lib/python2.7/site-packages/limesdr/limesdr_swig.pyo differ diff --git a/windows/Pothos_SDR/share/gnuradio/grc/blocks/limesdr_sink.xml b/windows/Pothos_SDR/share/gnuradio/grc/blocks/limesdr_sink.xml new file mode 100644 index 0000000..f973b70 --- /dev/null +++ b/windows/Pothos_SDR/share/gnuradio/grc/blocks/limesdr_sink.xml @@ -0,0 +1,825 @@ + + + LimeSuite Sink (TX) + limesdr_sink + [LimeSuite] + throttle + import limesdr + limesdr.sink($serial, + $device_type, + $chip_mode, + $channel, + $file_switch, + $filename, + $rf_freq, + $samp_rate, + $oversample, + $calibration_ch0, + $calibr_bandw_ch0, + $calibration_ch1, + $calibr_bandw_ch1, + $pa_path_mini, + $pa_path_ch0, + $pa_path_ch1, + $analog_filter_ch0, + $analog_bandw_ch0, + $analog_filter_ch1, + $analog_bandw_ch1, + $digital_filter_ch0, + $digital_bandw_ch0, + $digital_filter_ch1, + $digital_bandw_ch1, + $gain_dB_ch0, + $gain_dB_ch1, + $nco_freq_ch0, + $nco_freq_ch1, + $cmix_mode_ch0, + $cmix_mode_ch1) + + set_rf_freq($rf_freq) + set_pa_path($pa_path_mini,0) + set_pa_path($pa_path_ch0,0) + set_pa_path($pa_path_ch1,1) + set_nco($nco_freq_ch0,$cmix_mode_ch0,0) + set_nco($nco_freq_ch1,$cmix_mode_ch1,1) + set_analog_filter($analog_filter_ch0,$analog_bandw_ch0,0) + set_analog_filter($analog_filter_ch1,$analog_bandw_ch1,1) + set_digital_filter($digital_filter_ch0,$digital_bandw_ch0,0) + set_digital_filter($digital_filter_ch1,$digital_bandw_ch1,1) + set_gain($gain_dB_ch0,0) + set_gain($gain_dB_ch1,1) + + + General + CH0 + CH1 + + + + Device serial + serial + + string + none + + + + Device type + device_type + 2 + int + none + + + + + + Chip mode + chip_mode + 1 + int + none + + + + + + CH0 + channel + 0 + int + + #if $device_type() == 1 + all + #else if $chip_mode() == 2 + all + #else + none + #end if + + + + + + + Load settings + file_switch + 0 + int + none + + + + + + File + filename + + file_open + + #if $file_switch() == 0 + all + #else + none + #end if + + + + + RF frequency + rf_freq + 100e6 + float + + #if $file_switch() == 1 + all + #else + none + #end if + + + + + Sample rate + samp_rate + samp_rate + float + + #if $file_switch() == 1 + all + #else + none + #end if + + + + + Oversample + oversample + 0 + int + + #if $file_switch() == 1 + all + #else + none + #end if + + + + + + + + + + + + CH0:NCO frequency + nco_freq_ch0 + 0 + float + + #if $file_switch() == 1 + all + #else + none + #end if + + CH0 + + + + CH0:CMIX mode + cmix_mode_ch0 + 0 + int + + #if $file_switch() == 1 + all + #else + none + #end if + + + + CH0 + + + + CH0:Calibration + calibration_ch0 + 0 + int + + #if $file_switch() == 1 + all + #else + none + #end if + + + + CH0 + + + + CH0:Calibration bandw. + calibr_bandw_ch0 + 10e6 + float + + #if $calibration_ch0() == 0 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + CH0 + + + + CH0:PA path + pa_path_mini + 1 + int + + #if $device_type() == 2 + all + #else + none + #end if + + + + CH0 + + + + CH0:PA path + pa_path_ch0 + 1 + int + + #if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + + + CH0 + + + + CH0:Analog filter + analog_filter_ch0 + 1 + int + + #if $file_switch() == 1 + all + #else + none + #end if + + + + CH0 + + + + CH0:Analog filter bandw. + analog_bandw_ch0 + 5e6 + float + + #if $analog_filter_ch0() == 0 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + CH0 + + + + CH0:Digital filter + digital_filter_ch0 + 0 + int + + #if $file_switch() == 1 + all + #else + none + #end if + + + + CH0 + + + + CH0:Digital filter bandw. + digital_bandw_ch0 + 0 + float + + #if $digital_filter_ch0() == 0 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + CH0 + + + + CH0:Gain,dB + gain_dB_ch0 + 30 + int + + #if $file_switch() == 1 + all + #else + none + #end if + + CH0 + + + + CH1:NCO frequency + nco_freq_ch1 + 0 + float + + #if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + CH1 + + + + CH1:CMIX mode + cmix_mode_ch1 + 0 + int + + #if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + + + CH1 + + + + CH1:Calibration + calibration_ch1 + 0 + int + + #if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + + + CH1 + + + + CH1:Calibration bandw. + calibr_bandw_ch1 + 10e6 + float + + #if $calibration_ch1() == 0 + all + #else if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + CH1 + + + + CH1:PA path + pa_path_ch1 + 1 + int + + #if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + + + CH1 + + + + CH1:Analog filter + analog_filter_ch1 + 1 + int + + #if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + + + CH1 + + + + CH1:Analog filter bandw. + analog_bandw_ch1 + 5e6 + float + + #if $analog_filter_ch1() == 0 + all + #else if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + CH1 + + + + CH1:Digital filter + digital_filter_ch1 + 0 + int + + #if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + + + CH1 + + + + CH1:Digital filter bandw. + digital_bandw_ch1 + 0 + float + + #if $digital_filter_ch1() == 0 + all + #else if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + CH1 + + + + CH1:Gain,dB + gain_dB_ch1 + 30 + int + + #if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + CH1 + + + $device_type >= $chip_mode + $device_type >= 1 + 2 >= $device_type + + $chip_mode >= 1 + 2 >= $chip_mode + + $rf_freq > 0 + + $calibr_bandw_ch0 >= 2.5e6 + 120e6 >= $calibr_bandw_ch0 + + $calibr_bandw_ch1 >= 2.5e6 + 120e6 >= $calibr_bandw_ch1 + + $analog_bandw_ch0 >= 5e6 + 130e6 >= $analog_bandw_ch0 + + $analog_bandw_ch1 >= 5e6 + 130e6 >= $analog_bandw_ch1 + + $digital_bandw_ch0 >= 0 + $samp_rate >= $digital_bandw_ch0 + + $digital_bandw_ch1 >= 0 + $samp_rate >= $digital_bandw_ch1 + + $gain_dB_ch0 >= 0 + 60 >= $gain_dB_ch0 + + $gain_dB_ch1 >= 0 + 60 >= $gain_dB_ch1 + + $samp_rate > 0 + 61.44e6 >= $samp_rate + + + in + complex + $chip_mode + + + +------------------------------------------------------------------------------------------------------------------- +DEVICE SERIAL + +Device serial number obtained by running + + LimeUtil --find + +Cannot be left blank. +------------------------------------------------------------------------------------------------------------------- +DEVICE TYPE + +This setting lets you choose from predefined device type list and loads appropriate settings for the selected device. +Currently supported device types: LimeSDR-USB, LimeSDR-Mini. +------------------------------------------------------------------------------------------------------------------- +CHIP MODE + +Use this setting to choose between single-input and single-output (SISO)/multiple-input and multiple-output (MIMO) chip modes. + +Note: not all devices support MIMO mode. +------------------------------------------------------------------------------------------------------------------- +CH0 + +When in SISO mode select active channel as CH0. + +Note: not all devices have more than one channel. +------------------------------------------------------------------------------------------------------------------- +LOAD SETTINGS + +Enable loading settings from file. + +Note: setting must match in LimeSuite Source and Sink for the same device. +------------------------------------------------------------------------------------------------------------------- +FILE + +Generate .ini file with LimeSuite and select path. + +Note: setting must match in LimeSuite Source and Sink for the same device. +------------------------------------------------------------------------------------------------------------------- +CENTER FREQUENCY + +Set RF center frequency for TX (both channels). +LimeSDR-USB supports [100e3,3800e6] Hz. +LimeSDR-Mini supports [10e6,3800e6] Hz. +------------------------------------------------------------------------------------------------------------------- +SAMPLE RATE + +Here you can select sample rate for TX. + +LimeSDR-USB sample rate must be no more than 61.44e6 S/s. +LimeSDR-Mini sample rate must be no more than 30.72e6 S/s. + +Note: LimeSDR-Mini supports only the same sample rate for TX and RX. +------------------------------------------------------------------------------------------------------------------- +OVERSAMPLE + +Here you can select oversampling value for TX. Default value uses highest possible oversampling value. + +Note: LimeSDR-Mini supports only the same oversampling value for TX and RX. +------------------------------------------------------------------------------------------------------------------- +NCO FREQUENCY + +Adjust numerically controlled oscillator for each channel. 0 means that NCO is OFF. +------------------------------------------------------------------------------------------------------------------- +CMIX MODE + +Controls NCO direction for each channel. +------------------------------------------------------------------------------------------------------------------- +CALIBRATION + +Turn DC offset and IQ imbalance calibration ON/OFF for each channel. +------------------------------------------------------------------------------------------------------------------- +CALIBRATION BANDW. + +When calibration is turned ON this setting is used to set bandwidth for calibration for each channel. This value should be equal to your signal bandwidth. + +Calibration bandwidth range must be [2.5e6,120e6] Hz. +------------------------------------------------------------------------------------------------------------------- +PA PATH + +Select active power amplifier path of each channel. +------------------------------------------------------------------------------------------------------------------- +ANALOG FILTER + +Turn low-pass filter ON/OFF for each channel. +------------------------------------------------------------------------------------------------------------------- +ANALOG FILTER BANDW. + +Enter analog filter bandwidth for each channel. +Analog filter bandwidth range must be [5e6,130e6] Hz. +------------------------------------------------------------------------------------------------------------------- +DIGITAL FILTER + +Turn digital filters (GFIR) ON/OFF for each channel. +------------------------------------------------------------------------------------------------------------------- +DIGITAL FILTER BANDW. + +Enter digital filter bandwidth for each channel. Bandwidth should not be higher than sample rate. +------------------------------------------------------------------------------------------------------------------- +GAIN + +Controls combined TX gain settings. Gain range must be [0,60] dB. +------------------------------------------------------------------------------------------------------------------- + + diff --git a/windows/Pothos_SDR/share/gnuradio/grc/blocks/limesdr_source.xml b/windows/Pothos_SDR/share/gnuradio/grc/blocks/limesdr_source.xml new file mode 100644 index 0000000..3e436cc --- /dev/null +++ b/windows/Pothos_SDR/share/gnuradio/grc/blocks/limesdr_source.xml @@ -0,0 +1,833 @@ + + + LimeSuite Source (RX) + limesdr_source + [LimeSuite] + throttle + import limesdr + limesdr.source($serial, + $device_type, + $chip_mode, + $channel, + $file_switch, + $filename, + $rf_freq, + $samp_rate, + $oversample, + $calibration_ch0, + $calibr_bandw_ch0, + $calibration_ch1, + $calibr_bandw_ch1, + $lna_path_mini, + $lna_path_ch0, + $lna_path_ch1, + $analog_filter_ch0, + $analog_bandw_ch0, + $analog_filter_ch1, + $analog_bandw_ch1, + $digital_filter_ch0, + $digital_bandw_ch0, + $digital_filter_ch1, + $digital_bandw_ch1, + $gain_dB_ch0, + $gain_dB_ch1, + $nco_freq_ch0, + $nco_freq_ch1, + $cmix_mode_ch0, + $cmix_mode_ch1) + + set_rf_freq($rf_freq) + set_lna_path($lna_path_mini,0) + set_lna_path($lna_path_ch0,0) + set_lna_path($lna_path_ch1,1) + set_nco($nco_freq_ch0,$cmix_mode_ch0,0) + set_nco($nco_freq_ch1,$cmix_mode_ch1,1) + set_analog_filter($analog_filter_ch0,$analog_bandw_ch0,0) + set_analog_filter($analog_filter_ch1,$analog_bandw_ch1,1) + set_digital_filter($digital_filter_ch0,$digital_bandw_ch0,0) + set_digital_filter($digital_filter_ch1,$digital_bandw_ch1,1) + set_gain($gain_dB_ch0,0) + set_gain($gain_dB_ch1,1) + + + General + CH0 + CH1 + + + + Device serial + serial + + string + none + + + + Device type + device_type + 2 + int + none + + + + + + Chip mode + chip_mode + 1 + int + none + + + + + + CH0 + channel + 0 + int + + #if $device_type() == 1 + all + #else if $chip_mode() == 2 + all + #else + none + #end if + + + + + + + Load settings + file_switch + 0 + int + none + + + + + + File + filename + + file_open + + #if $file_switch() == 0 + all + #else + none + #end if + + + + + RF frequency + rf_freq + 100e6 + float + + #if $file_switch() == 1 + all + #else + none + #end if + + + + + Sample rate + samp_rate + samp_rate + float + + #if $file_switch() == 1 + all + #else + none + #end if + + + + + Oversample + oversample + 0 + int + + #if $file_switch() == 1 + all + #else + none + #end if + + + + + + + + + + + + CH0:NCO frequency + nco_freq_ch0 + 0 + float + + #if $file_switch() == 1 + all + #else + none + #end if + + CH0 + + + + CH0:CMIX mode + cmix_mode_ch0 + 0 + int + + #if $file_switch() == 1 + all + #else + none + #end if + + + + CH0 + + + + CH0:Calibration + calibration_ch0 + 0 + int + + #if $file_switch() == 1 + all + #else + none + #end if + + + + CH0 + + + + CH0:Calibration bandw. + calibr_bandw_ch0 + 10e6 + float + + #if $calibration_ch0() == 0 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + CH0 + + + + CH0:LNA path + lna_path_mini + 3 + int + + #if $device_type() == 2 + all + #else + none + #end if + + + + CH0 + + + + CH0:LNA path + lna_path_ch0 + 2 + int + + #if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + + + + CH0 + + + + CH0:Analog filter + analog_filter_ch0 + 1 + int + + #if $file_switch() == 1 + all + #else + none + #end if + + + + CH0 + + + + CH0:Analog filter bandw. + analog_bandw_ch0 + 5e6 + float + + #if $analog_filter_ch0() == 0 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + CH0 + + + + CH0:Digital filter + digital_filter_ch0 + 0 + int + + #if $file_switch() == 1 + all + #else + none + #end if + + + + CH0 + + + + CH0:Digital filter bandw. + digital_bandw_ch0 + 0 + float + + #if $digital_filter_ch0() == 0 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + CH0 + + + + CH0:Gain,dB + gain_dB_ch0 + 30 + int + + #if $file_switch() == 1 + all + #else + none + #end if + + CH0 + + + + CH1:NCO frequency + nco_freq_ch1 + 0 + float + + #if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + CH1 + + + + CH1:CMIX mode + cmix_mode_ch1 + 0 + int + + #if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + + + CH1 + + + + CH1:Calibration + calibration_ch1 + 0 + int + + #if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + + + CH1 + + + + CH1:Calibration bandw. + calibr_bandw_ch1 + 10e6 + float + + #if $calibration_ch1() == 0 + all + #else if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + CH1 + + + + CH1:LNA path + lna_path_ch1 + 2 + int + + #if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + + + + CH1 + + + + CH1:Analog filter + analog_filter_ch1 + 1 + int + + #if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + + + CH1 + + + + CH1:Analog filter bandw. + analog_bandw_ch1 + 5e6 + float + + #if $analog_filter_ch1() == 0 + all + #else if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + CH1 + + + + CH1:Digital filter + digital_filter_ch1 + 0 + int + + #if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + + + CH1 + + + + CH1:Digital filter bandw. + digital_bandw_ch1 + 0 + float + + #if $digital_filter_ch1() == 0 + all + #else if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + CH1 + + + + CH1:Gain,dB + gain_dB_ch1 + 30 + int + + #if $chip_mode() == 1 + all + #else if $device_type() == 1 + all + #else if $file_switch() == 1 + all + #else + none + #end if + + CH1 + + + $device_type >= $chip_mode + $device_type >= 1 + 2 >= $device_type + + $chip_mode >= 1 + 2 >= $chip_mode + + $rf_freq > 0 + + $calibr_bandw_ch0 >= 2.5e6 + 120e6 >= $calibr_bandw_ch0 + + $calibr_bandw_ch1 >= 2.5e6 + 120e6 >= $calibr_bandw_ch1 + + $analog_bandw_ch0 >= 1.5e6 + 130e6 >= $analog_bandw_ch0 + + $analog_bandw_ch1 >= 1.5e6 + 130e6 >= $analog_bandw_ch1 + + $digital_bandw_ch0 >= 0 + $samp_rate >= $digital_bandw_ch0 + + $digital_bandw_ch1 >= 0 + $samp_rate >= $digital_bandw_ch1 + + $gain_dB_ch0 >= 0 + 70 >= $gain_dB_ch0 + + $gain_dB_ch1 >= 0 + 70 >= $gain_dB_ch1 + + $samp_rate > 0 + 61.44e6 >= $samp_rate + + + out + complex + $chip_mode + + + +------------------------------------------------------------------------------------------------------------------- +DEVICE SERIAL + +Device serial number obtained by running + + LimeUtil --find + +Cannot be left blank. +------------------------------------------------------------------------------------------------------------------- +DEVICE TYPE + +This setting lets you choose from predefined device type list and loads appropriate settings for the selected device. +Currently supported device types: LimeSDR-USB, LimeSDR-Mini. +------------------------------------------------------------------------------------------------------------------- +CHIP MODE + +Use this setting to choose between single-input and single-output (SISO)/multiple-input and multiple-output (MIMO) chip modes. + +Note: not all devices support MIMO mode. +------------------------------------------------------------------------------------------------------------------- +CH0 + +When in SISO mode select active channel as CH0. + +Note: not all devices have more than one channel. +------------------------------------------------------------------------------------------------------------------- +LOAD SETTINGS + +Enable loading settings from file. + +Note: setting must match in LimeSuite Source and Sink for the same device. +------------------------------------------------------------------------------------------------------------------- +FILE + +Generate .ini file with LimeSuite and select path. + +Note: setting must match in LimeSuite Source and Sink for the same device. +------------------------------------------------------------------------------------------------------------------- +RF FREQUENCY + +Set RF center frequency for RX (both channels). +LimeSDR-USB supports [100e3,3800e6] Hz. +LimeSDR-Mini supports [10e6,3800e6] Hz. +------------------------------------------------------------------------------------------------------------------- +SAMPLE RATE + +Here you can select sample rate for RX. + +LimeSDR-USB sample rate must be no more than 61.44e6 S/s. +LimeSDR-Mini sample rate must be no more than 30.72e6 S/s. + +Note: LimeSDR-Mini supports only the same sample rate for TX and RX. +------------------------------------------------------------------------------------------------------------------- +OVERSAMPLE + +Here you can select oversampling value for RX. Default value uses highest possible oversampling value. + +Note: LimeSDR-Mini supports only the same oversampling value for TX and RX. +------------------------------------------------------------------------------------------------------------------- +NCO FREQUENCY + +Adjust numerically controlled oscillator for each channel. 0 means that NCO is OFF. +------------------------------------------------------------------------------------------------------------------- +CMIX MODE + +Controls NCO direction for each channel. +------------------------------------------------------------------------------------------------------------------- +CALIBRATION + +Turn DC offset and IQ imbalance calibration ON/OFF for each channel. +------------------------------------------------------------------------------------------------------------------- +CALIBRATION BANDW. + +When calibration is turned ON this setting is used to set bandwidth for calibration for each channel. This value should be equal to your signal bandwidth. + +Calibration bandwidth range must be [2.5e6,120e6] Hz. +------------------------------------------------------------------------------------------------------------------- +LNA PATH + +Select active low-noise amplifier path of each channel. +------------------------------------------------------------------------------------------------------------------- +ANALOG FILTER + +Turn low-pass filter ON/OFF for each channel. When OFF device uses default values. +------------------------------------------------------------------------------------------------------------------- +ANALOG FILTER BANDW. + +Enter analog filter bandwidth for each channel. +Analog filter bandwidth range must be [1.5e6,130e6] Hz. +------------------------------------------------------------------------------------------------------------------- +DIGITAL FILTER + +Turn digital filters (GFIR) ON/OFF for each channel. +------------------------------------------------------------------------------------------------------------------- +DIGITAL FILTER BANDW. + +Enter digital filter bandwidth for each channel. Bandwidth should not be higher than sample rate. +------------------------------------------------------------------------------------------------------------------- +GAIN + +Controls combined RX gain settings. Gain range must be [0,70] dB. +------------------------------------------------------------------------------------------------------------------- + +