2022-07-20 07:07:00 +00:00
|
|
|
// Copyright 2020 Mobilinkd LLC.
|
2022-06-07 01:22:18 +00:00
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <cstdint>
|
|
|
|
|
|
|
|
#include "Util.h"
|
|
|
|
|
2022-07-04 21:03:07 +00:00
|
|
|
namespace modemm17
|
2022-06-07 01:22:18 +00:00
|
|
|
{
|
|
|
|
|
|
|
|
struct M17Synchronizer
|
|
|
|
{
|
|
|
|
uint16_t expected_;
|
|
|
|
int allowable_errors_;
|
|
|
|
uint16_t buffer_ = 0;
|
|
|
|
|
|
|
|
M17Synchronizer(uint16_t word = 0x3243, int bit_errors = 1)
|
|
|
|
: expected_(word), allowable_errors_(bit_errors)
|
|
|
|
{}
|
|
|
|
|
|
|
|
bool operator()(int bits)
|
|
|
|
{
|
|
|
|
// Add one symbol (2 bits) of data to the synchronizer.
|
|
|
|
// Returns true when a sync word has been detected.
|
|
|
|
|
|
|
|
buffer_ = ((buffer_ << 2) | bits) & 0xFFFF;
|
|
|
|
auto tmp = buffer_ ^ expected_;
|
|
|
|
return popcount(tmp) <= allowable_errors_;
|
|
|
|
}
|
|
|
|
|
|
|
|
void reset() { buffer_ = 0; }
|
|
|
|
};
|
|
|
|
|
2022-07-04 21:03:07 +00:00
|
|
|
} // modemm17
|