diff --git a/conf/gnss-sdr.conf b/conf/gnss-sdr.conf index e99ffa22b..b42ca16be 100644 --- a/conf/gnss-sdr.conf +++ b/conf/gnss-sdr.conf @@ -3,24 +3,32 @@ ;######### GLOBAL OPTIONS ################## ;internal_fs_hz: Internal signal sampling frequency after the signal conditioning stage [Hz]. -GNSS-SDR.internal_fs_hz=2048000 +GNSS-SDR.internal_fs_hz=2000000 ;######### CONTROL_THREAD CONFIG ############ ControlThread.wait_for_flowgraph=false ;######### SIGNAL_SOURCE CONFIG ############ -;#implementation: Use only File_Signal_Source in this version -SignalSource.implementation=File_Signal_Source +;#implementation: Use File_Signal_Source or UHD_Signal_Source (experimental) +SignalSource.implementation=UHD_Signal_Source ;#filename: path to file with the captured GNSS signal samples to be processed -SignalSource.filename=/home/luis/Project/signals/cap2/agilent_cap2.dat -;SignalSource.filename=/media/My Passport/spirent scenario 2/data/sc2_d8.dat +SignalSource.filename=/media/DATALOGGER/signals/Agilent GPS Generator/cap2/agilent_cap2.dat ;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version. SignalSource.item_type=gr_complex ;#sampling_frequency: Original Signal sampling frequency in [Hz] -SignalSource.sampling_frequency=4000000 +SignalSource.sampling_frequency=2000000 + +;#freq: RF front-end center frequency in [Hz] +SignalSource.freq=1575420000 + +;#gain: Front-end Gain in [dB] +SignalSource.gain=50 + +;#subdevice: UHD subdevice specification (for USRP1 use A:0 or B:0) +SignalSource.subdevice=B:0 ;#samples: Number of samples to be processed. Notice that 0 indicates the entire file. SignalSource.samples=0 @@ -35,10 +43,11 @@ SignalSource.dump=false ; it helps to not overload the CPU, but the processing time will be longer. SignalSource.enable_throttle_control=false + ;######### SIGNAL_CONDITIONER CONFIG ############ ;## It holds blocks to change data type, filter and resample input data. ;#implementation: Pass_Through disables this block -SignalConditioner.implementation=Signal_Conditioner +SignalConditioner.implementation=Pass_Through ;######### DATA_TYPE_ADAPTER CONFIG ############ ;## Changes the type of input data. Please disable it in this version. @@ -122,16 +131,16 @@ InputFilter.dump=../data/resampler.dat Resampler.item_type=gr_complex ;#sample_freq_in: the sample frequency of the input signal -Resampler.sample_freq_in=4000000 +Resampler.sample_freq_in=2000000 ;#sample_freq_out: the desired sample frequency of the output signal -Resampler.sample_freq_out=2048000 +Resampler.sample_freq_out=2000000 ;######### CHANNELS GLOBAL CONFIG ############ ;#count: Number of available satellite channels. -Channels.count=4 -Channels.in_acquisition=2 +Channels.count=6 +Channels.in_acquisition=1 ;######### CHANNEL 0 CONFIG ############ ;#system: GPS, GLONASS, GALILEO, SBAS or COMPASS @@ -340,9 +349,6 @@ Tracking.early_late_space_chips=0.5; ;#implementation: Use [GPS_L1_CA_Telemetry_Decoder] for GPS L1 C/A. TelemetryDecoder.implementation=GPS_L1_CA_Telemetry_Decoder -;#fs_in: Signal sampling frequency in [Hz] -TelemetryDecoder.fs_in=4000000 - ;######### OBSERVABLES CONFIG ############ ;#implementation: Use [GPS_L1_CA_Observables] for GPS L1 C/A. Observables.implementation=GPS_L1_CA_Observables diff --git a/jamroot.jam b/jamroot.jam index 025963819..681ebf9d8 100644 --- a/jamroot.jam +++ b/jamroot.jam @@ -13,6 +13,8 @@ lib gtest lib glog ; lib gflags ; lib gnuradio-core ; +lib uhd ; +lib gnuradio-uhd ; project : requirements OMNITHREAD_POSIX @@ -55,6 +57,7 @@ project : requirements $GNURADIO_ROOT/gnuradio-core/src/lib/io $GNURADIO_ROOT/gnuradio-core/src/lib/general $GNURADIO_ROOT/gnuradio-core/src/lib/gengen +$GNURADIO_ROOT/gr-uhd/include $GNURADIO_ROOT/volk/lib $(GTEST_DIR)/include multi diff --git a/src/algorithms/signal_source/adapters/jamfile.jam b/src/algorithms/signal_source/adapters/jamfile.jam index 3e02de662..db5b9ee14 100644 --- a/src/algorithms/signal_source/adapters/jamfile.jam +++ b/src/algorithms/signal_source/adapters/jamfile.jam @@ -1,5 +1,6 @@ project : build-dir ../../../../build ; obj file_signal_source : file_signal_source.cc ; +obj uhd_signal_source : uhd_signal_source.cc ; #obj usrp1_signal_source : usrp1_signal_source.cc ; diff --git a/src/algorithms/signal_source/adapters/uhd_signal_source.cc b/src/algorithms/signal_source/adapters/uhd_signal_source.cc new file mode 100644 index 000000000..5e4c9006e --- /dev/null +++ b/src/algorithms/signal_source/adapters/uhd_signal_source.cc @@ -0,0 +1,232 @@ +/*! + * \file uhd_signal_source.cc + * \brief Universal Hardware Driver signal source + * \author Javier Arribas, 2012. jarribas(at)cttc.es + * + * Detailed description of the file here if needed. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2012 (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 "uhd_signal_source.h" + +//#include +#include + +#include +#include +#include + +#include + +#include "configuration_interface.h" +#include "gnss_sdr_valve.h" + +#include +#include +#include + +using google::LogMessage; + +UhdSignalSource::UhdSignalSource(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) +{ + + // DUMP PARAMETERS + std::string empty = ""; + std::string default_dump_file = "./data/signal_source.dat"; + std::string default_item_type = "short"; + samples_ = configuration->property(role + ".samples", 0); + dump_ = configuration->property(role + ".dump", false); + dump_filename_ = configuration->property(role + ".dump_filename", + default_dump_file); + + // UHD PARAMETERS + uhd::device_addr_t dev_addr; + device_address_= configuration->property(role + ".device_address",empty); + if (empty.compare(empty)!=0) + { + dev_addr["addr0"]=device_address_; + } + + subdevice_=configuration->property(role + ".subdevice",empty); + + freq_ = configuration->property(role + ".freq", (double)1.57542e9); + gain_ = configuration->property(role + ".gain", (double)50.0); + sample_rate_ = configuration->property(role + ".sampling_frequency", (double)4.0e6); + + IF_bandwidth_hz_ = configuration->property(role + ".IF_bandwidth_hz", sample_rate_/2); + + item_type_ = configuration->property(role + ".item_type", + default_item_type); + if (item_type_.compare("short") == 0) + { + item_size_ = sizeof(short); + } + else if (item_type_.compare("gr_complex") == 0) + { + // 1. Make the uhd driver instance + //uhd_source_= uhd::usrp::multi_usrp::make(dev_addr); + + // sigle source + // * \param device_addr the address to identify the hardware + // * \param io_type the desired output data type + uhd_source_= uhd_make_usrp_source(dev_addr,uhd::stream_args_t("fc32")); + + + // 2.1 set sampling clock reference + //Lock mboard clocks internal, external, or mimo + std::string clk_reference="internal"; + uhd_source_->set_clock_source(clk_reference); + + // 2.2 set sampling rate + uhd_source_->set_samp_rate(sample_rate_); + std::cout << boost::format("Actual RX Rate: %f [SPS]...") % (uhd_source_->get_samp_rate()) << std::endl << std::endl; + DLOG(INFO) << boost::format("Actual RX Rate: %f [SPS]...") % (uhd_source_->get_samp_rate()) << std::endl << std::endl; + + // 3. set rx frequency + uhd_source_->set_center_freq(freq_); + std::cout << boost::format("Actual RX Freq: %f [Hz]...") % (uhd_source_->get_center_freq()) << std::endl << std::endl; + DLOG(INFO) << boost::format("Actual RX Freq: %f [Hz]...") % (uhd_source_->get_center_freq()) << std::endl << std::endl; + + // 4. set rx gain + uhd_source_->set_gain(gain_); + std::cout << boost::format("Actual RX Gain: %f dB...") % uhd_source_->get_gain() << std::endl << std::endl; + DLOG(INFO) << boost::format("Actual RX Gain: %f dB...") % uhd_source_->get_gain() << std::endl << std::endl; + + //5. set the IF filter bandwidth + + std::cout << boost::format("Setting RX Bandwidth: %f [Hz]...") % IF_bandwidth_hz_ << std::endl; + uhd_source_->set_bandwidth(IF_bandwidth_hz_); + ///std::cout << boost::format("Actual RX Bandwidth: %f MHz...") % uhd_source_->get_rx_bandwidth() << std::endl << std::endl; + //DLOG(INFO) << boost::format("Actual RX Bandwidth: %f MHz...") % uhd_source_->get_rx_bandwidth() << std::endl << std::endl; + + //set the antenna (optional) + //uhd_source_->set_antenna(ant); + + //LO lock status + //Check Ref and LO Lock detect + //std::vector sensor_names; + //sensor_names = uhd_source_->get_rx_sensor_names(0); + //if (std::find(sensor_names.begin(), sensor_names.end(), "lo_locked") != sensor_names.end()) { + // uhd::sensor_value_t lo_locked = uhd_source_->get_rx_sensor("lo_locked",0); + // std::cout << boost::format("Checking RX: %s ...") % lo_locked.to_pp_string() << std::endl; + //UHD_ASSERT_THROW(lo_locked.to_bool()); + //} + + uhd_source_->set_subdev_spec(subdevice_); + } + else + { + LOG_AT_LEVEL(WARNING) << item_type_ + << " unrecognized item type. Using short."; + item_size_ = sizeof(short); + } + + if (samples_ != 0) + { + DLOG(INFO) << "Send STOP signal after " << samples_ << " samples"; + valve_ = gnss_sdr_make_valve(item_size_, samples_, queue_); + DLOG(INFO) << "valve(" << valve_->unique_id() << ")"; + } + + if (dump_) + { + DLOG(INFO) << "Dumping output into file " << dump_filename_; + file_sink_ = gr_make_file_sink(item_size_, dump_filename_.c_str()); + DLOG(INFO) << "file_sink(" << file_sink_->unique_id() << ")"; + } + +} + +UhdSignalSource::~UhdSignalSource() +{ +} + +void UhdSignalSource::connect(gr_top_block_sptr top_block) +{ + + if (samples_ != 0) + { + top_block->connect(uhd_source_, 0, valve_, 0); + DLOG(INFO) << "connected usrp source to valve"; + + if (dump_) + { + top_block->connect(valve_, 0, file_sink_, 0); + DLOG(INFO) << "connected valve to file sink"; + } + } + else + { + if (dump_) + { + top_block->connect(uhd_source_, 0, file_sink_, 0); + DLOG(INFO) << "connected usrp source to file sink"; + } + } +} + +void UhdSignalSource::disconnect(gr_top_block_sptr top_block) +{ + + if (samples_ != 0) + { + top_block->disconnect(uhd_source_, 0, valve_, 0); + + if (dump_) + { + top_block->disconnect(valve_, 0, file_sink_, 0); + } + } + else + { + if (dump_) + { + top_block->disconnect(uhd_source_, 0, file_sink_, 0); + } + } +} + +gr_basic_block_sptr UhdSignalSource::get_left_block() +{ + LOG_AT_LEVEL(WARNING) << "Trying to get signal source left block."; + return gr_basic_block_sptr(); +} + +gr_basic_block_sptr UhdSignalSource::get_right_block() +{ + if (samples_ != 0) + { + return valve_; + } + else + { + return uhd_source_; + } +} diff --git a/src/algorithms/signal_source/adapters/uhd_signal_source.h b/src/algorithms/signal_source/adapters/uhd_signal_source.h new file mode 100644 index 000000000..ab51d2f46 --- /dev/null +++ b/src/algorithms/signal_source/adapters/uhd_signal_source.h @@ -0,0 +1,107 @@ +/*! + * \file uhd_signal_source.h + * \brief Universal Hardware Driver signal source + * \author Javier Arribas, 2012. jarribas(at)cttc.es + * + * Detailed description of the file here if needed. + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2012 (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 . + * + * ------------------------------------------------------------------------- + */ + +#ifndef UHD_SIGNAL_SOURCE_H_ +#define UHD_SIGNAL_SOURCE_H_ + +#include +//#include +#include + +#include +#include + +#include "gnss_block_interface.h" + +class ConfigurationInterface; + +class UhdSignalSource: public GNSSBlockInterface +{ + +public: + UhdSignalSource(ConfigurationInterface* configuration, + std::string role, unsigned int in_stream, + unsigned int out_stream, gr_msg_queue_sptr queue); + + virtual ~UhdSignalSource(); + + std::string role() + { + return role_; + } + std::string implementation() + { + return "UhdSignalSource"; + } + 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(); + +private: + + std::string role_; + + // UHD SETTINGS + std::string device_address_; + std::string subdevice_; + double sample_rate_; + + unsigned int in_stream_; + unsigned int out_stream_; + + double freq_; + double gain_; + double IF_bandwidth_hz_; + std::string item_type_; + size_t item_size_; + long samples_; + bool dump_; + std::string dump_filename_; + + //uhd::usrp::multi_usrp::sptr uhd_source_; + + //boost::shared_ptr + + boost::shared_ptr uhd_source_; + + gr_block_sptr valve_; + gr_block_sptr file_sink_; + gr_msg_queue_sptr queue_; +}; + +#endif /*UHD_SIGNAL_SOURCE_H_*/ diff --git a/src/core/receiver/gnss_block_factory.cc b/src/core/receiver/gnss_block_factory.cc index 05b57952c..3ed0ffd82 100644 --- a/src/core/receiver/gnss_block_factory.cc +++ b/src/core/receiver/gnss_block_factory.cc @@ -47,7 +47,7 @@ #include "null_sink_output_filter.h" #include "file_output_filter.h" #include "channel.h" -//#include "usrp1_signal_source.h" +#include "uhd_signal_source.h" #include "signal_conditioner.h" #include "direct_resampler_conditioner.h" #include "fir_filter.h" @@ -250,13 +250,11 @@ GNSSBlockInterface* GNSSBlockFactory::GetBlock( out_streams, queue); } - // else if (implementation.compare("USRP1_Signal_Source") == 0) - // { - // block = new Usrp1SignalSource(configuration, role, in_streams, - // out_streams, queue); - // } - - //! \todo Create a UHD block + else if (implementation.compare("UHD_Signal_Source") == 0) + { + block = new UhdSignalSource(configuration, role, in_streams, + out_streams, queue); + } // DATA TYPE ADAPTER ----------------------------------------------------------- diff --git a/src/main/jamfile.jam b/src/main/jamfile.jam index a691a2afa..dea9f40d8 100644 --- a/src/main/jamfile.jam +++ b/src/main/jamfile.jam @@ -25,7 +25,7 @@ exe gnss-sdr : main.cc ../algorithms/resampler/gnuradio_blocks//direct_resampler_conditioner_cc #../algorithms/resampler/gnuradio_blocks//direct_resampler_conditioner_ss ../algorithms/signal_source/adapters//file_signal_source -#../algorithms/signal_source/adapters//usrp1_signal_source +../algorithms/signal_source/adapters//uhd_signal_source ../algorithms/telemetry_decoder/adapters//gps_l1_ca_telemetry_decoder ../algorithms/telemetry_decoder/gnuradio_blocks//gps_l1_ca_telemetry_decoder_cc ../algorithms/telemetry_decoder/libs//gps_l1_ca_subframe_fsm @@ -57,7 +57,9 @@ exe gnss-sdr : main.cc ../core/system_parameters//gnss_synchro ../..//gflags ../..//glog -../..//gnuradio-core ; +../..//gnuradio-core +../..//uhd +../..//gnuradio-uhd ; #../..//gnuradio-usrp ; install ../../install : gnss-sdr ; diff --git a/src/tests/jamfile.jam b/src/tests/jamfile.jam index fbde3e909..e9f4ef6a3 100644 --- a/src/tests/jamfile.jam +++ b/src/tests/jamfile.jam @@ -26,7 +26,7 @@ exe run_tests : test_main.cc ../algorithms/resampler/gnuradio_blocks//direct_resampler_conditioner_cc #../algorithms/resampler/gnuradio_blocks//direct_resampler_conditioner_ss ../algorithms/signal_source/adapters//file_signal_source -#../algorithms/signal_source/adapters//usrp1_signal_source +../algorithms/signal_source/adapters//uhd_signal_source ../algorithms/telemetry_decoder/adapters//gps_l1_ca_telemetry_decoder ../algorithms/telemetry_decoder/gnuradio_blocks//gps_l1_ca_telemetry_decoder_cc ../algorithms/telemetry_decoder/libs//gps_l1_ca_subframe_fsm @@ -58,7 +58,9 @@ exe run_tests : test_main.cc ../core/system_parameters//gnss_synchro ../..//gflags ../..//glog -../..//gnuradio-core +../..//gnuradio-core +../..//uhd +../..//gnuradio-uhd ../..//gtest : $(GTEST_DIR)/include ; install ../../install : run_tests ;