Skip to content

Commit 555b3ef

Browse files
authored
Access point fixes (#137)
* add lingering mode to access point fix bug which prevents active access point from being re-configured
1 parent ddbb844 commit 555b3ef

File tree

9 files changed

+81
-30
lines changed

9 files changed

+81
-30
lines changed

interface/src/ap/APModes.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { APSettings, ApProvisionMode } from "./types";
1+
import { APSettings, APProvisionMode } from "./types";
22

33
export const isAPEnabled = ({ provision_mode }: APSettings) => {
4-
return provision_mode === ApProvisionMode.AP_MODE_ALWAYS || provision_mode === ApProvisionMode.AP_MODE_DISCONNECTED;
4+
return provision_mode === APProvisionMode.AP_MODE_ALWAYS || provision_mode === APProvisionMode.AP_MODE_DISCONNECTED;
55
}

interface/src/ap/APSettingsForm.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import SaveIcon from '@material-ui/icons/Save';
77
import {PasswordValidator, RestFormProps, FormActions, FormButton} from '../components';
88

99
import { isAPEnabled } from './APModes';
10-
import { APSettings, ApProvisionMode } from './types';
10+
import { APSettings, APProvisionMode } from './types';
1111

1212
type APSettingsFormProps = RestFormProps<APSettings>;
1313

@@ -24,9 +24,9 @@ class APSettingsForm extends React.Component<APSettingsFormProps> {
2424
variant="outlined"
2525
onChange={handleValueChange('provision_mode')}
2626
margin="normal">
27-
<MenuItem value={ApProvisionMode.AP_MODE_ALWAYS}>Always</MenuItem>
28-
<MenuItem value={ApProvisionMode.AP_MODE_DISCONNECTED}>When WiFi Disconnected</MenuItem>
29-
<MenuItem value={ApProvisionMode.AP_NEVER}>Never</MenuItem>
27+
<MenuItem value={APProvisionMode.AP_MODE_ALWAYS}>Always</MenuItem>
28+
<MenuItem value={APProvisionMode.AP_MODE_DISCONNECTED}>When WiFi Disconnected</MenuItem>
29+
<MenuItem value={APProvisionMode.AP_NEVER}>Never</MenuItem>
3030
</SelectValidator>
3131
{
3232
isAPEnabled(data) &&

interface/src/ap/APStatus.ts

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,28 @@
11
import { Theme } from "@material-ui/core";
2-
import { APStatus } from "./types";
2+
import { APStatus, APNetworkStatus } from "./types";
33

4-
export const apStatusHighlight = ({ active }: APStatus, theme: Theme) => {
5-
return active ? theme.palette.success.main : theme.palette.info.main;
4+
export const apStatusHighlight = ({ status }: APStatus, theme: Theme) => {
5+
switch (status) {
6+
case APNetworkStatus.ACTIVE:
7+
return theme.palette.success.main;
8+
case APNetworkStatus.INACTIVE:
9+
return theme.palette.info.main;
10+
case APNetworkStatus.LINGERING:
11+
return theme.palette.warning.main;
12+
default:
13+
return theme.palette.warning.main;
14+
}
615
}
716

8-
export const apStatus = ({ active }: APStatus) => {
9-
return active ? "Active" : "Inactive";
17+
export const apStatus = ({ status }: APStatus) => {
18+
switch (status) {
19+
case APNetworkStatus.ACTIVE:
20+
return "Active";
21+
case APNetworkStatus.INACTIVE:
22+
return "Inactive";
23+
case APNetworkStatus.LINGERING:
24+
return "Lingering until idle";
25+
default:
26+
return "Unknown";
27+
}
1028
};

interface/src/ap/types.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,24 @@
1-
export enum ApProvisionMode {
1+
export enum APProvisionMode {
22
AP_MODE_ALWAYS = 0,
33
AP_MODE_DISCONNECTED = 1,
44
AP_NEVER = 2
55
}
66

7+
export enum APNetworkStatus {
8+
ACTIVE = 0,
9+
INACTIVE = 1,
10+
LINGERING = 2
11+
}
12+
713
export interface APStatus {
8-
active: boolean;
14+
status: APNetworkStatus;
915
ip_address: string;
1016
mac_address: string;
1117
station_num: number;
1218
}
1319

1420
export interface APSettings {
15-
provision_mode: ApProvisionMode;
21+
provision_mode: APProvisionMode;
1622
ssid: string;
1723
password: string;
1824
}

lib/framework/APSettingsService.cpp

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ APSettingsService::APSettingsService(AsyncWebServer* server, FS* fs, SecurityMan
44
_httpEndpoint(APSettings::read, APSettings::update, this, server, AP_SETTINGS_SERVICE_PATH, securityManager),
55
_fsPersistence(APSettings::read, APSettings::update, this, fs, AP_SETTINGS_FILE),
66
_dnsServer(nullptr),
7-
_lastManaged(0) {
7+
_lastManaged(0),
8+
_reconfigureAp(false) {
89
addUpdateHandler([&](const String& originId) { reconfigureAP(); }, false);
910
}
1011

@@ -15,6 +16,7 @@ void APSettingsService::begin() {
1516

1617
void APSettingsService::reconfigureAP() {
1718
_lastManaged = millis() - MANAGE_NETWORK_DELAY;
19+
_reconfigureAp = true;
1820
}
1921

2022
void APSettingsService::loop() {
@@ -31,14 +33,14 @@ void APSettingsService::manageAP() {
3133
WiFiMode_t currentWiFiMode = WiFi.getMode();
3234
if (_state.provisionMode == AP_MODE_ALWAYS ||
3335
(_state.provisionMode == AP_MODE_DISCONNECTED && WiFi.status() != WL_CONNECTED)) {
34-
if (currentWiFiMode == WIFI_OFF || currentWiFiMode == WIFI_STA) {
36+
if (_reconfigureAp || currentWiFiMode == WIFI_OFF || currentWiFiMode == WIFI_STA) {
3537
startAP();
3638
}
37-
} else {
38-
if (currentWiFiMode == WIFI_AP || currentWiFiMode == WIFI_AP_STA) {
39-
stopAP();
40-
}
39+
} else if ((currentWiFiMode == WIFI_AP || currentWiFiMode == WIFI_AP_STA) &&
40+
(_reconfigureAp || !WiFi.softAPgetStationNum())) {
41+
stopAP();
4142
}
43+
_reconfigureAp = false;
4244
}
4345

4446
void APSettingsService::startAP() {
@@ -69,3 +71,12 @@ void APSettingsService::handleDNS() {
6971
_dnsServer->processNextRequest();
7072
}
7173
}
74+
75+
APNetworkStatus APSettingsService::getAPNetworkStatus() {
76+
WiFiMode_t currentWiFiMode = WiFi.getMode();
77+
bool apActive = currentWiFiMode == WIFI_AP || currentWiFiMode == WIFI_AP_STA;
78+
if (apActive && _state.provisionMode != AP_MODE_ALWAYS && WiFi.status() == WL_CONNECTED) {
79+
return APNetworkStatus::LINGERING;
80+
}
81+
return apActive ? APNetworkStatus::ACTIVE : APNetworkStatus::INACTIVE;
82+
}

lib/framework/APSettingsService.h

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,12 @@
3030
#define AP_SETTINGS_FILE "/config/apSettings.json"
3131
#define AP_SETTINGS_SERVICE_PATH "/rest/apSettings"
3232

33+
enum APNetworkStatus {
34+
ACTIVE = 0,
35+
INACTIVE,
36+
LINGERING
37+
};
38+
3339
class APSettings {
3440
public:
3541
uint8_t provisionMode;
@@ -43,17 +49,23 @@ class APSettings {
4349
}
4450

4551
static StateUpdateResult update(JsonObject& root, APSettings& settings) {
46-
settings.provisionMode = root["provision_mode"] | FACTORY_AP_PROVISION_MODE;
52+
APSettings newSettings = {};
53+
newSettings.provisionMode = root["provision_mode"] | FACTORY_AP_PROVISION_MODE;
4754
switch (settings.provisionMode) {
4855
case AP_MODE_ALWAYS:
4956
case AP_MODE_DISCONNECTED:
5057
case AP_MODE_NEVER:
5158
break;
5259
default:
53-
settings.provisionMode = AP_MODE_ALWAYS;
60+
newSettings.provisionMode = AP_MODE_ALWAYS;
61+
}
62+
newSettings.ssid = root["ssid"] | FACTORY_AP_SSID;
63+
newSettings.password = root["password"] | FACTORY_AP_PASSWORD;
64+
if (newSettings.provisionMode == settings.provisionMode && newSettings.ssid.equals(settings.ssid) &&
65+
newSettings.password.equals(settings.password)) {
66+
return StateUpdateResult::UNCHANGED;
5467
}
55-
settings.ssid = root["ssid"] | FACTORY_AP_SSID;
56-
settings.password = root["password"] | FACTORY_AP_PASSWORD;
68+
settings = newSettings;
5769
return StateUpdateResult::CHANGED;
5870
}
5971
};
@@ -64,6 +76,7 @@ class APSettingsService : public StatefulService<APSettings> {
6476

6577
void begin();
6678
void loop();
79+
APNetworkStatus getAPNetworkStatus();
6780

6881
private:
6982
HttpEndpoint<APSettings> _httpEndpoint;
@@ -73,7 +86,8 @@ class APSettingsService : public StatefulService<APSettings> {
7386
DNSServer* _dnsServer;
7487

7588
// for the mangement delay loop
76-
unsigned long _lastManaged;
89+
volatile unsigned long _lastManaged;
90+
volatile boolean _reconfigureAp;
7791

7892
void reconfigureAP();
7993
void manageAP();

lib/framework/APStatus.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include <APStatus.h>
22

3-
APStatus::APStatus(AsyncWebServer* server, SecurityManager* securityManager) {
3+
APStatus::APStatus(AsyncWebServer* server, SecurityManager* securityManager, APSettingsService* apSettingsService) :
4+
_apSettingsService(apSettingsService) {
45
server->on(AP_STATUS_SERVICE_PATH,
56
HTTP_GET,
67
securityManager->wrapRequest(std::bind(&APStatus::apStatus, this, std::placeholders::_1),
@@ -11,8 +12,7 @@ void APStatus::apStatus(AsyncWebServerRequest* request) {
1112
AsyncJsonResponse* response = new AsyncJsonResponse(false, MAX_AP_STATUS_SIZE);
1213
JsonObject root = response->getRoot();
1314

14-
WiFiMode_t currentWiFiMode = WiFi.getMode();
15-
root["active"] = (currentWiFiMode == WIFI_AP || currentWiFiMode == WIFI_AP_STA);
15+
root["status"] = _apSettingsService->getAPNetworkStatus();
1616
root["ip_address"] = WiFi.softAPIP().toString();
1717
root["mac_address"] = WiFi.softAPmacAddress();
1818
root["station_num"] = WiFi.softAPgetStationNum();

lib/framework/APStatus.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,17 @@
1414
#include <ESPAsyncWebServer.h>
1515
#include <IPAddress.h>
1616
#include <SecurityManager.h>
17+
#include <APSettingsService.h>
1718

1819
#define MAX_AP_STATUS_SIZE 1024
1920
#define AP_STATUS_SERVICE_PATH "/rest/apStatus"
2021

2122
class APStatus {
2223
public:
23-
APStatus(AsyncWebServer* server, SecurityManager* securityManager);
24+
APStatus(AsyncWebServer* server, SecurityManager* securityManager, APSettingsService* apSettingsService);
2425

2526
private:
27+
APSettingsService* _apSettingsService;
2628
void apStatus(AsyncWebServerRequest* request);
2729
};
2830

lib/framework/ESP8266React.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ ESP8266React::ESP8266React(AsyncWebServer* server, FS* fs) :
1313
_wifiScanner(server, &_securitySettingsService),
1414
_wifiStatus(server, &_securitySettingsService),
1515
_ntpStatus(server, &_securitySettingsService),
16-
_apStatus(server, &_securitySettingsService),
16+
_apStatus(server, &_securitySettingsService, &_apSettingsService),
1717
_mqttStatus(server, &_mqttSettingsService, &_securitySettingsService),
1818
_systemStatus(server, &_securitySettingsService) {
1919
#ifdef PROGMEM_WWW

0 commit comments

Comments
 (0)