1
0
mirror of https://github.com/gnss-sdr/gnss-sdr synced 2024-12-14 12:10:34 +00:00

Adding timestamp capability to four bits signal source

This commit is contained in:
Javier Arribas 2022-05-23 12:30:12 +02:00
parent c97e12dbe0
commit 742113c55f
5 changed files with 62 additions and 15 deletions

View File

@ -16,7 +16,6 @@
#include "file_timestamp_signal_source.h" #include "file_timestamp_signal_source.h"
#include "gnss_sdr_flags.h" #include "gnss_sdr_flags.h"
#include "gnss_sdr_string_literals.h" #include "gnss_sdr_string_literals.h"
#include "gnss_sdr_timestamp.h"
#include <glog/logging.h> #include <glog/logging.h>
#include <string> #include <string>
@ -51,10 +50,22 @@ gnss_shared_ptr<gr::block> FileTimestampSignalSource::source() const { return ti
void FileTimestampSignalSource::create_file_source_hook() void FileTimestampSignalSource::create_file_source_hook()
{ {
if (is_complex() == false)
{
timestamp_block_ = gnss_sdr_make_Timestamp( timestamp_block_ = gnss_sdr_make_Timestamp(
std::get<0>(itemTypeToSize()), std::get<0>(itemTypeToSize()),
timestamp_file_, timestamp_file_,
timestamp_clock_offset_ms_); timestamp_clock_offset_ms_,
source_item_size() * 2);
}
else
{
timestamp_block_ = gnss_sdr_make_Timestamp(
std::get<0>(itemTypeToSize()),
timestamp_file_,
timestamp_clock_offset_ms_,
source_item_size());
}
DLOG(INFO) << "timestamp_block_(" << timestamp_block_->unique_id() << ")"; DLOG(INFO) << "timestamp_block_(" << timestamp_block_->unique_id() << ")";
} }

View File

@ -17,6 +17,7 @@
#include "four_bit_cpx_file_signal_source.h" #include "four_bit_cpx_file_signal_source.h"
#include "configuration_interface.h" #include "configuration_interface.h"
#include "gnss_sdr_flags.h"
#include "gnss_sdr_string_literals.h" #include "gnss_sdr_string_literals.h"
#include <glog/logging.h> #include <glog/logging.h>
@ -28,7 +29,9 @@ FourBitCpxFileSignalSource::FourBitCpxFileSignalSource(
const std::string& role, const std::string& role,
unsigned int in_streams, unsigned int out_streams, unsigned int in_streams, unsigned int out_streams,
Concurrent_Queue<pmt::pmt_t>* queue) Concurrent_Queue<pmt::pmt_t>* queue)
: FileSourceBase(configuration, role, "Four_Bit_Cpx_File_Signal_Source"s, queue, "byte"s) : FileSourceBase(configuration, role, "Four_Bit_Cpx_File_Signal_Source"s, queue, "byte"s),
timestamp_file_(configuration->property(role + ".timestamp_filename"s, ""s)),
timestamp_clock_offset_ms_(configuration->property(role + ".timestamp_clock_offset_ms"s, 0.0))
{ {
sample_type_ = configuration->property(role + ".sample_type", "iq"s); sample_type_ = configuration->property(role + ".sample_type", "iq"s);
// the complex-ness of the input is inferred from the output type // the complex-ness of the input is inferred from the output type
@ -54,6 +57,12 @@ FourBitCpxFileSignalSource::FourBitCpxFileSignalSource(
{ {
LOG(ERROR) << "This implementation only supports one output stream"; LOG(ERROR) << "This implementation only supports one output stream";
} }
// override value with commandline flag, if present
if (FLAGS_timestamp_source != "-")
{
timestamp_file_ = FLAGS_timestamp_source;
}
} }
@ -76,7 +85,7 @@ std::tuple<size_t, bool> FourBitCpxFileSignalSource::itemTypeToSize()
// 1 byte -> 1 complex samples // 1 byte -> 1 complex samples
double FourBitCpxFileSignalSource::packetsPerSample() const { return 1.0; } double FourBitCpxFileSignalSource::packetsPerSample() const { return 1.0; }
gnss_shared_ptr<gr::block> FourBitCpxFileSignalSource::source() const { return inter_shorts_to_cpx_; } gnss_shared_ptr<gr::block> FourBitCpxFileSignalSource::source() const { return timestamp_block_; }
void FourBitCpxFileSignalSource::create_file_source_hook() void FourBitCpxFileSignalSource::create_file_source_hook()
@ -85,6 +94,14 @@ void FourBitCpxFileSignalSource::create_file_source_hook()
DLOG(INFO) << "unpack_byte_2bit_cpx_samples(" << unpack_byte_->unique_id() << ")"; DLOG(INFO) << "unpack_byte_2bit_cpx_samples(" << unpack_byte_->unique_id() << ")";
inter_shorts_to_cpx_ = gr::blocks::interleaved_short_to_complex::make(false, reverse_interleaving_); // I/Q swap enabled inter_shorts_to_cpx_ = gr::blocks::interleaved_short_to_complex::make(false, reverse_interleaving_); // I/Q swap enabled
DLOG(INFO) << "interleaved_short_to_complex(" << inter_shorts_to_cpx_->unique_id() << ")"; DLOG(INFO) << "interleaved_short_to_complex(" << inter_shorts_to_cpx_->unique_id() << ")";
if (timestamp_file_.size() > 1)
{
timestamp_block_ = gnss_sdr_make_Timestamp(sizeof(gr_complex),
timestamp_file_,
timestamp_clock_offset_ms_,
1);
DLOG(INFO) << "timestamp_block_(" << timestamp_block_->unique_id() << ")";
}
} }
void FourBitCpxFileSignalSource::pre_connect_hook(gr::top_block_sptr top_block) void FourBitCpxFileSignalSource::pre_connect_hook(gr::top_block_sptr top_block)
@ -92,10 +109,20 @@ void FourBitCpxFileSignalSource::pre_connect_hook(gr::top_block_sptr top_block)
top_block->connect(file_source(), 0, unpack_byte_, 0); top_block->connect(file_source(), 0, unpack_byte_, 0);
top_block->connect(unpack_byte_, 0, inter_shorts_to_cpx_, 0); top_block->connect(unpack_byte_, 0, inter_shorts_to_cpx_, 0);
DLOG(INFO) << "connected file_source to unpacker"; DLOG(INFO) << "connected file_source to unpacker";
if (timestamp_file_.size() > 1)
{
top_block->connect(inter_shorts_to_cpx_, 0, timestamp_block_, 0);
DLOG(INFO) << "connected file_source to timestamp_block_";
}
} }
void FourBitCpxFileSignalSource::pre_disconnect_hook(gr::top_block_sptr top_block) void FourBitCpxFileSignalSource::pre_disconnect_hook(gr::top_block_sptr top_block)
{ {
if (timestamp_file_.size() > 1)
{
top_block->disconnect(inter_shorts_to_cpx_, 0, timestamp_block_, 0);
DLOG(INFO) << "disconnected file_source from timestamp_block_";
}
top_block->disconnect(file_source(), 0, unpack_byte_, 0); top_block->disconnect(file_source(), 0, unpack_byte_, 0);
top_block->disconnect(unpack_byte_, 0, inter_shorts_to_cpx_, 0); top_block->disconnect(unpack_byte_, 0, inter_shorts_to_cpx_, 0);
DLOG(INFO) << "disconnected file_source from unpacker"; DLOG(INFO) << "disconnected file_source from unpacker";

View File

@ -21,6 +21,7 @@
#define GNSS_SDR_FOUR_BIT_CPX_FILE_SIGNAL_SOURCE_H #define GNSS_SDR_FOUR_BIT_CPX_FILE_SIGNAL_SOURCE_H
#include "file_source_base.h" #include "file_source_base.h"
#include "gnss_sdr_timestamp.h"
#include "unpack_byte_4bit_samples.h" #include "unpack_byte_4bit_samples.h"
#include <gnuradio/blocks/interleaved_short_to_complex.h> #include <gnuradio/blocks/interleaved_short_to_complex.h>
#include <cstddef> #include <cstddef>
@ -63,6 +64,10 @@ private:
gr::blocks::interleaved_short_to_complex::sptr inter_shorts_to_cpx_; gr::blocks::interleaved_short_to_complex::sptr inter_shorts_to_cpx_;
std::string sample_type_; std::string sample_type_;
bool reverse_interleaving_; bool reverse_interleaving_;
gnss_shared_ptr<Gnss_Sdr_Timestamp> timestamp_block_;
std::string timestamp_file_;
double timestamp_clock_offset_ms_;
}; };

View File

@ -28,22 +28,23 @@
Gnss_Sdr_Timestamp::Gnss_Sdr_Timestamp(size_t sizeof_stream_item, Gnss_Sdr_Timestamp::Gnss_Sdr_Timestamp(size_t sizeof_stream_item,
std::string timestamp_file, double clock_offset_ms) std::string timestamp_file, double clock_offset_ms, int items_to_samples)
: gr::sync_block("Timestamp", : gr::sync_block("Timestamp",
gr::io_signature::make(1, 20, sizeof_stream_item), gr::io_signature::make(1, 20, sizeof_stream_item),
gr::io_signature::make(1, 20, sizeof_stream_item)), gr::io_signature::make(1, 20, sizeof_stream_item)),
d_timefile(std::move(timestamp_file)), d_timefile(std::move(timestamp_file)),
d_clock_offset_ms(clock_offset_ms), d_clock_offset_ms(clock_offset_ms),
d_fraction_ms_offset(modf(d_clock_offset_ms, &d_integer_ms_offset)), // optional clockoffset parameter to convert UTC timestamps to GPS time in some receiver's configuration d_fraction_ms_offset(modf(d_clock_offset_ms, &d_integer_ms_offset)), // optional clockoffset parameter to convert UTC timestamps to GPS time in some receiver's configuration
d_items_to_samples(items_to_samples),
d_next_timetag_samplecount(0), d_next_timetag_samplecount(0),
d_get_next_timetag(true) d_get_next_timetag(true)
{ {
} }
gnss_shared_ptr<Gnss_Sdr_Timestamp> gnss_sdr_make_Timestamp(size_t sizeof_stream_item, std::string timestamp_file, double clock_offset_ms) gnss_shared_ptr<Gnss_Sdr_Timestamp> gnss_sdr_make_Timestamp(size_t sizeof_stream_item, std::string timestamp_file, double clock_offset_ms, int items_to_samples)
{ {
gnss_shared_ptr<Gnss_Sdr_Timestamp> Timestamp_(new Gnss_Sdr_Timestamp(sizeof_stream_item, std::move(timestamp_file), clock_offset_ms)); gnss_shared_ptr<Gnss_Sdr_Timestamp> Timestamp_(new Gnss_Sdr_Timestamp(sizeof_stream_item, std::move(timestamp_file), clock_offset_ms, items_to_samples));
return Timestamp_; return Timestamp_;
} }
@ -110,8 +111,7 @@ int Gnss_Sdr_Timestamp::work(int noutput_items,
for (size_t ch = 0; ch < output_items.size(); ch++) for (size_t ch = 0; ch < output_items.size(); ch++)
{ {
std::memcpy(output_items[ch], input_items[ch], noutput_items * input_signature()->sizeof_stream_item(ch)); std::memcpy(output_items[ch], input_items[ch], noutput_items * input_signature()->sizeof_stream_item(ch));
uint64_t bytes_to_samples = 2; // todo: improve this.. hardcoded 2 bytes -> 1 complex sample! int64_t diff_samplecount = uint64diff(this->nitems_written(ch), d_next_timetag_samplecount * d_items_to_samples);
int64_t diff_samplecount = uint64diff(this->nitems_written(ch), d_next_timetag_samplecount * bytes_to_samples);
// std::cout << "diff_samplecount: " << diff_samplecount << ", noutput_items: " << noutput_items << "\n"; // std::cout << "diff_samplecount: " << diff_samplecount << ", noutput_items: " << noutput_items << "\n";
if (diff_samplecount <= noutput_items and std::labs(diff_samplecount) <= noutput_items) if (diff_samplecount <= noutput_items and std::labs(diff_samplecount) <= noutput_items)
{ {

View File

@ -39,7 +39,8 @@ class Gnss_Sdr_Timestamp;
gnss_shared_ptr<Gnss_Sdr_Timestamp> gnss_sdr_make_Timestamp( gnss_shared_ptr<Gnss_Sdr_Timestamp> gnss_sdr_make_Timestamp(
size_t sizeof_stream_item, size_t sizeof_stream_item,
std::string timestamp_file, std::string timestamp_file,
double clock_offset_ms); double clock_offset_ms,
int items_to_samples);
class Gnss_Sdr_Timestamp : public gr::sync_block class Gnss_Sdr_Timestamp : public gr::sync_block
@ -54,11 +55,13 @@ private:
friend gnss_shared_ptr<Gnss_Sdr_Timestamp> gnss_sdr_make_Timestamp( friend gnss_shared_ptr<Gnss_Sdr_Timestamp> gnss_sdr_make_Timestamp(
size_t sizeof_stream_item, size_t sizeof_stream_item,
std::string timestamp_file, std::string timestamp_file,
double clock_offset_ms); double clock_offset_ms,
int items_to_samples);
Gnss_Sdr_Timestamp(size_t sizeof_stream_item, Gnss_Sdr_Timestamp(size_t sizeof_stream_item,
std::string timestamp_file, std::string timestamp_file,
double clock_offset_ms); double clock_offset_ms,
int items_to_samples);
int64_t uint64diff(uint64_t first, uint64_t second); int64_t uint64diff(uint64_t first, uint64_t second);
bool read_next_timetag(); bool read_next_timetag();
@ -69,6 +72,7 @@ private:
double d_fraction_ms_offset; double d_fraction_ms_offset;
double d_integer_ms_offset; double d_integer_ms_offset;
uint64_t d_next_timetag_samplecount; uint64_t d_next_timetag_samplecount;
int d_items_to_samples;
bool d_get_next_timetag; bool d_get_next_timetag;
}; };