mirror of
https://github.com/ChuckBuilds/LEDMatrix.git
synced 2026-08-01 08:48:05 +00:00
perf(wifi): one status fetch per monitor tick instead of three (#411)
* perf(wifi): one status fetch per monitor tick instead of three The wifi monitor daemon fetched WiFi status + ethernet state before its AP-mode check, the check internally fetched the same state again (with retry), and the daemon fetched a third time afterwards — each fetch is several nmcli subprocess forks, every 30s, forever, even on a perfectly healthy link. check_and_manage_ap_mode's decision logic is extracted to _manage_ap_mode(status, ethernet, ap_active); the new check_and_manage_ap_mode_with_state() runs the single (retrying) fetch battery and returns (changed, status, ethernet, ap_active_after) — the post-state is derivable because state only ever flips via one enable or one disable. The original bool-returning method delegates, so existing callers are untouched. The daemon's dead pre-fetch is removed and its post-check reads use the returned state; the AP-enable retry semantics (_get_wifi_status_with_retry) are preserved exactly. ~10-15 forks/30s drops to ~4-6. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FqzC1nzTWL4kaqgMaQZFam * fix(wifi): add missing type hints on AP-mode state helpers, fix unused-var lint in tests - check_and_manage_ap_mode_with_state now declares its Tuple[bool, WiFiStatus, bool, bool] return type instead of being untyped. - _manage_ap_mode's status/ethernet_connected/ap_active parameters are now typed (WiFiStatus, bool, bool), matching its existing -> bool return hint. - test_wifi_check_state.py: rename unused unpacked variables (status/ ethernet/ap_after) to underscore-prefixed names at the three call sites that don't use them, leaving the used ones untouched. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KEZK1P1Q1fu5pcuVrkrCFZ --------- Co-authored-by: Chuck <chuck@example.com> Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
Chuck
parent
bff13129c4
commit
14a59c863c
@@ -2564,11 +2564,35 @@ address=/detectportal.firefox.com/192.168.4.1
|
||||
Returns:
|
||||
True if AP mode state changed, False otherwise
|
||||
"""
|
||||
changed, _status, _ethernet, _ap = self.check_and_manage_ap_mode_with_state()
|
||||
return changed
|
||||
|
||||
def check_and_manage_ap_mode_with_state(self) -> Tuple[bool, WiFiStatus, bool, bool]:
|
||||
"""Like check_and_manage_ap_mode, but also returns the state it
|
||||
observed, so callers (the wifi monitor daemon) don't have to re-run
|
||||
the same nmcli subprocess battery before AND after the check —
|
||||
each status fetch is several process forks.
|
||||
|
||||
Returns:
|
||||
(state_changed, WiFiStatus, ethernet_connected, ap_active_after)
|
||||
"""
|
||||
try:
|
||||
# Get status with retry for more reliable detection
|
||||
status = self._get_wifi_status_with_retry()
|
||||
ethernet_connected = self._is_ethernet_connected()
|
||||
ap_active = self._is_ap_mode_active()
|
||||
changed = self._manage_ap_mode(status, ethernet_connected, ap_active)
|
||||
# State only ever changes via one enable or one disable, so the
|
||||
# post-state is the inverse of the pre-state when changed.
|
||||
ap_after = (not ap_active) if changed else ap_active
|
||||
return changed, status, ethernet_connected, ap_after
|
||||
except Exception as e:
|
||||
logger.error(f"Error checking AP mode: {e}", exc_info=True)
|
||||
return False, WiFiStatus(connected=False), False, False
|
||||
|
||||
def _manage_ap_mode(self, status: WiFiStatus, ethernet_connected: bool, ap_active: bool) -> bool:
|
||||
"""AP-mode decision logic against an already-fetched state snapshot."""
|
||||
try:
|
||||
auto_enable = self.config.get("auto_enable_ap_mode", True) # Default: True (safe due to grace period)
|
||||
|
||||
# Log current state for debugging
|
||||
|
||||
Reference in New Issue
Block a user