mirror of
https://github.com/gnss-sdr/gnss-sdr
synced 2024-12-15 12:40:35 +00:00
Stop the Labsat_Signal_Source when the end of file is reached. This allows to use this source for automated testing.
Now the block also accepts directly *.ls2 names in filename parameter Remove samples parameter, it was not used. This source reads the full file(s). Make labsat23_source constructor private, so only the smart pointer wrapper can be called
This commit is contained in:
parent
b315118654
commit
35c42c41d7
@ -40,21 +40,20 @@ LabsatSignalSource::LabsatSignalSource(ConfigurationInterface* configuration,
|
|||||||
const 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_(std::move(queue))
|
const 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_(std::move(queue))
|
||||||
{
|
{
|
||||||
std::string default_item_type = "gr_complex";
|
std::string default_item_type = "gr_complex";
|
||||||
std::string default_dump_file = "./data/source.bin";
|
std::string default_dump_file = "./labsat_output.dat";
|
||||||
item_type_ = configuration->property(role + ".item_type", default_item_type);
|
item_type_ = configuration->property(role + ".item_type", default_item_type);
|
||||||
dump_ = configuration->property(role + ".dump", false);
|
dump_ = configuration->property(role + ".dump", false);
|
||||||
dump_filename_ = configuration->property(role + ".dump_filename", default_dump_file);
|
dump_filename_ = configuration->property(role + ".dump_filename", default_dump_file);
|
||||||
|
|
||||||
int channel_selector = configuration->property(role + ".selected_channel", 1);
|
int channel_selector = configuration->property(role + ".selected_channel", 1);
|
||||||
std::string default_filename = "./example_capture.LS3";
|
|
||||||
|
|
||||||
samples_ = configuration->property(role + ".samples", 0);
|
std::string default_filename = "./example_capture.LS3";
|
||||||
filename_ = configuration->property(role + ".filename", default_filename);
|
filename_ = configuration->property(role + ".filename", default_filename);
|
||||||
|
|
||||||
if (item_type_ == "gr_complex")
|
if (item_type_ == "gr_complex")
|
||||||
{
|
{
|
||||||
item_size_ = sizeof(gr_complex);
|
item_size_ = sizeof(gr_complex);
|
||||||
labsat23_source_ = labsat23_make_source(filename_.c_str(), channel_selector);
|
labsat23_source_ = labsat23_make_source_sptr(filename_.c_str(), channel_selector, queue_);
|
||||||
DLOG(INFO) << "Item size " << item_size_;
|
DLOG(INFO) << "Item size " << item_size_;
|
||||||
DLOG(INFO) << "labsat23_source_(" << labsat23_source_->unique_id() << ")";
|
DLOG(INFO) << "labsat23_source_(" << labsat23_source_->unique_id() << ")";
|
||||||
}
|
}
|
||||||
|
@ -81,7 +81,6 @@ private:
|
|||||||
unsigned int out_stream_;
|
unsigned int out_stream_;
|
||||||
std::string item_type_;
|
std::string item_type_;
|
||||||
size_t item_size_;
|
size_t item_size_;
|
||||||
uint64_t samples_;
|
|
||||||
std::string filename_;
|
std::string filename_;
|
||||||
bool dump_;
|
bool dump_;
|
||||||
std::string dump_filename_;
|
std::string dump_filename_;
|
||||||
|
@ -64,6 +64,7 @@ target_link_libraries(signal_source_gr_blocks
|
|||||||
Gnuradio::runtime
|
Gnuradio::runtime
|
||||||
signal_source_libs
|
signal_source_libs
|
||||||
PRIVATE
|
PRIVATE
|
||||||
|
core_receiver
|
||||||
Gflags::gflags
|
Gflags::gflags
|
||||||
Glog::glog
|
Glog::glog
|
||||||
)
|
)
|
||||||
|
@ -30,30 +30,25 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "labsat23_source.h"
|
#include "labsat23_source.h"
|
||||||
|
#include "control_message_factory.h"
|
||||||
#include <gnuradio/io_signature.h>
|
#include <gnuradio/io_signature.h>
|
||||||
#include <exception>
|
#include <exception>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
|
|
||||||
labsat23_source_sptr labsat23_make_source(const char *signal_file_basename, int channel_selector)
|
labsat23_source_sptr labsat23_make_source_sptr(const char *signal_file_basename, int channel_selector, gr::msg_queue::sptr queue)
|
||||||
{
|
{
|
||||||
return labsat23_source_sptr(new labsat23_source(signal_file_basename, channel_selector));
|
return labsat23_source_sptr(new labsat23_source(signal_file_basename, channel_selector, queue));
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
std::string labsat23_source::generate_filename()
|
|
||||||
{
|
|
||||||
std::ostringstream ss;
|
|
||||||
ss << std::setw(4) << std::setfill('0') << d_current_file_number;
|
|
||||||
return d_signal_file_basename + "_" + ss.str() + ".LS3";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
labsat23_source::labsat23_source(const char *signal_file_basename,
|
labsat23_source::labsat23_source(const char *signal_file_basename,
|
||||||
int channel_selector) : gr::block("labsat23_source",
|
int channel_selector,
|
||||||
|
gr::msg_queue::sptr queue) : gr::block("labsat23_source",
|
||||||
gr::io_signature::make(0, 0, 0),
|
gr::io_signature::make(0, 0, 0),
|
||||||
gr::io_signature::make(1, 1, sizeof(gr_complex)))
|
gr::io_signature::make(1, 1, sizeof(gr_complex))),
|
||||||
|
d_queue(queue)
|
||||||
{
|
{
|
||||||
if (channel_selector < 1 or channel_selector > 2)
|
if (channel_selector < 1 or channel_selector > 2)
|
||||||
{
|
{
|
||||||
@ -108,6 +103,25 @@ labsat23_source::~labsat23_source()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::string labsat23_source::generate_filename()
|
||||||
|
{
|
||||||
|
if (d_signal_file_basename.substr(d_signal_file_basename.length() - 4, 4) == ".ls2" or d_signal_file_basename.substr(d_signal_file_basename.length() - 4, 4) == ".LS2")
|
||||||
|
{
|
||||||
|
if (d_current_file_number == 0)
|
||||||
|
{
|
||||||
|
return d_signal_file_basename;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return std::string("donotexist"); // just to stop processing
|
||||||
|
}
|
||||||
|
}
|
||||||
|
std::ostringstream ss;
|
||||||
|
ss << std::setw(4) << std::setfill('0') << d_current_file_number;
|
||||||
|
return d_signal_file_basename + "_" + ss.str() + ".LS3";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int labsat23_source::getBit(uint8_t byte, int position)
|
int labsat23_source::getBit(uint8_t byte, int position)
|
||||||
{
|
{
|
||||||
return (byte >> position) & 0x01;
|
return (byte >> position) & 0x01;
|
||||||
@ -120,7 +134,7 @@ void labsat23_source::decode_samples_one_channel(int16_t input_short, gr_complex
|
|||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case 2:
|
case 2:
|
||||||
//two bits per sample, 8 samples per int16
|
// two bits per sample, 8 samples per int16
|
||||||
for (int i = 0; i < 8; i++)
|
for (int i = 0; i < 8; i++)
|
||||||
{
|
{
|
||||||
out[i] = gr_complex(static_cast<float>(bs[15 - (2 * i)]),
|
out[i] = gr_complex(static_cast<float>(bs[15 - (2 * i)]),
|
||||||
@ -129,45 +143,45 @@ void labsat23_source::decode_samples_one_channel(int16_t input_short, gr_complex
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
//four bits per sample, 4 samples per int16
|
// bits per sample, 4 samples per int16
|
||||||
for (int i = 0; i < 4; i++)
|
for (int i = 0; i < 4; i++)
|
||||||
{
|
{
|
||||||
out[i] = gr_complex(0.0, 0.0);
|
out[i] = gr_complex(0.0, 0.0);
|
||||||
//In-Phase
|
// In-Phase
|
||||||
if (bs[15 - 4 * i])
|
if (bs[15 - 4 * i])
|
||||||
{
|
{
|
||||||
if (bs[13 - 4 * i]) //11
|
if (bs[13 - 4 * i]) // 11
|
||||||
{
|
{
|
||||||
out[i] += gr_complex(-1, 0);
|
out[i] += gr_complex(-1, 0);
|
||||||
}
|
}
|
||||||
else //10
|
else // 10
|
||||||
{
|
{
|
||||||
out[i] += gr_complex(-2, 0);
|
out[i] += gr_complex(-2, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (bs[13 - 4 * i]) //01
|
if (bs[13 - 4 * i]) // 01
|
||||||
{
|
{
|
||||||
out[i] += gr_complex(1, 0);
|
out[i] += gr_complex(1, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Quadrature
|
// Quadrature
|
||||||
if (bs[14 - 4 * i])
|
if (bs[14 - 4 * i])
|
||||||
{
|
{
|
||||||
if (bs[12 - 4 * i]) //11
|
if (bs[12 - 4 * i]) // 11
|
||||||
{
|
{
|
||||||
out[i] += gr_complex(0, -1);
|
out[i] += gr_complex(0, -1);
|
||||||
}
|
}
|
||||||
else //10
|
else // 10
|
||||||
{
|
{
|
||||||
out[i] += gr_complex(0, -2);
|
out[i] += gr_complex(0, -2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (bs[12 - 4 * i]) //01
|
if (bs[12 - 4 * i]) // 01
|
||||||
{
|
{
|
||||||
out[i] += gr_complex(0, 1);
|
out[i] += gr_complex(0, 1);
|
||||||
}
|
}
|
||||||
@ -192,8 +206,8 @@ int labsat23_source::general_work(int noutput_items,
|
|||||||
{
|
{
|
||||||
char memblock[1024];
|
char memblock[1024];
|
||||||
binary_input_file->read(memblock, 1024);
|
binary_input_file->read(memblock, 1024);
|
||||||
//parse Labsat header
|
// parse Labsat header
|
||||||
//check preamble
|
// check preamble
|
||||||
int byte_counter = 0;
|
int byte_counter = 0;
|
||||||
bool preamble_ok = true;
|
bool preamble_ok = true;
|
||||||
for (int i = 0; i < 8; i++)
|
for (int i = 0; i < 8; i++)
|
||||||
@ -388,7 +402,6 @@ int labsat23_source::general_work(int noutput_items,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// ready to start reading samples
|
// ready to start reading samples
|
||||||
switch (d_bits_per_sample)
|
switch (d_bits_per_sample)
|
||||||
{
|
{
|
||||||
@ -419,8 +432,10 @@ int labsat23_source::general_work(int noutput_items,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// trigger the read of the next file in the sequence
|
// trigger the read of the next file in the sequence
|
||||||
|
if (d_labsat_version == 3)
|
||||||
|
{
|
||||||
std::cout << "End of current file, reading the next Labsat file in sequence: " << generate_filename() << std::endl;
|
std::cout << "End of current file, reading the next Labsat file in sequence: " << generate_filename() << std::endl;
|
||||||
|
}
|
||||||
d_current_file_number++;
|
d_current_file_number++;
|
||||||
binary_input_file->close();
|
binary_input_file->close();
|
||||||
binary_input_file->open(generate_filename().c_str(), std::ios::in | std::ios::binary);
|
binary_input_file->open(generate_filename().c_str(), std::ios::in | std::ios::binary);
|
||||||
@ -429,8 +444,18 @@ int labsat23_source::general_work(int noutput_items,
|
|||||||
std::cout << "Labsat file source is reading samples from " << generate_filename() << std::endl;
|
std::cout << "Labsat file source is reading samples from " << generate_filename() << std::endl;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
if (d_labsat_version == 3)
|
||||||
{
|
{
|
||||||
std::cout << "Last file reached, LabSat source stop" << std::endl;
|
std::cout << "Last file reached, LabSat source stop" << std::endl;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::cout << "End of file reached, LabSat source stop" << std::endl;
|
||||||
|
}
|
||||||
|
auto *cmf = new ControlMessageFactory();
|
||||||
|
d_queue->handle(cmf->GetQueueMessage(200, 0));
|
||||||
|
delete cmf;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -468,8 +493,10 @@ int labsat23_source::general_work(int noutput_items,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// trigger the read of the next file in the sequence
|
// trigger the read of the next file in the sequence
|
||||||
|
if (d_labsat_version == 3)
|
||||||
|
{
|
||||||
std::cout << "End of current file, reading the next Labsat file in sequence: " << generate_filename() << std::endl;
|
std::cout << "End of current file, reading the next Labsat file in sequence: " << generate_filename() << std::endl;
|
||||||
|
}
|
||||||
d_current_file_number++;
|
d_current_file_number++;
|
||||||
binary_input_file->close();
|
binary_input_file->close();
|
||||||
binary_input_file->open(generate_filename().c_str(), std::ios::in | std::ios::binary);
|
binary_input_file->open(generate_filename().c_str(), std::ios::in | std::ios::binary);
|
||||||
@ -478,8 +505,18 @@ int labsat23_source::general_work(int noutput_items,
|
|||||||
std::cout << "Labsat file source is reading samples from " << generate_filename() << std::endl;
|
std::cout << "Labsat file source is reading samples from " << generate_filename() << std::endl;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
if (d_labsat_version == 3)
|
||||||
{
|
{
|
||||||
std::cout << "Last file reached, LabSat source stop" << std::endl;
|
std::cout << "Last file reached, LabSat source stop" << std::endl;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::cout << "End of file reached, LabSat source stop" << std::endl;
|
||||||
|
}
|
||||||
|
auto *cmf = new ControlMessageFactory();
|
||||||
|
d_queue->handle(cmf->GetQueueMessage(200, 0));
|
||||||
|
delete cmf;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -32,6 +32,7 @@
|
|||||||
#define GNSS_SDR_LABSAT23_SOURCE_H
|
#define GNSS_SDR_LABSAT23_SOURCE_H
|
||||||
|
|
||||||
#include <gnuradio/block.h>
|
#include <gnuradio/block.h>
|
||||||
|
#include <gnuradio/msg_queue.h> // for msg_queue, msg_queue::sptr
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <string>
|
#include <string>
|
||||||
@ -41,7 +42,7 @@ class labsat23_source;
|
|||||||
|
|
||||||
using labsat23_source_sptr = boost::shared_ptr<labsat23_source>;
|
using labsat23_source_sptr = boost::shared_ptr<labsat23_source>;
|
||||||
|
|
||||||
labsat23_source_sptr labsat23_make_source(const char *signal_file_basename, int channel_selector);
|
labsat23_source_sptr labsat23_make_source_sptr(const char *signal_file_basename, int channel_selector, gr::msg_queue::sptr queue);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief This class implements conversion between Labsat2 and 3 format byte packet samples to gr_complex
|
* \brief This class implements conversion between Labsat2 and 3 format byte packet samples to gr_complex
|
||||||
@ -49,7 +50,8 @@ labsat23_source_sptr labsat23_make_source(const char *signal_file_basename, int
|
|||||||
class labsat23_source : public gr::block
|
class labsat23_source : public gr::block
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
friend labsat23_source_sptr labsat23_make_source_sptr(const char *signal_file_basename, int channel_selector);
|
friend labsat23_source_sptr labsat23_make_source_sptr(const char *signal_file_basename, int channel_selector, gr::msg_queue::sptr queue);
|
||||||
|
labsat23_source(const char *signal_file_basename, int channel_selector, gr::msg_queue::sptr queue);
|
||||||
std::string generate_filename();
|
std::string generate_filename();
|
||||||
void decode_samples_one_channel(int16_t input_short, gr_complex *out, int type);
|
void decode_samples_one_channel(int16_t input_short, gr_complex *out, int type);
|
||||||
int getBit(uint8_t byte, int position);
|
int getBit(uint8_t byte, int position);
|
||||||
@ -62,9 +64,9 @@ private:
|
|||||||
std::ifstream *binary_input_file;
|
std::ifstream *binary_input_file;
|
||||||
uint8_t d_ref_clock;
|
uint8_t d_ref_clock;
|
||||||
uint8_t d_bits_per_sample;
|
uint8_t d_bits_per_sample;
|
||||||
|
gr::msg_queue::sptr d_queue;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
labsat23_source(const char *signal_file_basename, int channel_selector);
|
|
||||||
~labsat23_source();
|
~labsat23_source();
|
||||||
int general_work(int noutput_items,
|
int general_work(int noutput_items,
|
||||||
gr_vector_int &ninput_items,
|
gr_vector_int &ninput_items,
|
||||||
|
Loading…
Reference in New Issue
Block a user