Reboot the system as a last resort failsafe mechanism
(self)
| 983 | self._handle_ap_mode_monitoring(current_time) |
| 984 | |
| 985 | # Handle force exit AP mode from web interface |
| 986 | if self.force_exit_ap_mode and self.ap_mode_active: |
| 987 | self.logger.info("Endless Loop: Force exit AP mode requested from web interface") |
| 988 | self.stop_ap_mode() |
| 989 | self.force_exit_ap_mode = False |
| 990 | self._endless_loop_wifi_search() |
| 991 | |
| 992 | # Update current SSID if connected |
| 993 | if self.wifi_connected: |
| 994 | connected_ssid = self.get_current_ssid() |
| 995 | self._set_current_ssid(connected_ssid) |
| 996 | if self._pending_ping_sweep_ssid: |
| 997 | self._trigger_initial_ping_sweep(self._pending_ping_sweep_ssid) |
| 998 | self._pending_ping_sweep_ssid = None |
| 999 | |
| 1000 | # Periodically save connection state (every 2 minutes) |
| 1001 | if current_time - last_state_save > 120: |
| 1002 | ssid = self.current_ssid if self.wifi_connected else None |
| 1003 | self._save_connection_state(ssid, self.wifi_connected) |
| 1004 | last_state_save = current_time |
| 1005 | |
| 1006 | # Keep web portal in sync with wardriving + WiFi state |
| 1007 | self._sync_web_portal_for_wardriving() |
| 1008 | |
| 1009 | time.sleep(self.connection_check_interval) |
| 1010 | |
| 1011 | except Exception as e: |
| 1012 | self.logger.error(f"Error in endless loop monitoring: {e}") |
| 1013 | time.sleep(5) |
| 1014 | |
| 1015 | def _perform_wifi_validation(self): |
| 1016 | """Perform 5 WiFi validation checks, 10 seconds apart. All 5 must fail to trigger AP mode.""" |
| 1017 | self.logger.info("Endless Loop: Starting WiFi validation (5 checks, 10s apart)") |
| 1018 | validation_failures = 0 |
| 1019 | |
| 1020 | for i in range(self.wifi_validation_retries): |
| 1021 | if not self.check_wifi_connection(): |
| 1022 | validation_failures += 1 |
| 1023 | self.logger.warning(f"Endless Loop: WiFi validation failed ({validation_failures}/{self.wifi_validation_retries})") |
no test coverage detected