From ec6c3b179339719357bb278be328577b78c7814b Mon Sep 17 00:00:00 2001 From: "pedro.minatel" Date: Thu, 3 Feb 2022 15:46:05 +0000 Subject: [PATCH 1/5] Added dual antenna for WiFi (based on the ESP32-WROOM-DA module) --- libraries/WiFi/src/WiFiGeneric.cpp | 152 ++++++++++++++++++++++++++++- libraries/WiFi/src/WiFiGeneric.h | 2 + 2 files changed, 150 insertions(+), 4 deletions(-) diff --git a/libraries/WiFi/src/WiFiGeneric.cpp b/libraries/WiFi/src/WiFiGeneric.cpp index 3bcaececc7a..7010ff6cfef 100644 --- a/libraries/WiFi/src/WiFiGeneric.cpp +++ b/libraries/WiFi/src/WiFiGeneric.cpp @@ -1192,6 +1192,60 @@ bool WiFiGenericClass::initiateFTM(uint8_t frm_count, uint16_t burst_period, uin return true; } +/** + * Configure Dual antenna. + * @param gpio_ant1 Configure the GPIO number for the antenna 1 connected to the RF switch (default GPIO2 on ESP32-WROOM-DA) + * @param gpio_ant2 Configure the GPIO number for the antenna 2 connected to the RF switch (default GPIO25 on ESP32-WROOM-DA) + * @param default_rx_ant Set the default RX antenna + * @return true on success + */ +bool WiFiGenericClass::setAntennaConfig(uint8_t gpio_ant1, uint8_t gpio_ant2, uint8_t default_rx_ant) { + + wifi_ant_gpio_config_t wifi_ant_io; + wifi_ant_config_t ant_config; + + if (ESP_OK != esp_wifi_get_ant_gpio(&wifi_ant_io)) { + log_e("Failed to get antenna configuration"); + return false; + } + + wifi_ant_io.gpio_cfg[0].gpio_num = gpio_ant1; + wifi_ant_io.gpio_cfg[0].gpio_select = 1; + wifi_ant_io.gpio_cfg[1].gpio_num = gpio_ant2; + wifi_ant_io.gpio_cfg[1].gpio_select = 1; + + if (ESP_OK != esp_wifi_set_ant_gpio(&wifi_ant_io)) { + log_e("Failed to set antenna GPIO configuration"); + return false; + } + + // Set antenna configuration + ant_config.rx_ant_mode = WIFI_ANT_MODE_AUTO; + ant_config.tx_ant_mode = WIFI_ANT_MODE_AUTO; + ant_config.enabled_ant0 = 0; + ant_config.enabled_ant1 = 1; + + switch (default_rx_ant) + { + case 0: + ant_config.rx_ant_default = WIFI_ANT_ANT0; + break; + case 1: + ant_config.rx_ant_default = WIFI_ANT_ANT1; + break; + default: + log_e("Invalid default antenna"); + break; + } + + if (ESP_OK != esp_wifi_set_ant(&ant_config)) { + log_e("Failed to set antenna configuration"); + return false; + } + + return true; +} + // ----------------------------------------------------------------------------------------------------------------------- // ------------------------------------------------ Generic Network function --------------------------------------------- // ----------------------------------------------------------------------------------------------------------------------- @@ -1204,13 +1258,103 @@ bool WiFiGenericClass::initiateFTM(uint8_t frm_count, uint16_t burst_period, uin */ static void wifi_dns_found_callback(const char *name, const ip_addr_t *ipaddr, void *callback_arg) { - if(ipaddr) { - (*reinterpret_cast(callback_arg)) = ipaddr->u_addr.ip4.addr; + if(ipaddr) {/** + * Configure Dual antenna. + * @param gpio_ant1 Configure the GPIO number for the antenna 1 connected to the RF switch (default GPIO2 on ESP32-WROOM-DA) + * @param gpio_ant2 Configure the GPIO number for the antenna 2 connected to the RF switch (default GPIO25 on ESP32-WROOM-DA) + * @param default_rx_ant Set the default RX antenna + * @return true on success + */ +bool WiFiGenericClass::setAntennaConfig(uint8_t gpio_ant1, uint8_t gpio_ant2, uint8_t default_rx_ant) { + + wifi_ant_gpio_config_t wifi_ant_io; + wifi_ant_config_t ant_config; + + if (ESP_OK != esp_wifi_get_ant_gpio(&wifi_ant_io)) { + log_e("Failed to get antenna configuration"); + return false; + } + + wifi_ant_io.gpio_cfg[0].gpio_num = gpio_ant1; + wifi_ant_io.gpio_cfg[0].gpio_select = 1; + wifi_ant_io.gpio_cfg[1].gpio_num = gpio_ant2; + wifi_ant_io.gpio_cfg[1].gpio_select = 1; + + if (ESP_OK != esp_wifi_set_ant_gpio(&wifi_ant_io)) { + log_e("Failed to set antenna GPIO configuration"); + return false;/** + * Configure Dual antenna. + * @param gpio_ant1 Configure the GPIO number for the antenna 1 connected to the RF switch (default GPIO2 on ESP32-WROOM-DA) + * @param gpio_ant2 Configure the GPIO number for the antenna 2 connected to the RF switch (default GPIO25 on ESP32-WROOM-DA) + * @param default_rx_ant Set the default RX antenna + * @return true on success + */ +bool WiFiGenericClass::setAntennaConfig(uint8_t gpio_ant1, uint8_t gpio_ant2, uint8_t default_rx_ant) { + + wifi_ant_gpio_config_t wifi_ant_io; + wifi_ant_config_t ant_config; + + if (ESP_OK != esp_wifi_get_ant_gpio(&wifi_ant_io)) { + log_e("Failed to get antenna configuration"); + return false; + } + + wifi_ant_io.gpio_cfg[0].gpio_num = gpio_ant1; + wifi_ant_io.gpio_cfg[0].gpio_select = 1; + wifi_ant_io.gpio_cfg[1].gpio_num = gpio_ant2; + wifi_ant_io.gpio_cfg[1].gpio_select = 1; + + if (ESP_OK != esp_wifi_set_ant_gpio(&wifi_ant_io)) { + log_e("Failed to set antenna GPIO configuration"); + return false; + } + + // Set antenna configuration + ant_config.rx_ant_mode = WIFI_ANT_MODE_AUTO; + ant_config.tx_ant_mode = WIFI_ANT_MODE_AUTO; + ant_config.enabled_ant0 = 0; + ant_config.enabled_ant1 = 1; + + switch (default_rx_ant) + { + case 0: + ant_config.rx_ant_default = WIFI_ANT_ANT0; + break; + case 1: + ant_config.rx_ant_default = WIFI_ANT_ANT1; + break; + default: + log_e("Invalid default antenna"); + break; } - xEventGroupSetBits(_arduino_event_group, WIFI_DNS_DONE_BIT); + + if (ESP_OK != esp_wifi_set_ant(&ant_config)) { + log_e("Failed to set antenna configuration"); + return false; + } + + return true; } + switch (default_rx_ant) + { + case 0: + ant_config.rx_ant_default = WIFI_ANT_ANT0; + break; + case 1: + ant_config.rx_ant_default = WIFI_ANT_ANT1; + break; + default: + log_e("Invalid default antenna"); + break; + } + + if (ESP_OK != esp_wifi_set_ant(&ant_config)) { + log_e("Failed to set antenna configuration"); + return false; + } -/** + return true; +} * Resolve the given hostname to an IP address. * @param aHostname Name to be resolved * @param aResult IPAddress structure to store the returned IP address diff --git a/libraries/WiFi/src/WiFiGeneric.h b/libraries/WiFi/src/WiFiGeneric.h index 7079c032993..0da41583296 100644 --- a/libraries/WiFi/src/WiFiGeneric.h +++ b/libraries/WiFi/src/WiFiGeneric.h @@ -174,6 +174,8 @@ class WiFiGenericClass bool initiateFTM(uint8_t frm_count=16, uint16_t burst_period=2, uint8_t channel=1, const uint8_t * mac=NULL); + bool setAntennaConfig(uint8_t gpio_ant1, uint8_t gpio_ant2, uint8_t default_rx_ant); + static const char * getHostname(); static bool setHostname(const char * hostname); static bool hostname(const String& aHostname) { return setHostname(aHostname.c_str()); } From d67ddea17010706b0c6ab62fdcaf0343c810531d Mon Sep 17 00:00:00 2001 From: "pedro.minatel" Date: Thu, 3 Feb 2022 15:53:26 +0000 Subject: [PATCH 2/5] Fixed build error --- libraries/WiFi/src/WiFiGeneric.cpp | 101 ++--------------------------- 1 file changed, 6 insertions(+), 95 deletions(-) diff --git a/libraries/WiFi/src/WiFiGeneric.cpp b/libraries/WiFi/src/WiFiGeneric.cpp index 7010ff6cfef..299243a8672 100644 --- a/libraries/WiFi/src/WiFiGeneric.cpp +++ b/libraries/WiFi/src/WiFiGeneric.cpp @@ -1192,11 +1192,12 @@ bool WiFiGenericClass::initiateFTM(uint8_t frm_count, uint16_t burst_period, uin return true; } + /** * Configure Dual antenna. * @param gpio_ant1 Configure the GPIO number for the antenna 1 connected to the RF switch (default GPIO2 on ESP32-WROOM-DA) * @param gpio_ant2 Configure the GPIO number for the antenna 2 connected to the RF switch (default GPIO25 on ESP32-WROOM-DA) - * @param default_rx_ant Set the default RX antenna + * @param default_rx_ant Set the default RX antenna for rece * @return true on success */ bool WiFiGenericClass::setAntennaConfig(uint8_t gpio_ant1, uint8_t gpio_ant2, uint8_t default_rx_ant) { @@ -1258,103 +1259,13 @@ bool WiFiGenericClass::setAntennaConfig(uint8_t gpio_ant1, uint8_t gpio_ant2, ui */ static void wifi_dns_found_callback(const char *name, const ip_addr_t *ipaddr, void *callback_arg) { - if(ipaddr) {/** - * Configure Dual antenna. - * @param gpio_ant1 Configure the GPIO number for the antenna 1 connected to the RF switch (default GPIO2 on ESP32-WROOM-DA) - * @param gpio_ant2 Configure the GPIO number for the antenna 2 connected to the RF switch (default GPIO25 on ESP32-WROOM-DA) - * @param default_rx_ant Set the default RX antenna - * @return true on success - */ -bool WiFiGenericClass::setAntennaConfig(uint8_t gpio_ant1, uint8_t gpio_ant2, uint8_t default_rx_ant) { - - wifi_ant_gpio_config_t wifi_ant_io; - wifi_ant_config_t ant_config; - - if (ESP_OK != esp_wifi_get_ant_gpio(&wifi_ant_io)) { - log_e("Failed to get antenna configuration"); - return false; - } - - wifi_ant_io.gpio_cfg[0].gpio_num = gpio_ant1; - wifi_ant_io.gpio_cfg[0].gpio_select = 1; - wifi_ant_io.gpio_cfg[1].gpio_num = gpio_ant2; - wifi_ant_io.gpio_cfg[1].gpio_select = 1; - - if (ESP_OK != esp_wifi_set_ant_gpio(&wifi_ant_io)) { - log_e("Failed to set antenna GPIO configuration"); - return false;/** - * Configure Dual antenna. - * @param gpio_ant1 Configure the GPIO number for the antenna 1 connected to the RF switch (default GPIO2 on ESP32-WROOM-DA) - * @param gpio_ant2 Configure the GPIO number for the antenna 2 connected to the RF switch (default GPIO25 on ESP32-WROOM-DA) - * @param default_rx_ant Set the default RX antenna - * @return true on success - */ -bool WiFiGenericClass::setAntennaConfig(uint8_t gpio_ant1, uint8_t gpio_ant2, uint8_t default_rx_ant) { - - wifi_ant_gpio_config_t wifi_ant_io; - wifi_ant_config_t ant_config; - - if (ESP_OK != esp_wifi_get_ant_gpio(&wifi_ant_io)) { - log_e("Failed to get antenna configuration"); - return false; - } - - wifi_ant_io.gpio_cfg[0].gpio_num = gpio_ant1; - wifi_ant_io.gpio_cfg[0].gpio_select = 1; - wifi_ant_io.gpio_cfg[1].gpio_num = gpio_ant2; - wifi_ant_io.gpio_cfg[1].gpio_select = 1; - - if (ESP_OK != esp_wifi_set_ant_gpio(&wifi_ant_io)) { - log_e("Failed to set antenna GPIO configuration"); - return false; + if(ipaddr) { + (*reinterpret_cast(callback_arg)) = ipaddr->u_addr.ip4.addr; } - - // Set antenna configuration - ant_config.rx_ant_mode = WIFI_ANT_MODE_AUTO; - ant_config.tx_ant_mode = WIFI_ANT_MODE_AUTO; - ant_config.enabled_ant0 = 0; - ant_config.enabled_ant1 = 1; - - switch (default_rx_ant) - { - case 0: - ant_config.rx_ant_default = WIFI_ANT_ANT0; - break; - case 1: - ant_config.rx_ant_default = WIFI_ANT_ANT1; - break; - default: - log_e("Invalid default antenna"); - break; - } - - if (ESP_OK != esp_wifi_set_ant(&ant_config)) { - log_e("Failed to set antenna configuration"); - return false; - } - - return true; + xEventGroupSetBits(_arduino_event_group, WIFI_DNS_DONE_BIT); } - switch (default_rx_ant) - { - case 0: - ant_config.rx_ant_default = WIFI_ANT_ANT0; - break; - case 1: - ant_config.rx_ant_default = WIFI_ANT_ANT1; - break; - default: - log_e("Invalid default antenna"); - break; - } - - if (ESP_OK != esp_wifi_set_ant(&ant_config)) { - log_e("Failed to set antenna configuration"); - return false; - } - return true; -} +/** * Resolve the given hostname to an IP address. * @param aHostname Name to be resolved * @param aResult IPAddress structure to store the returned IP address From a41c9d6030c40241dba1c02371d194ff8ab5cb3d Mon Sep 17 00:00:00 2001 From: "pedro.minatel" Date: Thu, 3 Feb 2022 16:06:18 +0000 Subject: [PATCH 3/5] Fixed indentation and renamed function to setDualAntennaConfig --- libraries/WiFi/src/WiFiGeneric.cpp | 2 +- libraries/WiFi/src/WiFiGeneric.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/WiFi/src/WiFiGeneric.cpp b/libraries/WiFi/src/WiFiGeneric.cpp index 299243a8672..2ae04111ace 100644 --- a/libraries/WiFi/src/WiFiGeneric.cpp +++ b/libraries/WiFi/src/WiFiGeneric.cpp @@ -1200,7 +1200,7 @@ bool WiFiGenericClass::initiateFTM(uint8_t frm_count, uint16_t burst_period, uin * @param default_rx_ant Set the default RX antenna for rece * @return true on success */ -bool WiFiGenericClass::setAntennaConfig(uint8_t gpio_ant1, uint8_t gpio_ant2, uint8_t default_rx_ant) { +bool WiFiGenericClass::setDualAntennaConfig(uint8_t gpio_ant1, uint8_t gpio_ant2, uint8_t default_rx_ant) { wifi_ant_gpio_config_t wifi_ant_io; wifi_ant_config_t ant_config; diff --git a/libraries/WiFi/src/WiFiGeneric.h b/libraries/WiFi/src/WiFiGeneric.h index 0da41583296..0c816c896dc 100644 --- a/libraries/WiFi/src/WiFiGeneric.h +++ b/libraries/WiFi/src/WiFiGeneric.h @@ -174,7 +174,7 @@ class WiFiGenericClass bool initiateFTM(uint8_t frm_count=16, uint16_t burst_period=2, uint8_t channel=1, const uint8_t * mac=NULL); - bool setAntennaConfig(uint8_t gpio_ant1, uint8_t gpio_ant2, uint8_t default_rx_ant); + bool setDualAntennaConfig(uint8_t gpio_ant1, uint8_t gpio_ant2, uint8_t default_rx_ant); static const char * getHostname(); static bool setHostname(const char * hostname); From 33c607b9faad5739d27a3b875f4d8949de9ec788 Mon Sep 17 00:00:00 2001 From: "pedro.minatel" Date: Thu, 3 Feb 2022 18:10:36 +0000 Subject: [PATCH 4/5] Added the RX and TX selection modes as configuration --- libraries/WiFi/src/WiFiGeneric.cpp | 60 +++++++++++++++++++++++------- libraries/WiFi/src/WiFiGeneric.h | 14 ++++++- 2 files changed, 59 insertions(+), 15 deletions(-) diff --git a/libraries/WiFi/src/WiFiGeneric.cpp b/libraries/WiFi/src/WiFiGeneric.cpp index 2ae04111ace..495f366cfd5 100644 --- a/libraries/WiFi/src/WiFiGeneric.cpp +++ b/libraries/WiFi/src/WiFiGeneric.cpp @@ -1197,13 +1197,13 @@ bool WiFiGenericClass::initiateFTM(uint8_t frm_count, uint16_t burst_period, uin * Configure Dual antenna. * @param gpio_ant1 Configure the GPIO number for the antenna 1 connected to the RF switch (default GPIO2 on ESP32-WROOM-DA) * @param gpio_ant2 Configure the GPIO number for the antenna 2 connected to the RF switch (default GPIO25 on ESP32-WROOM-DA) - * @param default_rx_ant Set the default RX antenna for rece + * @param rx_mode Set the RX antenna mode. See wifi_rx_ant_t for the options. + * @param tx_mode Set the TX antenna mode. See wifi_tx_ant_t for the options. * @return true on success */ -bool WiFiGenericClass::setDualAntennaConfig(uint8_t gpio_ant1, uint8_t gpio_ant2, uint8_t default_rx_ant) { +bool WiFiGenericClass::setDualAntennaConfig(uint8_t gpio_ant1, uint8_t gpio_ant2, wifi_rx_ant_t rx_mode, wifi_tx_ant_t tx_mode) { wifi_ant_gpio_config_t wifi_ant_io; - wifi_ant_config_t ant_config; if (ESP_OK != esp_wifi_get_ant_gpio(&wifi_ant_io)) { log_e("Failed to get antenna configuration"); @@ -1220,25 +1220,57 @@ bool WiFiGenericClass::setDualAntennaConfig(uint8_t gpio_ant1, uint8_t gpio_ant2 return false; } - // Set antenna configuration - ant_config.rx_ant_mode = WIFI_ANT_MODE_AUTO; - ant_config.tx_ant_mode = WIFI_ANT_MODE_AUTO; - ant_config.enabled_ant0 = 0; - ant_config.enabled_ant1 = 1; + // Set antenna default configuration + wifi_ant_config_t ant_config = { + .rx_ant_mode = WIFI_ANT_MODE_AUTO, + .tx_ant_mode = WIFI_ANT_MODE_AUTO, + .enabled_ant0 = 0, + .enabled_ant1 = 1, + }; - switch (default_rx_ant) + switch (rx_mode) { - case 0: + case WIFI_RX_ANT0: + ant_config.rx_ant_mode = WIFI_ANT_MODE_ANT0; + break; + case WIFI_RX_ANT1: + ant_config.rx_ant_mode = WIFI_ANT_MODE_ANT1; + break; + case WIFI_RX_ANT_AUTO: + log_i("TX Antenna will be automatically selected"); ant_config.rx_ant_default = WIFI_ANT_ANT0; + ant_config.rx_ant_mode = WIFI_ANT_MODE_AUTO; + // Force TX for AUTO if RX is AUTO + ant_config.tx_ant_mode = WIFI_ANT_MODE_AUTO; + break; + default: + log_e("Invalid default antenna! Falling back to AUTO"); + ant_config.rx_ant_mode = WIFI_ANT_MODE_AUTO; break; - case 1: - ant_config.rx_ant_default = WIFI_ANT_ANT1; + } + + switch (tx_mode) + { + case WIFI_TX_ANT0: + ant_config.tx_ant_mode = WIFI_ANT_MODE_ANT0; + break; + case WIFI_TX_ANT1: + ant_config.tx_ant_mode = WIFI_ANT_MODE_ANT1; + break; + case WIFI_TX_ANT_AUTO: + log_i("RX Antenna will be automatically selected"); + ant_config.rx_ant_default = WIFI_ANT_ANT0; + ant_config.tx_ant_mode = WIFI_ANT_MODE_AUTO; + // Force RX for AUTO if RX is AUTO + ant_config.rx_ant_mode = WIFI_ANT_MODE_AUTO; break; default: - log_e("Invalid default antenna"); + log_e("Invalid default antenna! Falling back to AUTO"); + ant_config.rx_ant_default = WIFI_ANT_ANT0; + ant_config.tx_ant_mode = WIFI_ANT_MODE_AUTO; break; } - + if (ESP_OK != esp_wifi_set_ant(&ant_config)) { log_e("Failed to set antenna configuration"); return false; diff --git a/libraries/WiFi/src/WiFiGeneric.h b/libraries/WiFi/src/WiFiGeneric.h index 0c816c896dc..f8a1bb77d37 100644 --- a/libraries/WiFi/src/WiFiGeneric.h +++ b/libraries/WiFi/src/WiFiGeneric.h @@ -139,6 +139,18 @@ static const int WIFI_SCAN_DONE_BIT= BIT12; static const int WIFI_DNS_IDLE_BIT = BIT13; static const int WIFI_DNS_DONE_BIT = BIT14; +typedef enum { + WIFI_RX_ANT0 = 0, + WIFI_RX_ANT1, + WIFI_RX_ANT_AUTO +} wifi_rx_ant_t; + +typedef enum { + WIFI_TX_ANT0 = 0, + WIFI_TX_ANT1, + WIFI_TX_ANT_AUTO +} wifi_tx_ant_t; + class WiFiGenericClass { public: @@ -174,7 +186,7 @@ class WiFiGenericClass bool initiateFTM(uint8_t frm_count=16, uint16_t burst_period=2, uint8_t channel=1, const uint8_t * mac=NULL); - bool setDualAntennaConfig(uint8_t gpio_ant1, uint8_t gpio_ant2, uint8_t default_rx_ant); + bool setDualAntennaConfig(uint8_t gpio_ant1, uint8_t gpio_ant2, wifi_rx_ant_t rx_mode, wifi_tx_ant_t tx_mode); static const char * getHostname(); static bool setHostname(const char * hostname); From 44dbcf36fadd42212ebbbaad68cf9098c9c33b4d Mon Sep 17 00:00:00 2001 From: "pedro.minatel" Date: Thu, 3 Feb 2022 18:36:59 +0000 Subject: [PATCH 5/5] Mode code optimization --- libraries/WiFi/src/WiFiGeneric.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libraries/WiFi/src/WiFiGeneric.cpp b/libraries/WiFi/src/WiFiGeneric.cpp index 495f366cfd5..5dfdacdc05d 100644 --- a/libraries/WiFi/src/WiFiGeneric.cpp +++ b/libraries/WiFi/src/WiFiGeneric.cpp @@ -1192,7 +1192,6 @@ bool WiFiGenericClass::initiateFTM(uint8_t frm_count, uint16_t burst_period, uin return true; } - /** * Configure Dual antenna. * @param gpio_ant1 Configure the GPIO number for the antenna 1 connected to the RF switch (default GPIO2 on ESP32-WROOM-DA) @@ -1242,6 +1241,7 @@ bool WiFiGenericClass::setDualAntennaConfig(uint8_t gpio_ant1, uint8_t gpio_ant2 ant_config.rx_ant_mode = WIFI_ANT_MODE_AUTO; // Force TX for AUTO if RX is AUTO ant_config.tx_ant_mode = WIFI_ANT_MODE_AUTO; + goto set_ant; break; default: log_e("Invalid default antenna! Falling back to AUTO"); @@ -1271,6 +1271,7 @@ bool WiFiGenericClass::setDualAntennaConfig(uint8_t gpio_ant1, uint8_t gpio_ant2 break; } +set_ant: if (ESP_OK != esp_wifi_set_ant(&ant_config)) { log_e("Failed to set antenna configuration"); return false;