diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 82799c0c..a5daca4a 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -224,6 +224,7 @@ endif (DISABLE_MONITOR)
option(DEBUG_DMR_PDU_DATA "" off)
option(DEBUG_CRC "" off)
option(DEBUG_RS "" off)
+option(DEBUG_AMBEFEC "" off)
option(DEBUG_MODEM_CAL "" off)
option(DEBUG_MODEM "" off)
option(DEBUG_NXDN_FACCH1 "" off)
@@ -255,6 +256,9 @@ endif (DEBUG_CRC_CHECK)
if (DEBUG_RS)
add_definitions(-DDEBUG_RS)
endif (DEBUG_RS)
+if (DEBUG_AMBEFEC)
+ add_definitions(-DDEBUG_AMBEFEC)
+endif (DEBUG_AMBEFEC)
if (DEBUG_MODEM_CAL)
add_definitions(-DDEBUG_MODEM_CAL)
endif (DEBUG_MODEM_CAL)
diff --git a/src/edac/AMBEFEC.cpp b/src/edac/AMBEFEC.cpp
index d4773a5d..8bde494a 100644
--- a/src/edac/AMBEFEC.cpp
+++ b/src/edac/AMBEFEC.cpp
@@ -33,6 +33,7 @@
#include "edac/AMBEFEC.h"
#include "edac/Golay24128.h"
#include "edac/Hamming.h"
+#include "Log.h"
#include "Utils.h"
using namespace edac;
@@ -105,21 +106,21 @@ uint32_t AMBEFEC::regenerateDMR(uint8_t* bytes) const
b3 |= MASK;
}
- MASK = 0x1000000U;
- for (uint32_t i = 0U; i < 25U; i++, MASK >>= 1) {
- uint32_t c1Pos = AMBE_C_TABLE[i];
- uint32_t c2Pos = c1Pos + 72U;
- if (c2Pos >= 108U)
- c2Pos += 48U;
- uint32_t c3Pos = c1Pos + 192U;
+ MASK = 0x1000000U;
+ for (uint32_t i = 0U; i < 25U; i++, MASK >>= 1) {
+ uint32_t c1Pos = AMBE_C_TABLE[i];
+ uint32_t c2Pos = c1Pos + 72U;
+ if (c2Pos >= 108U)
+ c2Pos += 48U;
+ uint32_t c3Pos = c1Pos + 192U;
- if (READ_BIT(bytes, c1Pos))
- c1 |= MASK;
- if (READ_BIT(bytes, c2Pos))
- c2 |= MASK;
- if (READ_BIT(bytes, c3Pos))
- c3 |= MASK;
- }
+ if (READ_BIT(bytes, c1Pos))
+ c1 |= MASK;
+ if (READ_BIT(bytes, c2Pos))
+ c2 |= MASK;
+ if (READ_BIT(bytes, c3Pos))
+ c3 |= MASK;
+ }
uint32_t errors = regenerate(a1, b1, c1);
errors += regenerate(a2, b2, c2);
@@ -212,21 +213,21 @@ uint32_t AMBEFEC::measureDMRBER(const uint8_t* bytes) const
b3 |= MASK;
}
- MASK = 0x1000000U;
- for (uint32_t i = 0U; i < 25U; i++, MASK >>= 1) {
- uint32_t c1Pos = AMBE_C_TABLE[i];
- uint32_t c2Pos = c1Pos + 72U;
- if (c2Pos >= 108U)
- c2Pos += 48U;
- uint32_t c3Pos = c1Pos + 192U;
+ MASK = 0x1000000U;
+ for (uint32_t i = 0U; i < 25U; i++, MASK >>= 1) {
+ uint32_t c1Pos = AMBE_C_TABLE[i];
+ uint32_t c2Pos = c1Pos + 72U;
+ if (c2Pos >= 108U)
+ c2Pos += 48U;
+ uint32_t c3Pos = c1Pos + 192U;
- if (READ_BIT(bytes, c1Pos))
- c1 |= MASK;
- if (READ_BIT(bytes, c2Pos))
- c2 |= MASK;
- if (READ_BIT(bytes, c3Pos))
- c3 |= MASK;
- }
+ if (READ_BIT(bytes, c1Pos))
+ c1 |= MASK;
+ if (READ_BIT(bytes, c2Pos))
+ c2 |= MASK;
+ if (READ_BIT(bytes, c3Pos))
+ c3 |= MASK;
+ }
uint32_t errors = regenerate(a1, b1, c1);
errors += regenerate(a2, b2, c2);
@@ -611,44 +612,49 @@ uint32_t AMBEFEC::measureNXDNBER(uint8_t* bytes) const
///
///
///
-///
///
-uint32_t AMBEFEC::regenerate(uint32_t& a, uint32_t& b, uint32_t& c, bool ignoreParity) const
+uint32_t AMBEFEC::regenerate(uint32_t& a, uint32_t& b, uint32_t& c) const
{
- uint32_t old_a = a;
- uint32_t old_b = b;
-
- uint32_t data;
- bool valid = Golay24128::decode24128(a, data);
- if (!valid && !ignoreParity) {
- a = 0xF00292U;
- b = 0x0E0B20U;
- c = 0x000000U;
- return 10U; // An invalid A block gives an error count of 10
- }
-
- a = Golay24128::encode24128(data);
+ uint32_t old_a = a;
+ uint32_t old_b = b;
+
+ uint32_t data;
+ bool valid = Golay24128::decode24128(a, data);
+ if (!valid) {
+ uint32_t errsA = Utils::countBits32(data ^ a);
+#if DEBUG_AMBEFEC
+ LogDebug(LOG_HOST, "AMBEFEC::regnerate() invalid A block, errsA = %u, a = %6X, b = %6X, c = %6X", errsA, a, b, c);
+#endif
+ a = 0xF00292U;
+ b = 0x0E0B20U;
+ c = 0x000000U;
+ return errsA;
+ }
- // PRNG
- uint32_t p = PRNG_TABLE[data] >> 1;
- b ^= p;
+ a = Golay24128::encode24128(data);
- uint32_t datb = Golay24128::decode23127(b);
- b = Golay24128::encode23127(datb) >> 1;
+ // PRNG
+ uint32_t p = PRNG_TABLE[data] >> 1;
+ b ^= p;
- b ^= p;
+ uint32_t datb = Golay24128::decode23127(b);
+ b = Golay24128::encode23127(datb) >> 1;
- uint32_t v = a ^ old_a;
- uint32_t errsA = Utils::countBits32(v);
+ b ^= p;
- v = b ^ old_b;
- uint32_t errsB = Utils::countBits32(v);
+ uint32_t v = a ^ old_a;
+ uint32_t errsA = Utils::countBits32(v);
- if (errsA >= 4U || ((errsA + errsB) >= 6U && errsA >= 2U)) {
- a = 0xF00292U;
- b = 0x0E0B20U;
- c = 0x000000U;
- }
+ v = b ^ old_b;
+ uint32_t errsB = Utils::countBits32(v);
+#if DEBUG_AMBEFEC
+ LogDebug(LOG_HOST, "AMBEFEC::regnerate() errsA = %u, a = %6X, errsB = %u, b = %6X, c = %6X", errsA, a, errsB, b, c);
+#endif
+ if (errsA >= 4U || ((errsA + errsB) >= 6U && errsA >= 2U)) {
+ a = 0xF00292U;
+ b = 0x0E0B20U;
+ c = 0x000000U;
+ }
- return errsA + errsB;
+ return errsA + errsB;
}
diff --git a/src/edac/AMBEFEC.h b/src/edac/AMBEFEC.h
index 813886ff..f24c5ea5 100644
--- a/src/edac/AMBEFEC.h
+++ b/src/edac/AMBEFEC.h
@@ -499,7 +499,7 @@ namespace edac
private:
///
- uint32_t regenerate(uint32_t& a, uint32_t& b, uint32_t& c, bool ignoreParity = true) const;
+ uint32_t regenerate(uint32_t& a, uint32_t& b, uint32_t& c) const;
};
} // namespace edac