From 474f78f5009f8795e734fe6d1144c0db9cf24bf8 Mon Sep 17 00:00:00 2001 From: Javier Date: Tue, 3 Mar 2015 18:07:26 +0100 Subject: [PATCH] New Teleorbit Flexiband adapter for Teleorbit Flexiband frontends (optional signal source). It requires a external GNU Radio driver. --- CMakeLists.txt | 24 +- cmake/Modules/FindTeleorbit.cmake | 29 ++ ...ultichannel_GPS_L1_Flexiband_realtime.conf | 276 ++++++++++++++++++ .../signal_source/adapters/CMakeLists.txt | 22 ++ .../adapters/flexiband_signal_source.cc | 146 +++++++++ .../adapters/flexiband_signal_source.h | 106 +++++++ src/core/receiver/CMakeLists.txt | 4 + src/core/receiver/gnss_block_factory.cc | 13 + 8 files changed, 616 insertions(+), 4 deletions(-) create mode 100644 cmake/Modules/FindTeleorbit.cmake create mode 100644 conf/gnss-sdr_multichannel_GPS_L1_Flexiband_realtime.conf create mode 100644 src/algorithms/signal_source/adapters/flexiband_signal_source.cc create mode 100644 src/algorithms/signal_source/adapters/flexiband_signal_source.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 73af2aedb..506176df1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -37,6 +37,7 @@ file(RELATIVE_PATH RELATIVE_CMAKE_CALL ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRE option(ENABLE_GN3S "Enable the use of the GN3S dongle as signal source (experimental)" OFF) option(ENABLE_ARRAY "Enable the use of CTTC's antenna array front-end as signal source (experimental)" OFF) +option(ENABLE_FLEXIBAND "Enable the use of the signal source adater for the Teleorbit Flexiband GNURadio driver" OFF) option(ENABLE_OSMOSDR "Enable the use of OsmoSDR and other front-ends (RTL-based dongles, HackRF, bladeRF, etc.) as signal source (experimental)" OFF) option(ENABLE_OPENCL "Enable building of processing blocks implemented with OpenCL (experimental)" OFF) option(ENABLE_GPERFTOOLS "Enable linking to Gperftools libraries (tcmalloc and profiler)" OFF) @@ -948,9 +949,11 @@ if($ENV{RAW_ARRAY_DRIVER}) message(STATUS "RAW_ARRAY_DRIVER environment variable found." ) set(ENABLE_ARRAY ON) endif($ENV{RAW_ARRAY_DRIVER}) + if(RAW_ARRAY_DRIVER) set(ENABLE_ARRAY ON) endif(RAW_ARRAY_DRIVER) + if(ENABLE_ARRAY) message(STATUS "CTTC's Antenna Array front-end driver will be compiled." ) message(STATUS "You can disable it with 'cmake -DENABLE_ARRAY=OFF ../'" ) @@ -961,14 +964,11 @@ else(ENABLE_ARRAY) message(STATUS "Enable it with 'cmake -DENABLE_ARRAY=ON ../' to add support for the CTTC experimental array front-end." ) endif(ENABLE_ARRAY) - if($ENV{RTLSDR_DRIVER}) message(STATUS "RTLSDR_DRIVER environment variable found." ) set(ENABLE_OSMOSDR ON) endif($ENV{RTLSDR_DRIVER}) -if(RAW_ARRAY_DRIVER) - set(ENABLE_OSMOSDR ON) -endif(RAW_ARRAY_DRIVER) + if(ENABLE_OSMOSDR) message(STATUS "The driver for OsmoSDR and other front-ends (HackRF, bladeRF, Realtek's RTL2832U-based dongles, etc.) will be compiled." ) message(STATUS "You can disable it with 'cmake -DENABLE_OSMOSDR=OFF ../'" ) @@ -977,6 +977,22 @@ else(ENABLE_OSMOSDR) message(STATUS "Enable it with 'cmake -DENABLE_OSMOSDR=ON ../' to add support for OsmoSDR and other front-ends (HackRF, bladeRF, Realtek's RTL2832U-based USB dongles, etc.)" ) endif(ENABLE_OSMOSDR) +if($ENV{FLEXIBAND_DRIVER}) + message(STATUS "FLEXIBAND_DRIVER environment variable found." ) + set(ENABLE_FLEXIBAND ON) +endif($ENV{FLEXIBAND_DRIVER}) + +if(FLEXIBAND_DRIVER) + set(ENABLE_FLEXIBAND ON) +endif(FLEXIBAND_DRIVER) + +if(ENABLE_FLEXIBAND) + message(STATUS "CTTC's Antenna Array front-end driver will be compiled." ) + message(STATUS "You can disable it with 'cmake -DENABLE_FLEXIBAND=OFF ../'" ) +else(ENABLE_FLEXIBAND) + message(STATUS "The (optional) Teleorbit Flexiband front-end driver adapter is not enabled." ) + message(STATUS "Enable it with 'cmake -DENABLE_FLEXIBAND=ON ../' to add support for the Teleorbit Flexiband front-end." ) +endif(ENABLE_FLEXIBAND) ######################################################################## # Set compiler flags diff --git a/cmake/Modules/FindTeleorbit.cmake b/cmake/Modules/FindTeleorbit.cmake new file mode 100644 index 000000000..0d2d3c505 --- /dev/null +++ b/cmake/Modules/FindTeleorbit.cmake @@ -0,0 +1,29 @@ +INCLUDE(FindPkgConfig) +PKG_CHECK_MODULES(PC_TELEORBIT teleorbit) + +FIND_PATH( + TELEORBIT_INCLUDE_DIRS + NAMES teleorbit/api.h + HINTS $ENV{TELEORBIT_DIR}/include + ${PC_TELEORBIT_INCLUDEDIR} + PATHS ${CMAKE_INSTALL_PREFIX}/include + /usr/local/include + /usr/include +) + +FIND_LIBRARY( + TELEORBIT_LIBRARIES + NAMES gnuradio-teleorbit + HINTS $ENV{TELEORBIT_DIR}/lib + ${PC_TELEORBIT_LIBDIR} + PATHS ${CMAKE_INSTALL_PREFIX}/lib + ${CMAKE_INSTALL_PREFIX}/lib64 + /usr/local/lib + /usr/local/lib64 + /usr/lib + /usr/lib64 +) + +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(TELEORBIT DEFAULT_MSG TELEORBIT_LIBRARIES TELEORBIT_INCLUDE_DIRS) +MARK_AS_ADVANCED(TELEORBIT_LIBRARIES TELEORBIT_INCLUDE_DIRS) diff --git a/conf/gnss-sdr_multichannel_GPS_L1_Flexiband_realtime.conf b/conf/gnss-sdr_multichannel_GPS_L1_Flexiband_realtime.conf new file mode 100644 index 000000000..48e72ca1d --- /dev/null +++ b/conf/gnss-sdr_multichannel_GPS_L1_Flexiband_realtime.conf @@ -0,0 +1,276 @@ +; Default configuration file +; You can define your own receiver and invoke it by doing +; gnss-sdr --config_file=my_GNSS_SDR_configuration.conf +; + +[GNSS-SDR] + +;######### GLOBAL OPTIONS ################## +;internal_fs_hz: Internal signal sampling frequency after the signal conditioning stage [Hz]. +GNSS-SDR.internal_fs_hz=4000000 + +;######### CONTROL_THREAD CONFIG ############ +ControlThread.wait_for_flowgraph=false + +;######### SUPL RRLP GPS assistance configuration ##### +GNSS-SDR.SUPL_gps_enabled=false +GNSS-SDR.SUPL_read_gps_assistance_xml=true +GNSS-SDR.SUPL_gps_ephemeris_server=supl.nokia.com +GNSS-SDR.SUPL_gps_ephemeris_port=7275 +GNSS-SDR.SUPL_gps_acquisition_server=supl.google.com +GNSS-SDR.SUPL_gps_acquisition_port=7275 +GNSS-SDR.SUPL_MCC=244 +GNSS-SDR.SUPL_MNS=5 +GNSS-SDR.SUPL_LAC=0x59e2 +GNSS-SDR.SUPL_CI=0x31b0 + +;######### SIGNAL_SOURCE CONFIG ############ +;#implementation: Use [File_Signal_Source] or [UHD_Signal_Source] or [GN3S_Signal_Source] (experimental) +SignalSource.implementation=Flexiband_Signal_Source + +;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. +SignalSource.item_type=gr_complex + +;# FPGA firmware file +SignalSource.firmware_file=flexiband_I-1b.bit + +;#RF_channels: Number of RF channels present in the frontend device, must agree the FPGA firmware file +SignalSource.RF_channels=1 + +;#frontend channels gain. Not usable yet! +SignalSource.gain1=0 +SignalSource.gain2=0 +SignalSource.gain3=0 + +;#frontend channels AGC +SignalSource.AGC=true + +;# USB 3.0 packet buffer size (number of SuperSpeed packets) +SignalSource.usb_packet_buffer=128 + +;######### SIGNAL_CONDITIONER 0 CONFIG ############ +;## It holds blocks to change data type, filter and resample input data. +SignalConditioner0.implementation=Pass_Through + +;######### DATA_TYPE_ADAPTER 0 CONFIG ############ +DataTypeAdapter0.implementation=Pass_Through +DataTypeAdapter0.item_type=gr_complex + +;######### INPUT_FILTER 0 CONFIG ############ +InputFilter0.implementation=Pass_Through + +;#dump: Dump the filtered data to a file. +InputFilter0.dump=false + +;#dump_filename: Log path and filename. +InputFilter0.dump_filename=../data/input_filter.dat + +;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. +InputFilter0.input_item_type=gr_complex + +;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. +InputFilter0.output_item_type=gr_complex + +;######### RESAMPLER CONFIG 0 ############ +;## Resamples the input data. +Resampler0.implementation=Pass_Through + +;######### SIGNAL_CONDITIONER 1 CONFIG ############ +;## It holds blocks to change data type, filter and resample input data. +SignalConditioner1.implementation=Pass_Through + +;######### DATA_TYPE_ADAPTER 1 CONFIG ############ +DataTypeAdapter1.implementation=Pass_Through +DataTypeAdapter1.item_type=gr_complex + +;######### INPUT_FILTER 1 CONFIG ############ +InputFilter1.implementation=Pass_Through + +;#dump: Dump the filtered data to a file. +InputFilter1.dump=false + +;#dump_filename: Log path and filename. +InputFilter1.dump_filename=../data/input_filter.dat + +;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. +InputFilter1.input_item_type=gr_complex + +;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. +InputFilter1.output_item_type=gr_complex + +;######### RESAMPLER CONFIG 1 ############ +;## Resamples the input data. +Resampler1.implementation=Pass_Through + +;######### SIGNAL_CONDITIONER 2 CONFIG ############ +;## It holds blocks to change data type, filter and resample input data. +SignalConditioner2.implementation=Pass_Through + +;######### DATA_TYPE_ADAPTER 2 CONFIG ############ +DataTypeAdapter2.implementation=Pass_Through +DataTypeAdapter2.item_type=gr_complex + +;######### INPUT_FILTER 2 CONFIG ############ +InputFilter2.implementation=Pass_Through + +;#dump: Dump the filtered data to a file. +InputFilter2.dump=false + +;#dump_filename: Log path and filename. +InputFilter2.dump_filename=../data/input_filter.dat + +;#input_item_type: Type and resolution for input signal samples. Use only gr_complex in this version. +InputFilter2.input_item_type=gr_complex + +;#outut_item_type: Type and resolution for output filtered signal samples. Use only gr_complex in this version. +InputFilter2.output_item_type=gr_complex + +;######### RESAMPLER CONFIG 2 ############ +;## Resamples the input data. +Resampler2.implementation=Pass_Through + +;######### CHANNELS GLOBAL CONFIG ############ +;#count: Number of available GPS satellite channels. +Channels_GPS.count=2 +;#count: Number of available Galileo satellite channels. +Channels_Galileo.count=0 +;#in_acquisition: Number of channels simultaneously acquiring for the whole receiver +Channels.in_acquisition=1 +;#system: GPS, GLONASS, GALILEO, SBAS or COMPASS +;#if the option is disabled by default is assigned GPS +Channel.system=GPS + +;# CHANNEL CONNECTION +Channel0.RF_channel_ID=0 +Channel1.RF_channel_ID=0 + +;#signal: +;#if the option is disabled by default is assigned "1C" GPS L1 C/A +Channel.signal=1C + +;######### SPECIFIC CHANNELS CONFIG ###### +;#The following options are specific to each channel and overwrite the generic options + + +;######### ACQUISITION GLOBAL CONFIG ############ + +;#dump: Enable or disable the acquisition internal data file logging [true] or [false] +Acquisition_GPS.dump=false +;#filename: Log path and filename +Acquisition_GPS.dump_filename=./acq_dump.dat +;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. +Acquisition_GPS.item_type=gr_complex +;#if: Signal intermediate frequency in [Hz] +Acquisition_GPS.if=0 +;#sampled_ms: Signal block duration for the acquisition signal detection [ms] +Acquisition_GPS.coherent_integration_time_ms=1 +;#implementation: Acquisition algorithm selection for this channel: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] +Acquisition_GPS.implementation=GPS_L1_CA_PCPS_Acquisition +;#threshold: Acquisition threshold. It will be ignored if pfa is defined. +Acquisition_GPS.threshold=0.02 +;#pfa: Acquisition false alarm probability. This option overrides the threshold option. Only use with implementations: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition] +;Acquisition_GPS.pfa=0.0001 +;#doppler_max: Maximum expected Doppler shift [Hz] +Acquisition_GPS.doppler_max=8000 +;#doppler_max: Doppler step in the grid search [Hz] +Acquisition_GPS.doppler_step=500 +;#bit_transition_flag: Enable or disable a strategy to deal with bit transitions in GPS signals: process two dwells and take +;#maximum test statistics. Only use with implementation: [GPS_L1_CA_PCPS_Acquisition] +;#(should not be used for Galileo_E1_PCPS_Ambiguous_Acquisition]) +Acquisition_GPS.bit_transition_flag=false +;#max_dwells: Maximum number of consecutive dwells to be processed. It will be ignored if bit_transition_flag=true +Acquisition_GPS.max_dwells=1 + + +;######### ACQUISITION CHANNELS CONFIG ###### +;#The following options are specific to each channel and overwrite the generic options + + +;######### TRACKING GLOBAL CONFIG ############ + +;#implementation: Selected tracking algorithm: [GPS_L1_CA_DLL_PLL_Tracking] or [GPS_L1_CA_DLL_FLL_PLL_Tracking] +Tracking_GPS.implementation=GPS_L1_CA_DLL_PLL_Optim_Tracking +;#item_type: Type and resolution for each of the signal samples. Use only [gr_complex] in this version. +Tracking_GPS.item_type=gr_complex + +;#sampling_frequency: Signal Intermediate Frequency in [Hz] +Tracking_GPS.if=0 + +;#dump: Enable or disable the Tracking internal binary data file logging [true] or [false] +Tracking_GPS.dump=false + +;#dump_filename: Log path and filename. Notice that the tracking channel will add "x.dat" where x is the channel number. +Tracking_GPS.dump_filename=./tracking_ch_ + +;#pll_bw_hz: PLL loop filter bandwidth [Hz] +Tracking_GPS.pll_bw_hz=50.0; + +;#dll_bw_hz: DLL loop filter bandwidth [Hz] +Tracking_GPS.dll_bw_hz=2.0; + +;#fll_bw_hz: FLL loop filter bandwidth [Hz] +Tracking_GPS.fll_bw_hz=10.0; + +;#order: PLL/DLL loop filter order [2] or [3] +Tracking_GPS.order=3; + +;#early_late_space_chips: correlator early-late space [chips]. Use [0.5] +Tracking_GPS.early_late_space_chips=0.5; + +;######### TELEMETRY DECODER GPS CONFIG ############ +;#implementation: Use [GPS_L1_CA_Telemetry_Decoder] for GPS L1 C/A +TelemetryDecoder_GPS.implementation=GPS_L1_CA_Telemetry_Decoder +TelemetryDecoder_GPS.dump=false +;#decimation factor +TelemetryDecoder_GPS.decimation_factor=1; + +;######### OBSERVABLES CONFIG ############ +;#implementation: Use [GPS_L1_CA_Observables] for GPS L1 C/A. +Observables.implementation=GPS_L1_CA_Observables + +;#dump: Enable or disable the Observables internal binary data file logging [true] or [false] +Observables.dump=false + +;#dump_filename: Log path and filename. +Observables.dump_filename=./observables.dat + + +;######### PVT CONFIG ############ +;#implementation: Position Velocity and Time (PVT) implementation algorithm: Use [GPS_L1_CA_PVT] in this version. +PVT.implementation=GPS_L1_CA_PVT + +;#averaging_depth: Number of PVT observations in the moving average algorithm +PVT.averaging_depth=10 + +;#flag_average: Enables the PVT averaging between output intervals (arithmetic mean) [true] or [false] +PVT.flag_averaging=true + +;#output_rate_ms: Period between two PVT outputs. Notice that the minimum period is equal to the tracking integration time (for GPS CA L1 is 1ms) [ms] +PVT.output_rate_ms=100 + +;#display_rate_ms: Position console print (std::out) interval [ms]. Notice that output_rate_ms<=display_rate_ms. +PVT.display_rate_ms=500 + +;# RINEX, KML, and NMEA output configuration + +;#dump_filename: Log path and filename without extension. Notice that PVT will add ".dat" to the binary dump and ".kml" to GoogleEarth dump. +PVT.dump_filename=./PVT + +;#nmea_dump_filename: NMEA log path and filename +PVT.nmea_dump_filename=./gnss_sdr_pvt.nmea; + +;#flag_nmea_tty_port: Enable or disable the NMEA log to a serial TTY port (Can be used with real hardware or virtual one) +PVT.flag_nmea_tty_port=false; + +;#nmea_dump_devname: serial device descriptor for NMEA logging +PVT.nmea_dump_devname=/dev/pts/4 + + +;#dump: Enable or disable the PVT internal binary data file logging [true] or [false] +PVT.dump=false + +;######### OUTPUT_FILTER CONFIG ############ +;# Receiver output filter: Leave this block disabled in this version +OutputFilter.implementation=Null_Sink_Output_Filter +OutputFilter.filename=data/gnss-sdr.dat +OutputFilter.item_type=gr_complex diff --git a/src/algorithms/signal_source/adapters/CMakeLists.txt b/src/algorithms/signal_source/adapters/CMakeLists.txt index 9eb7c8f4b..c8c753b36 100644 --- a/src/algorithms/signal_source/adapters/CMakeLists.txt +++ b/src/algorithms/signal_source/adapters/CMakeLists.txt @@ -51,6 +51,28 @@ if(ENABLE_GN3S) ) endif(ENABLE_GN3S) +if(ENABLE_FLEXIBAND) + ############################################## + # TELEORBIT FLEXIBAND FRONTEND ADAPTER + ############################################## + if(OS_IS_MACOSX) + set(MACOSX_ARGS "-DCMAKE_CXX_COMPILER=/usr/bin/clang++") + endif(OS_IS_MACOSX) + find_package(teleorbit REQUIRED) + if(NOT TELEORBIT_FOUND) + message(FATAL_ERROR "Teleorbit Flexiband GNURadio driver required to build gnss-sdr with the optional FLEXIBAND adapter") + endif(NOT TELEORBIT_FOUND) + + # Set up variables + set(FLEXIBAND_DRIVER_INCLUDE_DIRS + ${OPT_DRIVER_INCLUDE_DIRS} + ${TELEORBIT_INCLUDE_DIR}/teleorbit + ) + set(OPT_LIBRARIES ${OPT_LIBRARIES} ${TELEORBIT_LIBRARIES}) + set(OPT_DRIVER_INCLUDE_DIRS ${OPT_DRIVER_INCLUDE_DIRS} ${FLEXIBAND_DRIVER_INCLUDE_DIRS}) + set(OPT_DRIVER_SOURCES ${OPT_DRIVER_SOURCES} flexiband_signal_source.cc) +endif(ENABLE_FLEXIBAND) + if(ENABLE_ARRAY) ############################################## diff --git a/src/algorithms/signal_source/adapters/flexiband_signal_source.cc b/src/algorithms/signal_source/adapters/flexiband_signal_source.cc new file mode 100644 index 000000000..4e5b670a6 --- /dev/null +++ b/src/algorithms/signal_source/adapters/flexiband_signal_source.cc @@ -0,0 +1,146 @@ +/*! + * \file raw_array_signal_source.cc + * \brief CTTC Experimental GNSS 8 channels array signal source + * \author Javier Arribas, jarribas(at)cttc.es + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2015 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GNSS-SDR is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#include "flexiband_signal_source.h" +#include +#include +#include +#include +#include "configuration_interface.h" + + +using google::LogMessage; + +FlexibandSignalSource::FlexibandSignalSource(ConfigurationInterface* configuration, + std::string role, unsigned int in_stream, unsigned int out_stream, gr::msg_queue::sptr queue) : + role_(role), in_stream_(in_stream), out_stream_(out_stream), queue_(queue) +{ + std::string default_item_type = "byte"; + item_type_ = configuration->property(role + ".item_type", default_item_type); + + std::string default_firmware_file = "flexiband_I-1b.bit"; + firmware_filename_ = configuration->property(role + ".firmware_file", default_firmware_file); + + gain1_ = configuration->property(role + ".gain1", 0); // check gain DAC values for Flexiband frontend! + gain2_ = configuration->property(role + ".gain2", 0); // check gain DAC values for Flexiband frontend! + gain3_ = configuration->property(role + ".gain3", 0); // check gain DAC values for Flexiband frontend! + + AGC_ = configuration->property(role + ".AGC", true); // enabed AGC by default + + usb_packet_buffer_size_ =configuration->property(role + ".usb_packet_buffer", 128); + + RF_channels_ = configuration->property(role + ".RF_channels", 1); + + if (item_type_.compare("gr_complex") == 0) + { + item_size_ = sizeof(gr_complex); + flexiband_source_ = gr::teleorbit::frontend::make(firmware_filename_.c_str(),gain1_,gain2_,gain3_, AGC_, usb_packet_buffer_size_); + + //create I, Q -> gr_complex type conversion blocks + for (int n=0;n<(RF_channels_*2);n++) + { + char_to_float.push_back(gr::blocks::char_to_float::make()); + float_to_complex_.push_back(gr::blocks::float_to_complex::make()); + } + + for (int n=0;n<(RF_channels_);n++) + { + float_to_complex_.push_back(gr::blocks::float_to_complex::make()); + } + + DLOG(INFO) << "Item size " << item_size_; + DLOG(INFO) << "Firmware file "<unique_id() << ")"; + + }else + { + LOG(WARNING) << item_type_ << " unrecognized item type for flexiband_source_"; + item_size_ = sizeof(gr_complex); + } +} + + + +FlexibandSignalSource::~FlexibandSignalSource() +{} + + + +void FlexibandSignalSource::connect(gr::top_block_sptr top_block) +{ + for (int n=0;n<(RF_channels_*2);n++) + { + top_block->connect(flexiband_source_, n, char_to_float.at(n), 0); + DLOG(INFO) << "connected flexiband_source_ to char_to_float CH"<connect(char_to_float.at(n*2), 0, float_to_complex_.at(n*2), 0); + top_block->connect(char_to_float.at(n*2+1), 0, float_to_complex_.at(n*2+1), 0); + DLOG(INFO) << "connected char_to_float to float_to_complex_ CH"<disconnect(flexiband_source_, n, char_to_float.at(n), 0); + DLOG(INFO) << "disconnect flexiband_source_ to char_to_float CH"<disconnect(char_to_float.at(n*2), 0, float_to_complex_.at(n*2), 0); + top_block->disconnect(char_to_float.at(n*2+1), 0, float_to_complex_.at(n*2+1), 0); + DLOG(INFO) << "disconnect char_to_float to float_to_complex_ CH"<. + * + * ------------------------------------------------------------------------- + */ + + +#ifndef FLEXIBAND_SIGNAL_SOURCE_H_ +#define FLEXIBAND_SIGNAL_SOURCE_H_ + +#include +#include +#include +#include +#include +#include +#include +#include "gnss_block_interface.h" + + +class ConfigurationInterface; + +/*! + * \brief This class configures and reads samples from Teleorbit Flexiband front-end. + * This software requires a Flexiband GNURadio driver installed (not included with GNSS-SDR). + */ +class FlexibandSignalSource: public GNSSBlockInterface +{ +public: + FlexibandSignalSource(ConfigurationInterface* configuration, + std::string role, unsigned int in_stream, + unsigned int out_stream, gr::msg_queue::sptr queue); + + virtual ~FlexibandSignalSource(); + std::string role() + { + return role_; + } + + /*! + * \brief Returns "FlexibandSignalSource". + */ + std::string implementation() + { + return "Flexiband_Signal_Source"; + } + size_t item_size() + { + return item_size_; + } + void connect(gr::top_block_sptr top_block); + void disconnect(gr::top_block_sptr top_block); + gr::basic_block_sptr get_left_block(); + gr::basic_block_sptr get_right_block(); + gr::basic_block_sptr get_right_block(int RF_channel); + +private: + std::string role_; + unsigned int in_stream_; + unsigned int out_stream_; + std::string item_type_; + size_t item_size_; + + std::string firmware_filename_; + int gain1_; + int gain2_; + int gain3_; + int usb_packet_buffer_size_; + bool AGC_; + + int RF_channels_; + + gr::block_sptr flexiband_source_; + + std::vector> char_to_float; + std::vector> float_to_complex_; + + boost::shared_ptr queue_; +}; + +#endif /*FLEXIBAND_SIGNAL_SOURCE_H_*/ diff --git a/src/core/receiver/CMakeLists.txt b/src/core/receiver/CMakeLists.txt index 51cd6cc2f..94bff94c8 100644 --- a/src/core/receiver/CMakeLists.txt +++ b/src/core/receiver/CMakeLists.txt @@ -77,6 +77,10 @@ if(ENABLE_ARRAY) add_definitions(-DRAW_ARRAY_DRIVER=1) endif(ENABLE_ARRAY) +if(ENABLE_FLEXIBAND) + add_definitions(-DFLEXIBAND_DRIVER=1) +endif(ENABLE_FLEXIBAND) + if(ENABLE_OSMOSDR) add_definitions(-DOSMOSDR_DRIVER=1) endif(ENABLE_OSMOSDR) diff --git a/src/core/receiver/gnss_block_factory.cc b/src/core/receiver/gnss_block_factory.cc index 122e435b2..45795850a 100644 --- a/src/core/receiver/gnss_block_factory.cc +++ b/src/core/receiver/gnss_block_factory.cc @@ -112,6 +112,10 @@ #include "uhd_signal_source.h" #endif +#if FLEXIBAND_DRIVER + #include "flexiband_signal_source.h" +#endif + using google::LogMessage; @@ -465,6 +469,15 @@ std::unique_ptr GNSSBlockFactory::GetBlock( } #endif +#if FLEXIBAND_DRIVER + else if (implementation.compare("Flexiband_Signal_Source") == 0) + { + std::unique_ptr block_(new FlexibandSignalSource(configuration.get(), role, in_streams, + out_streams, queue)); + block = std::move(block_); + } +#endif + // DATA TYPE ADAPTER ----------------------------------------------------------- else if (implementation.compare("Byte_To_Short") == 0) {