Skip to content

Commit e7b4522

Browse files
author
Daniel Dunn
committed
Wifi listen interval
1 parent 8350097 commit e7b4522

File tree

5 files changed

+192
-77
lines changed

5 files changed

+192
-77
lines changed

ports/espressif/common-hal/wifi/Radio.c

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,25 @@ void common_hal_wifi_radio_set_tx_power(wifi_radio_obj_t *self, const mp_float_t
139139
esp_wifi_set_max_tx_power(tx_power * 4.0f);
140140
}
141141

142+
mp_int_t common_hal_wifi_radio_get_listen_interval(wifi_radio_obj_t *self) {
143+
wifi_config_t *config = &self->sta_config;
144+
return config->sta.listen_interval;
145+
}
146+
147+
void common_hal_wifi_radio_set_listen_interval(wifi_radio_obj_t *self, const mp_int_t listen_interval) {
148+
wifi_config_t *config = &self->sta_config;
149+
config->sta.listen_interval = listen_interval;
150+
if (listen_interval == 1) {
151+
esp_wifi_set_ps(WIFI_PS_MIN_MODEM);
152+
} else if (listen_interval > 1) {
153+
esp_wifi_set_ps(WIFI_PS_MAX_MODEM);
154+
} else {
155+
esp_wifi_set_ps(WIFI_PS_NONE);
156+
}
157+
158+
esp_wifi_set_config(ESP_IF_WIFI_STA, config);
159+
}
160+
142161
mp_obj_t common_hal_wifi_radio_get_mac_address_ap(wifi_radio_obj_t *self) {
143162
uint8_t mac[MAC_ADDRESS_LENGTH];
144163
esp_wifi_get_mac(ESP_IF_WIFI_AP, mac);
@@ -198,7 +217,8 @@ void common_hal_wifi_radio_start_ap(wifi_radio_obj_t *self, uint8_t *ssid, size_
198217
set_mode_ap(self, true);
199218

200219
uint8_t esp_authmode = 0;
201-
switch (authmode) {
220+
switch (authmode)
221+
{
202222
case AUTHMODE_OPEN:
203223
esp_authmode = WIFI_AUTH_OPEN;
204224
break;
@@ -249,7 +269,8 @@ mp_obj_t common_hal_wifi_radio_get_stations_ap(wifi_radio_obj_t *self) {
249269
}
250270

251271
esp_netif_pair_mac_ip_t mac_ip_pair[esp_sta_list.num];
252-
for (int i = 0; i < esp_sta_list.num; i++) {
272+
for (int i = 0; i < esp_sta_list.num; i++)
273+
{
253274
memcpy(mac_ip_pair[i].mac, esp_sta_list.sta[i].mac, MAC_ADDRESS_LENGTH);
254275
mac_ip_pair[i].ip.addr = 0;
255276
}
@@ -260,7 +281,8 @@ mp_obj_t common_hal_wifi_radio_get_stations_ap(wifi_radio_obj_t *self) {
260281
}
261282

262283
mp_obj_t mp_sta_list = mp_obj_new_list(0, NULL);
263-
for (int i = 0; i < esp_sta_list.num; i++) {
284+
for (int i = 0; i < esp_sta_list.num; i++)
285+
{
264286
mp_obj_t elems[3] = {
265287
mp_obj_new_bytes(esp_sta_list.sta[i].mac, MAC_ADDRESS_LENGTH),
266288
MP_OBJ_NEW_SMALL_INT(esp_sta_list.sta[i].rssi),
@@ -307,7 +329,8 @@ wifi_radio_error_t common_hal_wifi_radio_connect(wifi_radio_obj_t *self, uint8_t
307329
xEventGroupClearBits(self->event_group_handle, WIFI_DISCONNECTED_BIT);
308330
// Trying to switch networks so disconnect first.
309331
esp_wifi_disconnect();
310-
do {
332+
do
333+
{
311334
RUN_BACKGROUND_TASKS;
312335
bits = xEventGroupWaitBits(self->event_group_handle,
313336
WIFI_DISCONNECTED_BIT,
@@ -351,7 +374,8 @@ wifi_radio_error_t common_hal_wifi_radio_connect(wifi_radio_obj_t *self, uint8_t
351374
self->retries_left = 5;
352375
esp_wifi_connect();
353376

354-
do {
377+
do
378+
{
355379
RUN_BACKGROUND_TASKS;
356380
bits = xEventGroupWaitBits(self->event_group_handle,
357381
WIFI_CONNECTED_BIT | WIFI_DISCONNECTED_BIT,
@@ -369,8 +393,7 @@ wifi_radio_error_t common_hal_wifi_radio_connect(wifi_radio_obj_t *self, uint8_t
369393
(self->last_disconnect_reason == WIFI_REASON_AUTH_FAIL) ||
370394
(self->last_disconnect_reason == WIFI_REASON_4WAY_HANDSHAKE_TIMEOUT) ||
371395
(self->last_disconnect_reason == WIFI_REASON_NO_AP_FOUND_W_COMPATIBLE_SECURITY) ||
372-
(self->last_disconnect_reason == WIFI_REASON_NO_AP_FOUND_IN_AUTHMODE_THRESHOLD)
373-
) {
396+
(self->last_disconnect_reason == WIFI_REASON_NO_AP_FOUND_IN_AUTHMODE_THRESHOLD)) {
374397
return WIFI_RADIO_ERROR_AUTH_FAIL;
375398
} else if (self->last_disconnect_reason == WIFI_REASON_NO_AP_FOUND) {
376399
return WIFI_RADIO_ERROR_NO_AP_FOUND;
@@ -471,7 +494,8 @@ static mp_obj_t common_hal_wifi_radio_get_addresses_netif(wifi_radio_obj_t *self
471494
mp_obj_tuple_t *result = MP_OBJ_TO_PTR(mp_obj_new_tuple(n_addresses, NULL));
472495

473496
#if CIRCUITPY_SOCKETPOOL_IPV6
474-
for (int i = 0; i < n_addresses6; i++) {
497+
for (int i = 0; i < n_addresses6; i++)
498+
{
475499
result->items[i] = espaddr6_to_str(&addresses[i]);
476500
}
477501
#endif

ports/espressif/mpconfigport.mk

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ CIRCUITPY_FULL_BUILD ?= 1
2020
# If SSL is enabled, it's mbedtls
2121
CIRCUITPY_SSL_MBEDTLS = 1
2222

23+
# Wifi Power Save
24+
CIRCUITPY_WIFI_RADIO_SETTABLE_LISTEN_INTERVAL = 1
25+
26+
2327
# These modules are implemented in ports/<port>/common-hal:
2428
CIRCUITPY_ALARM ?= 1
2529
CIRCUITPY_ALARM_TOUCH ?= 0

py/circuitpy_mpconfig.mk

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -674,6 +674,9 @@ CFLAGS += -DCIRCUITPY_WEB_WORKFLOW=$(CIRCUITPY_WEB_WORKFLOW)
674674
CIRCUITPY_WIFI_RADIO_SETTABLE_MAC_ADDRESS?= 1
675675
CFLAGS += -DCIRCUITPY_WIFI_RADIO_SETTABLE_MAC_ADDRESS=$(CIRCUITPY_WIFI_RADIO_SETTABLE_MAC_ADDRESS)
676676

677+
CIRCUITPY_WIFI_RADIO_SETTABLE_LISTEN_INTERVAL?= 0
678+
CFLAGS += -DCIRCUITPY_WIFI_RADIO_SETTABLE_LISTEN_INTERVAL=$(CIRCUITPY_WIFI_RADIO_SETTABLE_LISTEN_INTERVAL)
679+
677680
# tinyusb port tailored configuration
678681
CIRCUITPY_TUSB_MEM_ALIGN ?= 4
679682
CFLAGS += -DCIRCUITPY_TUSB_MEM_ALIGN=$(CIRCUITPY_TUSB_MEM_ALIGN)

0 commit comments

Comments
 (0)