summaryrefslogtreecommitdiff
path: root/fw/esp32/components/eos/wifi.c
diff options
context:
space:
mode:
Diffstat (limited to 'fw/esp32/components/eos/wifi.c')
-rwxr-xr-xfw/esp32/components/eos/wifi.c451
1 files changed, 217 insertions, 234 deletions
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<scan_n; i++) {
- len = strnlen((char *)scan_r[i].ssid, sizeof(scan_r[i].ssid));
- if (len == sizeof(scan_r[i].ssid)) continue;
- if (p - rbuf + len + 1 > 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<scan_n; i++) {
+ len = strnlen((char *)scan_r[i].ssid, sizeof(scan_r[i].ssid));
+ if (len == sizeof(scan_r[i].ssid)) continue;
+ if (p - rbuf + len + 1 > 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);
}
-