@@ -155,41 +155,65 @@ void common_hal_wifi_radio_start_station(wifi_radio_obj_t *self) {
155
155
}
156
156
157
157
void common_hal_wifi_radio_stop_station (wifi_radio_obj_t * self ) {
158
+
159
+ // <strike>This is wrong</strike> This is fine.
158
160
cyw43_wifi_leave (& cyw43_state , CYW43_ITF_STA );
159
- // This is wrong, but without this call the state of ITF_STA is still
160
- // reported as CYW43_LINK_JOIN (by wifi_link_status) and CYW43_LINK_UP
161
- // (by tcpip_link_status). Until AP support is added, we can ignore the
162
- // problem.
163
161
cyw43_wifi_leave (& cyw43_state , CYW43_ITF_AP );
162
+
164
163
bindings_cyw43_wifi_enforce_pm ();
165
164
}
166
165
167
166
void common_hal_wifi_radio_start_ap (wifi_radio_obj_t * self , uint8_t * ssid , size_t ssid_len , uint8_t * password , size_t password_len , uint8_t channel , uint8_t authmode , uint8_t max_connections ) {
168
167
if (!common_hal_wifi_radio_get_enabled (self )) {
169
168
mp_raise_RuntimeError (translate ("wifi is not enabled" ));
170
169
}
171
- // Is there a better way?
172
- common_hal_wifi_radio_stop_station (self );
170
+
171
+ if (cyw43_tcpip_link_status (& cyw43_state , CYW43_ITF_STA ) != CYW43_LINK_DOWN ) {
172
+ mp_raise_RuntimeError (translate ("Already connected to station." ));
173
+ }
174
+
175
+ common_hal_wifi_radio_stop_ap (self );
173
176
174
177
// Channel can only be changed after inital powerup and config of ap.
175
178
// Defaults to 1 if not set or invalid (i.e. 13)
176
179
cyw43_wifi_ap_set_channel (& cyw43_state , (const uint32_t )channel );
177
180
178
181
cyw43_arch_enable_ap_mode ((const char * )ssid , (const char * )password , CYW43_AUTH_WPA2_AES_PSK );
182
+
179
183
// TODO: Implement authmode check like in espressif
180
184
bindings_cyw43_wifi_enforce_pm ();
181
185
}
182
186
183
187
void common_hal_wifi_radio_stop_ap (wifi_radio_obj_t * self ) {
184
- common_hal_wifi_radio_stop_station (self );
185
- // I mean, since it already does both..
188
+ if (!common_hal_wifi_radio_get_enabled (self )) {
189
+ mp_raise_RuntimeError (translate ("wifi is not enabled" ));
190
+ }
191
+
192
+ if (cyw43_tcpip_link_status (& cyw43_state , CYW43_ITF_AP ) != CYW43_LINK_DOWN ) {
193
+ mp_raise_NotImplementedError (translate ("AP cannot be stopped." ));
194
+ }
195
+
196
+ /*
197
+ * AP cannot be disconnected. cyw43_wifi_leave is broken.
198
+ * This code snippet should work, but doesn't.
199
+ *
200
+ * cyw43_wifi_leave(&cyw43_state, CYW43_ITF_AP);
201
+ * cyw43_wifi_leave(&cyw43_state, CYW43_ITF_STA);
202
+ *
203
+ * bindings_cyw43_wifi_enforce_pm();
204
+ */
186
205
}
187
206
188
207
wifi_radio_error_t common_hal_wifi_radio_connect (wifi_radio_obj_t * self , uint8_t * ssid , size_t ssid_len , uint8_t * password , size_t password_len , uint8_t channel , mp_float_t timeout , uint8_t * bssid , size_t bssid_len ) {
189
208
if (!common_hal_wifi_radio_get_enabled (self )) {
190
209
mp_raise_RuntimeError (translate ("wifi is not enabled" ));
191
210
}
192
211
212
+ if (cyw43_tcpip_link_status (& cyw43_state , CYW43_ITF_AP ) != CYW43_LINK_DOWN ) {
213
+ mp_raise_RuntimeError (translate ("Already in access point mode." ));
214
+ }
215
+
216
+
193
217
size_t timeout_ms = timeout <= 0 ? 8000 : (size_t )MICROPY_FLOAT_C_FUN (ceil )(timeout * 1000 );
194
218
uint64_t start = port_get_raw_ticks (NULL );
195
219
uint64_t deadline = start + timeout_ms ;
0 commit comments