#include #include #include #include "eos.h" #include "event.h" #include "dev/net.h" #include "wifi.h" static eos_evt_handler_t evt_handler[EOS_WIFI_MAX_MTYPE]; static void wifi_handle_msg(unsigned char type, unsigned char *buffer, uint16_t len) { unsigned char mtype; if ((buffer == NULL) || (len < 1)) { eos_net_bad_handler(type, buffer, len); return; } mtype = buffer[0]; if ((mtype < EOS_WIFI_MAX_MTYPE) && evt_handler[mtype]) { evt_handler[mtype](mtype, buffer, len); } else { eos_net_bad_handler(type, buffer, len); } } void eos_wifi_init(void) { int i; for (i=0; i EOS_WIFI_SIZE_SSID)) return EOS_ERR_SIZE; buffer[len - 1] = '\0'; if (ssid) strcpy(ssid, buffer); break; } return EOS_OK; } int eos_wifi_status(uint8_t *status, uint8_t ip_addr[], char *ssid, unsigned char *buffer) { unsigned char type; uint16_t len; int do_release; int rv; do_release = 0; if (buffer == NULL) { buffer = eos_net_alloc(); do_release = 1; } type = EOS_NET_MTYPE_WIFI; len = 1; buffer[0] = EOS_WIFI_MTYPE_STATUS; rv = eos_net_xchg(&type, buffer, &len); if (rv) goto wifi_status_fin; if (type != EOS_NET_MTYPE_WIFI) { rv = EOS_ERR_NET; goto wifi_status_fin; } rv = eos_wifi_status_parse(buffer, len, status, ip_addr, ssid); wifi_status_fin: if (do_release) eos_net_free(buffer, 1); return rv; } int eos_wifi_start(unsigned char *buffer, int sync) { int async; if (buffer == NULL) { buffer = eos_net_alloc(); async = 1; } else { async = !sync; } buffer[0] = EOS_WIFI_MTYPE_START; return _eos_net_send(EOS_NET_MTYPE_WIFI, buffer, 1, async, 1); } int eos_wifi_stop(unsigned char *buffer, int sync) { int async; if (buffer == NULL) { buffer = eos_net_alloc(); async = 1; } else { async = !sync; } buffer[0] = EOS_WIFI_MTYPE_STOP; return _eos_net_send(EOS_NET_MTYPE_WIFI, buffer, 1, async, 1); } int eos_wifi_scan(unsigned char *buffer, int sync) { int async; if (buffer == NULL) { buffer = eos_net_alloc(); async = 1; } else { async = !sync; } buffer[0] = EOS_WIFI_MTYPE_SCAN; return _eos_net_send(EOS_NET_MTYPE_WIFI, buffer, 1, async, 1); } int eos_wifi_connect(char *ssid, char *pwd, unsigned char *buffer, int sync) { unsigned char *buf; size_t ssid_len, pwd_len; int async; ssid_len = strlen(ssid); pwd_len = strlen(pwd); if (ssid_len > EOS_WIFI_SIZE_SSID - 1) return EOS_ERR_SIZE; if (pwd_len > EOS_WIFI_SIZE_PWD - 1) return EOS_ERR_SIZE; if (buffer == NULL) { buffer = eos_net_alloc(); async = 1; } else { async = !sync; } buf = buffer; buf[0] = EOS_WIFI_MTYPE_CONNECT; buf++; strcpy(buf, ssid); buf += ssid_len + 1; strcpy(buf, pwd); buf += pwd_len + 1; return _eos_net_send(EOS_NET_MTYPE_WIFI, buffer, 3 + ssid_len + pwd_len, async, 1); } int eos_wifi_disconnect(unsigned char *buffer, int sync) { int async; if (buffer == NULL) { buffer = eos_net_alloc(); async = 1; } else { async = !sync; } buffer[0] = EOS_WIFI_MTYPE_DISCONNECT; return _eos_net_send(EOS_NET_MTYPE_WIFI, buffer, 1, async, 1); }