fix(edge): gate multi-person activation on presence — stop reporting phantom persons

update_multi_person_vitals() marked top_k/2 persons active unconditionally every
frame, so the reported n_persons was a fixed artifact of the subcarrier count
(never 0) regardless of occupancy — an empty room reported e.g. 4 people. The
firmware already computes s_presence_detected (earlier in the same process_frame
pass, currently used only for a packet flag); gate person activation on it so an
empty room reports 0 persons. Addresses #803 and #496.

Scope: bounds the count to presence; true multi-person separation is out of scope.
This commit is contained in:
markt-heximal 2026-05-31 22:18:33 -04:00
parent f850d46e9a
commit 81f0e8acc1
1 changed files with 12 additions and 0 deletions

View File

@ -478,6 +478,18 @@ static void update_multi_person_vitals(const uint8_t *iq_data, uint16_t n_sc,
{
if (s_top_k_count < 2) return;
/* Presence gate (issues #803, #496): only activate persons when presence is
* actually detected. Without this, the loop below unconditionally marks
* top_k/2 persons active every frame, so the reported n_persons is a fixed
* artifact of the subcarrier count (never 0) regardless of occupancy an
* empty room still reports e.g. 4 "people". s_presence_detected is updated
* earlier in the same process_frame() pass. (This bounds the count to
* presence; true multi-person separation is a separate, larger problem.) */
if (!s_presence_detected) {
for (uint8_t p = 0; p < EDGE_MAX_PERSONS; p++) s_persons[p].active = false;
return;
}
/* Determine number of active persons based on available subcarriers. */
uint8_t n_persons = s_top_k_count / 2;
if (n_persons > EDGE_MAX_PERSONS) n_persons = EDGE_MAX_PERSONS;