1
0
mirror of https://github.com/gnss-sdr/gnss-sdr synced 2024-12-13 19:50:34 +00:00

Merge branch 'next' of https://github.com/gnss-sdr/gnss-sdr into osnma

This commit is contained in:
Carles Fernandez 2023-10-15 15:51:04 +02:00
commit ee5659ba55
No known key found for this signature in database
GPG Key ID: 4C583C52B0C3877D
40 changed files with 531 additions and 255 deletions

View File

@ -15,7 +15,7 @@ jobs:
build-ubuntu:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: install dependencies
run: |
sudo apt-get update -y
@ -39,14 +39,23 @@ jobs:
build-macos:
runs-on: macos-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: install dependencies
run: |
brew update
brew install --overwrite python@3.10 python@3.11
python3.11 -m pip install mako
brew install ninja pkg-config hdf5 automake armadillo lapack \
rm /usr/local/bin/2to3 || true
rm /usr/local/bin/idle3 || true
rm /usr/local/bin/pydoc3 || true
rm /usr/local/bin/python3 || true
rm /usr/local/bin/python3-config || true
rm /usr/local/bin/2to3-3.11 || true
rm /usr/local/bin/idle3.11 || true
rm /usr/local/bin/pydoc3.11 || true
rm /usr/local/bin/python3.11 || true
rm /usr/local/bin/python3.11-config || true
brew install ninja hdf5 automake armadillo lapack \
gflags glog gnuradio log4cpp openssl pugixml protobuf
pip3 install mako
- name: configure
run: cd build && cmake -GNinja ..
- name: build
@ -59,14 +68,23 @@ jobs:
build-macos-xcode:
runs-on: macos-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: install dependencies
run: |
brew update
brew install --overwrite python@3.10 python@3.11
python3.11 -m pip install mako
rm /usr/local/bin/2to3 || true
rm /usr/local/bin/idle3 || true
rm /usr/local/bin/pydoc3 || true
rm /usr/local/bin/python3 || true
rm /usr/local/bin/python3-config || true
rm /usr/local/bin/2to3-3.11 || true
rm /usr/local/bin/idle3.11 || true
rm /usr/local/bin/pydoc3.11 || true
rm /usr/local/bin/python3.11 || true
rm /usr/local/bin/python3.11-config || true
brew install ninja pkg-config hdf5 automake armadillo lapack gflags glog \
gnuradio log4cpp openssl pugixml protobuf
pip3 install mako
- name: configure
run: cd build && cmake -GXcode ..
- name: build
@ -87,7 +105,7 @@ jobs:
clang-format:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: run clang-format
uses: jidicula/clang-format-action@v4.11.0
with:
@ -98,14 +116,23 @@ jobs:
clang-tidy:
runs-on: macos-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: install dependencies
run: |
brew update
brew install --overwrite python@3.10 python@3.11
python3.11 -m pip install mako
rm /usr/local/bin/2to3 || true
rm /usr/local/bin/idle3 || true
rm /usr/local/bin/pydoc3 || true
rm /usr/local/bin/python3 || true
rm /usr/local/bin/python3-config || true
rm /usr/local/bin/2to3-3.11 || true
rm /usr/local/bin/idle3.11 || true
rm /usr/local/bin/pydoc3.11 || true
rm /usr/local/bin/python3.11 || true
rm /usr/local/bin/python3.11-config || true
brew install llvm pkg-config hdf5 armadillo lapack gflags glog gnuradio libmatio \
log4cpp openssl pugixml protobuf
pip3 install mako
ln -s $(brew --prefix llvm)/bin/clang-tidy /usr/local/bin
ln -s $(brew --prefix llvm)/bin/clang-apply-replacements /usr/local/bin
ln -s $(brew --prefix llvm)/bin/run-clang-tidy /usr/local/bin
@ -123,7 +150,7 @@ jobs:
cpplint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: install dependencies
run: sudo apt-get install python3-pip && sudo pip3 install cpplint
- name: run checks
@ -144,7 +171,7 @@ jobs:
prettier-markdown:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: install dependencies
run: sudo npm install --global prettier
- name: check markdown
@ -153,7 +180,7 @@ jobs:
cmakelint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: install dependencies
run: |
sudo python -m pip install --upgrade pip
@ -164,7 +191,7 @@ jobs:
volk-gnsssdr-windows:
runs-on: windows-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- uses: actions/setup-python@v4
- name: Install dependencies
run: |
@ -186,7 +213,7 @@ jobs:
volk-gnsssdr-ubuntu:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: install dependencies
run: sudo apt install python3-mako liborc-dev
- name: configure
@ -201,7 +228,7 @@ jobs:
volk-gnsssdr-macos:
runs-on: macos-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: install dependencies
run: pip3 install mako
- name: configure
@ -214,7 +241,7 @@ jobs:
volk-gnsssdr-macos-xcode:
runs-on: macos-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: install dependencies
run: pip3 install mako
- name: configure
@ -229,7 +256,7 @@ jobs:
shellcheck:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: install dependencies
run: sudo apt install shellcheck
- name: check scripts
@ -238,7 +265,7 @@ jobs:
REUSE-compliance:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Check REUSE compliance
uses: docker://fsfe/reuse
with:

View File

@ -16,7 +16,7 @@ endif()
# Build type can still be overridden by setting -DCMAKE_BUILD_TYPE=
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "")
cmake_minimum_required(VERSION 2.8.12...3.26)
cmake_minimum_required(VERSION 2.8.12...3.27)
project(gnss-sdr CXX C)
set(GNSSSDR_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) # Allows to be a sub-project
@ -335,12 +335,12 @@ set(GNSSSDR_PYTHON3_MIN_VERSION "3.4")
################################################################################
# Versions to download and build (but not to install system-wide) if not found
################################################################################
set(GNSSSDR_ARMADILLO_LOCAL_VERSION "12.2.x")
set(GNSSSDR_ARMADILLO_LOCAL_VERSION "12.6.x")
set(GNSSSDR_GFLAGS_LOCAL_VERSION "2.2.2")
set(GNSSSDR_GLOG_LOCAL_VERSION "0.6.0")
set(GNSSSDR_MATIO_LOCAL_VERSION "1.5.23")
set(GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION "22.4")
set(GNSSSDR_PUGIXML_LOCAL_VERSION "1.13")
set(GNSSSDR_PUGIXML_LOCAL_VERSION "1.14")
set(GNSSSDR_GTEST_LOCAL_VERSION "1.13.0")
set(GNSSSDR_GNSS_SIM_LOCAL_VERSION "master")
set(GNSSSDR_GNSSTK_LOCAL_VERSION "14.0.0")
@ -361,6 +361,13 @@ if(CMAKE_VERSION VERSION_LESS "3.0.2")
set(GNSSSDR_GLOG_LOCAL_VERSION "0.3.4") # Fix for Ubuntu 14.04
endif()
if(CMAKE_VERSION VERSION_LESS "3.5")
set(GNSSSDR_PUGIXML_LOCAL_VERSION "1.13")
endif()
if(CMAKE_VERSION VERSION_LESS "3.4")
set(GNSSSDR_PUGIXML_LOCAL_VERSION "1.10")
endif()
if(CMAKE_CROSSCOMPILING OR CMAKE_VERSION VERSION_LESS "3.13")
set(GNSSSDR_PROTOCOLBUFFERS_LOCAL_VERSION "21.12")
endif()
@ -1109,7 +1116,7 @@ if(NOT VOLKGNSSSDR_FOUND)
endif()
endif()
if(PYTHONINTERP_FOUND)
if(CMAKE_VERSION VERSION_LESS 3.27 AND PYTHONINTERP_FOUND)
set_package_properties(PythonInterp PROPERTIES
URL "https://www.python.org/"
DESCRIPTION "An interpreted, high-level, general-purpose programming language (found: v${PYTHON_VERSION_STRING})"

View File

@ -48,9 +48,25 @@ if(CMAKE_VERSION VERSION_LESS 3.12 OR CMAKE_CROSSCOMPILING)
message(STATUS "User set python executable ${PYTHON_EXECUTABLE}")
string(FIND "${PYTHON_EXECUTABLE}" "python3" IS_PYTHON3)
if(IS_PYTHON3 EQUAL -1)
if(CMAKE_VERSION VERSION_LESS "3.24")
find_package(PythonInterp ${GNSSSDR_PYTHON_MIN_VERSION} REQUIRED)
else()
set(Python_EXECUTABLE ${PYTHON_EXECUTABLE})
find_package(Python2 COMPONENTS Interpreter)
set(PYTHONINTERP_FOUND Python2_Interpreter_FOUND)
set(PYTHON_VERSION_MAJOR "${Python2_VERSION_MAJOR}")
set(PYTHON_VERSION_STRING "${Python2_VERSION_MAJOR}.${Python2_VERSION_MINOR}")
endif()
else()
if(CMAKE_VERSION VERSION_LESS "3.24")
find_package(PythonInterp ${GNSSSDR_PYTHON3_MIN_VERSION} REQUIRED)
else()
set(Python_EXECUTABLE ${PYTHON_EXECUTABLE})
find_package(Python3 COMPONENTS Interpreter)
set(PYTHONINTERP_FOUND Python3_Interpreter_FOUND)
set(PYTHON_VERSION_MAJOR "${Python3_VERSION_MAJOR}")
set(PYTHON_VERSION_STRING "${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR}")
endif()
endif()
gnsssdr_python_check_module("python >= ${GNSSSDR_PYTHON_MIN_VERSION}" sys "sys.version.split()[0] >= '${GNSSSDR_PYTHON_MIN_VERSION}'" PYTHON_MIN_VER_FOUND)
gnsssdr_python_check_module("mako >= ${GNSSSDR_MAKO_MIN_VERSION}" mako "mako.__version__ >= '${GNSSSDR_MAKO_MIN_VERSION}'" MAKO_FOUND)
@ -59,11 +75,28 @@ if(CMAKE_VERSION VERSION_LESS 3.12 OR CMAKE_CROSSCOMPILING)
endif()
else()
message(STATUS "PYTHON_EXECUTABLE not set - trying by default python3")
set(Python_ADDITIONAL_VERSIONS 3.4 3.5 3.6 3.7 3.8 3.9)
find_package(PythonInterp ${GNSSSDR_PYTHON_MIN3_VERSION})
if(CMAKE_VERSION VERSION_LESS "3.24")
set(Python_ADDITIONAL_VERSIONS 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11)
find_package(PythonInterp ${VOLK_PYTHON_MIN_VERSION})
else()
find_package(Python COMPONENTS Interpreter)
set(PYTHONINTERP_FOUND Python_Interpreter_FOUND)
set(PYTHON_EXECUTABLE "${Python_EXECUTABLE}")
set(PYTHON_VERSION_MAJOR "${Python_VERSION_MAJOR}")
set(PYTHON_VERSION_STRING "${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}")
endif()
if(NOT PYTHONINTERP_FOUND)
message(STATUS "python3 not found - trying with python2.7")
find_package(PythonInterp ${GNSSSDR_PYTHON_MIN_VERSION} REQUIRED)
if(CMAKE_VERSION VERSION_LESS "3.24")
set(Python_ADDITIONAL_VERSIONS 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11)
find_package(PythonInterp ${VOLK_PYTHON_MIN_VERSION})
else()
find_package(Python2 COMPONENTS Interpreter)
set(PYTHONINTERP_FOUND Python2_Interpreter_FOUND)
set(PYTHON_EXECUTABLE "${Python2_EXECUTABLE}")
set(PYTHON_VERSION_MAJOR "${Python2_VERSION_MAJOR}")
set(PYTHON_VERSION_STRING "${Python2_VERSION_MAJOR}.${Python2_VERSION_MINOR}")
endif()
endif()
gnsssdr_python_check_module("python >= ${GNSSSDR_PYTHON_MIN_VERSION}" sys "sys.version.split()[0] >= '${GNSSSDR_PYTHON_MIN_VERSION}'" PYTHON_MIN_VER_FOUND)
gnsssdr_python_check_module("mako >= ${GNSSSDR_MAKO_MIN_VERSION}" mako "mako.__version__ >= '${GNSSSDR_MAKO_MIN_VERSION}'" MAKO_FOUND)
@ -76,13 +109,17 @@ else()
set(_previous ${CMAKE_FIND_FRAMEWORK})
set(CMAKE_FIND_FRAMEWORK LAST)
endif()
if(PYTHON_EXECUTABLE)
set(Python_EXECUTABLE ${PYTHON_EXECUTABLE})
endif()
find_package(Python3 COMPONENTS Interpreter)
if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
set(CMAKE_FIND_FRAMEWORK ${_previous})
endif()
if(Python3_FOUND)
set(PYTHON_EXECUTABLE ${Python3_EXECUTABLE})
set(PYTHON_VERSION_MAJOR ${Python3_VERSION_MAJOR})
set(PYTHON_VERSION_MAJOR "${Python3_VERSION_MAJOR}")
set(PYTHON_VERSION_STRING "${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR}")
gnsssdr_python_check_module("python >= ${GNSSSDR_PYTHON_MIN_VERSION}" sys "sys.version.split()[0] >= '${GNSSSDR_PYTHON_MIN_VERSION}'" PYTHON_MIN_VER_FOUND)
gnsssdr_python_check_module("mako >= ${GNSSSDR_MAKO_MIN_VERSION}" mako "mako.__version__ >= '${GNSSSDR_MAKO_MIN_VERSION}'" MAKO_FOUND)
endif()
@ -91,16 +128,44 @@ else()
if(Python2_FOUND)
set(PYTHON_EXECUTABLE ${Python2_EXECUTABLE})
set(PYTHON_VERSION_MAJOR ${Python2_VERSION_MAJOR})
set(PYTHON_VERSION_STRING "${Python2_VERSION_MAJOR}.${Python2_VERSION_MINOR}")
gnsssdr_python_check_module("python >= ${GNSSSDR_PYTHON_MIN_VERSION}" sys "sys.version.split()[0] >= '${GNSSSDR_PYTHON_MIN_VERSION}'" PYTHON_MIN_VER_FOUND)
gnsssdr_python_check_module("mako >= ${GNSSSDR_MAKO_MIN_VERSION}" mako "mako.__version__ >= '${GNSSSDR_MAKO_MIN_VERSION}'" MAKO_FOUND)
gnsssdr_python_check_module("six - python 2 and 3 compatibility library" six "True" SIX_FOUND)
endif()
if(NOT MAKO_FOUND OR NOT SIX_FOUND)
unset(PYTHON_EXECUTABLE)
find_package(PythonInterp ${GNSSSDR_PYTHON_MIN_VERSION})
if(CMAKE_VERSION VERSION_LESS "3.24")
find_package(PythonInterp ${VOLK_PYTHON_MIN_VERSION})
else()
find_package(Python COMPONENTS Interpreter)
set(PYTHONINTERP_FOUND Python_Interpreter_FOUND)
set(PYTHON_EXECUTABLE "${Python_EXECUTABLE}")
set(PYTHON_VERSION_STRING "${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}")
set(PYTHON_VERSION_MAJOR "${Python_VERSION_MAJOR}")
endif()
gnsssdr_python_check_module("python >= ${GNSSSDR_PYTHON_MIN_VERSION}" sys "sys.version.split()[0] >= '${GNSSSDR_PYTHON_MIN_VERSION}'" PYTHON_MIN_VER_FOUND)
gnsssdr_python_check_module("mako >= ${GNSSSDR_MAKO_MIN_VERSION}" mako "mako.__version__ >= '${GNSSSDR_MAKO_MIN_VERSION}'" MAKO_FOUND)
if(PYTHON_VERSION_STRING VERSION_LESS "3.0")
if(NOT MAKO_FOUND)
unset(PYTHON_EXECUTABLE)
unset(PYTHON_VERSION_STRING)
unset(PYTHON_VERSION_MAJOR)
find_program(PYTHON_EXECUTABLE NAMES python3 python)
if(PYTHON_EXECUTABLE)
set(PYTHONINTERP_FOUND TRUE)
execute_process(COMMAND "${PYTHON_EXECUTABLE} --version" OUTPUT_VARIABLE PYTHON_VERSION_STRING_AUX)
string(FIND "${PYTHON_VERSION_STRING_AUX}" " " blank_char_index)
if(blank_char_index GREATER -1)
math(EXPR start_index "${blank_char_index} + 1")
string(SUBSTRING "${PYTHON_VERSION_STRING_AUX}" ${start_index} -1 PYTHON_VERSION_STRING)
string(STRIP ${PYTHON_VERSION_STRING} PYTHON_VERSION_STRING)
string(SUBSTRING "${PYTHON_VERSION_STRING_AUX}" ${start_index} 1 PYTHON_VERSION_MAJOR)
message(STATUS "Found Python: ${PYTHON_EXECUTABLE} (found version: ${PYTHON_VERSION_STRING})")
endif()
endif()
volk_python_check_module("mako >= 0.4.2" mako "mako.__version__ >= '0.4.2'" MAKO_FOUND)
endif()
if(MAKO_FOUND AND PYTHON_VERSION_STRING VERSION_LESS "3.0")
gnsssdr_python_check_module("six - python 2 and 3 compatibility library" six "True" SIX_FOUND)
endif()
endif()

View File

@ -14,7 +14,24 @@ All notable changes to GNSS-SDR will be documented in this file.
## [Unreleased](https://github.com/gnss-sdr/gnss-sdr/tree/next)
### Improvements in Repeatability
### Improvements in Interoperability:
- Added a new PVT configuration boolean flag (`flag_geohash_log_out`) that
enables or disables the Position Geohash tag output in INFO log files. Set to
`false` by default.
- New fields have been added to the custom output stream defined by
`monitor_pvt.proto`:
- `utc_time` (a [RFC 3339](https://www.rfc-editor.org/rfc/rfc3339) datetime
string),
- velocity in the local ENU frame (`vel_e`, `vel_n`, and `vel_u`), in m/s,
- the course over ground, `cog`, in degrees,
- the status of the Galileo's High Accuracy Service, `galhas_status`:
- 0: HAS data not available
- 1: HAS Corrections applied
- `geohash`, an
[encoded geographic location](https://en.wikipedia.org/wiki/Geohash).
### Improvements in Repeatability:
- A Kalman filter is now available in the PVT block, smoothing the outputs of a
simple Least Squares solution and improving the precision of delivered fixes.
@ -26,6 +43,21 @@ All notable changes to GNSS-SDR will be documented in this file.
`PVT.kf_system_ecef_pos_sd_m=0.01`, in [m]; and
`PVT.kf_system_ecef_vel_sd_ms=0.001`, in [m/s].
### Improvements in Usability:
- The Galileo E1B Reduced CED parameters usage has been set to `false` by
default. You can activate its usage with `Galileo_E1B_Telemetry_Decoder=true`
in your configuration file.
- The generation of Galileo E6B observables has been disabled if the user sets
`PVT.use_e6_for_pvt=false`, fixing the PVT computation in some multi-band
configurations.
- Fix bug in the custom binary output (`PVT.enable_monitor=true`) output rate.
Before this fix, it was outputting data every 20 ms, instead of observing the
`PVT.output_rate_ms` setting.
- Now the program exits properly if a SIGINT signal is received (_e.g._, the
user pressing Ctrl+C, or another user application sending an interruption
signal).
## [GNSS-SDR v0.0.18](https://github.com/gnss-sdr/gnss-sdr/releases/tag/v0.0.18) - 2023-04-06
[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.7805514.svg)](https://doi.org/10.5281/zenodo.7805514)

View File

@ -42,4 +42,14 @@ double hdop = 27; // Horizontal Dilution of Precision
double vdop = 28; // Vertical Dilution of Precision
double user_clk_drift_ppm = 29; // User clock drift [ppm]
string utc_time = 30; // PVT UTC time (rfc 3339 datetime string)
double vel_e = 31; // Velocity East component in the local frame, in m/s
double vel_n = 32; // Velocity North component in the local frame, in m/s
double vel_u = 33; // Velocity Up component in the local frame, in m/s
double cog = 34; // Course Over Ground, in deg
uint32 galhas_status = 35; // Galileo HAS status: 1- HAS messages decoded and applied, 0 - HAS not available
string geohash = 36; // Encoded geographic location. See https://en.wikipedia.org/wiki/Geohash
}

View File

@ -2458,10 +2458,10 @@ int rtklib_pvt_gs::work(int noutput_items, gr_vector_const_void_star& input_item
// p_time += boost::posix_time::microseconds(round(rtklib_utc_time.sec * 1e6));
// std::cout << TEXT_MAGENTA << "Observable RX time (GPST) " << boost::posix_time::to_simple_string(p_time) << TEXT_RESET << '\n';
LOG(INFO) << "Position at " << boost::posix_time::to_simple_string(d_user_pvt_solver->get_position_UTC_time())
DLOG(INFO) << "Position at " << boost::posix_time::to_simple_string(d_user_pvt_solver->get_position_UTC_time())
<< " UTC using " << d_user_pvt_solver->get_num_valid_observations() << " observations is Lat = " << d_user_pvt_solver->get_latitude() << " [deg], Long = " << d_user_pvt_solver->get_longitude()
<< " [deg], Height = " << d_user_pvt_solver->get_height() << " [m]";
LOG(INFO) << "geohash=" << d_geohash->encode(d_user_pvt_solver->get_latitude(), d_user_pvt_solver->get_longitude());
/* std::cout << "Dilution of Precision at " << boost::posix_time::to_simple_string(d_user_pvt_solver->get_position_UTC_time())
<< " UTC using "<< d_user_pvt_solver->get_num_valid_observations() <<" observations is HDOP = " << d_user_pvt_solver->get_hdop() << " VDOP = "
<< d_user_pvt_solver->get_vdop()
@ -2469,10 +2469,11 @@ int rtklib_pvt_gs::work(int noutput_items, gr_vector_const_void_star& input_item
}
// PVT MONITOR
if (d_user_pvt_solver->is_valid_position())
if (d_user_pvt_solver->is_valid_position() && flag_compute_pvt_output == true)
{
const std::shared_ptr<Monitor_Pvt> monitor_pvt = std::make_shared<Monitor_Pvt>(d_user_pvt_solver->get_monitor_pvt());
monitor_pvt->geohash = d_geohash->encode(d_user_pvt_solver->get_latitude(), d_user_pvt_solver->get_longitude());
DLOG(INFO) << "geohash=" << monitor_pvt->geohash;
// publish new position to the gnss_flowgraph channel status monitor
if (current_RX_time_ms % d_report_rate_ms == 0)
{

View File

@ -19,6 +19,7 @@
#include <boost/serialization/nvp.hpp>
#include <cstdint>
#include <string>
/** \addtogroup PVT
* \{ */
@ -63,6 +64,16 @@ public:
double longitude;
// GEO user position Height [m]
double height;
// East, Nord, Up (ENU) Velocity [m/s]
double vel_e;
double vel_n;
double vel_u;
// Course Over Ground (COG) [deg]
double cog;
// Galileo HAS status: 1- HAS messages decoded and applied, 0 - HAS not avaliable
uint32_t galhas_status;
// NUMBER OF VALID SATS
uint8_t valid_sats;
@ -84,6 +95,11 @@ public:
// User clock drift [ppm]
double user_clk_drift_ppm;
// PVT UTC Time (rfc 3339 datetime string)
std::string utc_time;
std::string geohash; // See https://en.wikipedia.org/wiki/Geohash
/*!
* \brief This member function serializes and restores
* Monitor_Pvt objects from a byte stream.
@ -131,6 +147,14 @@ public:
ar& BOOST_SERIALIZATION_NVP(vdop);
ar& BOOST_SERIALIZATION_NVP(user_clk_drift_ppm);
ar& BOOST_SERIALIZATION_NVP(utc_time);
ar& BOOST_SERIALIZATION_NVP(vel_e);
ar& BOOST_SERIALIZATION_NVP(vel_n);
ar& BOOST_SERIALIZATION_NVP(vel_u);
ar& BOOST_SERIALIZATION_NVP(cog);
ar& BOOST_SERIALIZATION_NVP(geohash);
}
};

View File

@ -1598,7 +1598,7 @@ bool Rtklib_Solver::get_PVT(const std::map<int, Gnss_Synchro> &gnss_observables_
ecef2pos(pvt_sol.rr, pos.data());
ecef2enu(pos.data(), &pvt_sol.rr[3], enuv.data());
this->set_speed_over_ground(norm_rtk(enuv.data(), 2));
double new_cog;
double new_cog = -9999.0; // COG not estimated due to insuficient velocity
if (ground_speed_ms >= 1.0)
{
new_cog = atan2(enuv[0], enuv[1]) * R2D;
@ -1680,12 +1680,41 @@ bool Rtklib_Solver::get_PVT(const std::map<int, Gnss_Synchro> &gnss_observables_
this->set_rx_vel({enuv[0], enuv[1], enuv[2]});
// ENU vel [m/s]
d_monitor_pvt.vel_e = enuv[0];
d_monitor_pvt.vel_n = enuv[1];
d_monitor_pvt.vel_u = enuv[2];
// Course Over Ground (cog) [deg]
d_monitor_pvt.cog = new_cog;
// Galileo HAS status: 1- HAS messages decoded and applied, 0 - HAS not avaliable
if (d_has_obs_corr_map.empty())
{
d_monitor_pvt.galhas_status = 0;
}
else
{
d_monitor_pvt.galhas_status = 1;
}
const double clock_drift_ppm = pvt_sol.dtr[5] / SPEED_OF_LIGHT_M_S * 1e6;
this->set_clock_drift_ppm(clock_drift_ppm);
// User clock drift [ppm]
d_monitor_pvt.user_clk_drift_ppm = clock_drift_ppm;
// write UTC time string
// Use a facet to display time in a custom format (only hour and minutes).
auto *facet = new boost::posix_time::time_facet();
facet->format("%Y-%m-%dT%H:%M:%S%F");
std::stringstream stream;
stream.imbue(std::locale(std::locale::classic(), facet));
stream << p_time;
stream << 'Z';
d_monitor_pvt.utc_time = stream.str();
// ######## LOG FILE #########
if (d_flag_dump_enabled == true)
{

View File

@ -112,6 +112,13 @@ public:
monitor_.set_hdop(monitor->hdop);
monitor_.set_vdop(monitor->vdop);
monitor_.set_user_clk_drift_ppm(monitor->user_clk_drift_ppm);
monitor_.set_utc_time(monitor->utc_time);
monitor_.set_vel_e(monitor->vel_e);
monitor_.set_vel_n(monitor->vel_n);
monitor_.set_vel_u(monitor->vel_u);
monitor_.set_cog(monitor->cog);
monitor_.set_galhas_status(monitor->galhas_status);
monitor_.set_geohash(monitor->geohash);
monitor_.SerializeToString(&data);
return data;
@ -150,6 +157,13 @@ public:
monitor.hdop = mon.hdop();
monitor.vdop = mon.vdop();
monitor.user_clk_drift_ppm = mon.user_clk_drift_ppm();
monitor.utc_time = mon.utc_time();
monitor.vel_e = mon.vel_e();
monitor.vel_n = mon.vel_n();
monitor.vel_u = mon.vel_u();
monitor.cog = mon.cog();
monitor.galhas_status = mon.galhas_status();
monitor.geohash = mon.geohash();
return monitor;
}

View File

@ -44,7 +44,7 @@ GalileoE1PcpsAmbiguousAcquisitionFpga::GalileoE1PcpsAmbiguousAcquisitionFpga(
out_streams_(out_streams),
acquire_pilot_(configuration->property(role + ".acquire_pilot", false))
{
acq_parameters_.SetFromConfiguration(configuration, role_, fpga_downsampling_factor, fpga_buff_num, fpga_blk_exp, GALILEO_E1_CODE_CHIP_RATE_CPS, GALILEO_E1_B_CODE_LENGTH_CHIPS);
acq_parameters_.SetFromConfiguration(configuration, role_, fpga_buff_num, fpga_blk_exp, GALILEO_E1_CODE_CHIP_RATE_CPS, GALILEO_E1_B_CODE_LENGTH_CHIPS);
if (FLAGS_doppler_max != 0)
{

View File

@ -181,7 +181,6 @@ public:
void set_resampler_latency(uint32_t latency_samples __attribute__((unused))) override{};
private:
static const uint32_t fpga_downsampling_factor = 4; // downampling factor in the FPGA
static const uint32_t fpga_buff_num = 0; // L1/E1 band
static const uint32_t fpga_blk_exp = 13; // default block exponent

View File

@ -43,7 +43,7 @@ GalileoE5aPcpsAcquisitionFpga::GalileoE5aPcpsAcquisitionFpga(
acq_pilot_(configuration->property(role + ".acquire_pilot", false)),
acq_iq_(configuration->property(role + ".acquire_iq", false))
{
acq_parameters_.SetFromConfiguration(configuration, role_, fpga_downsampling_factor, fpga_buff_num, fpga_blk_exp, GALILEO_E5A_CODE_CHIP_RATE_CPS, GALILEO_E5A_CODE_LENGTH_CHIPS);
acq_parameters_.SetFromConfiguration(configuration, role_, fpga_buff_num, fpga_blk_exp, GALILEO_E5A_CODE_CHIP_RATE_CPS, GALILEO_E5A_CODE_LENGTH_CHIPS);
if (FLAGS_doppler_max != 0)
{

View File

@ -188,7 +188,6 @@ public:
void set_resampler_latency(uint32_t latency_samples __attribute__((unused))) override{};
private:
static const uint32_t fpga_downsampling_factor = 1; // downampling factor in the FPGA
static const uint32_t fpga_buff_num = 1; // L5/E5a band
static const uint32_t fpga_blk_exp = 13; // default block exponent

View File

@ -43,7 +43,7 @@ GalileoE5bPcpsAcquisitionFpga::GalileoE5bPcpsAcquisitionFpga(const Configuration
acq_pilot_(configuration->property(role + ".acquire_pilot", false)),
acq_iq_(configuration->property(role + ".acquire_iq", false))
{
acq_parameters_.SetFromConfiguration(configuration, role_, fpga_downsampling_factor, fpga_buff_num, fpga_blk_exp, GALILEO_E5B_CODE_CHIP_RATE_CPS, GALILEO_E5B_CODE_LENGTH_CHIPS);
acq_parameters_.SetFromConfiguration(configuration, role_, fpga_buff_num, fpga_blk_exp, GALILEO_E5B_CODE_CHIP_RATE_CPS, GALILEO_E5B_CODE_LENGTH_CHIPS);
if (FLAGS_doppler_max != 0)
{
acq_parameters_.doppler_max = FLAGS_doppler_max;

View File

@ -187,7 +187,6 @@ public:
void set_resampler_latency(uint32_t latency_samples __attribute__((unused))) override{};
private:
static const uint32_t fpga_downsampling_factor = 1; // downampling factor in the FPGA
static const uint32_t fpga_buff_num = 1; // E5b band
static const uint32_t fpga_blk_exp = 13; // default block exponent

View File

@ -43,7 +43,7 @@ GpsL1CaPcpsAcquisitionFpga::GpsL1CaPcpsAcquisitionFpga(
in_streams_(in_streams),
out_streams_(out_streams)
{
acq_parameters_.SetFromConfiguration(configuration, role, fpga_downsampling_factor, fpga_buff_num, fpga_blk_exp, GPS_L1_CA_CODE_RATE_CPS, GPS_L1_CA_CODE_LENGTH_CHIPS);
acq_parameters_.SetFromConfiguration(configuration, role, fpga_buff_num, fpga_blk_exp, GPS_L1_CA_CODE_RATE_CPS, GPS_L1_CA_CODE_LENGTH_CHIPS);
DLOG(INFO) << "role " << role;

View File

@ -186,7 +186,6 @@ public:
private:
static const uint32_t NUM_PRNs = 32;
static const uint32_t fpga_downsampling_factor = 4; // downampling factor in the FPGA
static const uint32_t fpga_buff_num = 0; // L1/E1 band
static const uint32_t fpga_blk_exp = 10; // default block exponent

View File

@ -43,7 +43,7 @@ GpsL2MPcpsAcquisitionFpga::GpsL2MPcpsAcquisitionFpga(
in_streams_(in_streams),
out_streams_(out_streams)
{
acq_parameters_.SetFromConfiguration(configuration, role, fpga_downsampling_factor, fpga_buff_num, fpga_blk_exp, GPS_L2_M_CODE_RATE_CPS, GPS_L2_M_CODE_LENGTH_CHIPS);
acq_parameters_.SetFromConfiguration(configuration, role, fpga_buff_num, fpga_blk_exp, GPS_L2_M_CODE_RATE_CPS, GPS_L2_M_CODE_LENGTH_CHIPS);
LOG(INFO) << "role " << role;

View File

@ -149,7 +149,6 @@ public:
void set_resampler_latency(uint32_t latency_samples __attribute__((unused))) override{};
private:
static const uint32_t fpga_downsampling_factor = 4; // downampling factor in the FPGA
static const uint32_t fpga_buff_num = 0; // L2 band
static const uint32_t fpga_blk_exp = 13; // default block exponent

View File

@ -44,7 +44,7 @@ GpsL5iPcpsAcquisitionFpga::GpsL5iPcpsAcquisitionFpga(
in_streams_(in_streams),
out_streams_(out_streams)
{
acq_parameters_.SetFromConfiguration(configuration, role, fpga_downsampling_factor, fpga_buff_num, fpga_blk_exp, GPS_L5I_CODE_RATE_CPS, GPS_L5I_CODE_LENGTH_CHIPS);
acq_parameters_.SetFromConfiguration(configuration, role, fpga_buff_num, fpga_blk_exp, GPS_L5I_CODE_RATE_CPS, GPS_L5I_CODE_LENGTH_CHIPS);
LOG(INFO) << "role " << role;

View File

@ -186,7 +186,6 @@ public:
private:
static const uint32_t NUM_PRNs = 32;
static const uint32_t fpga_downsampling_factor = 1; // downampling factor in the FPGA
static const uint32_t fpga_buff_num = 1; // L5/E5a band
static const uint32_t fpga_blk_exp = 13; // default block exponent

View File

@ -23,7 +23,7 @@
#include <iostream>
void Acq_Conf_Fpga::SetFromConfiguration(const ConfigurationInterface *configuration,
const std::string &role, uint32_t downs_factor, uint32_t sel_queue_fpga, uint32_t blk_exp, double chip_rate, double code_length_chips)
const std::string &role, uint32_t sel_queue_fpga, uint32_t blk_exp, double chip_rate, double code_length_chips)
{
// sampling frequency
const int64_t fs_in_deprecated = configuration->property("GNSS-SDR.internal_fs_hz", fs_in);
@ -33,7 +33,8 @@ void Acq_Conf_Fpga::SetFromConfiguration(const ConfigurationInterface *configura
doppler_max = configuration->property(role + ".doppler_max", doppler_max);
// downsampling factor
uint32_t downsampling_factor = configuration->property(role + ".downsampling_factor", downs_factor);
downsampling_factor = configuration->property(role + ".downsampling_factor", downsampling_factor);
fs_in = fs_in / downsampling_factor;
// code length in samples

View File

@ -35,7 +35,7 @@ class Acq_Conf_Fpga
public:
Acq_Conf_Fpga() = default;
void SetFromConfiguration(const ConfigurationInterface *configuration, const std::string &role, uint32_t downs_factor, uint32_t sel_queue_fpga, uint32_t blk_exp, double chip_rate, double code_length_chips);
void SetFromConfiguration(const ConfigurationInterface *configuration, const std::string &role, uint32_t sel_queue_fpga, uint32_t blk_exp, double chip_rate, double code_length_chips);
/* PCPS Acquisition configuration */
std::string device_name = "uio0";

View File

@ -8,7 +8,7 @@
########################################################################
# Project setup
########################################################################
cmake_minimum_required(VERSION 2.8.12...3.26)
cmake_minimum_required(VERSION 2.8.12...3.27)
set(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} CACHE STRING "Choose build type: None Debug Release RelWithDebInfo MinSizeRel")
project(volk_gnsssdr)
enable_language(CXX)

View File

@ -52,18 +52,42 @@ set(VOLK_PYTHON3_MIN_VERSION "3.4")
if(CMAKE_VERSION VERSION_LESS 3.12 OR CMAKE_CROSSCOMPILING)
if(PYTHON_EXECUTABLE)
message(STATUS "User set python executable ${PYTHON_EXECUTABLE}")
find_package(PythonInterp ${VOLK_PYTHON_MIN_VERSION} REQUIRED)
if(CMAKE_VERSION VERSION_LESS "3.24") # For cross-compiling
find_package(PythonInterp ${VOLK_PYTHON_MIN3_VERSION} REQUIRED)
else()
set(Python_EXECUTABLE ${PYTHON_EXECUTABLE})
find_package(Python COMPONENTS Interpreter)
set(PYTHONINTERP_FOUND Python_Interpreter_FOUND)
set(PYTHON_VERSION_MAJOR "${Python_VERSION_MAJOR}")
set(PYTHON_VERSION_STRING "${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}")
endif()
if(PYTHON_VERSION_STRING VERSION_LESS "3.0")
volk_python_check_module("six - python 2 and 3 compatibility library" six "True" SIX_FOUND)
endif()
else()
message(STATUS "PYTHON_EXECUTABLE not set - trying by default python3")
message(STATUS "Use -DPYTHON_EXECUTABLE=/path/to/python to build for python 2.7")
set(Python_ADDITIONAL_VERSIONS 3.4 3.5 3.6 3.7 3.8 3.9)
find_package(PythonInterp ${VOLK_PYTHON_MIN3_VERSION})
if(CMAKE_VERSION VERSION_LESS "3.24") # For cross-compiling
set(Python_ADDITIONAL_VERSIONS 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11)
find_package(PythonInterp ${VOLK_PYTHON_MIN3_VERSION} REQUIRED)
else()
find_package(Python COMPONENTS Interpreter)
set(PYTHONINTERP_FOUND Python_Interpreter_FOUND)
set(PYTHON_EXECUTABLE "${Python_EXECUTABLE}")
set(PYTHON_VERSION_MAJOR "${Python_VERSION_MAJOR}")
set(PYTHON_VERSION_STRING "${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}")
endif()
if(NOT PYTHONINTERP_FOUND)
message(STATUS "python3 not found - trying with python2.7")
find_package(PythonInterp ${VOLK_PYTHON_MIN_VERSION} REQUIRED)
if(CMAKE_VERSION VERSION_LESS "3.24")
find_package(PythonInterp ${VOLK_PYTHON_MIN3_VERSION} REQUIRED)
else()
find_package(Python2 COMPONENTS Interpreter)
set(PYTHONINTERP_FOUND Python2_Interpreter_FOUND)
set(PYTHON_VERSION_MAJOR "${Python2_VERSION_MAJOR}")
set(PYTHON_EXECUTABLE "${Python2_EXECUTABLE}")
set(PYTHON_VERSION_STRING "${Python2_VERSION_MAJOR}.${Python2_VERSION_MINOR}")
endif()
volk_python_check_module("six - python 2 and 3 compatibility library" six "True" SIX_FOUND)
endif()
endif()
@ -71,7 +95,15 @@ if(CMAKE_VERSION VERSION_LESS 3.12 OR CMAKE_CROSSCOMPILING)
else()
if(PYTHON_EXECUTABLE)
message(STATUS "User set python executable ${PYTHON_EXECUTABLE}")
if(CMAKE_VERSION VERSION_LESS "3.24")
find_package(PythonInterp ${VOLK_PYTHON_MIN_VERSION} REQUIRED)
else()
set(Python_EXECUTABLE ${PYTHON_EXECUTABLE})
find_package(Python COMPONENTS Interpreter)
set(PYTHONINTERP_FOUND Python_Interpreter_FOUND)
set(PYTHON_VERSION_MAJOR "${Python_VERSION_MAJOR}")
set(PYTHON_VERSION_STRING "${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}")
endif()
volk_python_check_module("mako >= 0.4.2" mako "mako.__version__ >= '0.4.2'" MAKO_FOUND)
if(PYTHON_VERSION_STRING VERSION_LESS "3.0")
volk_python_check_module("six - python 2 and 3 compatibility library" six "True" SIX_FOUND)
@ -102,8 +134,37 @@ else()
endif()
if(NOT MAKO_FOUND OR NOT SIX_FOUND)
unset(PYTHON_EXECUTABLE)
if(CMAKE_VERSION VERSION_LESS "3.24")
find_package(PythonInterp ${VOLK_PYTHON_MIN_VERSION})
else()
find_package(Python COMPONENTS Interpreter)
set(PYTHONINTERP_FOUND Python_Interpreter_FOUND)
set(PYTHON_EXECUTABLE "${Python_EXECUTABLE}")
set(PYTHON_VERSION_MAJOR "${Python_VERSION_MAJOR}")
set(PYTHON_VERSION_STRING "${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}")
endif()
volk_python_check_module("mako >= 0.4.2" mako "mako.__version__ >= '0.4.2'" MAKO_FOUND)
if(NOT MAKO_FOUND)
unset(PYTHON_EXECUTABLE)
unset(PYTHON_VERSION_STRING)
find_program(PYTHON_EXECUTABLE NAMES python3 python)
if(PYTHON_EXECUTABLE)
set(PYTHONINTERP_FOUND TRUE)
execute_process(COMMAND ${PYTHON_EXECUTABLE} --version OUTPUT_VARIABLE PYTHON_VERSION_STRING_AUX)
string(FIND "${PYTHON_VERSION_STRING_AUX}" " " blank_char_index)
if(blank_char_index GREATER -1)
math(EXPR start_index "${blank_char_index} + 1")
string(SUBSTRING "${PYTHON_VERSION_STRING_AUX}" ${start_index} -1 PYTHON_VERSION_STRING)
string(STRIP ${PYTHON_VERSION_STRING} PYTHON_VERSION_STRING)
string(SUBSTRING "${PYTHON_VERSION_STRING_AUX}" ${start_index} 1 PYTHON_VERSION_MAJOR)
message(STATUS "Found Python: ${PYTHON_EXECUTABLE} (found version: ${PYTHON_VERSION_STRING})")
endif()
volk_python_check_module("mako >= 0.4.2" mako "mako.__version__ >= '0.4.2'" MAKO_FOUND)
if(MAKO_FOUND AND PYTHON_VERSION_STRING VERSION_LESS "3.0")
gnsssdr_python_check_module("six - python 2 and 3 compatibility library" six "True" SIX_FOUND)
endif()
endif()
endif()
endif()
endif()
endif()
@ -114,6 +175,7 @@ if(${PYTHON_VERSION_MAJOR} VERSION_EQUAL 3)
endif()
########################################################################
# Sets the python installation directory VOLK_PYTHON_DIR
########################################################################

View File

@ -43,6 +43,7 @@ HybridObservables::HybridObservables(const ConfigurationInterface* configuration
conf.observable_interval_ms = configuration->property("GNSS-SDR.observable_interval_ms", conf.observable_interval_ms);
conf.enable_carrier_smoothing = configuration->property(role + ".enable_carrier_smoothing", conf.enable_carrier_smoothing);
conf.always_output_gs = configuration->property("PVT.an_output_enabled", conf.always_output_gs) || configuration->property(role + ".always_output_gs", conf.always_output_gs);
conf.enable_E6 = configuration->property("PVT.use_e6_for_pvt", conf.enable_E6);
if (FLAGS_carrier_smoothing_factor == DEFAULT_CARRIER_SMOOTHING_FACTOR)
{

View File

@ -93,7 +93,7 @@ hybrid_observables_gs::hybrid_observables_gs(const Obs_Conf &conf_)
d_gnss_synchro_history = std::make_unique<Gnss_circular_deque<Gnss_Synchro>>(1000, d_nchannels_out);
d_Rx_clock_buffer.set_capacity(std::min(std::max(200U / d_T_rx_step_ms, 3U), 10U));
d_Rx_clock_buffer.set_capacity(std::min(std::max(300U / d_T_rx_step_ms, 3U), 20U));
d_Rx_clock_buffer.clear();
d_channel_last_pll_lock = std::vector<bool>(d_nchannels_out, false);
@ -720,6 +720,13 @@ int hybrid_observables_gs::general_work(int noutput_items __attribute__((unused)
// Push the valid tracking Gnss_Synchros to their corresponding deque
if (in[n][m].Flag_valid_word)
{
if (std::string(in[n][m].Signal, 2) == std::string("E6"))
{
if (d_conf.enable_E6 == false)
{
continue;
}
}
if (d_gnss_synchro_history->size(n) > 0)
{
// Check if the last Gnss_Synchro comes from the same satellite as the previous ones

View File

@ -41,6 +41,7 @@ public:
bool always_output_gs{false};
bool dump{false};
bool dump_mat{false};
bool enable_E6{false};
};
/** \} */

View File

@ -59,26 +59,26 @@ Ad9361FpgaSignalSource::Ad9361FpgaSignalSource(const ConfigurationInterface *con
filename0_(configuration->property(role + ".filename", empty_string)),
rf_gain_rx1_(configuration->property(role + ".gain_rx1", default_manual_gain_rx1)),
rf_gain_rx2_(configuration->property(role + ".gain_rx2", default_manual_gain_rx2)),
scale_dds_dbfs_(configuration->property(role + ".scale_dds_dbfs", -3.0)),
phase_dds_deg_(configuration->property(role + ".phase_dds_deg", 0.0)),
tx_attenuation_db_(configuration->property(role + ".tx_attenuation_db", default_tx_attenuation_db)),
freq0_(configuration->property(role + ".freq", 0)),
freq1_(configuration->property(role + ".freq1", static_cast<uint64_t>(GPS_L5_FREQ_HZ))),
sample_rate_(configuration->property(role + ".sampling_frequency", default_bandwidth)),
bandwidth_(configuration->property(role + ".bandwidth", default_bandwidth)),
samples_to_skip_(0),
samples_(configuration->property(role + ".samples", static_cast<int64_t>(0))),
freq_dds_tx_hz_(configuration->property(role + ".freq_dds_tx_hz", uint64_t(10000))),
freq_rf_tx_hz_(configuration->property(role + ".freq_rf_tx_hz", static_cast<uint64_t>(GPS_L1_FREQ_HZ - GPS_L5_FREQ_HZ - freq_dds_tx_hz_))),
tx_bandwidth_(configuration->property(role + ".tx_bandwidth", static_cast<uint64_t>(500000))),
Fpass_(configuration->property(role + ".Fpass", static_cast<float>(0.0))),
Fstop_(configuration->property(role + ".Fstop", static_cast<float>(0.0))),
num_freq_bands_(2),
dma_buff_offset_pos_(0),
scale_dds_dbfs_(configuration->property(role + ".scale_dds_dbfs", -3.0)),
phase_dds_deg_(configuration->property(role + ".phase_dds_deg", 0.0)),
tx_attenuation_db_(configuration->property(role + ".tx_attenuation_db", default_tx_attenuation_db)),
freq_dds_tx_hz_(configuration->property(role + ".freq_dds_tx_hz", uint64_t(10000))),
freq_rf_tx_hz_(configuration->property(role + ".freq_rf_tx_hz", static_cast<uint64_t>(GPS_L1_FREQ_HZ - GPS_L5_FREQ_HZ - freq_dds_tx_hz_))),
tx_bandwidth_(configuration->property(role + ".tx_bandwidth", static_cast<uint64_t>(500000))),
item_size_(sizeof(int8_t)),
in_stream_(in_stream),
out_stream_(out_stream),
switch_position_(configuration->property(role + ".switch_position", 0)),
item_size_(sizeof(int8_t)),
enable_dds_lo_(configuration->property(role + ".enable_dds_lo", false)),
filter_auto_(configuration->property(role + ".filter_auto", false)),
quadrature_(configuration->property(role + ".quadrature", true)),
@ -93,11 +93,17 @@ Ad9361FpgaSignalSource::Ad9361FpgaSignalSource(const ConfigurationInterface *con
rf_shutdown_(configuration->property(role + ".rf_shutdown", FLAGS_rf_shutdown)),
repeat_(configuration->property(role + ".repeat", false))
{
const int l1_band = configuration->property("Channels_1C.count", 0) +
configuration->property("Channels_1B.count", 0);
const double seconds_to_skip = configuration->property(role + ".seconds_to_skip", 0.0);
const size_t header_size = configuration->property(role + ".header_size", 0);
const int num_ch_rx1 = configuration->property("Channels_1C.count", 0) +
configuration->property("Channels_1B.count", 0);
const int num_ch_rx2 = (configuration->property("Channels_L2.count", 0) > 0) ? configuration->property("Channels_L2.count", 0) : configuration->property("Channels_L5.count", 0) + configuration->property("Channels_5X.count", 0);
// number of frequency bands
if (num_ch_rx2 == 0)
{
num_freq_bands_ = 1;
}
if (freq0_ == 0)
{
@ -135,8 +141,7 @@ Ad9361FpgaSignalSource::Ad9361FpgaSignalSource(const ConfigurationInterface *con
// if more than one input file are specified then the DMA transfer the samples to both the L1 and the L2/L5 frequency channels.
if (filename1_.empty())
{
num_freq_bands_ = 1;
if (l1_band != 0)
if (num_ch_rx1 != 0)
{
dma_buff_offset_pos_ = 2;
}
@ -160,7 +165,6 @@ Ad9361FpgaSignalSource::Ad9361FpgaSignalSource(const ConfigurationInterface *con
if (find_uio_dev_file_name(device_io_name, switch_device_name, 0) < 0)
{
std::cerr << "Cannot find the FPGA uio device file corresponding to device name " << switch_device_name << '\n';
item_size_ = 0;
return;
}
@ -196,7 +200,6 @@ Ad9361FpgaSignalSource::Ad9361FpgaSignalSource(const ConfigurationInterface *con
else
{
std::cerr << "SignalSource: Unable to open the samples file " << filename0_.c_str() << '\n';
item_size_ = 0;
return;
}
std::streamsize ss = std::cout.precision();
@ -224,7 +227,6 @@ Ad9361FpgaSignalSource::Ad9361FpgaSignalSource(const ConfigurationInterface *con
else
{
std::cerr << "SignalSource: Unable to open the samples file " << filename1_.c_str() << '\n';
item_size_ = 0;
return;
}
std::streamsize ss = std::cout.precision();
@ -372,7 +374,6 @@ Ad9361FpgaSignalSource::Ad9361FpgaSignalSource(const ConfigurationInterface *con
catch (const std::runtime_error &e)
{
std::cerr << "Exception cached when configuring the RX chain: " << e.what() << '\n';
item_size_ = 0;
return;
}
// LOCAL OSCILLATOR DDS GENERATOR FOR DUAL FREQUENCY OPERATION
@ -407,7 +408,6 @@ Ad9361FpgaSignalSource::Ad9361FpgaSignalSource(const ConfigurationInterface *con
catch (const std::runtime_error &e)
{
std::cerr << "Exception cached when configuring the TX carrier: " << e.what() << '\n';
item_size_ = 0;
return;
}
}
@ -424,7 +424,6 @@ Ad9361FpgaSignalSource::Ad9361FpgaSignalSource(const ConfigurationInterface *con
if (find_uio_dev_file_name(device_io_name_buffer_monitor, buffer_monitor_device_name, 0) < 0)
{
std::cerr << "Cannot find the FPGA uio device file corresponding to device name " << buffer_monitor_device_name << '\n';
item_size_ = 0;
return;
}
@ -435,25 +434,7 @@ Ad9361FpgaSignalSource::Ad9361FpgaSignalSource(const ConfigurationInterface *con
// dynamic bits selection
if (enable_dynamic_bit_selection_)
{
std::string device_io_name_dyn_bit_sel_0;
std::string device_io_name_dyn_bit_sel_1;
// find the uio device file corresponding to the dynamic bit selector 0 module.
if (find_uio_dev_file_name(device_io_name_dyn_bit_sel_0, dyn_bit_sel_device_name, 0) < 0)
{
std::cerr << "Cannot find the FPGA uio device file corresponding to device name " << dyn_bit_sel_device_name << '\n';
item_size_ = 0;
return;
}
// find the uio device file corresponding to the dynamic bit selector 1 module.
if (find_uio_dev_file_name(device_io_name_dyn_bit_sel_1, dyn_bit_sel_device_name, 1) < 0)
{
std::cerr << "Cannot find the FPGA uio device file corresponding to device name " << dyn_bit_sel_device_name << '\n';
item_size_ = 0;
return;
}
dynamic_bit_selection_fpga = std::make_shared<Fpga_dynamic_bit_selection>(device_io_name_dyn_bit_sel_0, device_io_name_dyn_bit_sel_1);
dynamic_bit_selection_fpga = std::make_shared<Fpga_dynamic_bit_selection>(num_freq_bands_);
thread_dynamic_bit_selection = std::thread([&] { run_dynamic_bit_selection_process(); });
}

View File

@ -118,7 +118,6 @@ private:
Concurrent_Queue<pmt::pmt_t> *queue_;
// Front-end settings
std::string gain_mode_rx1_;
std::string gain_mode_rx2_;
std::string rf_port_select_;
@ -130,30 +129,31 @@ private:
double rf_gain_rx1_;
double rf_gain_rx2_;
double scale_dds_dbfs_;
double phase_dds_deg_;
double tx_attenuation_db_;
uint64_t freq0_; // frequency of local oscillator for ADRV9361-A 0
uint64_t freq1_; // frequency of local oscillator for ADRV9361-B (if present)
uint64_t sample_rate_;
uint64_t bandwidth_;
uint64_t samples_to_skip_;
int64_t samples_;
uint64_t freq_dds_tx_hz_;
uint64_t freq_rf_tx_hz_;
uint64_t tx_bandwidth_;
float Fpass_;
float Fstop_;
uint32_t num_freq_bands_;
uint32_t dma_buff_offset_pos_;
// DDS configuration for LO generation for external mixer
double scale_dds_dbfs_;
double phase_dds_deg_;
double tx_attenuation_db_;
uint64_t freq_dds_tx_hz_;
uint64_t freq_rf_tx_hz_;
uint64_t tx_bandwidth_;
size_t item_size_;
uint32_t in_stream_;
uint32_t out_stream_;
int32_t switch_position_;
bool enable_dds_lo_;
size_t item_size_;
bool enable_dds_lo_;
bool filter_auto_;
bool quadrature_;
bool rf_dc_;

View File

@ -18,7 +18,7 @@
#ifndef SRC_LIBS_ad936x_iio_samples_H_
#define SRC_LIBS_ad936x_iio_samples_H_
#define IIO_DEFAULTAD936XAPIFIFOSIZE_SAMPLES 32768
#define IIO_DEFAULTAD936XAPIFIFOSIZE_SAMPLES 32768 * 4
#define IIO_INPUTRAMFIFOSIZE 256

View File

@ -2,7 +2,7 @@
* \file fpga_dynamic_bit_selection.cc
* \brief Dynamic Bit Selection in the received signal.
* \authors <ul>
* <li> Marc Majoral, 2020. mmajoral(at)cttc.es
* <li> Marc Majoral, 2023. mmajoral(at)cttc.es
* </ul>
*
* Class that controls the Dynamic Bit Selection in the FPGA.
@ -13,58 +13,52 @@
* GNSS-SDR is a Global Navigation Satellite System software-defined receiver.
* This file is part of GNSS-SDR.
*
* Copyright (C) 2010-2020 (see AUTHORS file for a list of contributors)
* Copyright (C) 2010-2023 (see AUTHORS file for a list of contributors)
* SPDX-License-Identifier: GPL-3.0-or-later
*
* -----------------------------------------------------------------------------
*/
#include "fpga_dynamic_bit_selection.h"
#include "uio_fpga.h"
#include <glog/logging.h>
#include <fcntl.h> // for open, O_RDWR, O_SYNC
#include <iostream> // for cout
#include <sys/mman.h> // for mmap
Fpga_dynamic_bit_selection::Fpga_dynamic_bit_selection(const std::string &device_name1, const std::string &device_name2)
Fpga_dynamic_bit_selection::Fpga_dynamic_bit_selection(uint32_t num_freq_bands)
: d_num_freq_bands(num_freq_bands)
{
// dynamic bits selection corresponding to frequency band 1
if ((d_device_descriptor1 = open(device_name1.c_str(), O_RDWR | O_SYNC)) == -1)
d_map_base = std::vector<volatile unsigned *>(d_num_freq_bands);
d_device_descriptors = std::vector<int>(d_num_freq_bands);
d_shift_out_bits = std::vector<uint32_t>(d_num_freq_bands);
for (uint32_t k = 0; k < d_num_freq_bands; k++)
{
LOG(WARNING) << "Cannot open deviceio" << device_name1;
// find the uio device file corresponding to the dynamic bit selector 0 module.
std::string device_name;
if (find_uio_dev_file_name(device_name, dyn_bit_sel_device_name, 0) < 0)
{
std::cerr << "Cannot find the FPGA uio device file corresponding to device name " << dyn_bit_sel_device_name << '\n';
return;
}
d_map_base1 = reinterpret_cast<volatile unsigned *>(mmap(nullptr, FPGA_PAGE_SIZE,
PROT_READ | PROT_WRITE, MAP_SHARED, d_device_descriptor1, 0));
// dynamic bits selection corresponding to frequency band 1
if ((d_device_descriptors[k] = open(device_name.c_str(), O_RDWR | O_SYNC)) == -1)
{
LOG(WARNING) << "Cannot open deviceio" << device_name;
}
d_map_base[k] = reinterpret_cast<volatile unsigned *>(mmap(nullptr, FPGA_PAGE_SIZE,
PROT_READ | PROT_WRITE, MAP_SHARED, d_device_descriptors[k], 0));
if (d_map_base1 == reinterpret_cast<void *>(-1))
if (d_map_base[k] == reinterpret_cast<void *>(-1))
{
LOG(WARNING) << "Cannot map the FPGA dynamic bit selection module in frequency band 1 into tracking memory";
std::cout << "Could not map dynamic bit selection memory corresponding to frequency band 1.\n";
}
// dynamic bits selection corresponding to frequency band 2
if ((d_device_descriptor2 = open(device_name2.c_str(), O_RDWR | O_SYNC)) == -1)
{
LOG(WARNING) << "Cannot open deviceio" << device_name2;
}
d_map_base2 = reinterpret_cast<volatile unsigned *>(mmap(nullptr, FPGA_PAGE_SIZE,
PROT_READ | PROT_WRITE, MAP_SHARED, d_device_descriptor2, 0));
if (d_map_base2 == reinterpret_cast<void *>(-1))
{
LOG(WARNING) << "Cannot map the FPGA dynamic bit selection module in frequency band 2 into tracking memory";
std::cout << "Could not map dynamic bit selection memory corresponding to frequency band 2.\n";
}
// initialize default bit selection
shift_out_bits_band1 = shift_out_bits_default;
shift_out_bits_band2 = shift_out_bits_default;
// init bit selection corresopnding to frequency band 1
d_map_base1[0] = shift_out_bits_band1;
// init bit selection corresponding to frequency band 2
d_map_base2[0] = shift_out_bits_band2;
d_shift_out_bits[k] = shift_out_bits_default;
d_map_base[k][0] = d_shift_out_bits[k];
}
DLOG(INFO) << "Dynamic bit selection FPGA class created";
}
@ -77,65 +71,42 @@ Fpga_dynamic_bit_selection::~Fpga_dynamic_bit_selection()
void Fpga_dynamic_bit_selection::bit_selection()
{
// estimated signal power corresponding to frequency band 1
uint32_t rx_signal_power1 = d_map_base1[1];
// estimated signal power corresponding to frequency band 2
uint32_t rx_signal_power2 = d_map_base2[1];
for (uint32_t k = 0; k < d_num_freq_bands; k++)
{
// estimated signal power
uint32_t rx_signal_power = d_map_base[k][1];
// dynamic bit selection corresponding to frequency band 1
if (rx_signal_power1 > Power_Threshold_High)
// dynamic bit selection
if (rx_signal_power > Power_Threshold_High)
{
if (shift_out_bits_band1 < shift_out_bit_max)
if (d_shift_out_bits[k] < shift_out_bit_max)
{
shift_out_bits_band1 = shift_out_bits_band1 + 1;
d_shift_out_bits[k] = d_shift_out_bits[k] + 1;
}
}
else if (rx_signal_power1 < Power_Threshold_Low)
else if (rx_signal_power < Power_Threshold_Low)
{
if (shift_out_bits_band1 > shift_out_bits_min)
if (d_shift_out_bits[k] > shift_out_bits_min)
{
shift_out_bits_band1 = shift_out_bits_band1 - 1;
}
}
// dynamic bit selection corresponding to frequency band 2
if (rx_signal_power2 > Power_Threshold_High)
{
if (shift_out_bits_band2 < shift_out_bit_max)
{
shift_out_bits_band2 = shift_out_bits_band2 + 1;
}
}
else if (rx_signal_power2 < Power_Threshold_Low)
{
if (shift_out_bits_band2 > shift_out_bits_min)
{
shift_out_bits_band2 = shift_out_bits_band2 - 1;
d_shift_out_bits[k] = d_shift_out_bits[k] - 1;
}
}
// update bit selection corresopnding to frequency band 1
d_map_base1[0] = shift_out_bits_band1;
// udpate bit selection corresponding to frequency band 2
d_map_base2[0] = shift_out_bits_band2;
d_map_base[k][0] = d_shift_out_bits[k];
}
}
void Fpga_dynamic_bit_selection::close_devices()
{
auto *aux = const_cast<unsigned *>(d_map_base1);
for (uint32_t k = 0; k < d_num_freq_bands; k++)
{
auto *aux = const_cast<unsigned *>(d_map_base[k]);
if (munmap(static_cast<void *>(aux), FPGA_PAGE_SIZE) == -1)
{
std::cout << "Failed to unmap memory uio\n";
}
aux = const_cast<unsigned *>(d_map_base2);
if (munmap(static_cast<void *>(aux), FPGA_PAGE_SIZE) == -1)
{
std::cout << "Failed to unmap memory uio\n";
close(d_device_descriptors[k]);
}
close(d_device_descriptor1);
close(d_device_descriptor2);
}

View File

@ -25,6 +25,7 @@
#include <cstddef>
#include <cstdint>
#include <string>
#include <vector>
/** \addtogroup Signal_Source
* \{ */
@ -42,7 +43,7 @@ public:
/*!
* \brief Constructor
*/
explicit Fpga_dynamic_bit_selection(const std::string& device_name1, const std::string& device_name2);
explicit Fpga_dynamic_bit_selection(uint32_t num_freq_bands);
/*!
* \brief Destructor
@ -52,12 +53,12 @@ public:
/*!
* \brief This function configures the switch in th eFPGA
*/
// void set_switch_position(int32_t switch_position);
void bit_selection(void);
private:
const std::string switch_device_name = std::string("AXIS_Switch_v1_0_0"); // Switch UIO device name
const std::string dyn_bit_sel_device_name = std::string("dynamic_bits_selector"); // Switch dhnamic bit selector device name
static const size_t FPGA_PAGE_SIZE = 0x1000;
static const uint32_t Num_bits_ADC = 12; // Number of bits in the ADC
static const uint32_t Num_bits_FPGA = 4; // Number of bits after the bit selection
static const uint32_t shift_out_bits_default = Num_bits_ADC - Num_bits_FPGA; // take the most significant bits by default
@ -70,14 +71,11 @@ private:
void close_devices(void);
uint32_t shift_out_bits_band1; // number of bits to shift for frequency band 1
uint32_t shift_out_bits_band2; // number of bits to shift for frequency band 2
std::vector<volatile unsigned*> d_map_base;
std::vector<int> d_device_descriptors;
std::vector<uint32_t> d_shift_out_bits;
volatile unsigned* d_map_base1; // driver memory map corresponding to frequency band 1
int d_device_descriptor1; // driver descriptor corresponding to frequency band 1
volatile unsigned* d_map_base2; // driver memory map corresponding to frequency band 2
int d_device_descriptor2; // driver descriptor corresponding to frequency band 2
uint32_t d_num_freq_bands; // number of frequency bands
};

View File

@ -33,6 +33,7 @@ GalileoE1BTelemetryDecoder::GalileoE1BTelemetryDecoder(
DLOG(INFO) << "role " << role;
tlm_parameters_.SetFromConfiguration(configuration, role);
tlm_parameters_.enable_reed_solomon = configuration->property(role + ".enable_reed_solomon", false);
tlm_parameters_.use_ced = configuration->property(role + ".use_reduced_ced", false);
// make telemetry decoder object
telemetry_decoder_ = galileo_make_telemetry_decoder_gs(satellite_, tlm_parameters_, 1); // unified galileo decoder set to INAV (frame_type=1)
DLOG(INFO) << "telemetry_decoder(" << telemetry_decoder_->unique_id() << ")";

View File

@ -105,8 +105,13 @@ galileo_telemetry_decoder_gs::galileo_telemetry_decoder_gs(
d_enable_reed_solomon_inav(false),
d_valid_timetag(false),
d_E6_TOW_set(false),
<<<<<<< HEAD
d_there_are_e1_channels(conf.there_are_e1_channels),
d_there_are_e6_channels(conf.there_are_e6_channels)
=======
d_there_are_e6_channels(conf.there_are_e6_channels),
d_use_ced(conf.use_ced)
>>>>>>> 62a8547e62605a6b9fa6b1e128beceb046bde2dc
{
// prevent telemetry symbols accumulation in output buffers
this->set_max_noutput_items(1);
@ -450,7 +455,7 @@ void galileo_telemetry_decoder_gs::decode_INAV_word(float *page_part_symbols, in
else
{
// If we still do not have ephemeris, check if we have a reduced CED
if ((d_band == '1') && !d_first_eph_sent && (d_inav_nav.have_new_reduced_ced() == true))
if ((d_band == '1') && d_use_ced && !d_first_eph_sent && (d_inav_nav.have_new_reduced_ced() == true))
{
const std::shared_ptr<Galileo_Ephemeris> tmp_obj = std::make_shared<Galileo_Ephemeris>(d_inav_nav.get_reduced_ced());
std::cout << "New Galileo E1 I/NAV reduced CED message received in channel " << d_channel << " from satellite " << d_satellite << std::endl;

View File

@ -153,6 +153,7 @@ private:
bool d_E6_TOW_set;
bool d_there_are_e1_channels;
bool d_there_are_e6_channels;
bool d_use_ced;
};

View File

@ -44,6 +44,7 @@ public:
bool enable_navdata_monitor{false};
bool there_are_e1_channels{false};
bool there_are_e6_channels{false};
bool use_ced{false};
};

View File

@ -279,7 +279,11 @@ void gnss_sdr_fpga_sample_counter::wait_for_interrupt() const
// enable interrupts
int32_t reenable = 1;
write(fd, reinterpret_cast<void *>(&reenable), sizeof(int32_t));
const ssize_t nbytes = TEMP_FAILURE_RETRY(write(fd, reinterpret_cast<void *>(&reenable), sizeof(int32_t)));
if (nbytes != sizeof(int32_t))
{
std::cerr << "Error re-enabling FPGA sample counter interrupt.\n";
}
// wait for interrupt
nb = read(fd, &irq_count, sizeof(irq_count));

View File

@ -55,6 +55,7 @@
#include <algorithm> // for find, min
#include <chrono> // for milliseconds
#include <cmath> // for floor, fmod, log
#include <csignal> // for signal, SIGINT
#include <ctime> // for time_t, gmtime, strftime
#include <exception> // for exception
#include <iostream> // for operator<<
@ -78,9 +79,17 @@ namespace wht = std;
extern Concurrent_Map<Gps_Acq_Assist> global_gps_acq_assist_map;
extern Concurrent_Queue<Gps_Acq_Assist> global_gps_acq_assist_queue;
ControlThread *ControlThread::me = nullptr;
ControlThread::ControlThread()
{
ControlThread::me = this;
/* the class will handle signals */
signal(SIGINT, ControlThread::handle_signal);
signal(SIGTERM, ControlThread::handle_signal);
signal(SIGHUP, ControlThread::handle_signal);
if (FLAGS_c == "-")
{
configuration_ = std::make_shared<FileConfiguration>(FLAGS_config_file);
@ -266,6 +275,28 @@ ControlThread::~ControlThread() // NOLINT(modernize-use-equals-default)
}
void ControlThread::handle_signal(int sig)
{
LOG(INFO) << "GNSS-SDR received " << sig << " OS signal";
if (sig == SIGINT || sig == SIGTERM || sig == SIGHUP)
{
ControlThread::me->control_queue_->push(pmt::make_any(command_event_make(200, 0)));
ControlThread::me->stop_ = true;
// Reset signal handling to default behavior
if (sig == SIGINT)
{
signal(SIGINT, SIG_DFL);
}
}
else if (sig == SIGCHLD)
{
LOG(INFO) << "Received SIGCHLD signal";
// todo
}
}
void ControlThread::telecommand_listener()
{
if (telecommand_enabled_)

View File

@ -54,6 +54,7 @@ class ConfigurationInterface;
class GNSSFlowgraph;
class Gnss_Satellite;
/*!
* \brief This class represents the main thread of the application, so the name is ControlThread.
* This is the GNSS Receiver Control Plane: it connects the flowgraph, starts running it,
@ -63,6 +64,7 @@ class Gnss_Satellite;
class ControlThread
{
public:
static ControlThread *me;
/*!
* \brief Default constructor
*/
@ -122,6 +124,12 @@ public:
}
private:
/*
* Callback function for handling signals.
* sig identifier of signal
*/
static void handle_signal(int sig);
void init();
void apply_action(unsigned int what);