Skip to content

Commit b198c25

Browse files
committed
Start working on native wifi manager
1 parent 6f6adc9 commit b198c25

5 files changed

Lines changed: 376 additions & 165 deletions

File tree

include/config/Config.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ namespace OpenShock::Config {
6262
bool GetRFConfigKeepAliveEnabled(bool& out);
6363
bool SetRFConfigKeepAliveEnabled(bool enabled);
6464

65+
bool AnyWiFiCredentials();
6566
bool AnyWiFiCredentials(std::function<bool(const Config::WiFiCredentials&)> predicate);
6667
uint8_t AddWiFiCredentials(std::string_view ssid, std::string_view password);
6768
bool TryGetWiFiCredentialsByID(uint8_t id, WiFiCredentials& out);

src/config/Config.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -445,6 +445,13 @@ bool Config::SetRFConfigKeepAliveEnabled(bool enabled)
445445
return _trySaveConfig();
446446
}
447447

448+
bool Config::AnyWiFiCredentials()
449+
{
450+
CONFIG_LOCK_READ(false);
451+
452+
return _configData.wifi.credentialsList.size() > 0;
453+
}
454+
448455
bool Config::AnyWiFiCredentials(std::function<bool(const Config::WiFiCredentials&)> predicate)
449456
{
450457
CONFIG_LOCK_READ(false);

src/main.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,18 @@ const char* const TAG = "main";
2424
// Internal setup function, returns true if setup succeeded, false otherwise.
2525
bool trySetup()
2626
{
27+
// Try to initialize TCP/IP mac address
28+
uint8_t mac[8];
29+
if (esp_efuse_mac_get_default(mac) == ESP_OK) {
30+
esp_base_mac_addr_set(mac);
31+
}
32+
33+
// Try to initialize global TCP/IP stack
34+
if (esp_netif_init() != ERR_OK) {
35+
OS_LOGE(TAG, "Failed to initialize TCP/IP stack!");
36+
return false;
37+
}
38+
2739
if (!OpenShock::VisualStateManager::Init()) {
2840
OS_LOGE(TAG, "Unable to initialize VisualStateManager");
2941
return false;

src/wifi/WiFiManager.cpp

Lines changed: 0 additions & 165 deletions
Original file line numberDiff line numberDiff line change
@@ -23,28 +23,11 @@ const char* const TAG = "WiFiManager";
2323

2424
using 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;
3326
static uint8_t s_connectedBSSID[6] = {0};
3427
static uint8_t s_connectedCredentialsID = 0;
3528
static uint8_t s_preferredCredentialsID = 0;
3629
static 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

4932
bool _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

7645
bool _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-
}
8749
std::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-
}
14776
bool _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

331260
esp_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), &current_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-
427262
bool WiFiManager::Save(const char* ssid, std::string_view password)
428263
{
429264
OS_LOGV(TAG, "Authenticating to network %s", ssid);

0 commit comments

Comments
 (0)