Driver for the ESP8266 WiFi module using ATParser library. Espressif Firmware.

Dependencies:   ATParser

Dependents:   ESP8266Interface

Fork of ESP8266 by NetworkSocketAPI

Note

This library assumes your ESP8266 is running the Espressif Firmware. For instructions on how to update your ESP8266 to use the correct firmware see the Firmware Update Wiki Page.

Revision:
18:11f2f6bd2e97
Parent:
17:8b541b19f391
Child:
20:32e5a5a328e0
--- a/ESP8266.cpp	Thu Feb 18 16:08:29 2016 -0600
+++ b/ESP8266.cpp	Thu Feb 18 16:11:03 2016 -0600
@@ -16,124 +16,121 @@
 
 #include "ESP8266.h"
 
-ESP8266::ESP8266(PinName tx, PinName rx, uint8_t debug) : serial(tx, rx), atParser(serial)
+ESP8266::ESP8266(PinName tx, PinName rx, bool debug)
+    : _serial(tx, rx, 1024), _parser(_serial)
 {
-    serial.baud(115200);
-    atParser.debugOn(debug);
+    _serial.baud(115200);
+    _parser.debugOn(debug);
 }
 
-bool ESP8266::startup(void)
-{
-    return (atParser.send("AT") && atParser.recv("OK"));
-}
-
-bool ESP8266::reset(void)
-{
-    return (atParser.send("AT+RST") && atParser.recv("OK\r\nready"));
-}
-
-bool ESP8266::wifiMode(int mode)
+bool ESP8266::startup(int mode)
 {
     //only 3 valid modes
     if(mode < 1 || mode > 3) {
         return false;
     }
 
-    char modestr[1];
-    sprintf(modestr,"%d",mode);
-    string mode_command = "AT+CWMODE="+string(modestr);
-    return (atParser.send(mode_command.c_str()) && atParser.recv("OK"));
+    return reset()
+        && _parser.send("AT+CWMODE=%d", mode) 
+        && _parser.recv("OK")
+        && _parser.send("AT+CIPMUX=1") 
+        && _parser.recv("OK");
 }
 
-bool ESP8266::multipleConnections(bool enabled)
+bool ESP8266::reset(void)
 {
-    int on = (int)enabled;
-    char enable[1];
-    sprintf(enable,"%d",on);
-    string mux_command = "AT+CIPMUX="+string(enable);
-    return (atParser.send(mux_command.c_str()) && atParser.recv("OK"));
+    return _parser.send("AT+RST")
+        && _parser.recv("OK\r\nready");
 }
 
-bool ESP8266::dhcp(int mode, bool enabled)
+bool ESP8266::dhcp(bool enabled, int mode)
 {
     //only 3 valid modes
     if(mode < 0 || mode > 2) {
         return false;
     }
-    int on = (int)enabled;
-    char enable[1];
-    sprintf(enable,"%d",on);
-    char modestr[1];
-    sprintf(modestr,"%d",mode);
-    string mode_command = "AT+CWDHCP="+string(modestr)+","+string(enable);
-    return (atParser.send(mode_command.c_str()) && atParser.recv("OK"));
+
+    return _parser.send("AT+CWDHCP=%d,%d", enabled?1:0, mode)
+        && _parser.recv("OK");
 }
 
 bool ESP8266::connect(const char *ap, const char *passPhrase)
 {
-    string connect_command = "AT+CWJAP=\""+(string)ap+"\",\""+(string)passPhrase+"\"";
-    return (atParser.send(connect_command.c_str()) && atParser.recv("OK"));
+    return _parser.send("AT+CWJAP=\"%s\",\"%s\"", ap, passPhrase)
+        && _parser.recv("OK");
 }
 
 bool ESP8266::disconnect(void)
 {
-    return (atParser.send("AT+CWQAP") && atParser.recv("OK"));
+    return _parser.send("AT+CWQAP") && _parser.recv("OK");
 }
 
-bool ESP8266::getIPAddress(char* ip)
+const char *ESP8266::getIPAddress(void)
 {
-    return (atParser.send("AT+CIPSTA?") && atParser.recv("+CIPSTA:\"%[^\"]\"", ip));
+    if (!(_parser.send("AT+CIFSR")
+        && _parser.recv("+CIFSR:STAIP,\"%[^\"]\"", _ip_buffer)
+        && _parser.recv("OK"))) {
+        return 0;
+    }
+
+    return _ip_buffer;
+}
+
+const char *ESP8266::getMACAddress(void)
+{
+    if (!(_parser.send("AT+CIFSR")
+        && _parser.recv("+CIFSR:STAMAC,\"%[^\"]\"", _mac_buffer)
+        && _parser.recv("OK"))) {
+        return 0;
+    }
+
+    return _mac_buffer;
 }
 
 bool ESP8266::isConnected(void)
 {
-    char* ip = "";
-    return getIPAddress(ip);
+    return getIPAddress() != 0;
 }
 
-bool ESP8266::openSocket(string sockType, int id, int port, const char* addr)
+bool ESP8266::open(const char *type, int id, const char* addr, int port)
 {
     //IDs only 0-4
     if(id > 4) {
         return false;
     }
-    char portstr[5];
-    char idstr[2];
-    sprintf(idstr,"%d",id);
-    sprintf(portstr, "%d", port);
 
-    string start_command = "AT+CIPSTART="+(string)idstr+",\""+sockType+"\",\""+(string)addr+"\","+(string)portstr;
-    if (!(atParser.send(start_command.c_str()) && atParser.recv("OK"))) {
-        return false;//opening socket not succesful
-    }
-    return true;
+    return _parser.send("AT+CIPSTART=%d,\"%s\",\"%s\",%d", id, type, addr, port)
+        && _parser.recv("OK");
 }
 
-bool ESP8266::sendData(int id, const void *data, uint32_t amount)
+bool ESP8266::send(int id, const void *data, uint32_t amount)
 {
-    char idstr[2];
-    sprintf(idstr,"%d",id);
-    char lenstr[5];
-    sprintf(lenstr,"%d",(int)amount);
+    //May take a second try if device is busy
+    for (unsigned i = 0; i < 2; i++) {
+        if (_parser.send("AT+CIPSEND=%d,%d", id, amount)
+            && _parser.recv(">")
+            && _parser.write((char*)data, (int)amount) >= 0) {
+            return true;
+        }
+    }
 
-    string send_command = "AT+CIPSEND="+(string)idstr+","+(string)lenstr;
-    if(!atParser.send(send_command.c_str(),">")) {
-        return false;
-    }
-    wait_ms(10);
-    atParser.write((char*)data, (int)amount);
-    wait_ms(10);
-    return true;
+    return false;
 }
 
-uint32_t ESP8266::recv(void *data, uint32_t amount)
+int32_t ESP8266::recv(int id, void *data, uint32_t amount)
 {
-    int length;
-    int id;
-    if (!(atParser.recv("+IPD,%d,%d:", &id, &length) && atParser.read((char*)data, length) && atParser.recv("OK"))) {
-        return 0;
+    uint32_t recv_amount;
+    int recv_id;
+
+    if (!(_parser.recv("+IPD,%d,%d:", &recv_id, &recv_amount)
+        && recv_id == id
+        && recv_amount <= amount
+        && _parser.read((char*)data, recv_amount)
+        && _parser.recv("OK"))) {
+        return -1;
     }
-    return length;
+
+    return recv_amount;
 }
 
 bool ESP8266::close(int id)
@@ -142,14 +139,23 @@
     if(id > 4) {
         return false;
     }
-    char idstr[2];
-    sprintf(idstr,"%d",id);
-    string close_command = "AT+CIPCLOSE="+(string)idstr;
 
-    return (atParser.send(close_command.c_str()) && atParser.recv("OK"));
+    return _parser.send("AT+CIPCLOSE=%d", id)
+        && _parser.recv("OK");
 }
 
 void ESP8266::setTimeout(uint32_t timeout_ms)
 {
-    atParser.setTimeout(timeout_ms);
-}
\ No newline at end of file
+    _parser.setTimeout(timeout_ms);
+}
+
+bool ESP8266::readable()
+{
+    return _serial.readable();
+}
+
+bool ESP8266::writeable()
+{
+    return _serial.writeable();
+}
+