Skip to content

Commit 85dc839

Browse files
committed
Merge remote-tracking branch 'origin/main'
2 parents 0984e92 + a4a744b commit 85dc839

File tree

5 files changed

+106
-4
lines changed

5 files changed

+106
-4
lines changed

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

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,35 @@ mp_obj_t common_hal_wifi_radio_get_ipv4_dns(wifi_radio_obj_t *self) {
398398
return common_hal_ipaddress_new_ipv4address(self->dns_info.ip.u_addr.ip4.addr);
399399
}
400400

401+
void common_hal_wifi_radio_set_ipv4_dns(wifi_radio_obj_t *self, mp_obj_t ipv4_dns_addr) {
402+
esp_netif_dns_info_t dns_addr;
403+
ipaddress_ipaddress_to_esp_idf_ip4(ipv4_dns_addr, &dns_addr.ip.u_addr.ip4);
404+
esp_netif_set_dns_info(self->netif, ESP_NETIF_DNS_MAIN, &dns_addr);
405+
}
406+
407+
void common_hal_wifi_radio_start_dhcp_client(wifi_radio_obj_t *self) {
408+
esp_netif_dhcpc_start(self->netif);
409+
}
410+
411+
void common_hal_wifi_radio_stop_dhcp_client(wifi_radio_obj_t *self) {
412+
esp_netif_dhcpc_stop(self->netif);
413+
}
414+
415+
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) {
416+
common_hal_wifi_radio_stop_dhcp_client(self); // Must stop DHCP to set a manual address
417+
418+
esp_netif_ip_info_t ip_info;
419+
ipaddress_ipaddress_to_esp_idf_ip4(ipv4, &ip_info.ip);
420+
ipaddress_ipaddress_to_esp_idf_ip4(netmask, &ip_info.netmask);
421+
ipaddress_ipaddress_to_esp_idf_ip4(gateway, &ip_info.gw);
422+
423+
esp_netif_set_ip_info(self->netif, &ip_info);
424+
425+
if (ipv4_dns != MP_OBJ_NULL) {
426+
common_hal_wifi_radio_set_ipv4_dns(self, ipv4_dns);
427+
}
428+
}
429+
401430
mp_int_t common_hal_wifi_radio_ping(wifi_radio_obj_t *self, mp_obj_t ip_address, mp_float_t timeout) {
402431
esp_ping_config_t ping_config = ESP_PING_DEFAULT_CONFIG();
403432
ipaddress_ipaddress_to_esp_idf(ip_address, &ping_config.target_addr);

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,16 @@ void ipaddress_ipaddress_to_esp_idf(mp_obj_t ip_address, ip_addr_t *esp_ip_addre
189189
IP_ADDR4(esp_ip_address, bytes[0], bytes[1], bytes[2], bytes[3]);
190190
}
191191

192+
void ipaddress_ipaddress_to_esp_idf_ip4(mp_obj_t ip_address, esp_ip4_addr_t *esp_ip_address) {
193+
if (!mp_obj_is_type(ip_address, &ipaddress_ipv4address_type)) {
194+
mp_raise_ValueError(translate("Only IPv4 addresses supported"));
195+
}
196+
mp_obj_t packed = common_hal_ipaddress_ipv4address_get_packed(ip_address);
197+
size_t len;
198+
const char *bytes = mp_obj_str_get_data(packed, &len);
199+
esp_netif_set_ip4_addr(esp_ip_address, bytes[0], bytes[1], bytes[2], bytes[3]);
200+
}
201+
192202
void common_hal_wifi_gc_collect(void) {
193203
common_hal_wifi_radio_gc_collect(&common_hal_wifi_radio_obj);
194204
}

ports/espressif/common-hal/wifi/__init__.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,11 @@
3030
#include "py/obj.h"
3131

3232
#include "lwip/api.h"
33+
#include "components/esp_wifi/include/esp_wifi.h"
3334

3435
void wifi_reset(void);
3536

3637
void ipaddress_ipaddress_to_esp_idf(mp_obj_t ip_address, ip_addr_t *esp_ip_address);
38+
void ipaddress_ipaddress_to_esp_idf_ip4(mp_obj_t ip_address, esp_ip4_addr_t *esp_ip_address);
3739

3840
#endif // MICROPY_INCLUDED_ESPRESSIF_COMMON_HAL_WIFI___INIT___H

shared-bindings/wifi/Radio.c

Lines changed: 59 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,28 @@ MP_DEFINE_CONST_FUN_OBJ_1(wifi_radio_get_ipv4_subnet_ap_obj, wifi_radio_get_ipv4
414414
MP_PROPERTY_GETTER(wifi_radio_ipv4_subnet_ap_obj,
415415
(mp_obj_t)&wifi_radio_get_ipv4_subnet_ap_obj);
416416

417+
//| def set_ipv4_address(self, *, ipv4: ipaddress.IPv4Address, netmask: ipaddress.IPv4Address, gateway: ipaddress.IPv4Address, ipv4_dns: Optional[ipaddress.IPv4Address]) -> None:
418+
//| """Sets the IP v4 address of the station. Must include the netmask and gateway. DNS address is optional.
419+
//| Setting the address manually will stop the DHCP client."""
420+
//| ...
421+
STATIC mp_obj_t wifi_radio_set_ipv4_address(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
422+
enum { ARG_ipv4, ARG_netmask, ARG_gateway, ARG_ipv4_dns };
423+
static const mp_arg_t allowed_args[] = {
424+
{ MP_QSTR_ipv4, MP_ARG_REQUIRED | MP_ARG_KW_ONLY | MP_ARG_OBJ, },
425+
{ MP_QSTR_netmask, MP_ARG_REQUIRED | MP_ARG_KW_ONLY | MP_ARG_OBJ, },
426+
{ MP_QSTR_gateway, MP_ARG_REQUIRED | MP_ARG_KW_ONLY | MP_ARG_OBJ, },
427+
{ MP_QSTR_ipv4_dns, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_OBJ_NULL} },
428+
};
429+
430+
wifi_radio_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);
431+
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
432+
mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
433+
434+
common_hal_wifi_radio_set_ipv4_address(self, args[ARG_ipv4].u_obj, args[ARG_netmask].u_obj, args[ARG_gateway].u_obj, args[ARG_ipv4_dns].u_obj);
435+
return mp_const_none;
436+
}
437+
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(wifi_radio_set_ipv4_address_obj, 1, wifi_radio_set_ipv4_address);
438+
417439
//| ipv4_address: Optional[ipaddress.IPv4Address]
418440
//| """IP v4 Address of the station when connected to an access point. None otherwise."""
419441
//|
@@ -438,17 +460,25 @@ MP_DEFINE_CONST_FUN_OBJ_1(wifi_radio_get_ipv4_address_ap_obj, wifi_radio_get_ipv
438460
MP_PROPERTY_GETTER(wifi_radio_ipv4_address_ap_obj,
439461
(mp_obj_t)&wifi_radio_get_ipv4_address_ap_obj);
440462

441-
//| ipv4_dns: Optional[ipaddress.IPv4Address]
442-
//| """IP v4 Address of the DNS server in use when connected to an access point. None otherwise."""
463+
//| ipv4_dns: ipaddress.IPv4Address
464+
//| """IP v4 Address of the DNS server to be used."""
443465
//|
444466
STATIC mp_obj_t wifi_radio_get_ipv4_dns(mp_obj_t self) {
445467
return common_hal_wifi_radio_get_ipv4_dns(self);
446468

447469
}
448470
MP_DEFINE_CONST_FUN_OBJ_1(wifi_radio_get_ipv4_dns_obj, wifi_radio_get_ipv4_dns);
449471

450-
MP_PROPERTY_GETTER(wifi_radio_ipv4_dns_obj,
451-
(mp_obj_t)&wifi_radio_get_ipv4_dns_obj);
472+
STATIC mp_obj_t wifi_radio_set_ipv4_dns(mp_obj_t self, mp_obj_t ipv4_dns_addr) {
473+
common_hal_wifi_radio_set_ipv4_dns(self, ipv4_dns_addr);
474+
475+
return mp_const_none;
476+
}
477+
MP_DEFINE_CONST_FUN_OBJ_2(wifi_radio_set_ipv4_dns_obj, wifi_radio_set_ipv4_dns);
478+
479+
MP_PROPERTY_GETSET(wifi_radio_ipv4_dns_obj,
480+
(mp_obj_t)&wifi_radio_get_ipv4_dns_obj,
481+
(mp_obj_t)&wifi_radio_set_ipv4_dns_obj);
452482

453483
//| ap_info: Optional[Network]
454484
//| """Network object containing BSSID, SSID, authmode, channel, country and RSSI when connected to an access point. None otherwise."""
@@ -459,6 +489,26 @@ STATIC mp_obj_t wifi_radio_get_ap_info(mp_obj_t self) {
459489
}
460490
MP_DEFINE_CONST_FUN_OBJ_1(wifi_radio_get_ap_info_obj, wifi_radio_get_ap_info);
461491

492+
//| def start_dhcp(self) -> None:
493+
//| """Starts the DHCP client."""
494+
//| ...
495+
//|
496+
STATIC mp_obj_t wifi_radio_start_dhcp_client(mp_obj_t self) {
497+
common_hal_wifi_radio_start_dhcp_client(self);
498+
return mp_const_none;
499+
}
500+
MP_DEFINE_CONST_FUN_OBJ_1(wifi_radio_start_dhcp_client_obj, wifi_radio_start_dhcp_client);
501+
502+
//| def stop_dhcp(self) -> None:
503+
//| """Stops the DHCP client. Needed to assign a static IP address."""
504+
//| ...
505+
//|
506+
STATIC mp_obj_t wifi_radio_stop_dhcp_client(mp_obj_t self) {
507+
common_hal_wifi_radio_stop_dhcp_client(self);
508+
return mp_const_none;
509+
}
510+
MP_DEFINE_CONST_FUN_OBJ_1(wifi_radio_stop_dhcp_client_obj, wifi_radio_stop_dhcp_client);
511+
462512
MP_PROPERTY_GETTER(wifi_radio_ap_info_obj,
463513
(mp_obj_t)&wifi_radio_get_ap_info_obj);
464514

@@ -509,6 +559,9 @@ STATIC const mp_rom_map_elem_t wifi_radio_locals_dict_table[] = {
509559
{ MP_ROM_QSTR(MP_QSTR_start_ap), MP_ROM_PTR(&wifi_radio_start_ap_obj) },
510560
{ MP_ROM_QSTR(MP_QSTR_stop_ap), MP_ROM_PTR(&wifi_radio_stop_ap_obj) },
511561

562+
{ MP_ROM_QSTR(MP_QSTR_start_dhcp), MP_ROM_PTR(&wifi_radio_start_dhcp_client_obj) },
563+
{ MP_ROM_QSTR(MP_QSTR_stop_dhcp), MP_ROM_PTR(&wifi_radio_stop_dhcp_client_obj) },
564+
512565
{ MP_ROM_QSTR(MP_QSTR_connect), MP_ROM_PTR(&wifi_radio_connect_obj) },
513566
// { MP_ROM_QSTR(MP_QSTR_connect_to_enterprise), MP_ROM_PTR(&wifi_radio_connect_to_enterprise_obj) },
514567

@@ -521,6 +574,8 @@ STATIC const mp_rom_map_elem_t wifi_radio_locals_dict_table[] = {
521574
{ MP_ROM_QSTR(MP_QSTR_ipv4_address), MP_ROM_PTR(&wifi_radio_ipv4_address_obj) },
522575
{ MP_ROM_QSTR(MP_QSTR_ipv4_address_ap), MP_ROM_PTR(&wifi_radio_ipv4_address_ap_obj) },
523576

577+
{ MP_ROM_QSTR(MP_QSTR_set_ipv4_address), MP_ROM_PTR(&wifi_radio_set_ipv4_address_obj) },
578+
524579
// { MP_ROM_QSTR(MP_QSTR_access_point_active), MP_ROM_PTR(&wifi_radio_access_point_active_obj) },
525580
// { MP_ROM_QSTR(MP_QSTR_start_access_point), MP_ROM_PTR(&wifi_radio_start_access_point_obj) },
526581

shared-bindings/wifi/Radio.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,17 +91,23 @@ extern void common_hal_wifi_radio_stop_station(wifi_radio_obj_t *self);
9191
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, uint8_t authmode, uint8_t max_connections);
9292
extern void common_hal_wifi_radio_stop_ap(wifi_radio_obj_t *self);
9393

94+
extern void common_hal_wifi_radio_start_dhcp_client(wifi_radio_obj_t *self);
95+
extern void common_hal_wifi_radio_stop_dhcp_client(wifi_radio_obj_t *self);
96+
9497
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);
9598

9699
extern mp_obj_t common_hal_wifi_radio_get_ap_info(wifi_radio_obj_t *self);
97100
extern mp_obj_t common_hal_wifi_radio_get_ipv4_dns(wifi_radio_obj_t *self);
101+
extern void common_hal_wifi_radio_set_ipv4_dns(wifi_radio_obj_t *self, mp_obj_t ipv4_dns_addr);
98102
extern mp_obj_t common_hal_wifi_radio_get_ipv4_gateway(wifi_radio_obj_t *self);
99103
extern mp_obj_t common_hal_wifi_radio_get_ipv4_gateway_ap(wifi_radio_obj_t *self);
100104
extern mp_obj_t common_hal_wifi_radio_get_ipv4_subnet(wifi_radio_obj_t *self);
101105
extern mp_obj_t common_hal_wifi_radio_get_ipv4_subnet_ap(wifi_radio_obj_t *self);
102106
extern mp_obj_t common_hal_wifi_radio_get_ipv4_address(wifi_radio_obj_t *self);
103107
extern mp_obj_t common_hal_wifi_radio_get_ipv4_address_ap(wifi_radio_obj_t *self);
104108

109+
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);
110+
105111
extern mp_int_t common_hal_wifi_radio_ping(wifi_radio_obj_t *self, mp_obj_t ip_address, mp_float_t timeout);
106112

107113
#endif // MICROPY_INCLUDED_SHARED_BINDINGS_WIFI_RADIO_H

0 commit comments

Comments
 (0)