Skip to content

Commit 97d037b

Browse files
committed
wip
1 parent 63815c5 commit 97d037b

File tree

7 files changed

+149
-69
lines changed

7 files changed

+149
-69
lines changed

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

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -139,23 +139,45 @@ 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;
142+
wifi_power_management_t common_hal_wifi_radio_get_power_management(wifi_radio_obj_t *self) {
143+
wifi_ps_type ps;
144+
esp_err_t ret = esp_wifi_get_ps(&ps);
145+
if (ret == ESP_OK) {
146+
switch (ps) {
147+
case WIFI_PS_MIN_MODEM:
148+
return POWER_MANAGEMENT_MIN;
149+
case WIFI_PS_MAX_MODEM:
150+
return POWER_MANAGEMENT_MAX;
151+
case WIFI_PS_NONE:
152+
return POWER_MANAGEMENT_NONE;
153+
}
154+
}
155+
return POWER_MANAGEMENT_MIN;
145156
}
146157

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);
158+
159+
void common_hal_wifi_radio_set_power_management(wifi_radio_obj_t *self, wifi_power_management_t power_management, mp_uint_t listen_interval) {
160+
switch (power_management) {
161+
case POWER_MANAGEMENT_MIN:
162+
esp_wifi_set_ps(WIFI_PS_MIN_MODEM);
163+
break;
164+
case POWER_MANAGEMENT_MAX: {
165+
// listen_interval is only used in this case.
166+
wifi_config_t *config = &self->sta_config;
167+
config->sta.listen_interval = listen_interval;
168+
esp_wifi_set_ps(WIFI_PS_MAX_MODEM);
169+
esp_wifi_set_config(ESP_IF_WIFI_STA, config);
170+
}
171+
break;
172+
case POWER_MANAGEMENT_NONE:
173+
esp_wifi_set_ps(WIFI_PS_NONE);
174+
break;
156175
}
176+
}
157177

158-
esp_wifi_set_config(ESP_IF_WIFI_STA, config);
178+
mp_int_t common_hal_wifi_radio_get_listen_interval(wifi_radio_obj_t *self) {
179+
wifi_config_t *config = &self->sta_config;
180+
return config->sta.listen_interval;
159181
}
160182

161183
mp_obj_t common_hal_wifi_radio_get_mac_address_ap(wifi_radio_obj_t *self) {

ports/espressif/mpconfigport.mk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ CIRCUITPY_FULL_BUILD ?= 1
4141
CIRCUITPY_SSL_MBEDTLS = 1
4242

4343
# Wifi Power Save
44-
CIRCUITPY_WIFI_RADIO_SETTABLE_LISTEN_INTERVAL = 1
44+
CIRCUITPY_WIFI_RADIO_SETTABLE_POWER_MANAGEMENT = 1
4545

4646
# Never use our copy of MBEDTLS
4747
CIRCUITPY_HASHLIB_MBEDTLS_ONLY = 0

py/circuitpy_mpconfig.mk

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -705,8 +705,8 @@ CFLAGS += -DCIRCUITPY_WEB_WORKFLOW=$(CIRCUITPY_WEB_WORKFLOW)
705705
CIRCUITPY_WIFI_RADIO_SETTABLE_MAC_ADDRESS?= 1
706706
CFLAGS += -DCIRCUITPY_WIFI_RADIO_SETTABLE_MAC_ADDRESS=$(CIRCUITPY_WIFI_RADIO_SETTABLE_MAC_ADDRESS)
707707

708-
CIRCUITPY_WIFI_RADIO_SETTABLE_LISTEN_INTERVAL?= 0
709-
CFLAGS += -DCIRCUITPY_WIFI_RADIO_SETTABLE_LISTEN_INTERVAL=$(CIRCUITPY_WIFI_RADIO_SETTABLE_LISTEN_INTERVAL)
708+
CIRCUITPY_WIFI_RADIO_SETTABLE_POWER_MANAGEMENT?= 0
709+
CFLAGS += -DCIRCUITPY_WIFI_RADIO_SETTABLE_POWER_MANAGEMENT=$(CIRCUITPY_WIFI_RADIO_SETTABLE_POWER_MANAGEMENT)
710710

711711
# tinyusb port tailored configuration
712712
CIRCUITPY_TUSB_MEM_ALIGN ?= 4
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// This file is part of the CircuitPython project: https://circuitpython.org
2+
//
3+
// SPDX-FileCopyrightText: Copyright (c) 2025 Dan Halbert for Adafruit Industries
4+
//
5+
// SPDX-License-Identifier: MIT
6+
7+
#include "py/enum.h"
8+
9+
#include "shared-bindings/wifi/PowerManagement.h"
10+
11+
//| class PowerManagement:
12+
//| """Power-saving options for wifi"""
13+
//|
14+
//| MIN: PowerManagement
15+
//| """Minimum power management (default). The WiFi station wakes up to receive a beacon every DTIM period.
16+
//| The DTIM period is set by the access point."""
17+
//| MAX: PowerManagement
18+
//| """Maximum power management, at the expense of some performance. The WiFi station wakes up every 100 ms."""
19+
//| NONE: PowerManagement
20+
//| """No power management: the WiFi station does not sleep."""
21+
22+
// In order of the enum type.
23+
MAKE_ENUM_VALUE(wifi_power_management_type, power_management, NONE, POWER_MANAGEMENT_NONE);
24+
MAKE_ENUM_VALUE(wifi_power_management_type, power_management, MIN, POWER_MANAGEMENT_MIN);
25+
MAKE_ENUM_VALUE(wifi_power_management_type, power_management, MAX, POWER_MANAGEMENT_MAX);
26+
27+
MAKE_ENUM_MAP(wifi_power_management) {
28+
MAKE_ENUM_MAP_ENTRY(power_management, NONE),
29+
MAKE_ENUM_MAP_ENTRY(power_management, MIN),
30+
MAKE_ENUM_MAP_ENTRY(power_management, MAX),
31+
};
32+
33+
static MP_DEFINE_CONST_DICT(wifi_power_management_locals_dict, wifi_power_management_locals_table);
34+
35+
MAKE_PRINTER(wifi, wifi_power_management);
36+
37+
MAKE_ENUM_TYPE(wifi, PowerManagement, wifi_power_management);
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// This file is part of the CircuitPython project: https://circuitpython.org
2+
//
3+
// SPDX-FileCopyrightText: Copyright (c) 2025 Dan Halbert for Adafruit Industries
4+
//
5+
// SPDX-License-Identifier: MIT
6+
7+
#pragma once
8+
9+
#include "py/enum.h"
10+
11+
typedef enum {
12+
POWER_MANAGMENT_NONE = 0,
13+
POWER_MANAGEMENT_MIN = 1,
14+
POWER_MANAGEMENT_MAX = 2,
15+
} wifi_power_management_t;
16+
17+
extern const mp_obj_type_t wifi_power_management_type;

shared-bindings/wifi/Radio.c

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
#include <string.h>
1111

12+
#include "py/enum.h"
1213
#include "py/unicode.h"
1314
#include "py/runtime.h"
1415
#include "py/objproperty.h"
@@ -187,23 +188,24 @@ MP_PROPERTY_GETSET(wifi_radio_tx_power_obj,
187188
(mp_obj_t)&wifi_radio_get_tx_power_obj,
188189
(mp_obj_t)&wifi_radio_set_tx_power_obj);
189190

190-
//| listen_interval: int
191-
//| """Wifi power save listen interval, in DTIM periods, or 100ms intervals if TWT is supported."""
192-
static mp_obj_t wifi_radio_get_listen_interval(mp_obj_t self_in) {
193-
#if CIRCUITPY_WIFI_RADIO_SETTABLE_LISTEN_INTERVAL
191+
//| power_management: PowerManagement
192+
//| """Wifi power management setting. The default is `wifi.PowerManagement.MIN.
193+
//| """
194+
static mp_obj_t wifi_radio_get_power_management(mp_obj_t self_in) {
195+
#if CIRCUITPY_WIFI_RADIO_SETTABLE_POWER_MANAGEMENT
194196
wifi_radio_obj_t *self = MP_OBJ_TO_PTR(self_in);
195-
return mp_obj_new_int(common_hal_wifi_radio_get_listen_interval(self));
197+
return cp_enum_find(&wifi_power_management_type, common_hal_wifi_radio_get_power_management(self));
196198
#else
197-
return mp_obj_new_int(0);
199+
return MP_OBJ_FROM_PTR(&power_management_MIN);
198200
#endif
199201
}
200202
MP_DEFINE_CONST_FUN_OBJ_1(wifi_radio_get_listen_interval_obj, wifi_radio_get_listen_interval);
201203

202-
static mp_obj_t wifi_radio_set_listen_interval(mp_obj_t self_in, mp_obj_t listen_interval_in) {
203-
#if CIRCUITPY_WIFI_RADIO_SETTABLE_LISTEN_INTERVAL
204-
mp_int_t listen_interval = mp_obj_get_int(listen_interval_in);
204+
static mp_obj_t wifi_radio_set_power_management(mp_obj_t self_in, mp_obj_t power_management_in) {
205+
#if CIRCUITPY_WIFI_RADIO_SETTABLE_POWER_MANAGEMENT
205206
wifi_radio_obj_t *self = MP_OBJ_TO_PTR(self_in);
206-
common_hal_wifi_radio_set_listen_interval(self, listen_interval);
207+
wifi_power_management_t power_management = cp_enum_value(&wifi_power_management_type, power_management_in, MP_QSTR_power_management);
208+
common_hal_wifi_radio_set_power_management(self, power_management);
207209
#else
208210
mp_raise_NotImplementedError(NULL);
209211
#endif
@@ -868,6 +870,7 @@ static const mp_rom_map_elem_t wifi_radio_locals_dict_table[] = {
868870
{ MP_ROM_QSTR(MP_QSTR_ipv4_subnet_ap), MP_ROM_PTR(&wifi_radio_ipv4_subnet_ap_obj) },
869871
{ MP_ROM_QSTR(MP_QSTR_ipv4_address), MP_ROM_PTR(&wifi_radio_ipv4_address_obj) },
870872
{ MP_ROM_QSTR(MP_QSTR_ipv4_address_ap), MP_ROM_PTR(&wifi_radio_ipv4_address_ap_obj) },
873+
{ MP_ROM_QSTR(MP_QSTR_listen_interval), MP_ROM_PTR(&wifi_radio_listen_interval_obj) },
871874

872875
{ MP_ROM_QSTR(MP_QSTR_set_ipv4_address), MP_ROM_PTR(&wifi_radio_set_ipv4_address_obj) },
873876
{ MP_ROM_QSTR(MP_QSTR_set_ipv4_address_ap), MP_ROM_PTR(&wifi_radio_set_ipv4_address_ap_obj) },

shared-bindings/wifi/Radio.h

Lines changed: 44 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -75,46 +75,47 @@ extern void common_hal_wifi_radio_set_mac_address_ap(wifi_radio_obj_t *self, con
7575
extern mp_float_t common_hal_wifi_radio_get_tx_power(wifi_radio_obj_t *self);
7676
extern void common_hal_wifi_radio_set_tx_power(wifi_radio_obj_t *self, const mp_float_t power);
7777

78-
extern void common_hal_wifi_radio_set_listen_interval(wifi_radio_obj_t *self, const mp_int_t listen_interval);
79-
extern mp_int_t common_hal_wifi_radio_get_listen_interval(wifi_radio_obj_t *self);
80-
81-
extern mp_obj_t common_hal_wifi_radio_start_scanning_networks(wifi_radio_obj_t *self, uint8_t start_channel, uint8_t stop_channel);
82-
extern void common_hal_wifi_radio_stop_scanning_networks(wifi_radio_obj_t *self);
83-
84-
extern void common_hal_wifi_radio_start_station(wifi_radio_obj_t *self);
85-
extern void common_hal_wifi_radio_stop_station(wifi_radio_obj_t *self);
86-
87-
extern 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, uint32_t authmode, uint8_t max_connections);
88-
extern void common_hal_wifi_radio_stop_ap(wifi_radio_obj_t *self);
89-
extern bool common_hal_wifi_radio_get_ap_active(wifi_radio_obj_t *self);
90-
extern mp_obj_t common_hal_wifi_radio_get_stations_ap(wifi_radio_obj_t *self);
91-
92-
extern void common_hal_wifi_radio_start_dhcp_client(wifi_radio_obj_t *self, bool ipv4, bool ipv6);
93-
extern void common_hal_wifi_radio_stop_dhcp_client(wifi_radio_obj_t *self);
94-
extern void common_hal_wifi_radio_start_dhcp_server(wifi_radio_obj_t *self);
95-
extern void common_hal_wifi_radio_stop_dhcp_server(wifi_radio_obj_t *self);
96-
97-
extern 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);
98-
extern bool common_hal_wifi_radio_get_connected(wifi_radio_obj_t *self);
99-
100-
extern mp_obj_t common_hal_wifi_radio_get_ap_info(wifi_radio_obj_t *self);
101-
extern mp_obj_t common_hal_wifi_radio_get_ipv4_dns(wifi_radio_obj_t *self);
102-
extern void common_hal_wifi_radio_set_ipv4_dns(wifi_radio_obj_t *self, mp_obj_t ipv4_dns_addr);
103-
extern mp_obj_t common_hal_wifi_radio_get_ipv4_gateway(wifi_radio_obj_t *self);
104-
extern mp_obj_t common_hal_wifi_radio_get_ipv4_gateway_ap(wifi_radio_obj_t *self);
105-
extern mp_obj_t common_hal_wifi_radio_get_ipv4_subnet(wifi_radio_obj_t *self);
106-
extern mp_obj_t common_hal_wifi_radio_get_ipv4_subnet_ap(wifi_radio_obj_t *self);
107-
uint32_t wifi_radio_get_ipv4_address(wifi_radio_obj_t *self);
108-
extern mp_obj_t common_hal_wifi_radio_get_ipv4_address(wifi_radio_obj_t *self);
109-
extern mp_obj_t common_hal_wifi_radio_get_ipv4_address_ap(wifi_radio_obj_t *self);
110-
111-
mp_obj_t common_hal_wifi_radio_get_addresses(wifi_radio_obj_t *self);
112-
mp_obj_t common_hal_wifi_radio_get_addresses_ap(wifi_radio_obj_t *self);
113-
114-
extern mp_obj_t common_hal_wifi_radio_get_dns(wifi_radio_obj_t *self);
115-
extern void common_hal_wifi_radio_set_dns(wifi_radio_obj_t *self, mp_obj_t dns_addr);
116-
117-
extern void common_hal_wifi_radio_set_ipv4_address(wifi_radio_obj_t *self, mp_obj_t ipv4, mp_obj_t netmask, mp_obj_t gateway, mp_obj_t ipv4_dns_addr);
118-
extern void common_hal_wifi_radio_set_ipv4_address_ap(wifi_radio_obj_t *self, mp_obj_t ipv4, mp_obj_t netmask, mp_obj_t gateway);
119-
120-
extern mp_int_t common_hal_wifi_radio_ping(wifi_radio_obj_t *self, mp_obj_t ip_address, mp_float_t timeout);
78+
wifi_power_management_t common_hal_wifi_radio_get_power_management(wifi_radio_obj_t *self) {
79+
void common_hal_wifi_radio_set_power_management(wifi_radio_obj_t *self, wifi_power_management_t power_management, mp_uint_t listen_interval);
80+
extern wifi_power_management_t common_hal_wifi_radio_get_listen_interval(wifi_radio_obj_t *self);
81+
82+
extern mp_obj_t common_hal_wifi_radio_start_scanning_networks(wifi_radio_obj_t *self, uint8_t start_channel, uint8_t stop_channel);
83+
extern void common_hal_wifi_radio_stop_scanning_networks(wifi_radio_obj_t *self);
84+
85+
extern void common_hal_wifi_radio_start_station(wifi_radio_obj_t *self);
86+
extern void common_hal_wifi_radio_stop_station(wifi_radio_obj_t *self);
87+
88+
extern 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, uint32_t authmode, uint8_t max_connections);
89+
extern void common_hal_wifi_radio_stop_ap(wifi_radio_obj_t *self);
90+
extern bool common_hal_wifi_radio_get_ap_active(wifi_radio_obj_t *self);
91+
extern mp_obj_t common_hal_wifi_radio_get_stations_ap(wifi_radio_obj_t *self);
92+
93+
extern void common_hal_wifi_radio_start_dhcp_client(wifi_radio_obj_t *self, bool ipv4, bool ipv6);
94+
extern void common_hal_wifi_radio_stop_dhcp_client(wifi_radio_obj_t *self);
95+
extern void common_hal_wifi_radio_start_dhcp_server(wifi_radio_obj_t *self);
96+
extern void common_hal_wifi_radio_stop_dhcp_server(wifi_radio_obj_t *self);
97+
98+
extern 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);
99+
extern bool common_hal_wifi_radio_get_connected(wifi_radio_obj_t *self);
100+
101+
extern mp_obj_t common_hal_wifi_radio_get_ap_info(wifi_radio_obj_t *self);
102+
extern mp_obj_t common_hal_wifi_radio_get_ipv4_dns(wifi_radio_obj_t *self);
103+
extern void common_hal_wifi_radio_set_ipv4_dns(wifi_radio_obj_t *self, mp_obj_t ipv4_dns_addr);
104+
extern mp_obj_t common_hal_wifi_radio_get_ipv4_gateway(wifi_radio_obj_t *self);
105+
extern mp_obj_t common_hal_wifi_radio_get_ipv4_gateway_ap(wifi_radio_obj_t *self);
106+
extern mp_obj_t common_hal_wifi_radio_get_ipv4_subnet(wifi_radio_obj_t *self);
107+
extern mp_obj_t common_hal_wifi_radio_get_ipv4_subnet_ap(wifi_radio_obj_t *self);
108+
uint32_t wifi_radio_get_ipv4_address(wifi_radio_obj_t *self);
109+
extern mp_obj_t common_hal_wifi_radio_get_ipv4_address(wifi_radio_obj_t *self);
110+
extern mp_obj_t common_hal_wifi_radio_get_ipv4_address_ap(wifi_radio_obj_t *self);
111+
112+
mp_obj_t common_hal_wifi_radio_get_addresses(wifi_radio_obj_t *self);
113+
mp_obj_t common_hal_wifi_radio_get_addresses_ap(wifi_radio_obj_t *self);
114+
115+
extern mp_obj_t common_hal_wifi_radio_get_dns(wifi_radio_obj_t *self);
116+
extern void common_hal_wifi_radio_set_dns(wifi_radio_obj_t *self, mp_obj_t dns_addr);
117+
118+
extern void common_hal_wifi_radio_set_ipv4_address(wifi_radio_obj_t *self, mp_obj_t ipv4, mp_obj_t netmask, mp_obj_t gateway, mp_obj_t ipv4_dns_addr);
119+
extern void common_hal_wifi_radio_set_ipv4_address_ap(wifi_radio_obj_t *self, mp_obj_t ipv4, mp_obj_t netmask, mp_obj_t gateway);
120+
121+
extern mp_int_t common_hal_wifi_radio_ping(wifi_radio_obj_t *self, mp_obj_t ip_address, mp_float_t timeout);

0 commit comments

Comments
 (0)