kopia lustrzana https://github.com/mobilinkd/NucleoTNC
38 wiersze
914 B
C++
38 wiersze
914 B
C++
// Copyright 2020 Rob Riggs <rob@mobilinkd.com>
|
|
// All rights reserved.
|
|
|
|
#include "Golay24.h"
|
|
|
|
#include <cstdint>
|
|
#include <cstddef>
|
|
|
|
namespace mobilinkd {
|
|
namespace Golay24
|
|
{
|
|
|
|
const std::array<SyndromeMapEntry, LUT_SIZE> LUT = make_lut();
|
|
|
|
bool decode(uint32_t input, uint32_t& output)
|
|
{
|
|
auto syndrm = syndrome(input >> 1);
|
|
auto it = std::lower_bound(LUT.begin(), LUT.end(), syndrm,
|
|
[](const SyndromeMapEntry& sme, uint32_t val){
|
|
return (sme.a >> 8) < val;
|
|
});
|
|
|
|
if ((it->a >> 8) == syndrm)
|
|
{
|
|
// Build the correction from the compressed entry.
|
|
auto correction = ((((it->a & 0xFF) << 16) | it->b) << 1);
|
|
// Apply the correction to the input.
|
|
output = input ^ correction;
|
|
// Only test parity for 3-bit errors.
|
|
return __builtin_popcount(syndrm) < 3 || !parity(output);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
} // Golay24
|
|
} // mobilinkd
|