1
0
mirror of https://github.com/gnss-sdr/gnss-sdr synced 2024-06-26 15:03:14 +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:
Carles Fernandez 2019-04-12 12:59:57 +02:00
parent b315118654
commit 35c42c41d7
No known key found for this signature in database
GPG Key ID: 4C583C52B0C3877D
5 changed files with 78 additions and 40 deletions

View File

@ -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))
{
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);
dump_ = configuration->property(role + ".dump", false);
dump_filename_ = configuration->property(role + ".dump_filename", default_dump_file);
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);
if (item_type_ == "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) << "labsat23_source_(" << labsat23_source_->unique_id() << ")";
}

View File

@ -81,7 +81,6 @@ private:
unsigned int out_stream_;
std::string item_type_;
size_t item_size_;
uint64_t samples_;
std::string filename_;
bool dump_;
std::string dump_filename_;

View File

@ -64,6 +64,7 @@ target_link_libraries(signal_source_gr_blocks
Gnuradio::runtime
signal_source_libs
PRIVATE
core_receiver
Gflags::gflags
Glog::glog
)

View File

@ -30,30 +30,25 @@
#include "labsat23_source.h"
#include "control_message_factory.h"
#include <gnuradio/io_signature.h>
#include <exception>
#include <iostream>
#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));
}
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";
return labsat23_source_sptr(new labsat23_source(signal_file_basename, channel_selector, queue));
}
labsat23_source::labsat23_source(const char *signal_file_basename,
int channel_selector) : gr::block("labsat23_source",
gr::io_signature::make(0, 0, 0),
gr::io_signature::make(1, 1, sizeof(gr_complex)))
int channel_selector,
gr::msg_queue::sptr queue) : gr::block("labsat23_source",
gr::io_signature::make(0, 0, 0),
gr::io_signature::make(1, 1, sizeof(gr_complex))),
d_queue(queue)
{
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)
{
return (byte >> position) & 0x01;
@ -120,7 +134,7 @@ void labsat23_source::decode_samples_one_channel(int16_t input_short, gr_complex
switch (type)
{
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++)
{
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;
case 4:
//four bits per sample, 4 samples per int16
// bits per sample, 4 samples per int16
for (int i = 0; i < 4; i++)
{
out[i] = gr_complex(0.0, 0.0);
//In-Phase
// In-Phase
if (bs[15 - 4 * i])
{
if (bs[13 - 4 * i]) //11
if (bs[13 - 4 * i]) // 11
{
out[i] += gr_complex(-1, 0);
}
else //10
else // 10
{
out[i] += gr_complex(-2, 0);
}
}
else
{
if (bs[13 - 4 * i]) //01
if (bs[13 - 4 * i]) // 01
{
out[i] += gr_complex(1, 0);
}
}
//Quadrature
// Quadrature
if (bs[14 - 4 * i])
{
if (bs[12 - 4 * i]) //11
if (bs[12 - 4 * i]) // 11
{
out[i] += gr_complex(0, -1);
}
else //10
else // 10
{
out[i] += gr_complex(0, -2);
}
}
else
{
if (bs[12 - 4 * i]) //01
if (bs[12 - 4 * i]) // 01
{
out[i] += gr_complex(0, 1);
}
@ -192,8 +206,8 @@ int labsat23_source::general_work(int noutput_items,
{
char memblock[1024];
binary_input_file->read(memblock, 1024);
//parse Labsat header
//check preamble
// parse Labsat header
// check preamble
int byte_counter = 0;
bool preamble_ok = true;
for (int i = 0; i < 8; i++)
@ -388,7 +402,6 @@ int labsat23_source::general_work(int noutput_items,
return -1;
}
// ready to start reading samples
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
std::cout << "End of current file, reading the next Labsat file in sequence: " << generate_filename() << std::endl;
if (d_labsat_version == 3)
{
std::cout << "End of current file, reading the next Labsat file in sequence: " << generate_filename() << std::endl;
}
d_current_file_number++;
binary_input_file->close();
binary_input_file->open(generate_filename().c_str(), std::ios::in | std::ios::binary);
@ -430,7 +445,17 @@ int labsat23_source::general_work(int noutput_items,
}
else
{
std::cout << "Last file reached, LabSat source stop" << std::endl;
if (d_labsat_version == 3)
{
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;
}
}
@ -468,8 +493,10 @@ int labsat23_source::general_work(int noutput_items,
}
// trigger the read of the next file in the sequence
std::cout << "End of current file, reading the next Labsat file in sequence: " << generate_filename() << std::endl;
if (d_labsat_version == 3)
{
std::cout << "End of current file, reading the next Labsat file in sequence: " << generate_filename() << std::endl;
}
d_current_file_number++;
binary_input_file->close();
binary_input_file->open(generate_filename().c_str(), std::ios::in | std::ios::binary);
@ -479,7 +506,17 @@ int labsat23_source::general_work(int noutput_items,
}
else
{
std::cout << "Last file reached, LabSat source stop" << std::endl;
if (d_labsat_version == 3)
{
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;
}
}

View File

@ -32,6 +32,7 @@
#define GNSS_SDR_LABSAT23_SOURCE_H
#include <gnuradio/block.h>
#include <gnuradio/msg_queue.h> // for msg_queue, msg_queue::sptr
#include <cstdint>
#include <fstream>
#include <string>
@ -41,7 +42,7 @@ class 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
@ -49,7 +50,8 @@ labsat23_source_sptr labsat23_make_source(const char *signal_file_basename, int
class labsat23_source : public gr::block
{
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();
void decode_samples_one_channel(int16_t input_short, gr_complex *out, int type);
int getBit(uint8_t byte, int position);
@ -62,9 +64,9 @@ private:
std::ifstream *binary_input_file;
uint8_t d_ref_clock;
uint8_t d_bits_per_sample;
gr::msg_queue::sptr d_queue;
public:
labsat23_source(const char *signal_file_basename, int channel_selector);
~labsat23_source();
int general_work(int noutput_items,
gr_vector_int &ninput_items,