mirror of
https://github.com/Show-maket/IR-protocol.git
synced 2026-04-28 03:08:08 +00:00
Analyzer
This commit is contained in:
@ -3,9 +3,11 @@
|
||||
#include "IrFoxDecoder.h"
|
||||
#include <AnalyzerChannelData.h>
|
||||
#include <AnalyzerResults.h>
|
||||
#include <algorithm>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
IrFoxAnalyzer::IrFoxAnalyzer()
|
||||
: Analyzer2(),
|
||||
@ -72,6 +74,45 @@ void IrFoxAnalyzer::WorkerThread()
|
||||
IrFoxDecoder decoder;
|
||||
decoder.reset();
|
||||
|
||||
/** Потоковый фильтр: убирает импульсы короче kMinFilteredPulseUs (иголки/дребезг в сэмплах). */
|
||||
const U64 min_seg_samples =
|
||||
std::max<U64>(1ULL, static_cast<U64>((static_cast<double>(irfox::kMinFilteredPulseUs) * 1e-6) * static_cast<double>(fs) + 0.5));
|
||||
struct RawEdge
|
||||
{
|
||||
U64 sample;
|
||||
bool rising;
|
||||
};
|
||||
std::vector<RawEdge> pending;
|
||||
U64 last_dec_edge_sample = 0;
|
||||
bool last_dec_edge_valid = false;
|
||||
|
||||
auto collapse_short_pairs = [&]() {
|
||||
for (size_t i = 0; i + 1 < pending.size();)
|
||||
{
|
||||
if (pending[i + 1].sample - pending[i].sample < min_seg_samples)
|
||||
{
|
||||
pending.erase(pending.begin() + static_cast<std::ptrdiff_t>(i),
|
||||
pending.begin() + static_cast<std::ptrdiff_t>(i + 2));
|
||||
if (i > 0)
|
||||
--i;
|
||||
}
|
||||
else
|
||||
++i;
|
||||
}
|
||||
};
|
||||
|
||||
auto strip_vs_last_decoder = [&]() {
|
||||
for (;;)
|
||||
{
|
||||
collapse_short_pairs();
|
||||
if (!last_dec_edge_valid || pending.empty())
|
||||
return;
|
||||
if (pending[0].sample - last_dec_edge_sample >= min_seg_samples)
|
||||
return;
|
||||
pending.erase(pending.begin());
|
||||
}
|
||||
};
|
||||
|
||||
U32 frames_since_commit = 0;
|
||||
const U32 kCommitBatch = 256;
|
||||
|
||||
@ -130,6 +171,43 @@ void IrFoxAnalyzer::WorkerThread()
|
||||
}
|
||||
};
|
||||
|
||||
auto emit_confirmed_edges = [&]() {
|
||||
for (;;)
|
||||
{
|
||||
collapse_short_pairs();
|
||||
strip_vs_last_decoder();
|
||||
if (pending.size() < 2)
|
||||
return;
|
||||
if (pending[1].sample - pending[0].sample < min_seg_samples)
|
||||
continue;
|
||||
decoder.processEdge(pending[0].sample, pending[0].rising, fs, on_bit, on_pkt);
|
||||
last_dec_edge_sample = pending[0].sample;
|
||||
last_dec_edge_valid = true;
|
||||
pending.erase(pending.begin());
|
||||
}
|
||||
};
|
||||
|
||||
auto flush_pending_tail = [&]() {
|
||||
collapse_short_pairs();
|
||||
strip_vs_last_decoder();
|
||||
while (pending.size() >= 2 && pending[1].sample - pending[0].sample >= min_seg_samples)
|
||||
{
|
||||
decoder.processEdge(pending[0].sample, pending[0].rising, fs, on_bit, on_pkt);
|
||||
last_dec_edge_sample = pending[0].sample;
|
||||
last_dec_edge_valid = true;
|
||||
pending.erase(pending.begin());
|
||||
collapse_short_pairs();
|
||||
strip_vs_last_decoder();
|
||||
}
|
||||
if (pending.size() == 1)
|
||||
{
|
||||
decoder.processEdge(pending[0].sample, pending[0].rising, fs, on_bit, on_pkt);
|
||||
last_dec_edge_sample = pending[0].sample;
|
||||
last_dec_edge_valid = true;
|
||||
pending.clear();
|
||||
}
|
||||
};
|
||||
|
||||
for (;;)
|
||||
{
|
||||
CheckIfThreadShouldExit();
|
||||
@ -146,10 +224,12 @@ void IrFoxAnalyzer::WorkerThread()
|
||||
const BitState new_level = mIr->GetBitState();
|
||||
const bool rising = (new_level == BIT_HIGH);
|
||||
|
||||
decoder.processEdge(edge_sample, rising, fs, on_bit, on_pkt);
|
||||
pending.push_back(RawEdge{edge_sample, rising});
|
||||
emit_confirmed_edges();
|
||||
ReportProgress(edge_sample);
|
||||
}
|
||||
|
||||
flush_pending_tail();
|
||||
decoder.flushEnd(mIr->GetSampleNumber(), fs, on_bit, on_pkt);
|
||||
|
||||
if (frames_since_commit != 0)
|
||||
|
||||
Reference in New Issue
Block a user