Revert the two verify-loop changes: zero matches in four runs

Two changes went in together and the next four runs matched nothing, including
a held press. They cannot be separated after the fact, so both come out and the
loop returns to the shape that has matched every time it was asked to.

One is definitely broken. The rising-edge recapture assumed a frame 50 ms after
detection would show a settled finger; on a quick tap the finger was already
gone, the recapture read the idle floor -- metric 133, still flagged FINGER
from the first capture -- and an empty image went to the matcher. A guaranteed
miss on exactly the case it was meant to fix.

The other is probably wrong. Dropping event 5 as a duplicate rested on
observing that event 7 alone produces a verdict -- but every such observation
was a held frame that followed an event 5 on the same press. Whether the touch
event initialises the press in the trustlet is not known, and five finger
frames with no match is not the evidence to remove it on.

The process error is the one worth writing down: two variables changed at
once, on a live user's finger, with no way to attribute the result. One at a
time from here.
This commit is contained in:
Jorijn van der Graaf 2026-09-02 23:18:42 +02:00
commit 06459a8e73
3 changed files with 31 additions and 28 deletions

View file

@ -1280,20 +1280,19 @@ public:
out.frames++;
std::string note;
bool rising = finger && !inPress;
if (rising) {
inPress = true; pressMatched = false; pressRejected = false;
pressFrames = 0; rescans = 0; pressFid = 0;
out.presses++;
// The frame that detected the finger is the finger LANDING --
// partial contact, and the frame that rejects most often.
// Capture once more now that it has settled, so the image the
// matcher sees on the first report is a real one. One capture,
// ~50 ms, on the frame that decides every quick tap.
auto c2 = SendCommand(app_, ta::Cmd::CaptureImage, cap);
if (c2.invoked) { c = c2; note += " recap"; }
}
// No recapture on the rising edge. It was tried, on the theory that
// the detecting frame is the finger landing and a frame 50 ms later
// would be a settled one. On a quick tap the finger was already
// gone 50 ms later: the recapture read the idle floor (metric 133,
// still flagged FINGER from the first capture) and an empty image
// was reported to the matcher. A guaranteed miss on exactly the
// case it was meant to fix.
for (ta::Event ev : tracker.Observe(finger, en::Mode::Authenticate)) {
if (ev == ta::Event::FingerTouched) {
inPress = true; pressMatched = false; pressRejected = false;
pressFrames = 0; rescans = 0; pressFid = 0;
out.presses++;
}
std::vector<std::byte> evbuf(ta::EventContextSize);
ta::BuildEventContext(evbuf, { .event = ev });
// A zero-initialised buffer cannot tell "the matcher never