diff --git a/src/core/system_parameters/Galileo_INAV.h b/src/core/system_parameters/Galileo_INAV.h index e7a3d2ddb..72222baf2 100644 --- a/src/core/system_parameters/Galileo_INAV.h +++ b/src/core/system_parameters/Galileo_INAV.h @@ -269,6 +269,7 @@ const std::vector> RS_IODNAV_LSBS({{15, 2}}); constexpr size_t INAV_RS_SUBVECTOR_LENGTH = 15; constexpr size_t INAV_RS_PARITY_VECTOR_LENGTH = 60; constexpr size_t INAV_RS_INFO_VECTOR_LENGTH = 58; +constexpr size_t INAV_RS_BUFFER_LENGTH = 118; constexpr int32_t BITS_IN_OCTET = 8; constexpr int32_t FIRST_RS_BIT = 7; constexpr int32_t FIRST_RS_BIT_AFTER_IODNAV = 17; diff --git a/src/core/system_parameters/galileo_inav_message.cc b/src/core/system_parameters/galileo_inav_message.cc index 62bcb2921..6189a5cd7 100644 --- a/src/core/system_parameters/galileo_inav_message.cc +++ b/src/core/system_parameters/galileo_inav_message.cc @@ -31,10 +31,10 @@ using CRC_Galileo_INAV_type = boost::crc_optimal<24, 0x1864CFBU, 0x0, 0x0, false Galileo_Inav_Message::Galileo_Inav_Message() { - rs_info_vector = std::vector(INAV_RS_INFO_VECTOR_LENGTH, 0); - rs_parity_vector = std::vector(INAV_RS_PARITY_VECTOR_LENGTH, 0); + rs_buffer = std::vector(INAV_RS_BUFFER_LENGTH, 0); } + bool Galileo_Inav_Message::CRC_test(const std::bitset& bits, uint32_t checksum) const { CRC_Galileo_INAV_type CRC_Galileo; @@ -618,19 +618,19 @@ int32_t Galileo_Inav_Message::page_jk_decoder(const char* data_jk) { // IODnav changed, reset buffer current_IODnav = IOD_nav_1; - rs_info_vector = std::vector(INAV_RS_INFO_VECTOR_LENGTH, 0); + rs_buffer = std::vector(INAV_RS_BUFFER_LENGTH, 0); } // Store RS information vector C_{RS,0} std::vector> info_octet_bits({{1, 6}, {15, 2}}); - rs_info_vector[0] = read_octet_unsigned(data_jk_bits, info_octet_bits); + rs_buffer[0] = read_octet_unsigned(data_jk_bits, info_octet_bits); info_octet_bits = std::vector>({{7, BITS_IN_OCTET}}); - rs_info_vector[1] = read_octet_unsigned(data_jk_bits, info_octet_bits); + rs_buffer[1] = read_octet_unsigned(data_jk_bits, info_octet_bits); int32_t start_bit = FIRST_RS_BIT_AFTER_IODNAV; for (size_t i = 2; i < 16; i++) { info_octet_bits = std::vector>({{start_bit, BITS_IN_OCTET}}); - rs_info_vector[i] = read_octet_unsigned(data_jk_bits, info_octet_bits); + rs_buffer[i] = read_octet_unsigned(data_jk_bits, info_octet_bits); start_bit += BITS_IN_OCTET; } } @@ -651,16 +651,16 @@ int32_t Galileo_Inav_Message::page_jk_decoder(const char* data_jk) { // IODnav changed, reset buffer current_IODnav = IOD_nav_2; - rs_info_vector = std::vector(INAV_RS_INFO_VECTOR_LENGTH, 0); + rs_buffer = std::vector(INAV_RS_BUFFER_LENGTH, 0); } // Store RS information vector C_{RS,1} - rs_info_vector[0] = 4 + current_IODnav % 4; // we always know c_{0,0} + rs_buffer[0] = 4 + current_IODnav % 4; // we always know c_{0,0} int32_t start_bit = FIRST_RS_BIT_AFTER_IODNAV; for (size_t i = 16; i < 30; i++) { std::vector> info_octet_bits({{start_bit, BITS_IN_OCTET}}); - rs_info_vector[i] = read_octet_unsigned(data_jk_bits, info_octet_bits); + rs_buffer[i] = read_octet_unsigned(data_jk_bits, info_octet_bits); start_bit += BITS_IN_OCTET; } } @@ -679,16 +679,16 @@ int32_t Galileo_Inav_Message::page_jk_decoder(const char* data_jk) { // IODnav changed, reset buffer current_IODnav = IOD_nav_3; - rs_info_vector = std::vector(INAV_RS_INFO_VECTOR_LENGTH, 0); + rs_buffer = std::vector(INAV_RS_BUFFER_LENGTH, 0); } // Store RS information vector C_{RS,2} - rs_info_vector[0] = 4 + current_IODnav % 4; // we always know c_{0,0} + rs_buffer[0] = 4 + current_IODnav % 4; // we always know c_{0,0} int32_t start_bit = FIRST_RS_BIT_AFTER_IODNAV; for (size_t i = 30; i < 44; i++) { std::vector> info_octet_bits({{start_bit, BITS_IN_OCTET}}); - rs_info_vector[i] = read_octet_unsigned(data_jk_bits, info_octet_bits); + rs_buffer[i] = read_octet_unsigned(data_jk_bits, info_octet_bits); start_bit += BITS_IN_OCTET; } } @@ -708,16 +708,16 @@ int32_t Galileo_Inav_Message::page_jk_decoder(const char* data_jk) { // IODnav changed, reset buffer current_IODnav = IOD_nav_4; - rs_info_vector = std::vector(INAV_RS_INFO_VECTOR_LENGTH, 0); + rs_buffer = std::vector(INAV_RS_BUFFER_LENGTH, 0); } // Store RS information vector C_{RS,3} - rs_info_vector[0] = 4 + current_IODnav % 4; // we always know c_{0,0} + rs_buffer[0] = 4 + current_IODnav % 4; // we always know c_{0,0} int32_t start_bit = FIRST_RS_BIT_AFTER_IODNAV; for (size_t i = 44; i < INAV_RS_INFO_VECTOR_LENGTH; i++) { std::vector> info_octet_bits({{start_bit, BITS_IN_OCTET}}); - rs_info_vector[i] = read_octet_unsigned(data_jk_bits, info_octet_bits); + rs_buffer[i] = read_octet_unsigned(data_jk_bits, info_octet_bits); start_bit += BITS_IN_OCTET; } } @@ -988,20 +988,14 @@ int32_t Galileo_Inav_Message::page_jk_decoder(const char* data_jk) { IODnav_LSB17 = read_octet_unsigned(data_jk_bits, RS_IODNAV_LSBS); DLOG(INFO) << "IODnav 2 LSBs in Word type 17: " << static_cast(IODnav_LSB17); - if (IODnav_LSB17 != static_cast((current_IODnav % 4))) - { - // IODnav changed, reset buffers - current_IODnav = 0; - rs_parity_vector = std::vector(INAV_RS_PARITY_VECTOR_LENGTH, 0); - } // Store RS parity vector gamma_{RS,0} std::vector> gamma_octet_bits({{FIRST_RS_BIT, BITS_IN_OCTET}}); - rs_parity_vector[0] = read_octet_unsigned(data_jk_bits, gamma_octet_bits); + rs_buffer[INAV_RS_INFO_VECTOR_LENGTH] = read_octet_unsigned(data_jk_bits, gamma_octet_bits); int32_t start_bit = FIRST_RS_BIT_AFTER_IODNAV; for (size_t i = 1; i < INAV_RS_SUBVECTOR_LENGTH; i++) { gamma_octet_bits[0] = std::pair({start_bit, BITS_IN_OCTET}); - rs_parity_vector[i] = read_octet_unsigned(data_jk_bits, gamma_octet_bits); + rs_buffer[INAV_RS_INFO_VECTOR_LENGTH + i] = read_octet_unsigned(data_jk_bits, gamma_octet_bits); start_bit += BITS_IN_OCTET; } } @@ -1014,20 +1008,14 @@ int32_t Galileo_Inav_Message::page_jk_decoder(const char* data_jk) { IODnav_LSB18 = read_octet_unsigned(data_jk_bits, RS_IODNAV_LSBS); DLOG(INFO) << "IODnav 2 LSBs in Word type 18: " << static_cast(IODnav_LSB18); - if (IODnav_LSB18 != static_cast((current_IODnav % 4))) - { - // IODnav changed, reset buffers - current_IODnav = 0; - rs_parity_vector = std::vector(INAV_RS_PARITY_VECTOR_LENGTH, 0); - } // Store RS parity vector gamma_{RS,1} std::vector> gamma_octet_bits({{FIRST_RS_BIT, BITS_IN_OCTET}}); - rs_parity_vector[INAV_RS_SUBVECTOR_LENGTH] = read_octet_unsigned(data_jk_bits, gamma_octet_bits); + rs_buffer[INAV_RS_INFO_VECTOR_LENGTH + INAV_RS_SUBVECTOR_LENGTH] = read_octet_unsigned(data_jk_bits, gamma_octet_bits); int32_t start_bit = FIRST_RS_BIT_AFTER_IODNAV; for (size_t i = INAV_RS_SUBVECTOR_LENGTH + 1; i < 2 * INAV_RS_SUBVECTOR_LENGTH; i++) { gamma_octet_bits[0] = std::pair({start_bit, BITS_IN_OCTET}); - rs_parity_vector[i] = read_octet_unsigned(data_jk_bits, gamma_octet_bits); + rs_buffer[INAV_RS_INFO_VECTOR_LENGTH + i] = read_octet_unsigned(data_jk_bits, gamma_octet_bits); start_bit += BITS_IN_OCTET; } } @@ -1040,20 +1028,14 @@ int32_t Galileo_Inav_Message::page_jk_decoder(const char* data_jk) { IODnav_LSB19 = read_octet_unsigned(data_jk_bits, RS_IODNAV_LSBS); DLOG(INFO) << "IODnav 2 LSBs in Word type 19: " << static_cast(IODnav_LSB19); - if (IODnav_LSB19 != static_cast((current_IODnav % 4))) - { - // IODnav changed, reset buffers - current_IODnav = 0; - rs_parity_vector = std::vector(INAV_RS_PARITY_VECTOR_LENGTH, 0); - } // Store RS parity vector gamma_{RS,2} std::vector> gamma_octet_bits({{FIRST_RS_BIT, BITS_IN_OCTET}}); - rs_parity_vector[2 * INAV_RS_SUBVECTOR_LENGTH] = read_octet_unsigned(data_jk_bits, gamma_octet_bits); + rs_buffer[INAV_RS_INFO_VECTOR_LENGTH + 2 * INAV_RS_SUBVECTOR_LENGTH] = read_octet_unsigned(data_jk_bits, gamma_octet_bits); int32_t start_bit = FIRST_RS_BIT_AFTER_IODNAV; for (size_t i = 2 * INAV_RS_SUBVECTOR_LENGTH + 1; i < 3 * INAV_RS_SUBVECTOR_LENGTH; i++) { gamma_octet_bits[0] = std::pair({start_bit, BITS_IN_OCTET}); - rs_parity_vector[i] = read_octet_unsigned(data_jk_bits, gamma_octet_bits); + rs_buffer[INAV_RS_INFO_VECTOR_LENGTH + i] = read_octet_unsigned(data_jk_bits, gamma_octet_bits); start_bit += BITS_IN_OCTET; } } @@ -1066,20 +1048,14 @@ int32_t Galileo_Inav_Message::page_jk_decoder(const char* data_jk) { IODnav_LSB20 = read_octet_unsigned(data_jk_bits, RS_IODNAV_LSBS); DLOG(INFO) << "IODnav 2 LSBs in Word type 20: " << static_cast(IODnav_LSB20); - if (IODnav_LSB20 != static_cast((current_IODnav % 4))) - { - // IODnav changed, reset buffers - current_IODnav = 0; - rs_parity_vector = std::vector(INAV_RS_PARITY_VECTOR_LENGTH, 0); - } // Store RS parity vector gamma_{RS,4} std::vector> gamma_octet_bits({{FIRST_RS_BIT, BITS_IN_OCTET}}); - rs_parity_vector[3 * INAV_RS_SUBVECTOR_LENGTH] = read_octet_unsigned(data_jk_bits, gamma_octet_bits); + rs_buffer[INAV_RS_INFO_VECTOR_LENGTH + 3 * INAV_RS_SUBVECTOR_LENGTH] = read_octet_unsigned(data_jk_bits, gamma_octet_bits); int32_t start_bit = FIRST_RS_BIT_AFTER_IODNAV; for (size_t i = 3 * INAV_RS_SUBVECTOR_LENGTH + 1; i < 4 * INAV_RS_SUBVECTOR_LENGTH; i++) { gamma_octet_bits[0] = std::pair({start_bit, BITS_IN_OCTET}); - rs_parity_vector[i] = read_octet_unsigned(data_jk_bits, gamma_octet_bits); + rs_buffer[INAV_RS_INFO_VECTOR_LENGTH + i] = read_octet_unsigned(data_jk_bits, gamma_octet_bits); start_bit += BITS_IN_OCTET; } } diff --git a/src/core/system_parameters/galileo_inav_message.h b/src/core/system_parameters/galileo_inav_message.h index 93725af1f..f2e6273d6 100644 --- a/src/core/system_parameters/galileo_inav_message.h +++ b/src/core/system_parameters/galileo_inav_message.h @@ -366,11 +366,7 @@ private: int32_t current_IODnav{}; - // Word types 1, 2, 3, 4: Reed-Solomon information vector - std::vector rs_info_vector; - - // Word types 17, 18, 19, 20: Reed-Solomon parity vector - std::vector rs_parity_vector; + std::vector rs_buffer; // Reed-Solomon buffer uint8_t IODnav_LSB17{}; uint8_t IODnav_LSB18{};