|
@@ -25,17 +25,23 @@
|
25
|
25
|
#include "mem.h"
|
26
|
26
|
#include "wifi.h"
|
27
|
27
|
|
|
28
|
+#define CONNECT_TIMEOUT (5 * 1000)
|
|
29
|
+
|
28
|
30
|
enum wifi_state {
|
29
|
31
|
WS_IDLE = 0,
|
30
|
32
|
WS_SCAN,
|
31
|
33
|
WS_CONNECT,
|
|
34
|
+ WS_WAIT_FOR_IP,
|
32
|
35
|
WS_READY,
|
33
|
36
|
};
|
34
|
37
|
|
35
|
38
|
static enum wifi_state state = WS_IDLE;
|
|
39
|
+static uint32_t start_time = 0;
|
36
|
40
|
|
37
|
41
|
static void wifi_connect(const char *ssid, const char *pw, uint32_t auth) {
|
38
|
42
|
debug("connecting to '%s'", ssid);
|
|
43
|
+ start_time = to_ms_since_boot(get_absolute_time());
|
|
44
|
+ state = WS_CONNECT;
|
39
|
45
|
|
40
|
46
|
// https://github.com/raspberrypi/pico-sdk/issues/1413
|
41
|
47
|
uint32_t a = 0;
|
|
@@ -48,8 +54,7 @@ static void wifi_connect(const char *ssid, const char *pw, uint32_t auth) {
|
48
|
54
|
int r = cyw43_arch_wifi_connect_async(ssid, pw, a);
|
49
|
55
|
if (r != 0) {
|
50
|
56
|
debug("failed to connect %d", r);
|
51
|
|
- } else {
|
52
|
|
- state = WS_CONNECT;
|
|
57
|
+ state = WS_SCAN;
|
53
|
58
|
}
|
54
|
59
|
}
|
55
|
60
|
|
|
@@ -75,12 +80,13 @@ static int scan_result(void *env, const cyw43_ev_scan_result_t *result) {
|
75
|
80
|
|
76
|
81
|
static void wifi_scan(void) {
|
77
|
82
|
debug("starting scan");
|
|
83
|
+ state = WS_SCAN;
|
|
84
|
+
|
78
|
85
|
cyw43_wifi_scan_options_t scan_options = {0};
|
79
|
86
|
int err = cyw43_wifi_scan(&cyw43_state, &scan_options, NULL, scan_result);
|
80
|
87
|
if (err != 0) {
|
81
|
88
|
debug("error %d", err);
|
82
|
89
|
}
|
83
|
|
- state = WS_SCAN;
|
84
|
90
|
}
|
85
|
91
|
|
86
|
92
|
void wifi_init(void) {
|
|
@@ -117,8 +123,16 @@ const char *wifi_state(void) {
|
117
|
123
|
case WS_CONNECT:
|
118
|
124
|
return "Connecting";
|
119
|
125
|
|
120
|
|
- case WS_READY:
|
121
|
|
- return ip4addr_ntoa(netif_ip4_addr(netif_default));
|
|
126
|
+ case WS_WAIT_FOR_IP:
|
|
127
|
+ return "Waiting for IP";
|
|
128
|
+
|
|
129
|
+ case WS_READY: {
|
|
130
|
+ cyw43_arch_lwip_begin();
|
|
131
|
+ const ip4_addr_t *ip = netif_ip4_addr(netif_default);
|
|
132
|
+ cyw43_arch_lwip_end();
|
|
133
|
+
|
|
134
|
+ return ip4addr_ntoa(ip);
|
|
135
|
+ }
|
122
|
136
|
}
|
123
|
137
|
|
124
|
138
|
return NULL;
|
|
@@ -133,9 +147,49 @@ void wifi_run(void) {
|
133
|
147
|
wifi_scan();
|
134
|
148
|
}
|
135
|
149
|
} else if (state == WS_CONNECT) {
|
136
|
|
- if (cyw43_wifi_link_status(&cyw43_state, CYW43_ITF_STA) == CYW43_LINK_JOIN) {
|
|
150
|
+ int link = cyw43_wifi_link_status(&cyw43_state, CYW43_ITF_STA);
|
|
151
|
+
|
|
152
|
+ static int prev_link = 0xFF;
|
|
153
|
+ if (prev_link != link) {
|
|
154
|
+ prev_link = link;
|
|
155
|
+ debug("net link status: %d", link);
|
|
156
|
+ }
|
|
157
|
+
|
|
158
|
+ if (link == CYW43_LINK_JOIN) {
|
137
|
159
|
debug("joined network");
|
|
160
|
+ start_time = to_ms_since_boot(get_absolute_time());
|
|
161
|
+ state = WS_WAIT_FOR_IP;
|
|
162
|
+ } else if (link < CYW43_LINK_DOWN) {
|
|
163
|
+ debug("net connection failed. retry.");
|
|
164
|
+ wifi_scan();
|
|
165
|
+ }
|
|
166
|
+
|
|
167
|
+ uint32_t now = to_ms_since_boot(get_absolute_time());
|
|
168
|
+ if ((now - start_time) >= CONNECT_TIMEOUT) {
|
|
169
|
+ debug("net connection timeout. retry.");
|
|
170
|
+ wifi_scan();
|
|
171
|
+ }
|
|
172
|
+ } else if (state == WS_WAIT_FOR_IP) {
|
|
173
|
+ cyw43_arch_lwip_begin();
|
|
174
|
+ const ip4_addr_t *ip = netif_ip4_addr(netif_default);
|
|
175
|
+ cyw43_arch_lwip_end();
|
|
176
|
+
|
|
177
|
+ if (ip4_addr_get_u32(ip) != 0) {
|
138
|
178
|
state = WS_READY;
|
|
179
|
+ debug("got IP '%s'", ip4addr_ntoa(ip));
|
|
180
|
+ }
|
|
181
|
+
|
|
182
|
+ uint32_t now = to_ms_since_boot(get_absolute_time());
|
|
183
|
+ if ((now - start_time) >= CONNECT_TIMEOUT) {
|
|
184
|
+ debug("net dhcp timeout. retry.");
|
|
185
|
+ start_time = now;
|
|
186
|
+
|
|
187
|
+ //cyw43_arch_lwip_begin();
|
|
188
|
+ //dhcp_renew(netif_default);
|
|
189
|
+ //cyw43_arch_lwip_end();
|
|
190
|
+
|
|
191
|
+ // DHCP renew does not seem to help, only a full reconnect
|
|
192
|
+ wifi_scan();
|
139
|
193
|
}
|
140
|
194
|
}
|
141
|
195
|
|