test

Dependencies:   ATParser

Fork of ESP8266 by NetworkSocketAPI

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();
+}
+