1
0
mirror of https://github.com/gnss-sdr/gnss-sdr synced 2025-01-05 15:00:33 +00:00

Add decoded HAS mmesages to the navigation message monitor

This commit is contained in:
Carles Fernandez 2021-09-07 14:58:16 +02:00
parent 26f72075fc
commit 0319dd5ae1
No known key found for this signature in database
GPG Key ID: 4C583C52B0C3877D
6 changed files with 59 additions and 11 deletions

View File

@ -6,11 +6,12 @@ package gnss_sdr;
message navMsg {
string system = 1; // GNSS constellation: "G" for GPS, "R" for Glonass, "E" for Galileo, and "C" for Beidou.
string signal = 2; // GNSS signal: "1C" for GPS L1 C/A, "1B" for Galileo E1b/c, "1G" for Glonass L1 C/A, "2S" for GPS L2 L2C(M), "2G" for Glonass L2 C/A, "L5" for GPS L5, and "5X" for Galileo E5a
int32 prn = 3; // SV ID
string signal = 2; // GNSS signal: "1C" for GPS L1 C/A, "1B" for Galileo E1b/c, "1G" for Glonass L1 C/A, "2S" for GPS L2 L2C(M), "2G" for Glonass L2 C/A, "L5" for GPS L5, "5X" for Galileo E5a, and "E6" for Galileo E6B.
int32 prn = 3; // SV ID.
int32 tow_at_current_symbol_ms = 4; // Time of week of the last symbol received, in ms
string nav_message = 5; // for Galileo I/NAV: decoded half page (even or odd), 120 bits, as described in OS SIS ICD 2.0, paragraph 4.3.2.3. I/NAV Page Part
// for Galileo F/NAV: decoded word, 244 bits, as described in OS SIS ICD 2.0, paragraph 4.2.2. F/NAV Page Layout
string nav_message = 5; // for Galileo I/NAV: decoded half page (even or odd), 120 bits, as described in OS SIS ICD 2.0, paragraph 4.3.2.3. I/NAV Page Part.
// for Galileo F/NAV: decoded word, 244 bits, as described in OS SIS ICD 2.0, paragraph 4.2.2. F/NAV Page Layout.
// for Galileo HAS: decoded full HAS message (header + body), variable length, as described in Galileo HAS SIS ICD.
// For GPS LNAV: decoded subframe, 300 bits, as described in IS-GPS-200M paragraph 20.3.2 Message Structure.
// For GPS CNAV: decoded subframe, 300 bits, as described in IS-GPS-200M paragraph 30.3.3 Message Content.
}

View File

@ -48,6 +48,8 @@ galileo_e6_has_msg_receiver::galileo_e6_has_msg_receiver() : gr::block("galileo_
{
// register Gal E6 HAS input message port from telemetry blocks
this->message_port_register_in(pmt::mp("E6_HAS_from_TLM"));
// register nav message monitor out
this->message_port_register_out(pmt::mp("Nav_msg_from_TLM"));
this->set_msg_handler(pmt::mp("E6_HAS_from_TLM"),
#if HAS_GENERIC_LAMBDA
[this](auto&& PH1) { msg_handler_galileo_e6_has(PH1); });
@ -64,6 +66,17 @@ galileo_e6_has_msg_receiver::galileo_e6_has_msg_receiver() : gr::block("galileo_
// initialize Reed-Solomon decoder
d_rs = std::make_unique<ReedSolomon>();
d_nav_msg_packet.system = std::string("E");
d_nav_msg_packet.signal = std::string("E6");
d_nav_msg_packet.prn = 0;
d_nav_msg_packet.tow_at_current_symbol_ms = 0;
}
void galileo_e6_has_msg_receiver::set_enable_navdata_monitor(bool enable)
{
d_enable_navdata_monitor = enable;
}
@ -178,6 +191,24 @@ int galileo_e6_has_msg_receiver::decode_message_type1(uint8_t message_id, uint8_
}
}
if (erasure_positions.size() > 223)
{
// This should not happen! Maybe message_size < PID < 33 ?
// Don't even try to decode
std::string msg("Reed Solomon decoding of HAS message is not possible. Received PIDs:");
std::stringstream ss;
for (auto pid : d_received_pids[message_id])
{
ss << " " << static_cast<float>(pid);
}
ss << ", Message size: " << static_cast<float>(message_size) << " Message ID: " << static_cast<float>(message_id);
msg += ss.str();
LOG(ERROR) << msg;
d_received_pids[message_id].clear();
d_C_matrix[message_id] = {GALILEO_CNAV_MAX_NUMBER_SYMBOLS_ENCODED_BLOCK, std::vector<uint8_t>(GALILEO_CNAV_OCTETS_IN_SUBPAGE, 0)};
return -1;
}
DLOG(INFO) << debug_print_vector("List of received PIDs", d_received_pids[message_id]);
DLOG(INFO) << debug_print_vector("erasure_positions", erasure_positions);
DLOG(INFO) << debug_print_matrix("d_C_matrix produced", d_C_matrix[message_id]);
@ -235,6 +266,14 @@ int galileo_e6_has_msg_receiver::decode_message_type1(uint8_t message_id, uint8_
// Trigger HAS message content reading and fill the d_HAS_data object
d_HAS_data = Galileo_HAS_data();
if (d_enable_navdata_monitor)
{
d_nav_msg_packet.nav_message = decoded_message_type_1;
const std::shared_ptr<Nav_Message_Packet> tmp_obj = std::make_shared<Nav_Message_Packet>(d_nav_msg_packet);
this->message_port_pub(pmt::mp("Nav_msg_from_TLM"), pmt::make_any(tmp_obj));
}
read_MT1_header(decoded_message_type_1.substr(0, GALILEO_CNAV_MT1_HEADER_BITS));
read_MT1_body(std::string(decoded_message_type_1.begin() + GALILEO_CNAV_MT1_HEADER_BITS, decoded_message_type_1.end()));

View File

@ -23,6 +23,7 @@
#include "Galileo_CNAV.h"
#include "galileo_has_data.h"
#include "gnss_block_interface.h"
#include "nav_message_packet.h"
#include <gnuradio/block.h>
#include <pmt/pmt.h>
#include <bitset>
@ -55,6 +56,7 @@ class galileo_e6_has_msg_receiver : public gr::block
{
public:
~galileo_e6_has_msg_receiver() = default; //!< Default destructor
void set_enable_navdata_monitor(bool enable);
private:
friend galileo_e6_has_msg_receiver_sptr galileo_e6_has_msg_receiver_make();
@ -64,6 +66,8 @@ private:
void read_MT1_header(const std::string& message_header);
void read_MT1_body(const std::string& message_body);
Nav_Message_Packet d_nav_msg_packet;
int decode_message_type1(uint8_t message_id, uint8_t message_size);
uint8_t read_has_message_header_parameter_uint8(const std::bitset<GALILEO_CNAV_MT1_HEADER_BITS>& bits, const std::pair<int32_t, int32_t>& parameter) const;
uint16_t read_has_message_header_parameter_uint16(const std::bitset<GALILEO_CNAV_MT1_HEADER_BITS>& bits, const std::pair<int32_t, int32_t>& parameter) const;
@ -84,6 +88,7 @@ private:
std::vector<std::vector<uint8_t>> d_M_matrix{GALILEO_CNAV_INFORMATION_VECTOR_LENGTH, std::vector<uint8_t>(GALILEO_CNAV_OCTETS_IN_SUBPAGE, 0)}; // HAS message matrix 32 x 53
std::vector<std::vector<uint8_t>> d_received_pids{32, std::vector<uint8_t>()};
bool d_new_message{};
bool d_enable_navdata_monitor{};
};

View File

@ -1527,6 +1527,7 @@ int GNSSFlowgraph::connect_tracking_monitor()
return 0;
}
int GNSSFlowgraph::connect_navdata_monitor()
{
try
@ -1535,6 +1536,8 @@ int GNSSFlowgraph::connect_navdata_monitor()
{
top_block_->msg_connect(channels_.at(i)->get_right_block(), pmt::mp("Nav_msg_from_TLM"), NavDataMonitor_, pmt::mp("Nav_msg_from_TLM"));
}
gal_e6_has_rx_->set_enable_navdata_monitor(true);
top_block_->msg_connect(gal_e6_has_rx_, pmt::mp("Nav_msg_from_TLM"), NavDataMonitor_, pmt::mp("Nav_msg_from_TLM"));
}
catch (const std::exception& e)
{
@ -1596,8 +1599,6 @@ int GNSSFlowgraph::connect_gal_e6_has()
for (int i = 0; i < channels_count_; i++)
{
const std::string gnss_signal = channels_.at(i)->get_signal().get_signal_str();
std::string gnss_system;
Gnss_Signal signal_value;
switch (mapStringValues_[gnss_signal])
{
case evGAL_E6:
@ -1647,6 +1648,7 @@ int GNSSFlowgraph::disconnect_monitors()
if (enable_navdata_monitor_)
{
top_block_->msg_disconnect(channels_.at(i)->get_right_block(), pmt::mp("Nav_msg_from_TLM"), NavDataMonitor_, pmt::mp("Nav_msg_from_TLM"));
top_block_->msg_disconnect(gal_e6_has_rx_, pmt::mp("Nav_msg_from_TLM"), NavDataMonitor_, pmt::mp("Nav_msg_from_TLM"));
}
}
}

View File

@ -6,11 +6,12 @@ package gnss_sdr;
message navMsg {
string system = 1; // GNSS constellation: "G" for GPS, "R" for Glonass, "E" for Galileo, and "C" for Beidou.
string signal = 2; // GNSS signal: "1C" for GPS L1 C/A, "1B" for Galileo E1b/c, "1G" for Glonass L1 C/A, "2S" for GPS L2 L2C(M), "2G" for Glonass L2 C/A, "L5" for GPS L5, and "5X" for Galileo E5a
int32 prn = 3; // SV ID
string signal = 2; // GNSS signal: "1C" for GPS L1 C/A, "1B" for Galileo E1b/c, "1G" for Glonass L1 C/A, "2S" for GPS L2 L2C(M), "2G" for Glonass L2 C/A, "L5" for GPS L5, "5X" for Galileo E5a, and "E6" for Galileo E6B.
int32 prn = 3; // SV ID.
int32 tow_at_current_symbol_ms = 4; // Time of week of the last symbol received, in ms
string nav_message = 5; // for Galileo I/NAV: decoded half page (even or odd), 120 bits, as described in OS SIS ICD 2.0, paragraph 4.3.2.3. I/NAV Page Part
// for Galileo F/NAV: decoded word, 244 bits, as described in OS SIS ICD 2.0, paragraph 4.2.2. F/NAV Page Layout
string nav_message = 5; // for Galileo I/NAV: decoded half page (even or odd), 120 bits, as described in OS SIS ICD 2.0, paragraph 4.3.2.3. I/NAV Page Part.
// for Galileo F/NAV: decoded word, 244 bits, as described in OS SIS ICD 2.0, paragraph 4.2.2. F/NAV Page Layout.
// for Galileo HAS: decoded full HAS message (header + body), variable length, as described in Galileo HAS SIS ICD.
// For GPS LNAV: decoded subframe, 300 bits, as described in IS-GPS-200M paragraph 20.3.2 Message Structure.
// For GPS CNAV: decoded subframe, 300 bits, as described in IS-GPS-200M paragraph 30.3.3 Message Content.
}

View File

@ -26,7 +26,7 @@ Nav_Msg_Udp_Listener::Nav_Msg_Udp_Listener(unsigned short port)
bool Nav_Msg_Udp_Listener::read_nav_message(gnss_sdr::navMsg &message)
{
char buff[1500]; // Buffer for storing the received data.
char buff[8192]; // Buffer for storing the received data.
message_ = message;
// This call will block until one or more bytes of data has been received.