From 6a4b3ef0e72ee134b81a523ce41fd4c45f3b4429 Mon Sep 17 00:00:00 2001 From: Uros Majstorovic Date: Sun, 4 Sep 2022 18:43:50 +0200 Subject: fixed wifi and cell --- fw/esp32/components/eos/wifi.c | 451 ++++++++++++++++++++--------------------- 1 file changed, 217 insertions(+), 234 deletions(-) (limited to 'fw/esp32/components/eos/wifi.c') diff --git a/fw/esp32/components/eos/wifi.c b/fw/esp32/components/eos/wifi.c index d294f45..537aeba 100755 --- a/fw/esp32/components/eos/wifi.c +++ b/fw/esp32/components/eos/wifi.c @@ -18,214 +18,196 @@ // XXX: WiFi fail due to no DHCP server -#define WIFI_MAX_SCAN_RECORDS 20 #define WIFI_MAX_CONNECT_ATTEMPTS 3 -#define WIFI_STATE_STOPPED 0 -#define WIFI_STATE_SCANNING 1 -#define WIFI_STATE_CONNECTING 2 -#define WIFI_STATE_CONNECTED 3 -#define WIFI_STATE_DISCONNECTING 4 -#define WIFI_STATE_DISCONNECTED 5 - -#define WIFI_ACTION_NONE 0 -#define WIFI_ACTION_SCAN 1 -#define WIFI_ACTION_CONNECT 2 -#define WIFI_ACTION_DISCONNECT 3 - static const char *TAG = "EOS WIFI"; -static SemaphoreHandle_t mutex; - -static wifi_config_t wifi_sta_config; -static wifi_scan_config_t wifi_scan_config; - -static int wifi_connect_cnt = 0; -static uint8_t wifi_action; -static uint8_t wifi_state; -static wifi_ap_record_t scan_r[WIFI_MAX_SCAN_RECORDS]; -static uint16_t scan_n; +static esp_netif_t *wifi_netif; static void wifi_event_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data) { - esp_err_t ret = ESP_OK; - char _disconnect; - uint8_t _action, _state; - unsigned char *rbuf, *p; - int i, len; - ip_event_got_ip_t *got_ip; + static int reconnect_cnt = 0; + static int stop = 0; if (event_base == WIFI_EVENT) { - switch(event_id) { - case WIFI_EVENT_SCAN_DONE: - scan_n = WIFI_MAX_SCAN_RECORDS; - memset(scan_r, 0, sizeof(scan_r)); - esp_wifi_scan_get_ap_records(&scan_n, scan_r); - - ESP_LOGI(TAG, "Scan done: %d", scan_n); - xSemaphoreTake(mutex, portMAX_DELAY); - _state = wifi_state; - if (wifi_state == WIFI_STATE_CONNECTED) wifi_action = WIFI_ACTION_NONE; - xSemaphoreGive(mutex); - - if (_state != WIFI_STATE_CONNECTED) ret = esp_wifi_stop(); - - rbuf = eos_net_alloc(); - rbuf[0] = EOS_WIFI_MTYPE_SCAN; - p = rbuf + 1; - for (i=0; i EOS_NET_MTU) break; - - strcpy((char *)p, (char *)scan_r[i].ssid); - p += len + 1; - } - eos_net_send(EOS_NET_MTYPE_WIFI, rbuf, p - rbuf); + switch (event_id) { + case WIFI_EVENT_SCAN_DONE: { + ESP_LOGI(TAG, "Event scan done"); + eos_wifi_send_scan(); break; + } case WIFI_EVENT_STA_START: - xSemaphoreTake(mutex, portMAX_DELAY); - _action = wifi_action; - xSemaphoreGive(mutex); + case WIFI_EVENT_STA_STOP: + case WIFI_EVENT_STA_CONNECTED: { + ESP_LOGI(TAG, "Event start/stop/conneced"); + stop = 0; + reconnect_cnt = 0; + eos_wifi_send_status(); + break; + } - switch (_action) { - case WIFI_ACTION_SCAN: - ret = esp_wifi_scan_start(&wifi_scan_config, 0); - break; + case WIFI_EVENT_STA_DISCONNECTED: { + wifi_event_sta_disconnected_t *sta_disconnected; - case WIFI_ACTION_CONNECT: - ret = esp_wifi_connect(); - break; + sta_disconnected = (wifi_event_sta_disconnected_t *)event_data; + ESP_LOGI(TAG, "Event disconnected - reason: %d", sta_disconnected->reason); - default: - break; + if (sta_disconnected->reason == WIFI_REASON_ASSOC_LEAVE) { + stop = 0; + reconnect_cnt = 0; + eos_wifi_send_status(); + break; } - break; - - case WIFI_EVENT_STA_STOP: - xSemaphoreTake(mutex, portMAX_DELAY); - wifi_state = WIFI_STATE_STOPPED; - wifi_action = WIFI_ACTION_NONE; - xSemaphoreGive(mutex); - break; - - case WIFI_EVENT_STA_CONNECTED: - xSemaphoreTake(mutex, portMAX_DELAY); - wifi_state = WIFI_STATE_CONNECTED; - wifi_action = WIFI_ACTION_NONE; - wifi_connect_cnt = WIFI_MAX_CONNECT_ATTEMPTS; - xSemaphoreGive(mutex); - break; + if ((reconnect_cnt == 0) && (sta_disconnected->reason == WIFI_REASON_BEACON_TIMEOUT)) { + stop = 1; + } + if (reconnect_cnt < WIFI_MAX_CONNECT_ATTEMPTS) { + esp_wifi_connect(); - case WIFI_EVENT_STA_DISCONNECTED: - xSemaphoreTake(mutex, portMAX_DELAY); - if (wifi_connect_cnt) wifi_connect_cnt--; - _action = wifi_action; - _disconnect = (wifi_connect_cnt == 0); - if (_disconnect) wifi_state = WIFI_STATE_DISCONNECTED; - xSemaphoreGive(mutex); - - if (_disconnect) { - rbuf = eos_net_alloc(); - rbuf[0] = EOS_WIFI_MTYPE_DISCONNECT; - eos_net_send(EOS_NET_MTYPE_WIFI, rbuf, 1); - if (!_action) ret = esp_wifi_stop(); + reconnect_cnt++; } else { - ret = esp_wifi_connect(); + eos_wifi_send_status(); + + reconnect_cnt = 0; + if (stop) { + esp_wifi_stop(); + stop = 0; + } } break; + } - default: // Ignore the other event types + default: // Ignore the other event types break; } } else if (event_base == IP_EVENT) { - switch(event_id) { - case IP_EVENT_STA_GOT_IP: + switch (event_id) { + case IP_EVENT_STA_GOT_IP: { + ip_event_got_ip_t *got_ip; + got_ip = (ip_event_got_ip_t *)event_data; - ESP_LOGI(TAG, "IP address: " IPSTR, IP2STR(&got_ip->ip_info.ip)); - rbuf = eos_net_alloc(); - rbuf[0] = EOS_WIFI_MTYPE_CONNECT; - rbuf[1] = EOS_OK; - eos_net_send(EOS_NET_MTYPE_WIFI, rbuf, 2); + ESP_LOGI(TAG, "Event got IP - addres: " IPSTR, IP2STR(&got_ip->ip_info.ip)); + eos_wifi_send_status(); - /* ip_changed is set even at normal connect! + /* if (got_ip->ip_changed) { - ESP_LOGI(TAG, "IP changed"); - // send wifi reconnect - } else { - rbuf = eos_net_alloc(); - rbuf[0] = EOS_WIFI_MTYPE_CONNECT; - rbuf[1] = EOS_OK; - eos_net_send(EOS_NET_MTYPE_WIFI, rbuf, 2); + recreate all sockets } */ break; + } - default: // Ignore the other event types + default: // Ignore the other event types break; } } - if (ret != ESP_OK) ESP_LOGE(TAG, "EVT HANDLER ERR:%d EVT:%d", ret, event_id); } static void wifi_handler(unsigned char _mtype, unsigned char *buffer, uint16_t buf_len) { + esp_err_t ret = ESP_OK; uint8_t mtype; - int rv; - char *ssid, *pass, *_buf; - uint16_t _buf_len; if (buf_len < 1) return; - rv = EOS_OK; - mtype = buffer[0]; - buffer++; - buf_len--; - switch (mtype) { - case EOS_WIFI_MTYPE_SCAN: - rv = eos_wifi_scan(); - break; + case EOS_WIFI_MTYPE_STATUS: { + int reply; + ssize_t rv; + + reply = _mtype & EOS_NET_MTYPE_FLAG_REPL; - case EOS_WIFI_MTYPE_AUTH: - _buf = (char *)buffer; - _buf_len = 0; + if (reply) { + rv = eos_wifi_get_status(buffer + 1); + if (rv < 0) break; - ssid = _buf; - _buf_len = strnlen(_buf, buf_len); - if (_buf_len == buf_len) break; - _buf += _buf_len + 1; - buf_len -= _buf_len + 1; + eos_net_reply(EOS_NET_MTYPE_WIFI, buffer, rv + 1); + } else { + unsigned char *buf; - pass = _buf; - _buf_len = strnlen(_buf, buf_len); - if (_buf_len == buf_len) break; - _buf += _buf_len + 1; - buf_len -= _buf_len + 1; + buf = eos_net_alloc(); + buf[0] = EOS_WIFI_MTYPE_STATUS; + rv = eos_wifi_get_status(buf + 1); + if (rv < 0) break; - rv = eos_wifi_auth(ssid, pass); + eos_net_send(EOS_NET_MTYPE_WIFI, buf, rv + 1); + } break; + } - case EOS_WIFI_MTYPE_CONNECT: - rv = eos_wifi_connect(); + case EOS_WIFI_MTYPE_START: { + ret = esp_wifi_start(); break; + } - case EOS_WIFI_MTYPE_DISCONNECT: - rv = eos_wifi_disconnect(); + case EOS_WIFI_MTYPE_STOP: { + ret = esp_wifi_stop(); break; + } + + case EOS_WIFI_MTYPE_SCAN: { + ret = esp_wifi_scan_start(NULL, 0); + break; + } + + case EOS_WIFI_MTYPE_CONNECT: { + wifi_config_t wifi_sta_config; + size_t ssid_size = sizeof(wifi_sta_config.sta.ssid); + size_t pwd_size = sizeof(wifi_sta_config.sta.password) - 1; + size_t ssid_len, pwd_len; + char *ssid, *pwd; + + buffer++; + buf_len--; + + ssid = (char *)buffer; + ssid_len = strnlen(ssid, buf_len); + if (ssid_len == buf_len) break; + if (ssid_len > ssid_size) break; + buffer += ssid_len + 1; + buf_len -= ssid_len + 1; + + pwd = (char *)buffer; + pwd_len = strnlen(pwd, buf_len); + if (pwd_len == buf_len) break; + if (pwd_len >= pwd_size) break; + buffer += pwd_len + 1; + buf_len -= pwd_len + 1; + + memset(&wifi_sta_config, 0, sizeof(wifi_sta_config)); + if (ssid_len < ssid_size) { + strcpy((char *)wifi_sta_config.sta.ssid, ssid); + } else { + memcpy(wifi_sta_config.sta.ssid, ssid, ssid_size); + } + strcpy((char *)wifi_sta_config.sta.password, pwd); + wifi_sta_config.sta.password[pwd_size] = '\0'; + + ret = esp_wifi_set_config(WIFI_IF_STA, &wifi_sta_config); + if (ret) break; + + ret = esp_wifi_connect(); + break; + } + + case EOS_WIFI_MTYPE_DISCONNECT: { + ret = esp_wifi_disconnect(); + break; + } } - if (rv) ESP_LOGE(TAG, "MSG HANDLER ERR:%d MSG:%d", rv, mtype); + if (ret) { + ESP_LOGE(TAG, "HANDLER ERR:%d MTYPE:%d", ret, mtype); + eos_wifi_send_status(); + } } void eos_wifi_init(void) { esp_err_t ret; wifi_init_config_t wifi_config = WIFI_INIT_CONFIG_DEFAULT(); - memset(&wifi_sta_config, 0, sizeof(wifi_sta_config)); - - esp_netif_create_default_wifi_sta(); + wifi_netif = esp_netif_create_default_wifi_sta(); ret = esp_wifi_init(&wifi_config); assert(ret == ESP_OK); @@ -242,118 +224,119 @@ void eos_wifi_init(void) { ret = esp_wifi_set_mode(WIFI_MODE_STA); assert(ret == ESP_OK); - ret = esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_sta_config); - assert(ret == ESP_OK); - ret = esp_wifi_stop(); assert(ret == ESP_OK); - mutex = xSemaphoreCreateBinary(); - xSemaphoreGive(mutex); - eos_net_set_handler(EOS_NET_MTYPE_WIFI, wifi_handler); ESP_LOGI(TAG, "INIT"); } -int eos_wifi_scan(void) { - int rv = EOS_OK; - esp_err_t ret = ESP_OK; - uint8_t _wifi_state = 0; +ssize_t eos_wifi_get_status(unsigned char *buffer) { + unsigned char *p; + wifi_ap_record_t ap_info; + esp_err_t ret; - xSemaphoreTake(mutex, portMAX_DELAY); - if (!wifi_action) { - _wifi_state = wifi_state; + p = buffer; + ret = esp_wifi_sta_get_ap_info(&ap_info); + switch (ret) { + case ESP_OK: { // Station connected + size_t len; + esp_netif_ip_info_t ip_info; + + len = strnlen((char *)ap_info.ssid, sizeof(ap_info.ssid)); + if (len == sizeof(ap_info.ssid)) { + ESP_LOGE(TAG, "STATUS BAD SSID"); + return EOS_ERR; + } + ret = esp_netif_get_ip_info(wifi_netif, &ip_info); + if (ret) { + ESP_LOGE(TAG, "STATUS GET IP INFO ERR:%d", ret); + return EOS_ERR; + } + + if (ip_info.ip.addr) { + *p = EOS_WIFI_STATUS_GOT_IP; + p++; + + memcpy(p, &ip_info.ip.addr, sizeof(uint32_t)); + p += sizeof(uint32_t); + } else { + *p = EOS_WIFI_STATUS_CONNECTED; + p++; + } + + strcpy((char *)p, (char *)ap_info.ssid); + p += len + 1; - wifi_action = WIFI_ACTION_SCAN; - if (wifi_state == WIFI_STATE_STOPPED) wifi_state = WIFI_STATE_SCANNING; + break; + } - memset(&wifi_scan_config, 0, sizeof(wifi_scan_config)); - } else { - rv = EOS_ERR_BUSY; - } - xSemaphoreGive(mutex); + case ESP_ERR_WIFI_NOT_CONNECT: { + *p = EOS_WIFI_STATUS_DISCONNECTED; + p++; + break; + } - if (rv) return rv; + case ESP_ERR_WIFI_STOP_STATE: + case ESP_ERR_WIFI_CONN: { + *p = EOS_WIFI_STATUS_OFF; + p++; + break; + } - if (_wifi_state == WIFI_STATE_STOPPED) { - ret = esp_wifi_start(); - } else { - ret = esp_wifi_scan_start(&wifi_scan_config, 0); + default: { + ESP_LOGE(TAG, "STATUS GET AP INFO ERR:%d", ret); + return EOS_ERR; + } } - if (ret != ESP_OK) rv = EOS_ERR; - return rv; + return p - buffer; } -int eos_wifi_auth(char *ssid, char *pass) { - int rv = EOS_OK; - - xSemaphoreTake(mutex, portMAX_DELAY); - if (!wifi_action) { - if (ssid) strncpy((char *)wifi_sta_config.sta.ssid, ssid, sizeof(wifi_sta_config.sta.ssid) - 1); - if (pass) strncpy((char *)wifi_sta_config.sta.password, pass, sizeof(wifi_sta_config.sta.password) - 1); - } else { - rv = EOS_ERR_BUSY; +void eos_wifi_send_status(void) { + unsigned char *rbuf; + ssize_t rv; + rbuf = eos_net_alloc(); + rbuf[0] = EOS_WIFI_MTYPE_STATUS; + rv = eos_wifi_get_status(rbuf + 1); + if (rv < 0) { + eos_net_free(rbuf); + return; } - xSemaphoreGive(mutex); - return rv; + eos_net_send(EOS_NET_MTYPE_WIFI, rbuf, rv + 1); } -int eos_wifi_connect(void) { - int rv = EOS_OK; - esp_err_t ret = ESP_OK; - uint8_t _wifi_state = 0; - - xSemaphoreTake(mutex, portMAX_DELAY); - if (!wifi_action) { - _wifi_state = wifi_state; - - wifi_action = WIFI_ACTION_CONNECT; - wifi_state = WIFI_STATE_CONNECTING; - wifi_connect_cnt = WIFI_MAX_CONNECT_ATTEMPTS; - } else { - rv = EOS_ERR_BUSY; - } - xSemaphoreGive(mutex); - - if (rv) return rv; - - esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_sta_config); +void eos_wifi_send_scan(void) { + static wifi_ap_record_t scan_r[EOS_WIFI_MAX_SCAN_RECORDS]; + static uint16_t scan_n; + unsigned char *rbuf, *p; + int i; + size_t len; + esp_err_t ret; - if (_wifi_state == WIFI_STATE_STOPPED) { - ret = esp_wifi_start(); - } else { - ret = esp_wifi_connect(); + scan_n = EOS_WIFI_MAX_SCAN_RECORDS; + memset(scan_r, 0, sizeof(scan_r)); + ret = esp_wifi_scan_get_ap_records(&scan_n, scan_r); + if (ret) { + ESP_LOGE(TAG, "SCAN GET RECORDS ERR:%d", ret); + return; } - if (ret != ESP_OK) rv = EOS_ERR; - return rv; -} + ESP_LOGI(TAG, "Scan done: %d", scan_n); -int eos_wifi_disconnect(void) { - int rv = EOS_OK; - esp_err_t ret = ESP_OK; + rbuf = eos_net_alloc(); + rbuf[0] = EOS_WIFI_MTYPE_SCAN; + p = rbuf + 1; - xSemaphoreTake(mutex, portMAX_DELAY); - if (!wifi_action) { - wifi_action = WIFI_ACTION_DISCONNECT; - wifi_state = WIFI_STATE_DISCONNECTING; - wifi_connect_cnt = 0; + for (i=0; i EOS_NET_MTU) break; - memset(wifi_sta_config.sta.ssid, 0, sizeof(wifi_sta_config.sta.ssid)); - memset(wifi_sta_config.sta.password, 0, sizeof(wifi_sta_config.sta.password)); - } else { - rv = EOS_ERR_BUSY; + strcpy((char *)p, (char *)scan_r[i].ssid); + p += len + 1; } - xSemaphoreGive(mutex); - - if (rv) return rv; - - ret = esp_wifi_stop(); - if (ret != ESP_OK) rv = EOS_ERR; - - return rv; + eos_net_send(EOS_NET_MTYPE_WIFI, rbuf, p - rbuf); } - -- cgit v1.2.3