From 97d037b3c4dbda8e8307975459cc2842946c66ee Mon Sep 17 00:00:00 2001 From: Dan Halbert Date: Mon, 14 Apr 2025 17:02:28 -0400 Subject: [PATCH 1/3] wip --- ports/espressif/common-hal/wifi/Radio.c | 48 ++++++++++---- ports/espressif/mpconfigport.mk | 2 +- py/circuitpy_mpconfig.mk | 4 +- shared-bindings/wifi/PowerManagement.c | 37 +++++++++++ shared-bindings/wifi/PowerManagement.h | 17 +++++ shared-bindings/wifi/Radio.c | 23 ++++--- shared-bindings/wifi/Radio.h | 87 +++++++++++++------------ 7 files changed, 149 insertions(+), 69 deletions(-) create mode 100644 shared-bindings/wifi/PowerManagement.c create mode 100644 shared-bindings/wifi/PowerManagement.h diff --git a/ports/espressif/common-hal/wifi/Radio.c b/ports/espressif/common-hal/wifi/Radio.c index 1e499b9d1d60b..7b3d958aad691 100644 --- a/ports/espressif/common-hal/wifi/Radio.c +++ b/ports/espressif/common-hal/wifi/Radio.c @@ -139,23 +139,45 @@ void common_hal_wifi_radio_set_tx_power(wifi_radio_obj_t *self, const mp_float_t esp_wifi_set_max_tx_power(tx_power * 4.0f); } -mp_int_t common_hal_wifi_radio_get_listen_interval(wifi_radio_obj_t *self) { - wifi_config_t *config = &self->sta_config; - return config->sta.listen_interval; +wifi_power_management_t common_hal_wifi_radio_get_power_management(wifi_radio_obj_t *self) { + wifi_ps_type ps; + esp_err_t ret = esp_wifi_get_ps(&ps); + if (ret == ESP_OK) { + switch (ps) { + case WIFI_PS_MIN_MODEM: + return POWER_MANAGEMENT_MIN; + case WIFI_PS_MAX_MODEM: + return POWER_MANAGEMENT_MAX; + case WIFI_PS_NONE: + return POWER_MANAGEMENT_NONE; + } + } + return POWER_MANAGEMENT_MIN; } -void common_hal_wifi_radio_set_listen_interval(wifi_radio_obj_t *self, const mp_int_t listen_interval) { - wifi_config_t *config = &self->sta_config; - config->sta.listen_interval = listen_interval; - if (listen_interval == 1) { - esp_wifi_set_ps(WIFI_PS_MIN_MODEM); - } else if (listen_interval > 1) { - esp_wifi_set_ps(WIFI_PS_MAX_MODEM); - } else { - esp_wifi_set_ps(WIFI_PS_NONE); + +void common_hal_wifi_radio_set_power_management(wifi_radio_obj_t *self, wifi_power_management_t power_management, mp_uint_t listen_interval) { + switch (power_management) { + case POWER_MANAGEMENT_MIN: + esp_wifi_set_ps(WIFI_PS_MIN_MODEM); + break; + case POWER_MANAGEMENT_MAX: { + // listen_interval is only used in this case. + wifi_config_t *config = &self->sta_config; + config->sta.listen_interval = listen_interval; + esp_wifi_set_ps(WIFI_PS_MAX_MODEM); + esp_wifi_set_config(ESP_IF_WIFI_STA, config); + } + break; + case POWER_MANAGEMENT_NONE: + esp_wifi_set_ps(WIFI_PS_NONE); + break; } +} - esp_wifi_set_config(ESP_IF_WIFI_STA, config); +mp_int_t common_hal_wifi_radio_get_listen_interval(wifi_radio_obj_t *self) { + wifi_config_t *config = &self->sta_config; + return config->sta.listen_interval; } mp_obj_t common_hal_wifi_radio_get_mac_address_ap(wifi_radio_obj_t *self) { diff --git a/ports/espressif/mpconfigport.mk b/ports/espressif/mpconfigport.mk index 31522795a165a..6d303424bc7c0 100644 --- a/ports/espressif/mpconfigport.mk +++ b/ports/espressif/mpconfigport.mk @@ -41,7 +41,7 @@ CIRCUITPY_FULL_BUILD ?= 1 CIRCUITPY_SSL_MBEDTLS = 1 # Wifi Power Save -CIRCUITPY_WIFI_RADIO_SETTABLE_LISTEN_INTERVAL = 1 +CIRCUITPY_WIFI_RADIO_SETTABLE_POWER_MANAGEMENT = 1 # Never use our copy of MBEDTLS CIRCUITPY_HASHLIB_MBEDTLS_ONLY = 0 diff --git a/py/circuitpy_mpconfig.mk b/py/circuitpy_mpconfig.mk index c277c04c9d4d5..53f3037a7c4c5 100644 --- a/py/circuitpy_mpconfig.mk +++ b/py/circuitpy_mpconfig.mk @@ -705,8 +705,8 @@ CFLAGS += -DCIRCUITPY_WEB_WORKFLOW=$(CIRCUITPY_WEB_WORKFLOW) CIRCUITPY_WIFI_RADIO_SETTABLE_MAC_ADDRESS?= 1 CFLAGS += -DCIRCUITPY_WIFI_RADIO_SETTABLE_MAC_ADDRESS=$(CIRCUITPY_WIFI_RADIO_SETTABLE_MAC_ADDRESS) -CIRCUITPY_WIFI_RADIO_SETTABLE_LISTEN_INTERVAL?= 0 -CFLAGS += -DCIRCUITPY_WIFI_RADIO_SETTABLE_LISTEN_INTERVAL=$(CIRCUITPY_WIFI_RADIO_SETTABLE_LISTEN_INTERVAL) +CIRCUITPY_WIFI_RADIO_SETTABLE_POWER_MANAGEMENT?= 0 +CFLAGS += -DCIRCUITPY_WIFI_RADIO_SETTABLE_POWER_MANAGEMENT=$(CIRCUITPY_WIFI_RADIO_SETTABLE_POWER_MANAGEMENT) # tinyusb port tailored configuration CIRCUITPY_TUSB_MEM_ALIGN ?= 4 diff --git a/shared-bindings/wifi/PowerManagement.c b/shared-bindings/wifi/PowerManagement.c new file mode 100644 index 0000000000000..a0a5e4faecc19 --- /dev/null +++ b/shared-bindings/wifi/PowerManagement.c @@ -0,0 +1,37 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Dan Halbert for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "py/enum.h" + +#include "shared-bindings/wifi/PowerManagement.h" + +//| class PowerManagement: +//| """Power-saving options for wifi""" +//| +//| MIN: PowerManagement +//| """Minimum power management (default). The WiFi station wakes up to receive a beacon every DTIM period. +//| The DTIM period is set by the access point.""" +//| MAX: PowerManagement +//| """Maximum power management, at the expense of some performance. The WiFi station wakes up every 100 ms.""" +//| NONE: PowerManagement +//| """No power management: the WiFi station does not sleep.""" + +// In order of the enum type. +MAKE_ENUM_VALUE(wifi_power_management_type, power_management, NONE, POWER_MANAGEMENT_NONE); +MAKE_ENUM_VALUE(wifi_power_management_type, power_management, MIN, POWER_MANAGEMENT_MIN); +MAKE_ENUM_VALUE(wifi_power_management_type, power_management, MAX, POWER_MANAGEMENT_MAX); + +MAKE_ENUM_MAP(wifi_power_management) { + MAKE_ENUM_MAP_ENTRY(power_management, NONE), + MAKE_ENUM_MAP_ENTRY(power_management, MIN), + MAKE_ENUM_MAP_ENTRY(power_management, MAX), +}; + +static MP_DEFINE_CONST_DICT(wifi_power_management_locals_dict, wifi_power_management_locals_table); + +MAKE_PRINTER(wifi, wifi_power_management); + +MAKE_ENUM_TYPE(wifi, PowerManagement, wifi_power_management); diff --git a/shared-bindings/wifi/PowerManagement.h b/shared-bindings/wifi/PowerManagement.h new file mode 100644 index 0000000000000..338c402971845 --- /dev/null +++ b/shared-bindings/wifi/PowerManagement.h @@ -0,0 +1,17 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Dan Halbert for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include "py/enum.h" + +typedef enum { + POWER_MANAGMENT_NONE = 0, + POWER_MANAGEMENT_MIN = 1, + POWER_MANAGEMENT_MAX = 2, +} wifi_power_management_t; + +extern const mp_obj_type_t wifi_power_management_type; diff --git a/shared-bindings/wifi/Radio.c b/shared-bindings/wifi/Radio.c index 57faa7065d031..9a060928d9b8d 100644 --- a/shared-bindings/wifi/Radio.c +++ b/shared-bindings/wifi/Radio.c @@ -9,6 +9,7 @@ #include +#include "py/enum.h" #include "py/unicode.h" #include "py/runtime.h" #include "py/objproperty.h" @@ -187,23 +188,24 @@ MP_PROPERTY_GETSET(wifi_radio_tx_power_obj, (mp_obj_t)&wifi_radio_get_tx_power_obj, (mp_obj_t)&wifi_radio_set_tx_power_obj); -//| listen_interval: int -//| """Wifi power save listen interval, in DTIM periods, or 100ms intervals if TWT is supported.""" -static mp_obj_t wifi_radio_get_listen_interval(mp_obj_t self_in) { - #if CIRCUITPY_WIFI_RADIO_SETTABLE_LISTEN_INTERVAL +//| power_management: PowerManagement +//| """Wifi power management setting. The default is `wifi.PowerManagement.MIN. +//| """ +static mp_obj_t wifi_radio_get_power_management(mp_obj_t self_in) { + #if CIRCUITPY_WIFI_RADIO_SETTABLE_POWER_MANAGEMENT wifi_radio_obj_t *self = MP_OBJ_TO_PTR(self_in); - return mp_obj_new_int(common_hal_wifi_radio_get_listen_interval(self)); + return cp_enum_find(&wifi_power_management_type, common_hal_wifi_radio_get_power_management(self)); #else - return mp_obj_new_int(0); + return MP_OBJ_FROM_PTR(&power_management_MIN); #endif } MP_DEFINE_CONST_FUN_OBJ_1(wifi_radio_get_listen_interval_obj, wifi_radio_get_listen_interval); -static mp_obj_t wifi_radio_set_listen_interval(mp_obj_t self_in, mp_obj_t listen_interval_in) { - #if CIRCUITPY_WIFI_RADIO_SETTABLE_LISTEN_INTERVAL - mp_int_t listen_interval = mp_obj_get_int(listen_interval_in); +static mp_obj_t wifi_radio_set_power_management(mp_obj_t self_in, mp_obj_t power_management_in) { + #if CIRCUITPY_WIFI_RADIO_SETTABLE_POWER_MANAGEMENT wifi_radio_obj_t *self = MP_OBJ_TO_PTR(self_in); - common_hal_wifi_radio_set_listen_interval(self, listen_interval); + wifi_power_management_t power_management = cp_enum_value(&wifi_power_management_type, power_management_in, MP_QSTR_power_management); + common_hal_wifi_radio_set_power_management(self, power_management); #else mp_raise_NotImplementedError(NULL); #endif @@ -868,6 +870,7 @@ static const mp_rom_map_elem_t wifi_radio_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_ipv4_subnet_ap), MP_ROM_PTR(&wifi_radio_ipv4_subnet_ap_obj) }, { MP_ROM_QSTR(MP_QSTR_ipv4_address), MP_ROM_PTR(&wifi_radio_ipv4_address_obj) }, { MP_ROM_QSTR(MP_QSTR_ipv4_address_ap), MP_ROM_PTR(&wifi_radio_ipv4_address_ap_obj) }, + { MP_ROM_QSTR(MP_QSTR_listen_interval), MP_ROM_PTR(&wifi_radio_listen_interval_obj) }, { MP_ROM_QSTR(MP_QSTR_set_ipv4_address), MP_ROM_PTR(&wifi_radio_set_ipv4_address_obj) }, { MP_ROM_QSTR(MP_QSTR_set_ipv4_address_ap), MP_ROM_PTR(&wifi_radio_set_ipv4_address_ap_obj) }, diff --git a/shared-bindings/wifi/Radio.h b/shared-bindings/wifi/Radio.h index ac352626dccba..2ca7430277aea 100644 --- a/shared-bindings/wifi/Radio.h +++ b/shared-bindings/wifi/Radio.h @@ -75,46 +75,47 @@ extern void common_hal_wifi_radio_set_mac_address_ap(wifi_radio_obj_t *self, con extern mp_float_t common_hal_wifi_radio_get_tx_power(wifi_radio_obj_t *self); extern void common_hal_wifi_radio_set_tx_power(wifi_radio_obj_t *self, const mp_float_t power); -extern void common_hal_wifi_radio_set_listen_interval(wifi_radio_obj_t *self, const mp_int_t listen_interval); -extern mp_int_t common_hal_wifi_radio_get_listen_interval(wifi_radio_obj_t *self); - -extern mp_obj_t common_hal_wifi_radio_start_scanning_networks(wifi_radio_obj_t *self, uint8_t start_channel, uint8_t stop_channel); -extern void common_hal_wifi_radio_stop_scanning_networks(wifi_radio_obj_t *self); - -extern void common_hal_wifi_radio_start_station(wifi_radio_obj_t *self); -extern void common_hal_wifi_radio_stop_station(wifi_radio_obj_t *self); - -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); -extern void common_hal_wifi_radio_stop_ap(wifi_radio_obj_t *self); -extern bool common_hal_wifi_radio_get_ap_active(wifi_radio_obj_t *self); -extern mp_obj_t common_hal_wifi_radio_get_stations_ap(wifi_radio_obj_t *self); - -extern void common_hal_wifi_radio_start_dhcp_client(wifi_radio_obj_t *self, bool ipv4, bool ipv6); -extern void common_hal_wifi_radio_stop_dhcp_client(wifi_radio_obj_t *self); -extern void common_hal_wifi_radio_start_dhcp_server(wifi_radio_obj_t *self); -extern void common_hal_wifi_radio_stop_dhcp_server(wifi_radio_obj_t *self); - -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); -extern bool common_hal_wifi_radio_get_connected(wifi_radio_obj_t *self); - -extern mp_obj_t common_hal_wifi_radio_get_ap_info(wifi_radio_obj_t *self); -extern mp_obj_t common_hal_wifi_radio_get_ipv4_dns(wifi_radio_obj_t *self); -extern void common_hal_wifi_radio_set_ipv4_dns(wifi_radio_obj_t *self, mp_obj_t ipv4_dns_addr); -extern mp_obj_t common_hal_wifi_radio_get_ipv4_gateway(wifi_radio_obj_t *self); -extern mp_obj_t common_hal_wifi_radio_get_ipv4_gateway_ap(wifi_radio_obj_t *self); -extern mp_obj_t common_hal_wifi_radio_get_ipv4_subnet(wifi_radio_obj_t *self); -extern mp_obj_t common_hal_wifi_radio_get_ipv4_subnet_ap(wifi_radio_obj_t *self); -uint32_t wifi_radio_get_ipv4_address(wifi_radio_obj_t *self); -extern mp_obj_t common_hal_wifi_radio_get_ipv4_address(wifi_radio_obj_t *self); -extern mp_obj_t common_hal_wifi_radio_get_ipv4_address_ap(wifi_radio_obj_t *self); - -mp_obj_t common_hal_wifi_radio_get_addresses(wifi_radio_obj_t *self); -mp_obj_t common_hal_wifi_radio_get_addresses_ap(wifi_radio_obj_t *self); - -extern mp_obj_t common_hal_wifi_radio_get_dns(wifi_radio_obj_t *self); -extern void common_hal_wifi_radio_set_dns(wifi_radio_obj_t *self, mp_obj_t dns_addr); - -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); -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); - -extern mp_int_t common_hal_wifi_radio_ping(wifi_radio_obj_t *self, mp_obj_t ip_address, mp_float_t timeout); +wifi_power_management_t common_hal_wifi_radio_get_power_management(wifi_radio_obj_t *self) { + void common_hal_wifi_radio_set_power_management(wifi_radio_obj_t *self, wifi_power_management_t power_management, mp_uint_t listen_interval); + extern wifi_power_management_t common_hal_wifi_radio_get_listen_interval(wifi_radio_obj_t *self); + + extern mp_obj_t common_hal_wifi_radio_start_scanning_networks(wifi_radio_obj_t *self, uint8_t start_channel, uint8_t stop_channel); + extern void common_hal_wifi_radio_stop_scanning_networks(wifi_radio_obj_t *self); + + extern void common_hal_wifi_radio_start_station(wifi_radio_obj_t *self); + extern void common_hal_wifi_radio_stop_station(wifi_radio_obj_t *self); + + 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); + extern void common_hal_wifi_radio_stop_ap(wifi_radio_obj_t *self); + extern bool common_hal_wifi_radio_get_ap_active(wifi_radio_obj_t *self); + extern mp_obj_t common_hal_wifi_radio_get_stations_ap(wifi_radio_obj_t *self); + + extern void common_hal_wifi_radio_start_dhcp_client(wifi_radio_obj_t *self, bool ipv4, bool ipv6); + extern void common_hal_wifi_radio_stop_dhcp_client(wifi_radio_obj_t *self); + extern void common_hal_wifi_radio_start_dhcp_server(wifi_radio_obj_t *self); + extern void common_hal_wifi_radio_stop_dhcp_server(wifi_radio_obj_t *self); + + 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); + extern bool common_hal_wifi_radio_get_connected(wifi_radio_obj_t *self); + + extern mp_obj_t common_hal_wifi_radio_get_ap_info(wifi_radio_obj_t *self); + extern mp_obj_t common_hal_wifi_radio_get_ipv4_dns(wifi_radio_obj_t *self); + extern void common_hal_wifi_radio_set_ipv4_dns(wifi_radio_obj_t *self, mp_obj_t ipv4_dns_addr); + extern mp_obj_t common_hal_wifi_radio_get_ipv4_gateway(wifi_radio_obj_t *self); + extern mp_obj_t common_hal_wifi_radio_get_ipv4_gateway_ap(wifi_radio_obj_t *self); + extern mp_obj_t common_hal_wifi_radio_get_ipv4_subnet(wifi_radio_obj_t *self); + extern mp_obj_t common_hal_wifi_radio_get_ipv4_subnet_ap(wifi_radio_obj_t *self); + uint32_t wifi_radio_get_ipv4_address(wifi_radio_obj_t *self); + extern mp_obj_t common_hal_wifi_radio_get_ipv4_address(wifi_radio_obj_t *self); + extern mp_obj_t common_hal_wifi_radio_get_ipv4_address_ap(wifi_radio_obj_t *self); + + mp_obj_t common_hal_wifi_radio_get_addresses(wifi_radio_obj_t *self); + mp_obj_t common_hal_wifi_radio_get_addresses_ap(wifi_radio_obj_t *self); + + extern mp_obj_t common_hal_wifi_radio_get_dns(wifi_radio_obj_t *self); + extern void common_hal_wifi_radio_set_dns(wifi_radio_obj_t *self, mp_obj_t dns_addr); + + 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); + 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); + + extern mp_int_t common_hal_wifi_radio_ping(wifi_radio_obj_t *self, mp_obj_t ip_address, mp_float_t timeout); From 1ff3dff298c0c03782b70df0a8352e96d580f81f Mon Sep 17 00:00:00 2001 From: Dan Halbert Date: Sat, 19 Apr 2025 20:54:10 -0400 Subject: [PATCH 2/3] add wifi.radio.power_management et al --- ports/espressif/common-hal/wifi/Radio.c | 15 +++-- ports/espressif/mpconfigport.mk | 3 - ports/raspberrypi/bindings/cyw43/__init__.c | 26 +++++--- ports/raspberrypi/bindings/cyw43/__init__.h | 22 ++++--- ports/raspberrypi/common-hal/wifi/Radio.c | 36 +++++++++++ py/circuitpy_defns.mk | 1 + py/circuitpy_mpconfig.mk | 3 - shared-bindings/wifi/PowerManagement.c | 17 ++++- shared-bindings/wifi/PowerManagement.h | 4 +- shared-bindings/wifi/Radio.c | 29 ++++----- shared-bindings/wifi/Radio.h | 69 +++++++++++---------- shared-bindings/wifi/__init__.c | 19 +++--- 12 files changed, 150 insertions(+), 94 deletions(-) diff --git a/ports/espressif/common-hal/wifi/Radio.c b/ports/espressif/common-hal/wifi/Radio.c index 7b3d958aad691..abb7cb8626cf1 100644 --- a/ports/espressif/common-hal/wifi/Radio.c +++ b/ports/espressif/common-hal/wifi/Radio.c @@ -140,7 +140,7 @@ void common_hal_wifi_radio_set_tx_power(wifi_radio_obj_t *self, const mp_float_t } wifi_power_management_t common_hal_wifi_radio_get_power_management(wifi_radio_obj_t *self) { - wifi_ps_type ps; + wifi_ps_type_t ps; esp_err_t ret = esp_wifi_get_ps(&ps); if (ret == ESP_OK) { switch (ps) { @@ -156,7 +156,7 @@ wifi_power_management_t common_hal_wifi_radio_get_power_management(wifi_radio_ob } -void common_hal_wifi_radio_set_power_management(wifi_radio_obj_t *self, wifi_power_management_t power_management, mp_uint_t listen_interval) { +void common_hal_wifi_radio_set_power_management(wifi_radio_obj_t *self, wifi_power_management_t power_management) { switch (power_management) { case POWER_MANAGEMENT_MIN: esp_wifi_set_ps(WIFI_PS_MIN_MODEM); @@ -164,7 +164,8 @@ void common_hal_wifi_radio_set_power_management(wifi_radio_obj_t *self, wifi_pow case POWER_MANAGEMENT_MAX: { // listen_interval is only used in this case. wifi_config_t *config = &self->sta_config; - config->sta.listen_interval = listen_interval; + // This is a typical value seen in various examples. + config->sta.listen_interval = 3; esp_wifi_set_ps(WIFI_PS_MAX_MODEM); esp_wifi_set_config(ESP_IF_WIFI_STA, config); } @@ -172,14 +173,12 @@ void common_hal_wifi_radio_set_power_management(wifi_radio_obj_t *self, wifi_pow case POWER_MANAGEMENT_NONE: esp_wifi_set_ps(WIFI_PS_NONE); break; + case POWER_MANAGEMENT_UNKNOWN: + // This should be prevented in shared-bindings. + break; } } -mp_int_t common_hal_wifi_radio_get_listen_interval(wifi_radio_obj_t *self) { - wifi_config_t *config = &self->sta_config; - return config->sta.listen_interval; -} - mp_obj_t common_hal_wifi_radio_get_mac_address_ap(wifi_radio_obj_t *self) { uint8_t mac[MAC_ADDRESS_LENGTH]; esp_wifi_get_mac(ESP_IF_WIFI_AP, mac); diff --git a/ports/espressif/mpconfigport.mk b/ports/espressif/mpconfigport.mk index 6d303424bc7c0..81ad652bb2365 100644 --- a/ports/espressif/mpconfigport.mk +++ b/ports/espressif/mpconfigport.mk @@ -40,9 +40,6 @@ CIRCUITPY_FULL_BUILD ?= 1 # If SSL is enabled, it's mbedtls CIRCUITPY_SSL_MBEDTLS = 1 -# Wifi Power Save -CIRCUITPY_WIFI_RADIO_SETTABLE_POWER_MANAGEMENT = 1 - # Never use our copy of MBEDTLS CIRCUITPY_HASHLIB_MBEDTLS_ONLY = 0 diff --git a/ports/raspberrypi/bindings/cyw43/__init__.c b/ports/raspberrypi/bindings/cyw43/__init__.c index 36ac3ff7b6206..a699a5e91ebba 100644 --- a/ports/raspberrypi/bindings/cyw43/__init__.c +++ b/ports/raspberrypi/bindings/cyw43/__init__.c @@ -16,7 +16,7 @@ #include "lib/cyw43-driver/src/cyw43.h" -static int power_management_value = PM_DISABLED; +static uint32_t power_management_value = CONST_CYW43_DEFAULT_PM; void cyw43_enter_deep_sleep(void) { #define WL_REG_ON 23 @@ -43,14 +43,23 @@ MP_DEFINE_CONST_OBJ_TYPE( print, shared_bindings_microcontroller_pin_print ); +uint32_t cyw43_get_power_management_value() { + return power_management_value; +} + +void cyw43_set_power_management_value(uint32_t value) { + power_management_value = value; + bindings_cyw43_wifi_enforce_pm(); +} + //| PM_STANDARD: int -//| """The standard power management mode""" +//| """The default power management mode; same as PM_PERFORMANCE""" //| PM_AGGRESSIVE: int //| """Aggressive power management mode for optimal power usage at the cost of performance""" //| PM_PERFORMANCE: int //| """Performance power management mode where more power is used to increase performance""" //| PM_DISABLED: int -//| """Disable power management and always use highest power mode. CircuitPython sets this value at reset time, because it provides the best connectivity reliability.""" +//| """Disable power management and always use highest power mode.""" //| //| //| def set_power_management(value: int) -> None: @@ -85,8 +94,7 @@ MP_DEFINE_CONST_OBJ_TYPE( //| static mp_obj_t cyw43_set_power_management(const mp_obj_t value_in) { mp_int_t value = mp_obj_get_int(value_in); - power_management_value = value; - bindings_cyw43_wifi_enforce_pm(); + cyw43_set_power_management_value(value); return mp_const_none; } static MP_DEFINE_CONST_FUN_OBJ_1(cyw43_set_power_management_obj, cyw43_set_power_management); @@ -126,10 +134,10 @@ static const mp_rom_map_elem_t cyw43_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_CywPin), MP_ROM_PTR(&cyw43_pin_type) }, { MP_ROM_QSTR(MP_QSTR_set_power_management), &cyw43_set_power_management_obj }, { MP_ROM_QSTR(MP_QSTR_get_power_management), &cyw43_get_power_management_obj }, - { MP_ROM_QSTR(MP_QSTR_PM_STANDARD), MP_ROM_INT(PM_STANDARD) }, - { MP_ROM_QSTR(MP_QSTR_PM_AGGRESSIVE), MP_ROM_INT(PM_AGGRESSIVE) }, - { MP_ROM_QSTR(MP_QSTR_PM_PERFORMANCE), MP_ROM_INT(PM_PERFORMANCE) }, - { MP_ROM_QSTR(MP_QSTR_PM_DISABLED), MP_ROM_INT(PM_DISABLED) }, + { MP_ROM_QSTR(MP_QSTR_PM_STANDARD), MP_ROM_INT(CONST_CYW43_DEFAULT_PM) }, + { MP_ROM_QSTR(MP_QSTR_PM_AGGRESSIVE), MP_ROM_INT(CONST_CYW43_AGGRESSIVE_PM) }, + { MP_ROM_QSTR(MP_QSTR_PM_PERFORMANCE), MP_ROM_INT(CONST_CYW43_PERFORMANCE_PM) }, + { MP_ROM_QSTR(MP_QSTR_PM_DISABLED), MP_ROM_INT(CONST_CYW43_NONE_PM) }, }; static MP_DEFINE_CONST_DICT(cyw43_module_globals, cyw43_module_globals_table); diff --git a/ports/raspberrypi/bindings/cyw43/__init__.h b/ports/raspberrypi/bindings/cyw43/__init__.h index 51657b075d263..70f9ec294fb30 100644 --- a/ports/raspberrypi/bindings/cyw43/__init__.h +++ b/ports/raspberrypi/bindings/cyw43/__init__.h @@ -16,21 +16,25 @@ const mcu_pin_obj_t *validate_obj_is_free_pin_including_cyw43(mp_obj_t obj, qstr const mcu_pin_obj_t *validate_obj_is_free_pin_or_gpio29(mp_obj_t obj, qstr arg_name); const mcu_pin_obj_t *validate_obj_is_pin_including_cyw43(mp_obj_t obj, qstr arg_name); -#define CONSTANT_CYW43_PM_VALUE(pm_mode, pm2_sleep_ret_ms, li_beacon_period, li_dtim_period, li_assoc) \ +// This is equivalent to the code in cyw43.h, except that the values are computed at compile time. +// A `CONST_` prefix has been added to the computation function (expressed as a macro) and the values. + +#define CONST_cyw43_pm_value(pm_mode, pm2_sleep_ret_ms, li_beacon_period, li_dtim_period, li_assoc) \ (li_assoc << 20 | /* listen interval sent to ap */ \ li_dtim_period << 16 | \ li_beacon_period << 12 | \ (pm2_sleep_ret_ms / 10) << 4 | /* cyw43_ll_wifi_pm multiplies this by 10 */ \ pm_mode /* CYW43_PM2_POWERSAVE_MODE etc */) -// CYW43_DEFAULT_PM (except a compile-time constant) -#define PM_STANDARD CONSTANT_CYW43_PM_VALUE(CYW43_PM2_POWERSAVE_MODE, 200, 1, 1, 10) -// CYW43_AGGRESSIVE_PM (except a compile-time constant) -#define PM_AGGRESSIVE CONSTANT_CYW43_PM_VALUE(CYW43_PM2_POWERSAVE_MODE, 2000, 1, 1, 10) -// CYW43_PERFORMANCE_PM (except a compile-time constant) -#define PM_PERFORMANCE CONSTANT_CYW43_PM_VALUE(CYW43_PM2_POWERSAVE_MODE, 20, 1, 1, 1) -// The 0xa11140 magic value -#define PM_DISABLED CONSTANT_CYW43_PM_VALUE(CYW43_NO_POWERSAVE_MODE, 200, 1, 1, 10) +#define CONST_CYW43_DEFAULT_PM (CONST_CYW43_PERFORMANCE_PM) + +#define CONST_CYW43_NONE_PM (CONST_cyw43_pm_value(CYW43_NO_POWERSAVE_MODE, 10, 0, 0, 0)) + +#define CONST_CYW43_AGGRESSIVE_PM (CONST_cyw43_pm_value(CYW43_PM1_POWERSAVE_MODE, 10, 0, 0, 0)) + +#define CONST_CYW43_PERFORMANCE_PM (CONST_cyw43_pm_value(CYW43_PM2_POWERSAVE_MODE, 200, 1, 1, 10)) +extern uint32_t cyw43_get_power_management_value(void); +extern void cyw43_set_power_management_value(uint32_t value); extern void bindings_cyw43_wifi_enforce_pm(void); void cyw43_enter_deep_sleep(void); diff --git a/ports/raspberrypi/common-hal/wifi/Radio.c b/ports/raspberrypi/common-hal/wifi/Radio.c index b34a7670b83c9..5ac3a196fdcc9 100644 --- a/ports/raspberrypi/common-hal/wifi/Radio.c +++ b/ports/raspberrypi/common-hal/wifi/Radio.c @@ -5,6 +5,7 @@ // SPDX-License-Identifier: MIT #include "supervisor/port.h" +#include "shared-bindings/wifi/PowerManagement.h" #include "shared-bindings/wifi/Radio.h" #include "shared-bindings/wifi/Network.h" @@ -107,6 +108,41 @@ void common_hal_wifi_radio_set_tx_power(wifi_radio_obj_t *self, const mp_float_t cyw43_ioctl(&cyw43_state, CYW43_IOCTL_SET_VAR, 9 + 4, buf, CYW43_ITF_AP); } +wifi_power_management_t common_hal_wifi_radio_get_power_management(wifi_radio_obj_t *self) { + uint32_t pm_value = cyw43_get_power_management_value(); + + switch (pm_value) { + case CONST_CYW43_PERFORMANCE_PM: + return POWER_MANAGEMENT_MIN; + case CONST_CYW43_AGGRESSIVE_PM: + return POWER_MANAGEMENT_MAX; + case CONST_CYW43_NONE_PM: + return POWER_MANAGEMENT_NONE; + default: + return POWER_MANAGEMENT_UNKNOWN; + } +} + + +void common_hal_wifi_radio_set_power_management(wifi_radio_obj_t *self, wifi_power_management_t power_management) { + uint32_t pm_setting = CONST_CYW43_DEFAULT_PM; + switch (power_management) { + case POWER_MANAGEMENT_MIN: + pm_setting = CONST_CYW43_PERFORMANCE_PM; + break; + case POWER_MANAGEMENT_MAX: + pm_setting = CONST_CYW43_AGGRESSIVE_PM; + break; + case POWER_MANAGEMENT_NONE: + pm_setting = CONST_CYW43_NONE_PM; + break; + default: + // Should not get here. + break; + } + cyw43_set_power_management_value(pm_setting); +} + mp_obj_t common_hal_wifi_radio_get_mac_address_ap(wifi_radio_obj_t *self) { return common_hal_wifi_radio_get_mac_address(self); } diff --git a/py/circuitpy_defns.mk b/py/circuitpy_defns.mk index 640ca70bf3543..7eb55e09de20b 100644 --- a/py/circuitpy_defns.mk +++ b/py/circuitpy_defns.mk @@ -617,6 +617,7 @@ $(filter $(SRC_PATTERNS), \ supervisor/StatusBar.c \ wifi/AuthMode.c \ wifi/Packet.c \ + wifi/PowerManagement.c \ ) ifeq ($(CIRCUITPY_BLEIO_HCI),1) diff --git a/py/circuitpy_mpconfig.mk b/py/circuitpy_mpconfig.mk index 53f3037a7c4c5..7475b6296c5f9 100644 --- a/py/circuitpy_mpconfig.mk +++ b/py/circuitpy_mpconfig.mk @@ -705,9 +705,6 @@ CFLAGS += -DCIRCUITPY_WEB_WORKFLOW=$(CIRCUITPY_WEB_WORKFLOW) CIRCUITPY_WIFI_RADIO_SETTABLE_MAC_ADDRESS?= 1 CFLAGS += -DCIRCUITPY_WIFI_RADIO_SETTABLE_MAC_ADDRESS=$(CIRCUITPY_WIFI_RADIO_SETTABLE_MAC_ADDRESS) -CIRCUITPY_WIFI_RADIO_SETTABLE_POWER_MANAGEMENT?= 0 -CFLAGS += -DCIRCUITPY_WIFI_RADIO_SETTABLE_POWER_MANAGEMENT=$(CIRCUITPY_WIFI_RADIO_SETTABLE_POWER_MANAGEMENT) - # tinyusb port tailored configuration CIRCUITPY_TUSB_MEM_ALIGN ?= 4 CFLAGS += -DCIRCUITPY_TUSB_MEM_ALIGN=$(CIRCUITPY_TUSB_MEM_ALIGN) diff --git a/shared-bindings/wifi/PowerManagement.c b/shared-bindings/wifi/PowerManagement.c index a0a5e4faecc19..659144b024db8 100644 --- a/shared-bindings/wifi/PowerManagement.c +++ b/shared-bindings/wifi/PowerManagement.c @@ -9,25 +9,38 @@ #include "shared-bindings/wifi/PowerManagement.h" //| class PowerManagement: -//| """Power-saving options for wifi""" +//| """Power-saving options for wifi +//| +//| .. note:: On boards using the CYW43 radio module, the choices below correspond to the +//| power management values defined in the `cyw43` module: +//| `PowerManagement.MIN` is the same as `cyw43.PM_PERFORMANCE`, `PowerManagement.MAX` +//| is the same as `cyw43.PM_AGGRESSIVE`, and `PowerManagement.NONE` is the same as +//| `cyw43.PM_DISABLED`. If a custom value was set with `cyw43.set_power_management()` +//| not corresponding to one of these three values, then `PowerManagement.UNKNOWN` will be returned. +//| """ //| //| MIN: PowerManagement //| """Minimum power management (default). The WiFi station wakes up to receive a beacon every DTIM period. //| The DTIM period is set by the access point.""" //| MAX: PowerManagement -//| """Maximum power management, at the expense of some performance. The WiFi station wakes up every 100 ms.""" +//| """Maximum power management, at the expense of some performance. The WiFi station wakes up less often than `MIN`.""" //| NONE: PowerManagement //| """No power management: the WiFi station does not sleep.""" +//| UNKNOWN: PowerManagement +//| """Power management setting cannot be determined.""" +//| // In order of the enum type. MAKE_ENUM_VALUE(wifi_power_management_type, power_management, NONE, POWER_MANAGEMENT_NONE); MAKE_ENUM_VALUE(wifi_power_management_type, power_management, MIN, POWER_MANAGEMENT_MIN); MAKE_ENUM_VALUE(wifi_power_management_type, power_management, MAX, POWER_MANAGEMENT_MAX); +MAKE_ENUM_VALUE(wifi_power_management_type, power_management, UNKNOWN, POWER_MANAGEMENT_UNKNOWN); MAKE_ENUM_MAP(wifi_power_management) { MAKE_ENUM_MAP_ENTRY(power_management, NONE), MAKE_ENUM_MAP_ENTRY(power_management, MIN), MAKE_ENUM_MAP_ENTRY(power_management, MAX), + MAKE_ENUM_MAP_ENTRY(power_management, UNKNOWN), }; static MP_DEFINE_CONST_DICT(wifi_power_management_locals_dict, wifi_power_management_locals_table); diff --git a/shared-bindings/wifi/PowerManagement.h b/shared-bindings/wifi/PowerManagement.h index 338c402971845..c933e36df154d 100644 --- a/shared-bindings/wifi/PowerManagement.h +++ b/shared-bindings/wifi/PowerManagement.h @@ -9,9 +9,11 @@ #include "py/enum.h" typedef enum { - POWER_MANAGMENT_NONE = 0, + POWER_MANAGEMENT_NONE = 0, POWER_MANAGEMENT_MIN = 1, POWER_MANAGEMENT_MAX = 2, + // Value can't be determined. + POWER_MANAGEMENT_UNKNOWN = 3, } wifi_power_management_t; extern const mp_obj_type_t wifi_power_management_type; diff --git a/shared-bindings/wifi/Radio.c b/shared-bindings/wifi/Radio.c index 9a060928d9b8d..a267dea11c1ff 100644 --- a/shared-bindings/wifi/Radio.c +++ b/shared-bindings/wifi/Radio.c @@ -6,6 +6,7 @@ #include "shared-bindings/wifi/__init__.h" #include "shared-bindings/wifi/AuthMode.h" +#include "shared-bindings/wifi/PowerManagement.h" #include @@ -189,33 +190,29 @@ MP_PROPERTY_GETSET(wifi_radio_tx_power_obj, (mp_obj_t)&wifi_radio_set_tx_power_obj); //| power_management: PowerManagement -//| """Wifi power management setting. The default is `wifi.PowerManagement.MIN. +//| """Wifi power management setting. See `wifi.PowerManagement`. The default is `wifi.PowerManagement.MIN`. //| """ static mp_obj_t wifi_radio_get_power_management(mp_obj_t self_in) { - #if CIRCUITPY_WIFI_RADIO_SETTABLE_POWER_MANAGEMENT wifi_radio_obj_t *self = MP_OBJ_TO_PTR(self_in); return cp_enum_find(&wifi_power_management_type, common_hal_wifi_radio_get_power_management(self)); - #else - return MP_OBJ_FROM_PTR(&power_management_MIN); - #endif } -MP_DEFINE_CONST_FUN_OBJ_1(wifi_radio_get_listen_interval_obj, wifi_radio_get_listen_interval); +MP_DEFINE_CONST_FUN_OBJ_1(wifi_radio_get_power_management_obj, wifi_radio_get_power_management); static mp_obj_t wifi_radio_set_power_management(mp_obj_t self_in, mp_obj_t power_management_in) { - #if CIRCUITPY_WIFI_RADIO_SETTABLE_POWER_MANAGEMENT wifi_radio_obj_t *self = MP_OBJ_TO_PTR(self_in); - wifi_power_management_t power_management = cp_enum_value(&wifi_power_management_type, power_management_in, MP_QSTR_power_management); + wifi_power_management_t power_management = + cp_enum_value(&wifi_power_management_type, power_management_in, MP_QSTR_power_management); + if (power_management == POWER_MANAGEMENT_UNKNOWN) { + mp_arg_error_invalid(MP_QSTR_power_management); + } common_hal_wifi_radio_set_power_management(self, power_management); - #else - mp_raise_NotImplementedError(NULL); - #endif return mp_const_none; } -MP_DEFINE_CONST_FUN_OBJ_2(wifi_radio_set_listen_interval_obj, wifi_radio_set_listen_interval); +MP_DEFINE_CONST_FUN_OBJ_2(wifi_radio_set_power_management_obj, wifi_radio_set_power_management); -MP_PROPERTY_GETSET(wifi_radio_listen_interval_obj, - (mp_obj_t)&wifi_radio_get_listen_interval_obj, - (mp_obj_t)&wifi_radio_set_listen_interval_obj); +MP_PROPERTY_GETSET(wifi_radio_power_management_obj, + (mp_obj_t)&wifi_radio_get_power_management_obj, + (mp_obj_t)&wifi_radio_set_power_management_obj); //| mac_address_ap: ReadableBuffer //| """MAC address for the AP. When the address is altered after interface is started @@ -870,7 +867,7 @@ static const mp_rom_map_elem_t wifi_radio_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_ipv4_subnet_ap), MP_ROM_PTR(&wifi_radio_ipv4_subnet_ap_obj) }, { MP_ROM_QSTR(MP_QSTR_ipv4_address), MP_ROM_PTR(&wifi_radio_ipv4_address_obj) }, { MP_ROM_QSTR(MP_QSTR_ipv4_address_ap), MP_ROM_PTR(&wifi_radio_ipv4_address_ap_obj) }, - { MP_ROM_QSTR(MP_QSTR_listen_interval), MP_ROM_PTR(&wifi_radio_listen_interval_obj) }, + { MP_ROM_QSTR(MP_QSTR_power_management), MP_ROM_PTR(&wifi_radio_power_management_obj) }, { MP_ROM_QSTR(MP_QSTR_set_ipv4_address), MP_ROM_PTR(&wifi_radio_set_ipv4_address_obj) }, { MP_ROM_QSTR(MP_QSTR_set_ipv4_address_ap), MP_ROM_PTR(&wifi_radio_set_ipv4_address_ap_obj) }, diff --git a/shared-bindings/wifi/Radio.h b/shared-bindings/wifi/Radio.h index 2ca7430277aea..d3c12344b8706 100644 --- a/shared-bindings/wifi/Radio.h +++ b/shared-bindings/wifi/Radio.h @@ -8,6 +8,8 @@ #include +#include "shared-bindings/wifi/PowerManagement.h" + #include "common-hal/wifi/Radio.h" #include "py/objstr.h" @@ -75,47 +77,46 @@ extern void common_hal_wifi_radio_set_mac_address_ap(wifi_radio_obj_t *self, con extern mp_float_t common_hal_wifi_radio_get_tx_power(wifi_radio_obj_t *self); extern void common_hal_wifi_radio_set_tx_power(wifi_radio_obj_t *self, const mp_float_t power); -wifi_power_management_t common_hal_wifi_radio_get_power_management(wifi_radio_obj_t *self) { - void common_hal_wifi_radio_set_power_management(wifi_radio_obj_t *self, wifi_power_management_t power_management, mp_uint_t listen_interval); - extern wifi_power_management_t common_hal_wifi_radio_get_listen_interval(wifi_radio_obj_t *self); +extern wifi_power_management_t common_hal_wifi_radio_get_power_management(wifi_radio_obj_t *self); +extern void common_hal_wifi_radio_set_power_management(wifi_radio_obj_t *self, wifi_power_management_t power_management); - extern mp_obj_t common_hal_wifi_radio_start_scanning_networks(wifi_radio_obj_t *self, uint8_t start_channel, uint8_t stop_channel); - extern void common_hal_wifi_radio_stop_scanning_networks(wifi_radio_obj_t *self); +extern mp_obj_t common_hal_wifi_radio_start_scanning_networks(wifi_radio_obj_t *self, uint8_t start_channel, uint8_t stop_channel); +extern void common_hal_wifi_radio_stop_scanning_networks(wifi_radio_obj_t *self); - extern void common_hal_wifi_radio_start_station(wifi_radio_obj_t *self); - extern void common_hal_wifi_radio_stop_station(wifi_radio_obj_t *self); +extern void common_hal_wifi_radio_start_station(wifi_radio_obj_t *self); +extern void common_hal_wifi_radio_stop_station(wifi_radio_obj_t *self); - 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); - extern void common_hal_wifi_radio_stop_ap(wifi_radio_obj_t *self); - extern bool common_hal_wifi_radio_get_ap_active(wifi_radio_obj_t *self); - extern mp_obj_t common_hal_wifi_radio_get_stations_ap(wifi_radio_obj_t *self); +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); +extern void common_hal_wifi_radio_stop_ap(wifi_radio_obj_t *self); +extern bool common_hal_wifi_radio_get_ap_active(wifi_radio_obj_t *self); +extern mp_obj_t common_hal_wifi_radio_get_stations_ap(wifi_radio_obj_t *self); - extern void common_hal_wifi_radio_start_dhcp_client(wifi_radio_obj_t *self, bool ipv4, bool ipv6); - extern void common_hal_wifi_radio_stop_dhcp_client(wifi_radio_obj_t *self); - extern void common_hal_wifi_radio_start_dhcp_server(wifi_radio_obj_t *self); - extern void common_hal_wifi_radio_stop_dhcp_server(wifi_radio_obj_t *self); +extern void common_hal_wifi_radio_start_dhcp_client(wifi_radio_obj_t *self, bool ipv4, bool ipv6); +extern void common_hal_wifi_radio_stop_dhcp_client(wifi_radio_obj_t *self); +extern void common_hal_wifi_radio_start_dhcp_server(wifi_radio_obj_t *self); +extern void common_hal_wifi_radio_stop_dhcp_server(wifi_radio_obj_t *self); - 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); - extern bool common_hal_wifi_radio_get_connected(wifi_radio_obj_t *self); +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); +extern bool common_hal_wifi_radio_get_connected(wifi_radio_obj_t *self); - extern mp_obj_t common_hal_wifi_radio_get_ap_info(wifi_radio_obj_t *self); - extern mp_obj_t common_hal_wifi_radio_get_ipv4_dns(wifi_radio_obj_t *self); - extern void common_hal_wifi_radio_set_ipv4_dns(wifi_radio_obj_t *self, mp_obj_t ipv4_dns_addr); - extern mp_obj_t common_hal_wifi_radio_get_ipv4_gateway(wifi_radio_obj_t *self); - extern mp_obj_t common_hal_wifi_radio_get_ipv4_gateway_ap(wifi_radio_obj_t *self); - extern mp_obj_t common_hal_wifi_radio_get_ipv4_subnet(wifi_radio_obj_t *self); - extern mp_obj_t common_hal_wifi_radio_get_ipv4_subnet_ap(wifi_radio_obj_t *self); - uint32_t wifi_radio_get_ipv4_address(wifi_radio_obj_t *self); - extern mp_obj_t common_hal_wifi_radio_get_ipv4_address(wifi_radio_obj_t *self); - extern mp_obj_t common_hal_wifi_radio_get_ipv4_address_ap(wifi_radio_obj_t *self); +extern mp_obj_t common_hal_wifi_radio_get_ap_info(wifi_radio_obj_t *self); +extern mp_obj_t common_hal_wifi_radio_get_ipv4_dns(wifi_radio_obj_t *self); +extern void common_hal_wifi_radio_set_ipv4_dns(wifi_radio_obj_t *self, mp_obj_t ipv4_dns_addr); +extern mp_obj_t common_hal_wifi_radio_get_ipv4_gateway(wifi_radio_obj_t *self); +extern mp_obj_t common_hal_wifi_radio_get_ipv4_gateway_ap(wifi_radio_obj_t *self); +extern mp_obj_t common_hal_wifi_radio_get_ipv4_subnet(wifi_radio_obj_t *self); +extern mp_obj_t common_hal_wifi_radio_get_ipv4_subnet_ap(wifi_radio_obj_t *self); +uint32_t wifi_radio_get_ipv4_address(wifi_radio_obj_t *self); +extern mp_obj_t common_hal_wifi_radio_get_ipv4_address(wifi_radio_obj_t *self); +extern mp_obj_t common_hal_wifi_radio_get_ipv4_address_ap(wifi_radio_obj_t *self); - mp_obj_t common_hal_wifi_radio_get_addresses(wifi_radio_obj_t *self); - mp_obj_t common_hal_wifi_radio_get_addresses_ap(wifi_radio_obj_t *self); +mp_obj_t common_hal_wifi_radio_get_addresses(wifi_radio_obj_t *self); +mp_obj_t common_hal_wifi_radio_get_addresses_ap(wifi_radio_obj_t *self); - extern mp_obj_t common_hal_wifi_radio_get_dns(wifi_radio_obj_t *self); - extern void common_hal_wifi_radio_set_dns(wifi_radio_obj_t *self, mp_obj_t dns_addr); +extern mp_obj_t common_hal_wifi_radio_get_dns(wifi_radio_obj_t *self); +extern void common_hal_wifi_radio_set_dns(wifi_radio_obj_t *self, mp_obj_t dns_addr); - 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); - 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); +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); +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); - extern mp_int_t common_hal_wifi_radio_ping(wifi_radio_obj_t *self, mp_obj_t ip_address, mp_float_t timeout); +extern mp_int_t common_hal_wifi_radio_ping(wifi_radio_obj_t *self, mp_obj_t ip_address, mp_float_t timeout); diff --git a/shared-bindings/wifi/__init__.c b/shared-bindings/wifi/__init__.c index 91d317ebd1666..2a1c0097080db 100644 --- a/shared-bindings/wifi/__init__.c +++ b/shared-bindings/wifi/__init__.c @@ -30,21 +30,22 @@ static MP_DEFINE_CONST_FUN_OBJ_0(wifi___init___obj, wifi___init__); static const mp_rom_map_elem_t wifi_module_globals_table[] = { // Name - { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_wifi) }, + { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_wifi) }, // Initialization - { MP_ROM_QSTR(MP_QSTR___init__), MP_ROM_PTR(&wifi___init___obj) }, + { MP_ROM_QSTR(MP_QSTR___init__), MP_ROM_PTR(&wifi___init___obj) }, // Classes - { MP_ROM_QSTR(MP_QSTR_AuthMode), MP_ROM_PTR(&wifi_authmode_type) }, - { MP_ROM_QSTR(MP_QSTR_Monitor), MP_ROM_PTR(&wifi_monitor_type) }, - { MP_ROM_QSTR(MP_QSTR_Network), MP_ROM_PTR(&wifi_network_type) }, - { MP_ROM_QSTR(MP_QSTR_Packet), MP_ROM_PTR(&wifi_packet_type) }, - { MP_ROM_QSTR(MP_QSTR_Radio), MP_ROM_PTR(&wifi_radio_type) }, - { MP_ROM_QSTR(MP_QSTR_Station), MP_ROM_PTR(&wifi_radio_station_type) }, + { MP_ROM_QSTR(MP_QSTR_AuthMode), MP_ROM_PTR(&wifi_authmode_type) }, + { MP_ROM_QSTR(MP_QSTR_Monitor), MP_ROM_PTR(&wifi_monitor_type) }, + { MP_ROM_QSTR(MP_QSTR_Network), MP_ROM_PTR(&wifi_network_type) }, + { MP_ROM_QSTR(MP_QSTR_Packet), MP_ROM_PTR(&wifi_packet_type) }, + { MP_ROM_QSTR(MP_QSTR_PowerManagement), MP_ROM_PTR(&wifi_power_management_type) }, + { MP_ROM_QSTR(MP_QSTR_Radio), MP_ROM_PTR(&wifi_radio_type) }, + { MP_ROM_QSTR(MP_QSTR_Station), MP_ROM_PTR(&wifi_radio_station_type) }, // Properties - { MP_ROM_QSTR(MP_QSTR_radio), MP_ROM_PTR(&common_hal_wifi_radio_obj) }, + { MP_ROM_QSTR(MP_QSTR_radio), MP_ROM_PTR(&common_hal_wifi_radio_obj) }, }; static MP_DEFINE_CONST_DICT(wifi_module_globals, wifi_module_globals_table); From ef2a6245e23225ef957b4b1aded720bdefd4dc3d Mon Sep 17 00:00:00 2001 From: Dan Halbert Date: Sat, 19 Apr 2025 22:02:22 -0400 Subject: [PATCH 3/3] stub out wifi power management in zephyr --- ports/zephyr-cp/common-hal/wifi/Radio.c | 42 ++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/ports/zephyr-cp/common-hal/wifi/Radio.c b/ports/zephyr-cp/common-hal/wifi/Radio.c index fe053b6f60ee4..a5bb59db04590 100644 --- a/ports/zephyr-cp/common-hal/wifi/Radio.c +++ b/ports/zephyr-cp/common-hal/wifi/Radio.c @@ -137,10 +137,44 @@ void common_hal_wifi_radio_set_tx_power(wifi_radio_obj_t *self, const mp_float_t // esp_wifi_set_max_tx_power(tx_power * 4.0f); } -mp_int_t common_hal_wifi_radio_get_listen_interval(wifi_radio_obj_t *self) { - // wifi_config_t *config = &self->sta_config; - // return config->sta.listen_interval; - return 0; +wifi_power_management_t common_hal_wifi_radio_get_power_management(wifi_radio_obj_t *self) { + // wifi_ps_type_t ps; + // esp_err_t ret = esp_wifi_get_ps(&ps); + // if (ret == ESP_OK) { + // switch (ps) { + // case WIFI_PS_MIN_MODEM: + // return POWER_MANAGEMENT_MIN; + // case WIFI_PS_MAX_MODEM: + // return POWER_MANAGEMENT_MAX; + // case WIFI_PS_NONE: + // return POWER_MANAGEMENT_NONE; + // } + // } + return POWER_MANAGEMENT_UNKNOWN; +} + + +void common_hal_wifi_radio_set_power_management(wifi_radio_obj_t *self, wifi_power_management_t power_management) { + // switch (power_management) { + // case POWER_MANAGEMENT_MIN: + // esp_wifi_set_ps(WIFI_PS_MIN_MODEM); + // break; + // case POWER_MANAGEMENT_MAX: { + // // listen_interval is only used in this case. + // wifi_config_t *config = &self->sta_config; + // // This is a typical value seen in various examples. + // config->sta.listen_interval = 3; + // esp_wifi_set_ps(WIFI_PS_MAX_MODEM); + // esp_wifi_set_config(ESP_IF_WIFI_STA, config); + // } + // break; + // case POWER_MANAGEMENT_NONE: + // esp_wifi_set_ps(WIFI_PS_NONE); + // break; + // case POWER_MANAGEMENT_UNKNOWN: + // // This should be prevented in shared-bindings. + // break; + // } } void common_hal_wifi_radio_set_listen_interval(wifi_radio_obj_t *self, const mp_int_t listen_interval) { pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy