@@ -23,28 +23,11 @@ const char* const TAG = "WiFiManager";
2323
2424using namespace OpenShock ;
2525
26- enum class WiFiState : uint8_t {
27- Disconnected = 0 ,
28- Connecting = 1 << 0 ,
29- Connected = 1 << 1 ,
30- };
31-
32- static WiFiState s_wifiState = WiFiState::Disconnected;
3326static uint8_t s_connectedBSSID[6 ] = {0 };
3427static uint8_t s_connectedCredentialsID = 0 ;
3528static uint8_t s_preferredCredentialsID = 0 ;
3629static std::vector<WiFiNetwork> s_wifiNetworks;
3730
38- bool _isZeroBSSID (const uint8_t (&bssid)[6])
39- {
40- for (std::size_t i = 0 ; i < sizeof (bssid); i++) {
41- if (bssid[i] != 0 ) {
42- return false ;
43- }
44- }
45-
46- return true ;
47- }
4831
4932bool _attractivityComparer (const WiFiNetwork& a, const WiFiNetwork& b)
5033{
@@ -58,32 +41,11 @@ bool _attractivityComparer(const WiFiNetwork& a, const WiFiNetwork& b)
5841
5942 return a.rssi > b.rssi ;
6043}
61- bool _isConnectRateLimited (const WiFiNetwork& net)
62- {
63- if (net.lastConnectAttempt == 0 ) {
64- return false ;
65- }
66-
67- int64_t now = OpenShock::millis ();
68- int64_t diff = now - net.lastConnectAttempt ;
69- if ((net.connectAttempts > 5 && diff < 5000 ) || (net.connectAttempts > 10 && diff < 10'000 ) || (net.connectAttempts > 15 && diff < 30'000 ) || (net.connectAttempts > 20 && diff < 60'000 )) {
70- return true ;
71- }
72-
73- return false ;
74- }
7544
7645bool _isSaved (std::function<bool (const Config::WiFiCredentials&)> predicate)
7746{
7847 return Config::AnyWiFiCredentials (predicate);
7948}
80- std::vector<WiFiNetwork>::iterator _findNetwork (std::function<bool (WiFiNetwork&)> predicate, bool sortByAttractivity = true)
81- {
82- if (sortByAttractivity) {
83- std::sort (s_wifiNetworks.begin (), s_wifiNetworks.end (), _attractivityComparer);
84- }
85- return std::find_if (s_wifiNetworks.begin (), s_wifiNetworks.end (), predicate);
86- }
8749std::vector<WiFiNetwork>::iterator _findNetworkBySSID (const char * ssid, bool sortByAttractivity = true )
8850{
8951 return _findNetwork ([ssid](const WiFiNetwork& net) { return strcmp (net.ssid , ssid) == 0 ; }, sortByAttractivity);
@@ -110,40 +72,7 @@ bool _markNetworkAsAttempted(const uint8_t (&bssid)[6])
11072 return true ;
11173}
11274
113- bool _getNextWiFiNetwork (OpenShock::Config::WiFiCredentials& creds)
114- {
115- return _findNetwork ([&creds](const WiFiNetwork& net) {
116- if (net.credentialsID == 0 ) {
117- return false ;
118- }
119-
120- if (_isConnectRateLimited (net)) {
121- return false ;
122- }
123-
124- if (!Config::TryGetWiFiCredentialsByID (net.credentialsID , creds)) {
125- return false ;
126- }
127-
128- return true ;
129- }) != s_wifiNetworks.end ();
130- }
131-
132- bool _connectImpl (const char * ssid, const char * password, const uint8_t (&bssid)[6])
133- {
134- OS_LOGV (TAG, " Connecting to network %s (" BSSID_FMT " )" , ssid, BSSID_ARG (bssid));
13575
136- _markNetworkAsAttempted (bssid);
137-
138- // Connect to the network
139- s_wifiState = WiFiState::Connecting;
140- if (WiFi.begin (ssid, password, 0 , bssid, true ) == WL_CONNECT_FAILED) {
141- s_wifiState = WiFiState::Disconnected;
142- return false ;
143- }
144-
145- return true ;
146- }
14776bool _connectHidden (const uint8_t (&bssid)[6], const std::string& password)
14877{
14978 (void )password;
@@ -330,100 +259,6 @@ void _evWiFiNetworksDiscovery(const std::vector<const wifi_ap_record_t*>& record
330259
331260esp_err_t set_esp_interface_dns (esp_interface_t interface, IPAddress main_dns, IPAddress backup_dns, IPAddress fallback_dns);
332261
333- bool _tryConnect ()
334- {
335- Config::WiFiCredentials creds;
336- if (s_preferredCredentialsID != 0 ) {
337- bool foundCreds = Config::TryGetWiFiCredentialsByID (s_preferredCredentialsID, creds);
338-
339- s_preferredCredentialsID = 0 ;
340-
341- if (!foundCreds) {
342- OS_LOGE (TAG, " Failed to find credentials with ID %u" , s_preferredCredentialsID);
343- return false ;
344- }
345-
346- if (_connect (creds.ssid , creds.password )) {
347- return true ;
348- }
349-
350- OS_LOGE (TAG, " Failed to connect to network %s" , creds.ssid .c_str ());
351- }
352-
353- if (!_getNextWiFiNetwork (creds)) {
354- return false ;
355- }
356-
357- return _connect (creds.ssid , creds.password );
358- }
359-
360- void _wifimanagerUpdateTask (void *)
361- {
362- int64_t lastScanRequest = 0 ;
363- while (true ) {
364- if (s_wifiState == WiFiState::Disconnected && !WiFiScanManager::IsScanning ()) {
365- if (!_tryConnect ()) {
366- int64_t now = OpenShock::millis ();
367- if (lastScanRequest == 0 || now - lastScanRequest > 30'000 ) {
368- lastScanRequest = now;
369-
370- OS_LOGV (TAG, " No networks to connect to, starting scan..." );
371- WiFiScanManager::StartScan ();
372- }
373- }
374- }
375- vTaskDelay (pdMS_TO_TICKS (1000 ));
376- }
377- }
378-
379- bool WiFiManager::Init ()
380- {
381- WiFi.onEvent (_evWiFiConnected, ARDUINO_EVENT_WIFI_STA_CONNECTED);
382- WiFi.onEvent (_evWiFiGotIP, ARDUINO_EVENT_WIFI_STA_GOT_IP);
383- WiFi.onEvent (_evWiFiGotIP6, ARDUINO_EVENT_WIFI_STA_GOT_IP6);
384- WiFi.onEvent (_evWiFiDisconnected, ARDUINO_EVENT_WIFI_STA_DISCONNECTED);
385- WiFiScanManager::RegisterStatusChangedHandler (_evWiFiScanStatusChanged);
386- WiFiScanManager::RegisterNetworksDiscoveredHandler (_evWiFiNetworksDiscovery);
387-
388- if (!WiFiScanManager::Init ()) {
389- OS_LOGE (TAG, " Failed to initialize WiFiScanManager" );
390- return false ;
391- }
392-
393- std::string hostname;
394- if (!Config::GetWiFiHostname (hostname)) {
395- OS_LOGE (TAG, " Failed to get WiFi hostname, reverting to default" );
396- hostname = OPENSHOCK_FW_HOSTNAME;
397- }
398-
399- WiFi.setAutoConnect (false );
400- WiFi.setAutoReconnect (false );
401- WiFi.enableSTA (true );
402- WiFi.setHostname (hostname.c_str ());
403-
404- // If we recognize the network in the ESP's WiFi cache, try to connect to it
405- wifi_config_t current_conf;
406- if (esp_wifi_get_config (static_cast <wifi_interface_t >(ESP_IF_WIFI_STA), ¤t_conf) == ESP_OK) {
407- if (current_conf.sta .ssid [0 ] != ' \0 ' ) {
408- if (Config::GetWiFiCredentialsIDbySSID (reinterpret_cast <const char *>(current_conf.sta .ssid )) != 0 ) {
409- WiFi.begin ();
410- }
411- }
412- }
413-
414- if (set_esp_interface_dns (ESP_IF_WIFI_STA, IPAddress (1 , 1 , 1 , 1 ), IPAddress (8 , 8 , 8 , 8 ), IPAddress (9 , 9 , 9 , 9 )) != ESP_OK) {
415- OS_LOGE (TAG, " Failed to set DNS servers" );
416- return false ;
417- }
418-
419- if (TaskUtils::TaskCreateUniversal (_wifimanagerUpdateTask, TAG, 2048 , nullptr , 5 , nullptr , 1 ) != pdPASS) { // Profiled: 1.716KB stack usage
420- OS_LOGE (TAG, " Failed to create WiFiManager update task" );
421- return false ;
422- }
423-
424- return true ;
425- }
426-
427262bool WiFiManager::Save (const char * ssid, std::string_view password)
428263{
429264 OS_LOGV (TAG, " Authenticating to network %s" , ssid);
0 commit comments