#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, EOSMessage *msg, uint16_t len) { unsigned char mtype; if ((msg == NULL) || (len < 1)) { eos_net_bad_handler(type, msg, len); return; } mtype = msg->buffer[0]; if ((mtype < EOS_WIFI_MAX_MTYPE) && evt_handler[mtype]) { evt_handler[mtype](mtype, msg, len); } else { eos_net_bad_handler(type, msg, len); } } void eos_wifi_init(void) { int i; for (i=0; ibuffer; if (len < 2) return EOS_ERR_SIZE; if (buffer[0] != EOS_WIFI_MTYPE_STATUS) return EOS_ERR_NET; buffer++; len--; *status = buffer[0]; buffer++; len--; switch (*status) { case EOS_WIFI_STATUS_GOT_IP: if (len < sizeof(uint32_t)) return EOS_ERR_SIZE; if (ip_addr) memcpy(ip_addr, buffer, sizeof(uint32_t)); buffer += sizeof(uint32_t); len -= sizeof(uint32_t); case EOS_WIFI_STATUS_CONNECTED: if (ssid) { if ((len == 0) || (len > EOS_WIFI_SIZE_SSID) || (len > ssid_size - 1)) return EOS_ERR_SIZE; memcpy(ssid, buffer, len); ssid[len] = '\0'; } break; } return EOS_OK; } int eos_wifi_status(uint8_t *status, uint8_t ip_addr[], char *ssid, uint16_t ssid_size, EOSMessage *msg) { unsigned char type; uint16_t len; int rv; if (msg->size < 1) return EOS_ERR_SIZE; type = EOS_NET_MTYPE_WIFI; len = 1; msg->buffer[0] = EOS_WIFI_MTYPE_STATUS; rv = eos_net_xchg(&type, msg, &len); if (rv) return rv; if (type != EOS_NET_MTYPE_WIFI) return EOS_ERR_NET; return eos_wifi_status_parse(msg, len, status, ip_addr, ssid, ssid_size); } int eos_wifi_start(EOSMessage *msg) { if (msg->size < 1) return EOS_ERR_SIZE; msg->buffer[0] = EOS_WIFI_MTYPE_START; return eos_net_send_sync(EOS_NET_MTYPE_WIFI, msg, 1); } int eos_wifi_stop(EOSMessage *msg) { if (msg->size < 1) return EOS_ERR_SIZE; msg->buffer[0] = EOS_WIFI_MTYPE_STOP; return eos_net_send_sync(EOS_NET_MTYPE_WIFI, msg, 1); } int eos_wifi_scan(EOSMessage *msg) { if (msg->size < 1) return EOS_ERR_SIZE; msg->buffer[0] = EOS_WIFI_MTYPE_SCAN; return eos_net_send_sync(EOS_NET_MTYPE_WIFI, msg, 1); } unsigned char *eos_wifi_scan2data(EOSMessage *msg, uint16_t *len) { if (*len < 1) return NULL; if (msg->buffer[0] != EOS_WIFI_MTYPE_SCAN) return NULL; if (len) *len -= 1; return msg->buffer + 1; } int eos_wifi_connect(char *ssid, char *pwd, EOSMessage *msg) { unsigned char *buffer = msg->buffer; size_t ssid_len, pwd_len; ssid_len = strlen(ssid); pwd_len = strlen(pwd); if (ssid_len > EOS_WIFI_SIZE_SSID) return EOS_ERR_SIZE; if (pwd_len > EOS_WIFI_SIZE_PWD) return EOS_ERR_SIZE; if (msg->size < 3 + ssid_len + pwd_len) return EOS_ERR_SIZE; buffer[0] = EOS_WIFI_MTYPE_CONNECT; buffer++; *buffer = ssid_len; buffer++; memcpy(buffer, ssid, ssid_len); buffer += ssid_len; *buffer = pwd_len; buffer++; memcpy(buffer, pwd, pwd_len); buffer += pwd_len; return eos_net_send_sync(EOS_NET_MTYPE_WIFI, msg, 3 + ssid_len + pwd_len); } int eos_wifi_disconnect(EOSMessage *msg) { if (msg->size < 1) return EOS_ERR_SIZE; msg->buffer[0] = EOS_WIFI_MTYPE_DISCONNECT; return eos_net_send_sync(EOS_NET_MTYPE_WIFI, msg, 1); }