Program Listing for File WiFi.cpp¶
↰ Return to documentation for file (components/Network/src/WiFi.cpp
)
#include "WiFi.h"
#include <cstdint>
#include <cstring>
#include <esp_log.h>
#include <esp_wifi.h>
namespace network {
static const char* TAG = "WiFi";
WiFiDefaultEventHandler::WiFiDefaultEventHandler()
{
}
esp_err_t WiFiDefaultEventHandler::staStart()
{
ESP_LOGI(TAG, "STA Start");
WiFi& wifi = WiFi::getInstance();
esp_err_t err = wifi.connect();
if (err != ESP_OK) {
ESP_LOGE(TAG, "Couldn't connect to AP (%s)", esp_err_to_name(err));
return err;
}
return ESP_OK;
}
esp_err_t WiFiDefaultEventHandler::staStop()
{
ESP_LOGI(TAG, "STA Stop");
return ESP_OK;
}
WiFi::WiFi()
: m_event_handler()
{
}
esp_err_t WiFi::init()
{
ESP_LOGD(TAG, "Init TCP/IP adapter");
esp_err_t err;
err = esp_netif_init();
if (err != ESP_OK) {
ESP_LOGE(TAG, "esp_netif_init failed, err = %s", esp_err_to_name(err));
return err;
}
err = esp_event_loop_create_default();
if (err != ESP_OK) {
ESP_LOGE(TAG, "Couldn't create event loop, err = %s", esp_err_to_name(err));
return err;
}
esp_netif_create_default_wifi_ap();
ESP_LOGD(TAG, "Initializing Wi-Fi");
wifi_init_config_t init_config = WIFI_INIT_CONFIG_DEFAULT();
err = esp_wifi_init(&init_config);
if (err != ESP_OK) {
ESP_LOGE(TAG, "esp_wifi_init failed, err = %s", esp_err_to_name(err));
return err;
}
err = esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID,
&WiFi::eventHandler, this);
if (err != ESP_OK) {
ESP_LOGE(TAG, "Couldn't register Wi-Fi event handler, err = %s", esp_err_to_name(err));
return err;
}
return ESP_OK;
}
esp_err_t WiFi::setMode(wifi_mode_t mode)
{
return esp_wifi_set_mode(mode);
}
esp_err_t WiFi::getMode(wifi_mode_t& mode)
{
return esp_wifi_get_mode(&mode);
}
esp_err_t WiFi::setApConfig(wifi_config_t& ap_config)
{
return esp_wifi_set_config(WIFI_IF_AP, &ap_config);
}
esp_err_t WiFi::getApConfig(wifi_config_t& ap_config)
{
return esp_wifi_get_config(WIFI_IF_AP, &ap_config);
}
esp_err_t WiFi::setStaConfig(wifi_config_t& sta_config)
{
return esp_wifi_set_config(WIFI_IF_STA, &sta_config);
}
esp_err_t WiFi::getStaConfig(wifi_config_t& sta_config)
{
return esp_wifi_get_config(WIFI_IF_STA, &sta_config);
}
bool WiFi::isAp()
{
wifi_mode_t mode;
esp_err_t err = esp_wifi_get_mode(&mode);
if (err != ESP_OK) {
ESP_LOGE(TAG, "esp_wifi_get_mode failed (%s)", esp_err_to_name(err));
return false;
}
return (mode == WIFI_MODE_APSTA || mode == WIFI_MODE_AP);
}
bool WiFi::isSta()
{
wifi_mode_t mode;
esp_err_t err = esp_wifi_get_mode(&mode);
if (err != ESP_OK) {
ESP_LOGE(TAG, "esp_wifi_get_mode failed (%s)", esp_err_to_name(err));
return false;
}
return (mode == WIFI_MODE_APSTA || mode == WIFI_MODE_STA);
}
esp_err_t WiFi::start()
{
ESP_LOGD(TAG, "Starting Wi-Fi");
esp_err_t err = esp_wifi_start();
if (err != ESP_OK) {
ESP_LOGE(TAG, "esp_wifi_start failed");
return err;
}
return ESP_OK;
}
esp_err_t WiFi::connect()
{
esp_err_t err;
wifi_mode_t wifimode;
err = esp_wifi_get_mode(&wifimode);
if (err != ESP_OK) {
ESP_LOGE(TAG, "esp_wifi_get_mode failed");
return err;
}
if (!isSta()) {
ESP_LOGE(TAG, "Wi-Fi mode is not STA");
return ESP_FAIL;
}
return esp_wifi_connect();
}
void WiFi::setEventHandler(std::unique_ptr<WiFiEventHandler>&& event_handler)
{
ESP_LOGD(TAG, "Setting Wi-Fi event handler");
m_event_handler.setNextHandler(std::move(event_handler));
}
esp_err_t WiFi::stop()
{
esp_err_t err = esp_wifi_stop();
if (err != ESP_OK) {
ESP_LOGE(TAG, "esp_wifi_stop failed, err = %s", esp_err_to_name(err));
return err;
}
return ESP_OK;
}
void WiFi::eventHandler(void* event_handler_arg,
esp_event_base_t event_base,
std::int32_t event_id,
void* event_data)
{
ESP_LOGD(TAG, "Wi-Fi Event Handler Called");
WiFi* wifi = reinterpret_cast<WiFi*>(event_handler_arg);
esp_err_t err = wifi->m_event_handler.eventDispatcher(event_id, event_data);
if (err != ESP_OK) {
ESP_LOGE(TAG, "Event handler error, err = %s", esp_err_to_name(err));
}
}
} // namespace network