Improve antenna order detection

Remove a lot of the false positives that were occuring due to random
noise
This commit is contained in:
Christos Falas 2025-01-28 21:40:28 +00:00
parent 814321f524
commit b681f0b2c6
No known key found for this signature in database

View File

@ -1,17 +1,29 @@
import logging import logging
from collections import deque
from typing import Any, Collection
from ..collection import ingest from ..collection import ingest
from ..config import config
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
AntennaIdentifier = tuple[ingest.Host, int] AntennaIdentifier = tuple[ingest.Host, int]
order: list[AntennaIdentifier] = [] order: list[AntennaIdentifier] = []
prev_unplugged: set[AntennaIdentifier] = set() prev_unplugged: set[AntennaIdentifier] = set()
antenna_average: dict[AntennaIdentifier, float] = {} long_antenna_average: dict[AntennaIdentifier, deque[int]] = {
(host, 0): deque(maxlen=10 * config.sample_rate) for host in config.receive_hosts
} | {(host, 1): deque(maxlen=10 * config.sample_rate) for host in config.receive_hosts}
short_antenna_average: dict[AntennaIdentifier, deque[int]] = {
(host, 0): deque(maxlen=config.sample_rate) for host in config.receive_hosts
} | {(host, 1): deque(maxlen=config.sample_rate) for host in config.receive_hosts}
RSSI_THRESHOLD = 8 RSSI_THRESHOLD = 8
def average(data: Collection[Any]) -> float:
return sum(data) / len(data)
def callback(antenna_data: dict[ingest.Host, ingest.CSI]) -> None: def callback(antenna_data: dict[ingest.Host, ingest.CSI]) -> None:
global prev_unplugged global prev_unplugged
global antenna_average global antenna_average
@ -27,18 +39,18 @@ def callback(antenna_data: dict[ingest.Host, ingest.CSI]) -> None:
) )
) )
for host, csi in antenna_data.items(): for host, csi in antenna_data.items():
antenna_average[(host, 0)] = ( long_antenna_average[(host, 0)].append(csi.header.rssi1)
antenna_average.get((host, 0), csi.header.rssi1) * 0.99 long_antenna_average[(host, 1)].append(csi.header.rssi2)
+ csi.header.rssi1 * 0.01 short_antenna_average[(host, 0)].append(csi.header.rssi1)
) short_antenna_average[(host, 1)].append(csi.header.rssi2)
antenna_average[(host, 1)] = (
antenna_average.get((host, 1), csi.header.rssi2) * 0.99 for antenna in range(2):
+ csi.header.rssi2 * 0.01 if (
) average(short_antenna_average[(host, antenna)])
if csi.header.rssi1 > antenna_average[(host, 0)] + RSSI_THRESHOLD: > average(long_antenna_average[(host, antenna)]) + RSSI_THRESHOLD
unplugged.add((host, 0)) ):
if csi.header.rssi2 > antenna_average[(host, 1)] + RSSI_THRESHOLD: unplugged.add((host, antenna))
unplugged.add((host, 1))
if prev_unplugged != unplugged: if prev_unplugged != unplugged:
if len(prev_unplugged) > len(unplugged): if len(prev_unplugged) > len(unplugged):
logger.info(f"Antenna plugged in: {prev_unplugged - unplugged}") logger.info(f"Antenna plugged in: {prev_unplugged - unplugged}")