1
0
mirror of https://github.com/gnss-sdr/gnss-sdr synced 2025-09-04 20:08:00 +00:00

feat: added more data types

This commit is contained in:
Victor Castillo
2025-06-09 04:28:28 +02:00
committed by Carles Fernandez
parent 8ee53e645b
commit 5934879ae7
9 changed files with 81 additions and 20 deletions

View File

@@ -32,9 +32,13 @@ SensorDataAggregator::SensorDataAggregator(const SensorDataSourceConfiguration&
// Populate sensor sample maps
switch (SensorIdentifier::get_internal_type(required_sensor))
{
case SensorDataType::FLOAT:
case SensorDataType::F32:
f32_data_[required_sensor] = {};
break;
// More maps to be populated in the future for different types
// For now, all supported sensors are represented as f32
default:
break;
}
@@ -69,6 +73,8 @@ void SensorDataAggregator::update(const std::vector<gr::tag_t>& tags)
sensor_samples.emplace_back(last_sample);
}
}
// More maps to be cleared in the future for different types
// For now, all supported sensors are represented as f32
// Append new data
for (const auto& sensor_tag : tags)
@@ -119,7 +125,7 @@ void SensorDataAggregator::append_data(const pmt::pmt_t& data_dict)
{
switch (SensorIdentifier::get_internal_type(sensor_id))
{
case SensorDataType::FLOAT:
case SensorDataType::F32:
if (f32_data_.contains(sensor_id))
{
f32_data_.at(sensor_id).emplace_back(
@@ -127,6 +133,10 @@ void SensorDataAggregator::append_data(const pmt::pmt_t& data_dict)
pmt::to_float(val));
}
break;
// More types to be handled in the future for different types
// For now, all supported sensors are represented as f32
default:
break;
}

View File

@@ -46,13 +46,16 @@ public:
void update(const std::vector<gr::tag_t>& tags);
const std::vector<SensorDataSample<float>>& get_f32(SensorIdentifier::value_type sensor_id) const;
SensorDataSample<float> get_last_f32(SensorIdentifier::value_type sensor_id) const;
// More getters to be added in the future for different types
// For now, all supported sensors are represented as f32
private:
void append_data(const pmt::pmt_t& data_dict);
std::unordered_map<SensorIdentifier::value_type, std::vector<SensorDataSample<float>>> f32_data_{};
// More maps to be added in the future for different types
// For now, all supported sensors are represented as f32
};

View File

@@ -25,7 +25,7 @@ SensorDataFile::SensorDataFile(
const std::size_t& item_size,
const bool& repeat)
: path_(path),
file_(path_),
file_(path_, std::ios::binary),
sample_delay_(sample_delay),
sample_period_(sample_period),
offset_in_file_(offset_in_file),
@@ -44,6 +44,7 @@ SensorDataFile::SensorDataFile(
void SensorDataFile::reset()
{
file_.clear();
file_.seekg(offset_in_file_, std::ios_base::beg);
offset_in_io_buffer_ = io_buffer_size_;
done_ = false;
@@ -97,6 +98,12 @@ void SensorDataFile::read_into_io_buffer()
{
reset();
file_.read(reinterpret_cast<char*>(&io_buffer_[bytes_read]), io_buffer_size_ - bytes_read);
const std::size_t new_bytes_read = file_.gcount();
if (new_bytes_read < io_buffer_size_ - bytes_read)
{
// Buffer is too big for this file
io_buffer_size_ = bytes_read + new_bytes_read;
}
}
else
{

View File

@@ -110,7 +110,9 @@ int SensorDataSource::work(int noutput_items,
data_tag = pmt::dict_add(data_tag, CHUNK_COUNT_KEY, pmt::from_long(data_file->get_chunks_read()));
for (const auto& sensor : sensor_config_map_.at(file_id))
{
data_tag = pmt::dict_add(data_tag, sensor.tag_key, SensorDataType::make_value(sensor.type, &chunk[sensor.offset]));
pmt::pmt_t raw_value = SensorDataType::make_value(sensor.type, &chunk[sensor.offset]);
pmt::pmt_t value = SensorIdentifier::convert_to_internal_type(sensor.identifier, sensor.type, raw_value);
data_tag = pmt::dict_add(data_tag, sensor.tag_key, value);
}
add_item_tag(0, sample_stamp, TAG_KEY, data_tag);
}

View File

@@ -127,7 +127,7 @@ void SensorDataSourceConfiguration::configure_sensors(const ConfigurationInterfa
}
// Configure sensor data type, default to same data type as previous sensor
SensorDataType::value_type data_type = SensorDataType::FLOAT;
SensorDataType::value_type data_type = SensorDataType::F32;
if (id > 0 and not configuration->is_present(role + ".type"))
{
data_type = sensors_[id - 1].type;

View File

@@ -32,9 +32,21 @@ SensorDataType::value_type SensorDataType::from_string(const std::string& s)
{
return SensorDataType::UINT64;
}
else if (str == "FLOAT")
else if (str == "F32")
{
return SensorDataType::FLOAT;
return SensorDataType::F32;
}
else if (str == "F64")
{
return SensorDataType::F64;
}
else if (str == "I32")
{
return SensorDataType::I32;
}
else if (str == "I64")
{
return SensorDataType::I64;
}
throw std::runtime_error{"Unknown sensor data type: " + s};
}
@@ -45,10 +57,16 @@ std::string SensorDataType::to_string(const SensorDataType::value_type& v)
{
case SensorDataType::UINT64:
return "UINT64";
case SensorDataType::FLOAT:
return "FLOAT";
case SensorDataType::F32:
return "F32";
case SensorDataType::F64:
return "F64";
case SensorDataType::I32:
return "I32";
case SensorDataType::I64:
return "I64";
default:
return "UNKNOWN SENSOR";
return "UNKNOWN TYPE";
}
}
@@ -58,8 +76,14 @@ uint64_t SensorDataType::get_size(const SensorDataType::value_type& v)
{
case SensorDataType::UINT64:
return sizeof(uint64_t);
case SensorDataType::FLOAT:
case SensorDataType::F32:
return sizeof(float);
case SensorDataType::F64:
return sizeof(double);
case SensorDataType::I32:
return sizeof(int);
case SensorDataType::I64:
return sizeof(long);
default:
return 0UL;
}
@@ -71,8 +95,14 @@ pmt::pmt_t SensorDataType::make_value(const SensorDataType::value_type& v, void*
{
case SensorDataType::UINT64:
return pmt::from_uint64(*static_cast<uint64_t*>(value));
case SensorDataType::FLOAT:
case SensorDataType::F32:
return pmt::from_float(*static_cast<float*>(value));
case SensorDataType::F64:
return pmt::from_double(*static_cast<double*>(value));
case SensorDataType::I32:
return pmt::from_long(long{*static_cast<int*>(value)});
case SensorDataType::I64:
return pmt::from_long(*static_cast<long*>(value));
default:
throw std::runtime_error{"Unknown sensor data type: " + to_string(v)};
}

View File

@@ -32,8 +32,12 @@ struct SensorDataType
SensorDataType() = delete;
enum value_type
{
UINT64,
FLOAT
UINT64, // Used internally for SAMPLE_STAMP and CHUNK_COUNT
F32,
F64,
I32,
I64,
// More types can be added here, don't forget to update the static functions
};
static value_type from_string(const std::string& s);

View File

@@ -16,6 +16,7 @@
#include "sensor_identifier.h"
#include "sensor_data_type.h"
#include <iostream>
#include <stdexcept>
#include <string>
@@ -28,7 +29,10 @@ struct ConversionEntry
};
static const ConversionEntry conversion_table[] = {
{SensorDataType::FLOAT, SensorDataType::FLOAT, [](const pmt::pmt_t& val) { return val; }},
{SensorDataType::F32, SensorDataType::F32, [](const pmt::pmt_t& val) { return val; }},
{SensorDataType::F64, SensorDataType::F32, [](const pmt::pmt_t& val) { return pmt::from_float(pmt::to_double(val)); }},
{SensorDataType::I32, SensorDataType::F32, [](const pmt::pmt_t& val) { return pmt::from_float(pmt::to_long(val)); }},
{SensorDataType::I64, SensorDataType::F32, [](const pmt::pmt_t& val) { return pmt::from_float(pmt::to_long(val)); }},
};
const ConversionEntry* lookup_conversion(SensorDataType::value_type from_type, SensorDataType::value_type to_type)
@@ -168,9 +172,9 @@ SensorDataType::value_type SensorIdentifier::get_internal_type(value_type sensor
case IMU_ANG_ACC_X:
case IMU_ANG_ACC_Y:
case IMU_ANG_ACC_Z:
return SensorDataType::FLOAT;
return SensorDataType::F32;
default:
return SensorDataType::FLOAT;
return SensorDataType::F32;
}
}
@@ -180,6 +184,7 @@ pmt::pmt_t SensorIdentifier::convert_to_internal_type(value_type sensor_id, Sens
const ConversionEntry* conversion = lookup_conversion(original_type, get_internal_type(sensor_id));
if (conversion == nullptr)
{
throw std::runtime_error("Could not convert sensor value to internal type");
}
return conversion->conversion_fun(value);

View File

@@ -31,8 +31,8 @@ struct SensorIdentifier
SensorIdentifier() = delete;
enum value_type : unsigned short
{
SAMPLE_STAMP = 0,
CHUNK_COUNT,
SAMPLE_STAMP = 0, // Used internally
CHUNK_COUNT, // Used internally
IMU_VEL_X,
IMU_VEL_Y,
IMU_VEL_Z,