mirror of
https://github.com/lumapu/ahoy.git
synced 2025-06-06 20:51:38 +02:00
refactor wifi for ESP32 S2 (PR #1127)
This commit is contained in:
parent
4f45444b5f
commit
0d65016ca1
4 changed files with 135 additions and 85 deletions
|
@ -225,8 +225,8 @@ void app::onNetwork(bool gotIp) {
|
||||||
#if !defined(ETHERNET)
|
#if !defined(ETHERNET)
|
||||||
if (WIFI_AP == WiFi.getMode()) {
|
if (WIFI_AP == WiFi.getMode()) {
|
||||||
mMqttEnabled = false;
|
mMqttEnabled = false;
|
||||||
everySec(std::bind(&ahoywifi::tickWifiLoop, &mWifi), "wifiL");
|
|
||||||
}
|
}
|
||||||
|
everySec(std::bind(&ahoywifi::tickWifiLoop, &mWifi), "wifiL");
|
||||||
#endif /* !defined(ETHERNET) */
|
#endif /* !defined(ETHERNET) */
|
||||||
mInnerLoopCb = [this]() { this->loopStandard(); };
|
mInnerLoopCb = [this]() { this->loopStandard(); };
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -108,6 +108,19 @@ build_flags = ${env.build_flags}
|
||||||
monitor_filters =
|
monitor_filters =
|
||||||
esp32_exception_decoder
|
esp32_exception_decoder
|
||||||
|
|
||||||
|
[env:esp-32-s2-mini-release]
|
||||||
|
platform = espressif32@6.3.2
|
||||||
|
board = lolin_s2_mini
|
||||||
|
build_flags = ${env.build_flags}
|
||||||
|
-DDEF_NRF_CS_PIN=12
|
||||||
|
-DDEF_NRF_CE_PIN=3
|
||||||
|
-DDEF_NRF_IRQ_PIN=5
|
||||||
|
-DDEF_NRF_MISO_PIN=9
|
||||||
|
-DDEF_NRF_MOSI_PIN=11
|
||||||
|
-DDEF_NRF_SCLK_PIN=7
|
||||||
|
monitor_filters =
|
||||||
|
esp32_exception_decoder
|
||||||
|
|
||||||
[env:opendtufusionv1]
|
[env:opendtufusionv1]
|
||||||
platform = espressif32@6.1.0
|
platform = espressif32@6.1.0
|
||||||
board = esp32-s3-devkitc-1
|
board = esp32-s3-devkitc-1
|
||||||
|
|
|
@ -29,6 +29,7 @@ void ahoywifi::setup(settings_t *config, uint32_t *utcTimestamp, appWifiCb cb) {
|
||||||
mUtcTimestamp = utcTimestamp;
|
mUtcTimestamp = utcTimestamp;
|
||||||
mAppWifiCb = cb;
|
mAppWifiCb = cb;
|
||||||
|
|
||||||
|
mGotDisconnect = false;
|
||||||
mStaConn = DISCONNECTED;
|
mStaConn = DISCONNECTED;
|
||||||
mCnt = 0;
|
mCnt = 0;
|
||||||
mScanActive = false;
|
mScanActive = false;
|
||||||
|
@ -69,12 +70,35 @@ void ahoywifi::setupWifi(bool startAP = false) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
void ahoywifi::tickWifiLoop() {
|
void ahoywifi::tickWifiLoop() {
|
||||||
|
static const uint8_t DISCONN_TIMEOUT = 10;
|
||||||
|
static const uint8_t TIMEOUT = 20;
|
||||||
|
static const uint8_t SCAN_TIMEOUT = 10;
|
||||||
#if !defined(AP_ONLY)
|
#if !defined(AP_ONLY)
|
||||||
if(mStaConn != GOT_IP) {
|
uint8_t timeout = (mStaConn == DISCONNECTED) ? DISCONN_TIMEOUT : TIMEOUT; // seconds
|
||||||
if (WiFi.softAPgetStationNum() > 0) { // do not reconnect if any AP connection exists
|
|
||||||
if(mStaConn != IN_AP_MODE) {
|
mCnt++;
|
||||||
|
|
||||||
|
switch (mStaConn) {
|
||||||
|
case IN_STA_MODE:
|
||||||
|
// Nothing to do
|
||||||
|
if (mGotDisconnect) {
|
||||||
|
mStaConn = RESET;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
case IN_AP_MODE:
|
||||||
|
if (WiFi.softAPgetStationNum() == 0) {
|
||||||
|
mCnt = 0;
|
||||||
|
mDns.stop();
|
||||||
|
WiFi.mode(WIFI_AP_STA);
|
||||||
|
mStaConn = DISCONNECTED;
|
||||||
|
} else {
|
||||||
|
mDns.processNextRequest();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case DISCONNECTED:
|
||||||
|
if (WiFi.softAPgetStationNum() > 0) {
|
||||||
mStaConn = IN_AP_MODE;
|
mStaConn = IN_AP_MODE;
|
||||||
// first time switch to AP Mode
|
// first time switch to AP Mode
|
||||||
if (mScanActive) {
|
if (mScanActive) {
|
||||||
|
@ -86,26 +110,13 @@ void ahoywifi::tickWifiLoop() {
|
||||||
WiFi.mode(WIFI_AP);
|
WiFi.mode(WIFI_AP);
|
||||||
mDns.start(53, "*", mApIp);
|
mDns.start(53, "*", mApIp);
|
||||||
mAppWifiCb(true);
|
mAppWifiCb(true);
|
||||||
}
|
|
||||||
mDns.processNextRequest();
|
mDns.processNextRequest();
|
||||||
return;
|
return;
|
||||||
}
|
} else if (!mScanActive) {
|
||||||
else if(mStaConn == IN_AP_MODE) {
|
|
||||||
mCnt = 0;
|
|
||||||
mDns.stop();
|
|
||||||
WiFi.mode(WIFI_AP_STA);
|
|
||||||
mStaConn = DISCONNECTED;
|
|
||||||
}
|
|
||||||
mCnt++;
|
|
||||||
|
|
||||||
uint8_t timeout = (mStaConn == DISCONNECTED) ? 10 : 20; // seconds
|
|
||||||
if (mStaConn == CONNECTED) // connected but no ip
|
|
||||||
timeout = 20;
|
|
||||||
|
|
||||||
if(!mScanActive && mBSSIDList.empty() && (mStaConn == DISCONNECTED)) { // start scanning APs with the given SSID
|
|
||||||
DBGPRINT(F("scanning APs with SSID "));
|
DBGPRINT(F("scanning APs with SSID "));
|
||||||
DBGPRINTLN(String(mConfig->sys.stationSsid));
|
DBGPRINTLN(String(mConfig->sys.stationSsid));
|
||||||
mScanCnt = 0;
|
mScanCnt = 0;
|
||||||
|
mCnt = 0;
|
||||||
mScanActive = true;
|
mScanActive = true;
|
||||||
#if defined(ESP8266)
|
#if defined(ESP8266)
|
||||||
WiFi.scanNetworks(true, true, 0U, ([this]() {
|
WiFi.scanNetworks(true, true, 0U, ([this]() {
|
||||||
|
@ -121,21 +132,23 @@ void ahoywifi::tickWifiLoop() {
|
||||||
})());
|
})());
|
||||||
#endif
|
#endif
|
||||||
return;
|
return;
|
||||||
}
|
} else if(getBSSIDs()) {
|
||||||
DBGPRINT(F("reconnect in "));
|
// Scan ready
|
||||||
DBGPRINT(String(timeout-mCnt));
|
mStaConn = SCAN_READY;
|
||||||
DBGPRINTLN(F(" seconds"));
|
} else {
|
||||||
if(mScanActive) {
|
// In case of a timeout, what do we do?
|
||||||
getBSSIDs();
|
// For now we start scanning again as the original code did.
|
||||||
if((!mScanActive) && (!mBSSIDList.empty())) // scan completed
|
// Would be better to into PA mode
|
||||||
if ((mCnt % timeout) < timeout - 2)
|
|
||||||
mCnt = timeout - 2;
|
|
||||||
}
|
|
||||||
if((mCnt % timeout) == 0) { // try to reconnect after x sec without connection
|
|
||||||
mStaConn = CONNECTING;
|
|
||||||
WiFi.disconnect();
|
|
||||||
|
|
||||||
if(mBSSIDList.size() > 0) { // get first BSSID in list
|
if (isTimeout(SCAN_TIMEOUT)) {
|
||||||
|
WiFi.scanDelete();
|
||||||
|
mScanActive = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SCAN_READY:
|
||||||
|
mStaConn = CONNECTING;
|
||||||
|
mCnt = 0;
|
||||||
DBGPRINT(F("try to connect to AP with BSSID:"));
|
DBGPRINT(F("try to connect to AP with BSSID:"));
|
||||||
uint8_t bssid[6];
|
uint8_t bssid[6];
|
||||||
for (int j = 0; j < 6; j++) {
|
for (int j = 0; j < 6; j++) {
|
||||||
|
@ -144,18 +157,48 @@ void ahoywifi::tickWifiLoop() {
|
||||||
DBGPRINT(" " + String(bssid[j], HEX));
|
DBGPRINT(" " + String(bssid[j], HEX));
|
||||||
}
|
}
|
||||||
DBGPRINTLN("");
|
DBGPRINTLN("");
|
||||||
|
mGotDisconnect = false;
|
||||||
WiFi.begin(mConfig->sys.stationSsid, mConfig->sys.stationPwd, 0, &bssid[0]);
|
WiFi.begin(mConfig->sys.stationSsid, mConfig->sys.stationPwd, 0, &bssid[0]);
|
||||||
}
|
|
||||||
else
|
|
||||||
mStaConn = DISCONNECTED;
|
|
||||||
|
|
||||||
mCnt = 0;
|
break;
|
||||||
|
case CONNECTING:
|
||||||
|
if (isTimeout(TIMEOUT)) {
|
||||||
|
WiFi.disconnect();
|
||||||
|
mStaConn = mBSSIDList.empty() ? DISCONNECTED : SCAN_READY;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
case CONNECTED:
|
||||||
|
// Connection but no IP yet
|
||||||
|
if (isTimeout(TIMEOUT) || mGotDisconnect) {
|
||||||
|
mStaConn = RESET;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
case GOT_IP:
|
||||||
|
welcome(WiFi.localIP().toString(), F(" (Station)"));
|
||||||
|
WiFi.softAPdisconnect();
|
||||||
|
WiFi.mode(WIFI_STA);
|
||||||
|
DBGPRINTLN(F("[WiFi] AP disabled"));
|
||||||
|
delay(100);
|
||||||
|
mAppWifiCb(true);
|
||||||
|
mGotDisconnect = false;
|
||||||
|
mStaConn = IN_STA_MODE;
|
||||||
|
break;
|
||||||
|
case RESET:
|
||||||
|
mGotDisconnect = false;
|
||||||
|
mStaConn = DISCONNECTED;
|
||||||
|
mCnt = 5; // try to reconnect in 5 sec
|
||||||
|
setupWifi(); // reconnect with AP / Station setup
|
||||||
|
mAppWifiCb(false);
|
||||||
|
DPRINTLN(DBG_INFO, "[WiFi] Connection Lost");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
DBGPRINTLN(F("Unhandled status"));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
void ahoywifi::setupAp(void) {
|
void ahoywifi::setupAp(void) {
|
||||||
DPRINTLN(DBG_VERBOSE, F("wifi::setupAp"));
|
DPRINTLN(DBG_VERBOSE, F("wifi::setupAp"));
|
||||||
|
@ -213,7 +256,7 @@ void ahoywifi::setupStation(void) {
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
bool ahoywifi::getNtpTime(void) {
|
bool ahoywifi::getNtpTime(void) {
|
||||||
if(GOT_IP != mStaConn)
|
if(IN_STA_MODE != mStaConn)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
IPAddress timeServer;
|
IPAddress timeServer;
|
||||||
|
@ -314,11 +357,12 @@ bool ahoywifi::getAvailNetworks(JsonObject obj) {
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
void ahoywifi::getBSSIDs() {
|
bool ahoywifi::getBSSIDs() {
|
||||||
|
bool result = false;
|
||||||
int n = WiFi.scanComplete();
|
int n = WiFi.scanComplete();
|
||||||
if (n < 0) {
|
if (n < 0) {
|
||||||
if (++mScanCnt < 20)
|
if (++mScanCnt < 20)
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
if(n > 0) {
|
if(n > 0) {
|
||||||
mBSSIDList.clear();
|
mBSSIDList.clear();
|
||||||
|
@ -333,9 +377,11 @@ void ahoywifi::getBSSIDs() {
|
||||||
}
|
}
|
||||||
DBGPRINTLN("");
|
DBGPRINTLN("");
|
||||||
}
|
}
|
||||||
|
result = true;
|
||||||
}
|
}
|
||||||
mScanActive = false;
|
mScanActive = false;
|
||||||
WiFi.scanDelete();
|
WiFi.scanDelete();
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
@ -346,32 +392,17 @@ void ahoywifi::connectionEvent(WiFiStatus_t status) {
|
||||||
case CONNECTED:
|
case CONNECTED:
|
||||||
if(mStaConn != CONNECTED) {
|
if(mStaConn != CONNECTED) {
|
||||||
mStaConn = CONNECTED;
|
mStaConn = CONNECTED;
|
||||||
|
mGotDisconnect = false;
|
||||||
DBGPRINTLN(F("\n[WiFi] Connected"));
|
DBGPRINTLN(F("\n[WiFi] Connected"));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GOT_IP:
|
case GOT_IP:
|
||||||
mStaConn = GOT_IP;
|
mStaConn = GOT_IP;
|
||||||
if (mScanActive) { // maybe another scan has started
|
|
||||||
WiFi.scanDelete();
|
|
||||||
mScanActive = false;
|
|
||||||
}
|
|
||||||
welcome(WiFi.localIP().toString(), F(" (Station)"));
|
|
||||||
WiFi.softAPdisconnect();
|
|
||||||
WiFi.mode(WIFI_STA);
|
|
||||||
DBGPRINTLN(F("[WiFi] AP disabled"));
|
|
||||||
delay(100);
|
|
||||||
mAppWifiCb(true);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DISCONNECTED:
|
case DISCONNECTED:
|
||||||
if(mStaConn != CONNECTING) {
|
mGotDisconnect = true;
|
||||||
mStaConn = DISCONNECTED;
|
|
||||||
mCnt = 5; // try to reconnect in 5 sec
|
|
||||||
setupWifi(); // reconnect with AP / Station setup
|
|
||||||
mAppWifiCb(false);
|
|
||||||
DPRINTLN(DBG_INFO, "[WiFi] Connection Lost");
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -32,10 +32,13 @@ class ahoywifi {
|
||||||
private:
|
private:
|
||||||
typedef enum WiFiStatus {
|
typedef enum WiFiStatus {
|
||||||
DISCONNECTED = 0,
|
DISCONNECTED = 0,
|
||||||
|
SCAN_READY,
|
||||||
CONNECTING,
|
CONNECTING,
|
||||||
CONNECTED,
|
CONNECTED,
|
||||||
IN_AP_MODE,
|
IN_AP_MODE,
|
||||||
GOT_IP
|
GOT_IP,
|
||||||
|
IN_STA_MODE,
|
||||||
|
RESET
|
||||||
} WiFiStatus_t;
|
} WiFiStatus_t;
|
||||||
|
|
||||||
void setupWifi(bool startAP);
|
void setupWifi(bool startAP);
|
||||||
|
@ -43,8 +46,10 @@ class ahoywifi {
|
||||||
void setupStation(void);
|
void setupStation(void);
|
||||||
void sendNTPpacket(IPAddress& address);
|
void sendNTPpacket(IPAddress& address);
|
||||||
void sortRSSI(int *sort, int n);
|
void sortRSSI(int *sort, int n);
|
||||||
void getBSSIDs(void);
|
bool getBSSIDs(void);
|
||||||
void connectionEvent(WiFiStatus_t status);
|
void connectionEvent(WiFiStatus_t status);
|
||||||
|
bool isTimeout(uint8_t timeout) { return (mCnt % timeout) == 0; }
|
||||||
|
|
||||||
#if defined(ESP8266)
|
#if defined(ESP8266)
|
||||||
void onConnect(const WiFiEventStationModeConnected& event);
|
void onConnect(const WiFiEventStationModeConnected& event);
|
||||||
void onGotIP(const WiFiEventStationModeGotIP& event);
|
void onGotIP(const WiFiEventStationModeGotIP& event);
|
||||||
|
@ -71,6 +76,7 @@ class ahoywifi {
|
||||||
|
|
||||||
uint8_t mScanCnt;
|
uint8_t mScanCnt;
|
||||||
bool mScanActive;
|
bool mScanActive;
|
||||||
|
bool mGotDisconnect;
|
||||||
std::list<uint8_t> mBSSIDList;
|
std::list<uint8_t> mBSSIDList;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue