Skip to content

Commit 0bb434f

Browse files
authored
Improved initial setup (#1148)
* Improved initial setup * Improvements after testing * Adjustments after testing * Fixed ESP8266 build * Fixed voltage check
1 parent 4673fea commit 0bb434f

File tree

11 files changed

+212
-42
lines changed

11 files changed

+212
-42
lines changed

lib/ConnectionHandler/src/WiFiAccessPointConnectionHandler.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ bool WiFiAccessPointConnectionHandler::connect(NetworkConfig config, SystemConfi
1919
//wifi_softap_set_dhcps_offer_option(OFFER_ROUTER, 0); // Disable default gw
2020

2121
WiFi.mode(WIFI_AP);
22+
WiFi.persistent(false);
2223
WiFi.softAP(config.ssid, config.psk);
2324

2425
dnsServer.setErrorReplyCode(DNSReplyCode::NoError);

lib/ConnectionHandler/src/WiFiClientConnectionHandler.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ bool WiFiClientConnectionHandler::connect(NetworkConfig config, SystemConfig sys
100100
}
101101
#endif
102102
WiFi.setAutoReconnect(true);
103+
WiFi.persistent(false);
103104
this->config = config;
104105
#if defined(ESP32)
105106
if(begin(config.ssid, config.psk)) {

lib/HwTools/src/HwTools.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -419,7 +419,6 @@ float HwTools::getVcc() {
419419
}
420420
volts = (x * 3.3) / 10.0 / analogRange;
421421
#endif
422-
} else {
423422
}
424423
if(volts == 0.0) {
425424
#if defined(ESP8266)
@@ -429,8 +428,11 @@ float HwTools::getVcc() {
429428
#endif
430429
}
431430

432-
if(vccGnd_r > 0 && vccVcc_r > 0)
433-
volts *= ((float) (vccGnd_r + vccVcc_r) / vccGnd_r);
431+
if(vccPin != 0xFF) {
432+
if(vccGnd_r > 0 && vccVcc_r > 0) {
433+
volts *= ((float) (vccGnd_r + vccVcc_r) / vccGnd_r);
434+
}
435+
}
434436
if(vccOffset != 0.0)
435437
volts += vccOffset;
436438
if(vccMultiplier != 0.0)

lib/SvelteUi/app/dist/index.css

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/SvelteUi/app/dist/index.js

Lines changed: 8 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/SvelteUi/app/src/app.postcss

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,4 +206,8 @@ svg {
206206
border-width: 9px;
207207
border-style: solid;
208208
border-color: #ddd transparent transparent transparent;
209+
}
210+
211+
.link {
212+
@apply cursor-pointer;
209213
}

lib/SvelteUi/app/src/lib/ConfigurationPanel.svelte

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
export let sysinfo = {};
1717
export let data;
1818

19+
let form;
1920
let translations = {};
2021
translationsStore.subscribe(update => {
2122
translations = update;
@@ -248,9 +249,34 @@
248249
_global.bindToCloud = function() {
249250
console.log("BIND CALLED");
250251
}
252+
253+
async function toggleShowWifiPass() {
254+
const input = form.querySelector('input[name="wp"]');
255+
toggleShowPass.call(this, input);
256+
}
257+
258+
async function toggleShowMqttPass() {
259+
const input = form.querySelector('input[name="qa"]');
260+
toggleShowPass.call(this, input);
261+
}
262+
263+
async function toggleShowWebPass() {
264+
const input = form.querySelector('input[name="gp"]');
265+
toggleShowPass.call(this, input);
266+
}
267+
268+
async function toggleShowPass(input) {
269+
if(input.type === 'password') {
270+
input.type = 'text';
271+
this.textContent = '🙈';
272+
} else {
273+
input.type = 'password';
274+
this.textContent = '👁️';
275+
}
276+
}
251277
</script>
252278

253-
<form on:submit|preventDefault={handleSubmit} autocomplete="off">
279+
<form bind:this={form} on:submit|preventDefault={handleSubmit} autocomplete="off">
254280
<div class="grid xl:grid-cols-4 lg:grid-cols-2 md:grid-cols-2">
255281
{#if configuration?.g}
256282
<div class="cnt">
@@ -360,7 +386,10 @@
360386
</div>
361387
<div class="my-1">
362388
{translations.conf?.general?.security?.password ?? "Password"}<br/>
363-
<input name="gp" bind:value={configuration.g.p} type="password" class="in-s" maxlength="36" pattern={asciiPattern}/>
389+
<div class="flex">
390+
<input name="gp" bind:value={configuration.g.p} type="password" class="in-f w-full" maxlength="36" pattern={asciiPattern}/>
391+
<span on:click={toggleShowWebPass} class="in-post link">👁️</span>
392+
</div>
364393
</div>
365394
{/if}
366395
<div class="my-1">
@@ -512,7 +541,10 @@
512541
</div>
513542
<div class="my-1">
514543
{translations.conf?.connection?.psk ?? "Password"}<br/>
515-
<input name="wp" bind:value={configuration.w.p} type="password" class="in-s" pattern={asciiPatternExt}/>
544+
<div class="flex">
545+
<input name="wp" bind:value={configuration.w.p} type="password" class="in-f w-full" pattern={asciiPatternExt}/>
546+
<span on:click={toggleShowWifiPass} class="in-post link">👁️</span>
547+
</div>
516548
</div>
517549
<div class="my-1 flex">
518550
<div class="w-1/2">
@@ -635,7 +667,10 @@
635667
</div>
636668
<div class="my-1">
637669
{translations.conf?.mqtt?.pass ?? "Password"}<br/>
638-
<input name="qa" bind:value={configuration.q.a} type="password" class="in-s" pattern={asciiPatternExt}/>
670+
<div class="flex">
671+
<input name="qa" bind:value={configuration.q.a} type="password" class="in-f w-full" pattern={asciiPatternExt}/>
672+
<span on:click={toggleShowMqttPass} class="in-post link">👁️</span>
673+
</div>
639674
</div>
640675
<div class="my-1 flex">
641676
<div>

lib/SvelteUi/app/src/lib/SetupPanel.svelte

Lines changed: 87 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,25 @@
1010
translations = update;
1111
});
1212
13+
let form;
14+
let ssid = '';
15+
let psk = '';
1316
let manual = false;
1417
let networks = {};
1518
networksStore.subscribe(update => {
1619
networks = update;
20+
manual = update?.c == 0;
21+
ssid = update?.n[0]?.s ?? '';
1722
});
1823
1924
export let sysinfo = {}
2025
2126
let staticIp = false;
2227
let connectionMode = 1;
2328
let loadingOrSaving = false;
29+
let wifiTestInProgress = false;
30+
let wifiTestOk = false;
31+
let wifiTestError = 0;
2432
2533
function updateSysinfo(url) {
2634
sysinfoStore.update(s => {
@@ -29,9 +37,9 @@
2937
});
3038
}
3139
32-
async function handleSubmit(e) {
40+
async function handleSubmit() {
3341
loadingOrSaving = true;
34-
const formData = new FormData(e.target);
42+
const formData = new FormData(form);
3543
const data = new URLSearchParams();
3644
for (let field of formData) {
3745
const [key, value] = field;
@@ -59,17 +67,71 @@
5967
return s;
6068
});
6169
}
70+
71+
async function wifiTest() {
72+
let response;
73+
if(wifiTestInProgress) {
74+
response = await fetch('wifitest.json');
75+
} else {
76+
wifiTestInProgress = true;
77+
wifiTestOk = false;
78+
const data = new URLSearchParams();
79+
data.append('ssid', ssid);
80+
data.append('psk', psk);
81+
response = await fetch('wifitest.json', {
82+
method: 'POST',
83+
body: data
84+
});
85+
}
86+
const res = await response.json();
87+
if(res?.time == 0) {
88+
wifiTestInProgress = false;
89+
wifiTestOk = res.status == 3;
90+
wifiTestError = res.status;
91+
if(wifiTestOk) {
92+
sysinfoStore.update(s => {
93+
s.net.ip = res.ip;
94+
return s;
95+
});
96+
setTimeout(handleSubmit, 1000);
97+
}
98+
} else if(wifiTestInProgress) {
99+
if(res.time > 30000) {
100+
wifiTestError = 4;
101+
wifiTestInProgress = false;
102+
} else {
103+
setTimeout(wifiTest, 2000);
104+
}
105+
}
106+
}
107+
108+
async function resetWifiTest() {
109+
wifiTestInProgress = false;
110+
wifiTestOk = false;
111+
wifiTestError = 0;
112+
}
113+
114+
async function toggleShowPass() {
115+
const input = form.querySelector('input[name="sp"]');
116+
if(input.type === 'password') {
117+
input.type = 'text';
118+
this.textContent = '🙈';
119+
} else {
120+
input.type = 'password';
121+
this.textContent = '👁️';
122+
}
123+
}
62124
</script>
63125
64126
65127
<div class="grid xl:grid-cols-4 lg:grid-cols-3 md:grid-cols-2">
66128
<div class="cnt">
67-
<form on:submit|preventDefault={handleSubmit}>
129+
<form bind:this={form} on:submit|preventDefault={handleSubmit}>
68130
<input type="hidden" name="s" value="true"/>
69131
<strong class="text-sm">{translations.setup?.title ?? "Setup"}</strong>
70132
<div class="my-3">
71133
{translations.conf?.connection?.title ?? "Connection"}<br/>
72-
<select name="sc" class="in-s" bind:value={connectionMode}>
134+
<select name="sc" class="in-s" bind:value={connectionMode} on:input={resetWifiTest}>
73135
<option value={1}>{translations.conf?.connection?.wifi ?? "Connect to WiFi"}</option>
74136
<option value={2}>{translations.conf?.connection?.ap ?? "Standalone access point"}</option>
75137
{#if sysinfo.if && sysinfo.if.eth}
@@ -83,9 +145,9 @@
83145
<label class="float-right mr-3"><input type="checkbox" value="true" bind:checked={manual} class="rounded mb-1"/> manual</label>
84146
<br/>
85147
{#if manual}
86-
<input name="ss" type="text" pattern={asciiPatternExt} class="in-s" required={connectionMode == 1 || connectionMode == 2}/>
148+
<input name="ss" bind:value={ssid} on:input={resetWifiTest} type="text" pattern={asciiPatternExt} class="in-s" required={connectionMode == 1 || connectionMode == 2}/>
87149
{:else}
88-
<select name="ss" class="in-s" required={connectionMode == 1 || connectionMode == 2}>
150+
<select name="ss" bind:value={ssid} on:change={resetWifiTest} class="in-s" required={connectionMode == 1 || connectionMode == 2}>
89151
{#if networks?.c == -1}
90152
<option value="" selected disabled>Scanning...</option>
91153
{/if}
@@ -99,7 +161,10 @@
99161
</div>
100162
<div class="my-3">
101163
{translations.conf?.connection?.psk ?? "Password"}<br/>
102-
<input name="sp" type="password" pattern={asciiPatternExt} class="in-s" autocomplete="off" required={connectionMode == 2}/>
164+
<div class="flex">
165+
<input name="sp" bind:value={psk} on:input={resetWifiTest} type="password" pattern={asciiPatternExt} class="in-f w-full" autocomplete="off" required={connectionMode == 2}/>
166+
<span on:click={toggleShowPass} class="in-post link">👁️</span>
167+
</div>
103168
</div>
104169
{/if}
105170
<div>
@@ -131,7 +196,21 @@
131196
</div>
132197
{/if}
133198
<div class="my-3">
134-
<button type="submit" class="btn-pri">{translations.btn?.save ?? "Save"}</button>
199+
{#if connectionMode != 1}
200+
<button type="submit" class="btn-pri">{translations.btn?.save ?? "Save"}</button>
201+
{:else if wifiTestOk}
202+
<div class="bd-green">{translations.setup?.testok ?? "Connection successful (" + sysinfo.net.ip + ")"}</div>
203+
<button type="submit" class="btn-pri">{translations.btn?.save ?? "Save"}</button>
204+
{:else if wifiTestInProgress}
205+
<div class="bd-yellow">{translations.setup?.testconn ?? "Testing connection"}</div>
206+
{:else}
207+
{#if wifiTestError}
208+
<div class="bd-red">{ (translations.setup?.testfail ?? "Connection failed") + ': ' + (translations.errors?.wifi?.[wifiTestError] ?? wifiTestError) }</div>
209+
<button type="submit" class="btn-pri">{translations.btn?.forcesave ?? "Force save"}</button>
210+
{:else}
211+
<button type="button" class="btn-pri" on:click={wifiTest}>{translations.btn?.save ?? "Save"}</button>
212+
{/if}
213+
{/if}
135214
</div>
136215
</form>
137216
</div>

lib/SvelteUi/include/AmsWebServer.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@
4545

4646
#include "LittleFS.h"
4747

48+
#define WIFI_TEST_TIMEOUT 30000
49+
4850
class AmsWebServer {
4951
public:
5052
#if defined(AMS_REMOTE_DEBUG)
@@ -113,6 +115,10 @@ class AmsWebServer {
113115
WebServer server;
114116
#endif
115117

118+
bool wifiTestInProgress = false;
119+
unsigned long wifiTestStarted = 0;
120+
uint8_t wifiTestStatusCode = 0;
121+
116122
bool checkSecurity(byte level, bool send401 = true);
117123

118124
void indexHtml();
@@ -137,6 +143,8 @@ class AmsWebServer {
137143
void cloudkeyJson();
138144

139145
void wifiScan();
146+
void wifiTestStart();
147+
void wifiTestStatus();
140148

141149
void configurationJson();
142150
void handleSave();

lib/SvelteUi/src/AmsWebServer.cpp

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,8 @@ void AmsWebServer::setup(AmsConfiguration* config, GpioConfig* gpioConfig, AmsDa
129129
server.on(context + F("/cloudkey.json"), HTTP_GET, std::bind(&AmsWebServer::cloudkeyJson, this));
130130

131131
server.on(context + F("/wifiscan.json"), HTTP_GET, std::bind(&AmsWebServer::wifiScan, this));
132+
server.on(context + F("/wifitest.json"), HTTP_POST, std::bind(&AmsWebServer::wifiTestStart, this));
133+
server.on(context + F("/wifitest.json"), HTTP_GET, std::bind(&AmsWebServer::wifiTestStatus, this));
132134

133135
server.on(context + F("/configuration.json"), HTTP_GET, std::bind(&AmsWebServer::configurationJson, this));
134136
server.on(context + F("/save"), HTTP_POST, std::bind(&AmsWebServer::handleSave, this));
@@ -2912,4 +2914,50 @@ void AmsWebServer::wifiScan() {
29122914

29132915
server.setContentLength(strlen(buf));
29142916
server.send(200, MIME_JSON, buf);
2915-
}
2917+
}
2918+
2919+
void AmsWebServer::wifiTestStart() {
2920+
if(!checkSecurity(1))
2921+
return;
2922+
2923+
if(WiFi.getMode() == WIFI_AP_STA) {
2924+
wifiTestStarted = millis();
2925+
String ssid = server.arg(F("ssid"));
2926+
String psk = server.arg(F("psk"));
2927+
WiFi.begin(ssid, psk);
2928+
wifiTestInProgress = true;
2929+
wifiTestStatusCode = 0;
2930+
}
2931+
wifiTestStatus();
2932+
}
2933+
2934+
void AmsWebServer::wifiTestStatus() {
2935+
if(!checkSecurity(1))
2936+
return;
2937+
2938+
if(wifiTestInProgress) {
2939+
wifiTestStatusCode = WiFi.status();
2940+
if(wifiTestStatusCode == WL_DISCONNECTED) { // Still trying to connect
2941+
if(millis() - wifiTestStarted > WIFI_TEST_TIMEOUT) {
2942+
wifiTestInProgress = false;
2943+
wifiTestStatusCode = 99; // Custom code for timeout
2944+
}
2945+
} else {
2946+
wifiTestInProgress = false;
2947+
}
2948+
}
2949+
2950+
#if defined(ESP32)
2951+
wifi_config_t conf;
2952+
esp_wifi_get_config((wifi_interface_t)ESP_IF_WIFI_STA, &conf);
2953+
snprintf_P(buf, BufferSize, PSTR("{\"ssid\":\"%s\",\"status\":%d,\"time\":%lu,\"ip\":\"%s\"}"), conf.sta.ssid, wifiTestStatusCode, wifiTestInProgress ? millis() - wifiTestStarted : 0, WiFi.localIP().toString().c_str());
2954+
#else
2955+
snprintf_P(buf, BufferSize, PSTR("{\"ssid\":\"%s\",\"status\":%d,\"time\":%lu,\"ip\":\"%s\"}"), WiFi.SSID().c_str(), wifiTestStatusCode, wifiTestInProgress ? millis() - wifiTestStarted : 0, WiFi.localIP().toString().c_str());
2956+
#endif
2957+
server.sendHeader(HEADER_CACHE_CONTROL, CACHE_CONTROL_NO_CACHE);
2958+
server.sendHeader(HEADER_PRAGMA, PRAGMA_NO_CACHE);
2959+
server.sendHeader(HEADER_EXPIRES, EXPIRES_OFF);
2960+
2961+
server.setContentLength(strlen(buf));
2962+
server.send(200, MIME_JSON, buf);
2963+
}

0 commit comments

Comments
 (0)