Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 20 additions & 9 deletions src/backgrounds/plugins/rf_mapper.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ def __init__(self, config: RFmapperConfig):
self.loop = asyncio.new_event_loop()
self.thread = threading.Thread(target=self._scan_task)
self.running = False
self.scan_lock = threading.Lock()

self.scan_results: List[RFData] = []
self.scan_idx = 0
Expand Down Expand Up @@ -113,8 +114,6 @@ def __init__(self, config: RFmapperConfig):

self.seen_devices: Dict[str, RFData] = {}

self.seen_names: List[str] = []

self.start()

async def scan(self) -> List[RFData]:
Expand Down Expand Up @@ -201,6 +200,14 @@ def detection_callback(device, advdata: AdvertisementData):
# scan for 5 seconds, then return a new payload
await asyncio.sleep(5.0)
await scanner.stop()
# Cleanup stale BLE devices not seen for more than 60 seconds
now = time.time()
stale_addrs = [
addr for addr, dev in self.seen_devices.items() if now - dev.unix_ts > 60
]
for addr in stale_addrs:
del self.seen_devices[addr]
logging.debug(f"Removed stale BLE device: {addr}")

logging.debug(f"ready to sort: {self.seen_devices.values()}")

Expand All @@ -217,7 +224,8 @@ def detection_callback(device, advdata: AdvertisementData):
final_list.append(device)
logging.debug(f"Scan...{final_list}")

self.scan_idx += 1
with self.scan_lock:
self.scan_idx += 1

return final_list

Expand All @@ -229,7 +237,9 @@ def _scan_task(self):
logging.info("Starting RF scan thread...")
self.running = True
while self.running:
self.scan_results = self.loop.run_until_complete(self.scan())
new_results = self.loop.run_until_complete(self.scan())
with self.scan_lock:
self.scan_results = new_results
logging.info(f"RF scan index: {self.scan_idx}")
logging.info(f"RF scan last sent: {self.scan_last_sent}")
time.sleep(0.5)
Expand Down Expand Up @@ -262,11 +272,12 @@ def run(self) -> None:
logging.info(f"RF scan index: {self.scan_idx}")
logging.info(f"RF scan last sent: {self.scan_last_sent}")
fresh_scan_results = []
if self.scan_results and self.scan_idx > self.scan_last_sent:
fresh_scan_results = self.scan_results
self.scan_last_sent = self.scan_idx
self.scan_results = []
logging.info(f"RF scan sending new payload: {self.scan_last_sent}")
with self.scan_lock:
if self.scan_results and self.scan_idx > self.scan_last_sent:
fresh_scan_results = self.scan_results
self.scan_last_sent = self.scan_idx
self.scan_results = []
logging.info(f"RF scan sending new payload: {self.scan_last_sent}")

# basic gps data and occasional scan results
try:
Expand Down
Loading
Loading