diff --git a/aether/cloud_connections/cloud_server_connections.cpp b/aether/cloud_connections/cloud_server_connections.cpp index 576b97d8..5329038f 100644 --- a/aether/cloud_connections/cloud_server_connections.cpp +++ b/aether/cloud_connections/cloud_server_connections.cpp @@ -80,8 +80,8 @@ CloudServerConnections::servers_update_event() { return servers_update_event_; } -std::vector const& CloudServerConnections::selected_servers() - const { +std::vector const& +CloudServerConnections::selected_servers() const { return selected_servers_; } diff --git a/aether/transport/system_sockets/udp/udp.h b/aether/transport/system_sockets/udp/udp.h index 9e574c9b..bdfa3a71 100644 --- a/aether/transport/system_sockets/udp/udp.h +++ b/aether/transport/system_sockets/udp/udp.h @@ -60,8 +60,7 @@ class SendAction final : public PacketSendAction { SetStatus(WriteAction::Status::kFail); return; } - AE_TELED_DEBUG("Data has been written size {}", data_.size()); - + AE_TELED_DEBUG("Data has been written size {}", *res); if (*res == 0) { reenqueue_ = true; // Not sent yet @@ -71,7 +70,7 @@ class SendAction final : public PacketSendAction { AE_TELED_ERROR("Send error, sent size isn't same as packet size"); SetStatus(WriteAction::Status::kFail); return; - } + } SetStatus(WriteAction::Status::kSuccess); } diff --git a/aether/wifi/esp_wifi_driver.cpp b/aether/wifi/esp_wifi_driver.cpp index bf8044b9..44f73c45 100644 --- a/aether/wifi/esp_wifi_driver.cpp +++ b/aether/wifi/esp_wifi_driver.cpp @@ -26,14 +26,14 @@ # include "esp_system.h" # include "esp_wifi.h" # include "nvs_flash.h" +# include "esp_mac.h" +# include "esp_event.h" # include "lwip/err.h" # include "lwip/ip4_addr.h" # include "lwip/ip6_addr.h" # include "lwip/sys.h" -# include "aether/tele/tele.h" - extern "C" esp_err_t esp_wifi_internal_set_retry_counter(uint8_t short_retry, uint8_t long_retry); extern "C" esp_err_t esp_wifi_internal_get_fix_rate(wifi_interface_t ifx, @@ -45,7 +45,9 @@ namespace ae { # define WIFI_FAIL_BIT BIT1 namespace esp_wifi_driver_internal { +static constexpr char kTag[] = "EspWifiDriver"; static constexpr int kMaxRetry = 10; + void EventHandler(void* arg, esp_event_base_t event_base, int32_t event_id, [[maybe_unused]] void* event_data) { auto base_type = [](esp_event_base_t event_base) { @@ -58,7 +60,7 @@ void EventHandler(void* arg, esp_event_base_t event_base, int32_t event_id, return "UNKNOWN_EVENT"; }; - ESP_LOGI("EspWiFiEventHandler", "Event handler event_base %s event_id %d", + ESP_LOGI(kTag, "Event handler event_base %s event_id %d", base_type(event_base), event_id); auto* driver = static_cast(arg); @@ -78,13 +80,11 @@ void EventHandler(void* arg, esp_event_base_t event_base, int32_t event_id, } } -void SetupBssid(wifi_config_t& wifi_config, - WiFiBaseStation const& base_station) { - std::array debug_bssid; - memcpy(debug_bssid.data(), base_station.target_bssid, - sizeof(base_station.target_bssid)); - AE_TELED_DEBUG("Restored from cash BSSID:{} CHN:{}", debug_bssid, - static_cast(base_station.target_channel)); +esp_err_t SetupBssid(wifi_config_t& wifi_config, + WiFiBaseStation const& base_station) { + ESP_LOGD(kTag, "Restored from cache BSSID:" MACSTR " CHN:%u", + MAC2STR(base_station.target_bssid), + static_cast(base_station.target_channel)); wifi_config.sta.scan_method = WIFI_FAST_SCAN; // Fast scan wifi_config.sta.bssid_set = true; // Enable BSSID binding @@ -92,15 +92,17 @@ void SetupBssid(wifi_config_t& wifi_config, // Copy the BSSID to the configuration memcpy(wifi_config.sta.bssid, base_station.target_bssid, sizeof(base_station.target_bssid)); - ESP_ERROR_CHECK( - esp_wifi_set_channel(base_station.target_channel, WIFI_SECOND_CHAN_NONE)); + auto err = + esp_wifi_set_channel(base_station.target_channel, WIFI_SECOND_CHAN_NONE); + + return err; } void SetupCredentials(wifi_config_t& wifi_config, WifiCreds const& creds) { # ifdef DEBUG // for debug purpose only, it's private data - AE_TELED_DEBUG("Connecting to ap SSID:{} PSWD:{}", creds.ssid, - creds.password); + ESP_LOGD(kTag, "Connecting to ap SSID:%s PSWD:%s", creds.ssid.c_str(), + creds.password.c_str()); # endif // DEBUG strncpy(reinterpret_cast(wifi_config.sta.ssid), creds.ssid.data(), @@ -157,7 +159,7 @@ esp_err_t SetStaticIp(esp_netif_t* netif, WiFiIP const& config) { // Stopping the DHCP client err = esp_netif_dhcpc_stop(netif); if (err != ESP_OK && err != ESP_ERR_ESP_NETIF_DHCP_ALREADY_STOPPED) { - AE_TELED_ERROR("Failed to stop DHCP client: {}", esp_err_to_name(err)); + ESP_LOGE(kTag, "Failed to stop DHCP client: %s", esp_err_to_name(err)); return err; } @@ -165,7 +167,7 @@ esp_err_t SetStaticIp(esp_netif_t* netif, WiFiIP const& config) { // Setting a static IP err = esp_netif_set_ip_info(netif, &ip_info); if (err != ESP_OK) { - AE_TELED_ERROR("Failed to set IP info: {}", esp_err_to_name(err)); + ESP_LOGE(kTag, "Failed to set IP info: %s", esp_err_to_name(err)); return err; } @@ -173,7 +175,7 @@ esp_err_t SetStaticIp(esp_netif_t* netif, WiFiIP const& config) { if (config.primary_dns_v4) { err = esp_netif_set_dns_info(netif, ESP_NETIF_DNS_MAIN, &dns_info1); if (err != ESP_OK) { - AE_TELED_ERROR("Failed to set primary DNS: {}", esp_err_to_name(err)); + ESP_LOGE(kTag, "Failed to set primary DNS: %s", esp_err_to_name(err)); return err; } } @@ -181,35 +183,59 @@ esp_err_t SetStaticIp(esp_netif_t* netif, WiFiIP const& config) { if (config.secondary_dns_v4) { err = esp_netif_set_dns_info(netif, ESP_NETIF_DNS_BACKUP, &dns_info2); if (err != ESP_OK) { - AE_TELED_ERROR("Failed to set secondary DNS: {}", esp_err_to_name(err)); + ESP_LOGE(kTag, "Failed to set secondary DNS: %s", esp_err_to_name(err)); return err; } } - AE_TELED_DEBUG("Static IP V4 configured: {}", config.static_ip_v4); + ESP_LOGD(kTag, "Static IP V4 configured: %u.%u.%u.%u", + static_cast(config.static_ip_v4.ipv4_value[0]), + static_cast(config.static_ip_v4.ipv4_value[1]), + static_cast(config.static_ip_v4.ipv4_value[2]), + static_cast(config.static_ip_v4.ipv4_value[3])); # endif # if AE_SUPPORT_IPV6 == 1 if (config.static_ip_v6.has_value()) { err = esp_netif_set_ip6_global(netif, &ip_info_v6.ip); if (err != ESP_OK) { - AE_TELED_ERROR("Failed to set IP V6 info: {}", esp_err_to_name(err)); + ESP_LOGE(kTag, "Failed to set IP V6 info: %s", esp_err_to_name(err)); return err; } - AE_TELED_DEBUG("Static IP V6 configured: {}", config.static_ip_v6); + auto const& ip = config.static_ip_v6->ipv6_value; + ESP_LOGD(kTag, + "Static IP V6 configured: " + "%02x%02x:%02x%02x:%02x%02x:%02x%02x:" + "%02x%02x:%02x%02x:%02x%02x:%02x%02x", + static_cast(ip[0]), static_cast(ip[1]), + static_cast(ip[2]), static_cast(ip[3]), + static_cast(ip[4]), static_cast(ip[5]), + static_cast(ip[6]), static_cast(ip[7]), + static_cast(ip[8]), static_cast(ip[9]), + static_cast(ip[10]), static_cast(ip[11]), + static_cast(ip[12]), static_cast(ip[13]), + static_cast(ip[14]), static_cast(ip[15])); } # endif return ESP_OK; } -void StartWifiConnection(esp_netif_t* espt_init_sta, WiFiAp const& wifi_ap, - std::optional const& psp, - std::optional const& base_station) { +esp_err_t StartWifiConnection( + esp_netif_t* espt_init_sta, WiFiAp const& wifi_ap, + std::optional const& psp, + std::optional const& base_station) { + esp_err_t err = ESP_OK; + wifi_config_t wifi_config{}; if (base_station) { // Restore saved Base Station - esp_wifi_driver_internal::SetupBssid(wifi_config, *base_station); + auto err = esp_wifi_driver_internal::SetupBssid(wifi_config, *base_station); + if (err != ESP_OK) { + ESP_LOGE(kTag, "Failed to set BSSID."); + // If an error occurs, exit + return err; + } } wifi_scan_threshold_t wifi_threshold{}; @@ -225,41 +251,84 @@ void StartWifiConnection(esp_netif_t* espt_init_sta, WiFiAp const& wifi_ap, // Setting up a static IP, if required if (wifi_ap.static_ip.has_value()) { - auto err = esp_wifi_driver_internal::SetStaticIp(espt_init_sta, - wifi_ap.static_ip.value()); + err = esp_wifi_driver_internal::SetStaticIp(espt_init_sta, + wifi_ap.static_ip.value()); if (err != ESP_OK) { - AE_TELED_ERROR("Failed to set static IP, falling back to DHCP"); + ESP_LOGE(kTag, "Failed to set static IP, falling back to DHCP."); // If an error occurs, switch to DHCP + return err; } } else { - AE_TELED_DEBUG("Using DHCP for IP configuration"); + ESP_LOGD(kTag, "Using DHCP for IP configuration"); } - ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); - ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config)); + err = esp_wifi_set_mode(WIFI_MODE_STA); + if (err != ESP_OK) { + ESP_LOGE(kTag, "Failed to set mode."); + // If an error occurs, exit + return err; + } + err = esp_wifi_set_config(WIFI_IF_STA, &wifi_config); + if (err != ESP_OK) { + ESP_LOGE(kTag, "Failed to set config."); + // If an error occurs, exit + return err; + } if (psp) { - ESP_ERROR_CHECK( - esp_wifi_set_ps(static_cast(psp->wifi_ps_type))); - ESP_ERROR_CHECK(esp_wifi_set_protocol(WIFI_IF_STA, psp->protocol_bitmap)); + err = esp_wifi_set_ps(static_cast(psp->wifi_ps_type)); + if (err != ESP_OK) { + ESP_LOGE(kTag, "Failed to set ps."); + // If an error occurs, exit + return err; + } + err = esp_wifi_set_protocol(WIFI_IF_STA, psp->protocol_bitmap); + if (err != ESP_OK) { + ESP_LOGE(kTag, "Failed to set protocol."); + // If an error occurs, exit + return err; + } } - ESP_ERROR_CHECK(esp_wifi_start()); + err = esp_wifi_start(); + if (err != ESP_OK) { + ESP_LOGE(kTag, "Failed to start WiFi!"); + // If an error occurs, exit + return err; + } if (psp) { - ESP_ERROR_CHECK(esp_wifi_internal_set_fix_rate( - WIFI_IF_STA, true, static_cast(psp->fix_rate))); - ESP_ERROR_CHECK( - esp_wifi_internal_set_retry_counter(psp->short_retry, psp->long_retry)); - ESP_ERROR_CHECK(esp_wifi_set_max_tx_power(psp->power)); + err = esp_wifi_internal_set_fix_rate( + WIFI_IF_STA, true, static_cast(psp->fix_rate)); + if (err != ESP_OK) { + ESP_LOGE(kTag, "Failed to set fix rate."); + // If an error occurs, exit + return err; + } + err = + esp_wifi_internal_set_retry_counter(psp->short_retry, psp->long_retry); + if (err != ESP_OK) { + ESP_LOGE(kTag, "Failed to set retry counter."); + // If an error occurs, exit + return err; + } + err = esp_wifi_set_max_tx_power(psp->power); + if (err != ESP_OK) { + ESP_LOGE(kTag, "Failed to set tx power."); + // If an error occurs, exit + return err; + } } - AE_TELED_DEBUG("WifiInitSta finished."); + ESP_LOGD(kTag, "WifiInitSta finished."); + + return err; } } // namespace esp_wifi_driver_internal EspWifiDriver::EspWifiDriver(AeContext const& ae_context) : ae_context_{ae_context} { + esp_log_level_set(esp_wifi_driver_internal::kTag, ESP_LOG_DEBUG); Init(); } @@ -281,9 +350,13 @@ void EspWifiDriver::Connect( connection_state_ = {}; connection_state_.state = State::kConnecting; - esp_wifi_driver_internal::StartWifiConnection( + auto err = esp_wifi_driver_internal::StartWifiConnection( static_cast(espt_init_sta_), wifi_ap, psp, base_station); // the connection result will be handled in ConnectingEventHandler + if (err != ESP_OK) { + // Emitting the error, 2 for example. + connect_res_event_.Emit(Error(2)); + } } EspWifiDriver::ConnectResEvent::Subscriber EspWifiDriver::connect_res_event() { @@ -295,10 +368,22 @@ std::optional EspWifiDriver::connected_to() const { } void EspWifiDriver::Init() { + esp_err_t err = ESP_OK; + InitNvs(); - ESP_ERROR_CHECK(esp_netif_init()); - ESP_ERROR_CHECK(esp_event_loop_create_default()); + err = esp_netif_init(); + if (err != ESP_OK) { + ESP_LOGE(esp_wifi_driver_internal::kTag, "Failed to netif init."); + // If an error occurs, exit + return; + } + err = esp_event_loop_create_default(); + if (err != ESP_OK) { + ESP_LOGE(esp_wifi_driver_internal::kTag, "Failed to create event loop."); + // If an error occurs, exit + return; + } espt_init_sta_ = esp_netif_create_default_wifi_sta(); @@ -307,7 +392,12 @@ void EspWifiDriver::Init() { wifi_init_config.ampdu_rx_enable = 0; wifi_init_config.ampdu_tx_enable = 0; - ESP_ERROR_CHECK(esp_wifi_init(&wifi_init_config)); + err = esp_wifi_init(&wifi_init_config); + if (err != ESP_OK) { + ESP_LOGE(esp_wifi_driver_internal::kTag, "Failed to wifi init."); + // If an error occurs, exit + return; + } esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, esp_wifi_driver_internal::EventHandler, this); @@ -318,13 +408,20 @@ void EspWifiDriver::Init() { } void EspWifiDriver::InitNvs() { - esp_err_t ret = nvs_flash_init(); - if (ret == ESP_ERR_NVS_NO_FREE_PAGES || - ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { - ESP_ERROR_CHECK(nvs_flash_erase()); - ret = nvs_flash_init(); + esp_err_t err = nvs_flash_init(); + if (err == ESP_ERR_NVS_NO_FREE_PAGES || + err == ESP_ERR_NVS_NEW_VERSION_FOUND) { + err = nvs_flash_erase(); + if (err != ESP_OK) { + ESP_LOGE(esp_wifi_driver_internal::kTag, "Failed to flash erase."); + return; + } + err = nvs_flash_init(); + if (err != ESP_OK) { + ESP_LOGE(esp_wifi_driver_internal::kTag, "Failed to flash init."); + return; + } } - ESP_ERROR_CHECK(ret); } void EspWifiDriver::Deinit() { @@ -354,8 +451,9 @@ void EspWifiDriver::ConnectingEventHandler(esp_event_base_t event_base, break; case WIFI_EVENT_STA_DISCONNECTED: { auto* event = static_cast(event_data); - AE_TELED_DEBUG("Wifi event disconnected, reasone {}", - static_cast(event->reason)); + ESP_LOGD(esp_wifi_driver_internal::kTag, + "Wifi event disconnected, reason %d", + static_cast(event->reason)); if (connection_state_.retry_count < esp_wifi_driver_internal::kMaxRetry) { esp_wifi_connect(); @@ -382,18 +480,18 @@ void EspWifiDriver::ConnectingEventHandler(esp_event_base_t event_base, esp_wifi_sta_get_ap_info(&ap_info); // save real SSID connected_to_ = std::string(reinterpret_cast(ap_info.ssid)); - AE_TELED_DEBUG("Connected to AP {}", *connected_to_); + ESP_LOGD(esp_wifi_driver_internal::kTag, "Connected to AP %s", + connected_to_->c_str()); WiFiBaseStation base_station{}; base_station.target_channel = ap_info.primary; // Set channel // Copy the BSSID to the configuration memcpy(base_station.target_bssid, ap_info.bssid, sizeof(base_station.target_bssid)); - std::array debug_bssid; - memcpy(debug_bssid.data(), base_station.target_bssid, - sizeof(base_station.target_bssid)); - AE_TELED_DEBUG("Storing to cash BSSID:{} CHN:{}", debug_bssid, - static_cast(base_station.target_channel)); + ESP_LOGD(esp_wifi_driver_internal::kTag, + "Storing to cache BSSID:" MACSTR " CHN:%u", + MAC2STR(base_station.target_bssid), + static_cast(base_station.target_channel)); connection_state_.state = State::kConnected; event_task_sub_ = ae_context_.scheduler().Task( @@ -407,13 +505,14 @@ void EspWifiDriver::ConnectingEventHandler(esp_event_base_t event_base, } void EspWifiDriver::ConnectedEventHandler(esp_event_base_t event_base, int32_t event_id, void* event_data) { - AE_TELED_DEBUG("Wifi event on Connected"); + ESP_LOGD(esp_wifi_driver_internal::kTag, "Wifi event on Connected"); if (event_base == WIFI_EVENT) { switch (event_id) { case WIFI_EVENT_STA_DISCONNECTED: { auto* event = static_cast(event_data); - AE_TELED_DEBUG("Wifi event disconnected, reasone {}", - static_cast(event->reason)); + ESP_LOGD(esp_wifi_driver_internal::kTag, + "Wifi event disconnected, reason %d", + static_cast(event->reason)); break; } default: @@ -426,14 +525,14 @@ void EspWifiDriver::ConnectedEventHandler(esp_event_base_t event_base, void EspWifiDriver::DisconnectingEventHandler(esp_event_base_t /* event_base */, int32_t /* event_id */, void* /* event_data */) { - AE_TELED_DEBUG("Wifi event on Disconnecting"); + ESP_LOGD(esp_wifi_driver_internal::kTag, "Wifi event on Disconnecting"); // TODO: } void EspWifiDriver::DisconnectedEventHandler(esp_event_base_t /* event_base */, int32_t /* event_id */, void* /* event_data */) { - AE_TELED_DEBUG("Wifi event on Disconnected"); + ESP_LOGD(esp_wifi_driver_internal::kTag, "Wifi event on Disconnected"); // TODO: } diff --git a/aether/write_action/buffer_write.h b/aether/write_action/buffer_write.h index 3404a694..d2c7bd59 100644 --- a/aether/write_action/buffer_write.h +++ b/aether/write_action/buffer_write.h @@ -75,6 +75,7 @@ class BufferWrite { struct BufferEntry { BufferedWriteAction wa; T data; + bool sent = false; }; public: @@ -163,6 +164,9 @@ class BufferWrite { buffer_.pop(); continue; } + if (be.sent) { + continue; + } // buffer state might change during direct write if (buffer_on_) { break; @@ -172,6 +176,7 @@ class BufferWrite { if (dwa == nullptr) { break; } + be.sent = true; be.wa.Sent(*dwa); } } diff --git a/examples/cloud/aether_construct_esp_wifi.h b/examples/cloud/aether_construct_esp_wifi.h index 3aff8e19..41f08c23 100644 --- a/examples/cloud/aether_construct_esp_wifi.h +++ b/examples/cloud/aether_construct_esp_wifi.h @@ -22,8 +22,8 @@ #if CLOUD_TEST_ESP_WIFI namespace ae::cloud_test { -static const std::string kWifi1Ssid = "noname_5G"; -static const std::string kWifi1Pass = "Grubiy321"; +static const std::string kWifi1Ssid = "Test1234"; +static const std::string kWifi1Pass = "Test1234"; static const std::string kWifi2Ssid = "Test2345"; static const std::string kWifi2Pass = "Test2345"; diff --git a/projects/espressif_riscv/platformio/aether-client-cpp/sdkconfig.defaults b/projects/espressif_riscv/platformio/aether-client-cpp/sdkconfig.defaults index e07b476f..a6f0ec38 100644 --- a/projects/espressif_riscv/platformio/aether-client-cpp/sdkconfig.defaults +++ b/projects/espressif_riscv/platformio/aether-client-cpp/sdkconfig.defaults @@ -38,6 +38,8 @@ CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE=y CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP=y CONFIG_BOOTLOADER_SKIP_VALIDATE_ON_POWER_ON=y CONFIG_BOOTLOADER_LOG_LEVEL_NONE=y +CONFIG_LOG_DEFAULT_LEVEL_NONE=y +CONFIG_LOG_MAXIMUM_LEVEL_INFO=y # 3. Disabling logs (UART is the main brake at startup) CONFIG_LOG_DEFAULT_LEVEL_NONE=y @@ -68,6 +70,11 @@ CONFIG_RTC_CLK_SRC_INT_RC=y CONFIG_ESP_CONSOLE_UART_DEFAULT=y CONFIG_ESP_CONSOLE_SECONDARY_NONE=y +# Enable USB console +#CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG=n +#CONFIG_ESP_CONSOLE_SECONDARY_USB_SERIAL_JTAG=y +#CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG_ENABLED=y + # Disabling USB-Serial-JTAG clocking in sleep mode CONFIG_ESP_BROWNOUT_DET=n CONFIG_ESP_BROWNOUT_DET_LVL_SEL_7=y diff --git a/projects/espressif_riscv/vscode/aether-client-cpp/sdkconfig.defaults b/projects/espressif_riscv/vscode/aether-client-cpp/sdkconfig.defaults index e07b476f..2e0134a2 100644 --- a/projects/espressif_riscv/vscode/aether-client-cpp/sdkconfig.defaults +++ b/projects/espressif_riscv/vscode/aether-client-cpp/sdkconfig.defaults @@ -38,6 +38,8 @@ CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE=y CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP=y CONFIG_BOOTLOADER_SKIP_VALIDATE_ON_POWER_ON=y CONFIG_BOOTLOADER_LOG_LEVEL_NONE=y +CONFIG_LOG_DEFAULT_LEVEL_NONE=y +CONFIG_LOG_MAXIMUM_LEVEL_INFO=y # 3. Disabling logs (UART is the main brake at startup) CONFIG_LOG_DEFAULT_LEVEL_NONE=y @@ -68,6 +70,11 @@ CONFIG_RTC_CLK_SRC_INT_RC=y CONFIG_ESP_CONSOLE_UART_DEFAULT=y CONFIG_ESP_CONSOLE_SECONDARY_NONE=y +# Enable USB console +CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG=n +CONFIG_ESP_CONSOLE_SECONDARY_USB_SERIAL_JTAG=y +CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG_ENABLED=y + # Disabling USB-Serial-JTAG clocking in sleep mode CONFIG_ESP_BROWNOUT_DET=n CONFIG_ESP_BROWNOUT_DET_LVL_SEL_7=y