38 static const auto VALIDCHARS =
"*.";
39 OsvrHdkLedIdentifier::~OsvrHdkLedIdentifier() {}
43 const PatternStringList &PATTERNS) {
47 if (PATTERNS.empty()) {
51 for (
auto &pat : PATTERNS) {
52 if (!pat.empty() && pat.find_first_not_of(VALIDCHARS) == pat.npos) {
55 d_length = pat.length();
68 for (
auto &pat : PATTERNS) {
69 if (pat.empty() || pat.find_first_not_of(VALIDCHARS) != pat.npos) {
71 d_patterns.emplace_back();
76 if (pat.size() != d_length) {
77 throw std::runtime_error(
"Got a pattern of incorrect length!");
85 auto wrapped = pat + pat;
87 d_patterns.push_back(std::move(wrapped));
93 BrightnessList &brightnesses,
94 bool &lastBright,
bool blobsKeepId)
const {
97 if (brightnesses.size() < d_length) {
99 Led::SENTINEL_NO_IDENTIFIER_OBJECT_OR_INSUFFICIENT_DATA);
103 truncateBrightnessListTo(brightnesses, d_length);
109 Brightness minVal, maxVal;
110 std::tie(minVal, maxVal) = findMinMaxBrightness(brightnesses);
113 static const double TODO_MIN_BRIGHTNESS_DIFF = 0.3;
114 if (maxVal - minVal <= TODO_MIN_BRIGHTNESS_DIFF) {
116 Led::SENTINEL_INSUFFICIENT_EXTREMA_DIFFERENCE);
118 const auto threshold = (minVal + maxVal) / 2;
120 lastBright = brightnesses.back() >= threshold;
122 if (blobsKeepId && beaconIdentified(currentId)) {
129 auto bits = getBitsUsingThreshold(brightnesses, threshold);
138 for (
size_t i = 0; i < d_patterns.size(); i++) {
139 if (d_patterns[i].empty()) {
143 if (d_patterns[i].find(bits) != std::string::npos) {
151 Led::SENTINEL_NO_PATTERN_RECOGNIZED_DESPITE_SUFFICIENT_DATA);
OsvrHdkLedIdentifier(const PatternStringList &PATTERNS)
Give it a list of patterns to use. There is a string for each LED, and each is encoded with '*' meani...
Header file for class that tracks and identifies LEDs.
ZeroBasedBeaconId getId(ZeroBasedBeaconId currentId, BrightnessList &brightnesses, bool &lastBright, bool blobsKeepId) const override
Determine an ID based on a list of brightnesses This truncates the passed-in list to only as many ele...