Provide an easy-to-use way to manipulate ESP8266.

Dependencies:   ArduinoAPI

Dependents:   WeeESP8266_TCPClientMultiple WeeESP8266_TCPClientSingle WeeESP8266_TCPServer WeeESP8266_UDPClientMultiple ... more

Revision:
9:dec2cf52b744
Parent:
8:60d15efb4a1f
Child:
10:002615561b0b
--- a/ESP8266.cpp	Sat Feb 07 00:57:05 2015 +0000
+++ b/ESP8266.cpp	Sat Feb 07 05:24:08 2015 +0000
@@ -43,7 +43,7 @@
         start = millis();
         while (millis() - start < 3000) {
             if (eAT()) {
-                delay(500);
+                delay(1500); /* Waiting for stable */
                 return true;
             }
             delay(100);
@@ -85,130 +85,221 @@
 
 String ESP8266::getAPList(void)
 {
-    return "";
+    String list;
+    eATCWLAP(list);
+    return list;
 }
 
 bool ESP8266::joinAP(String ssid, String pwd)
 {
-    return false;
+    return sATCWJAP(ssid, pwd);
 }
 
 bool ESP8266::leaveAP(void)
 {
-    return false;
+    return eATCWQAP();
 }
 
 bool ESP8266::setSoftAPParam(String ssid, String pwd, uint8_t chl, uint8_t ecn)
 {
-    return false;
+    return sATCWSAP(ssid, pwd, chl, ecn);
 }
 
 String ESP8266::getJoinedDeviceIP(void)
 {
-    return "";
+    String list;
+    eATCWLIF(list);
+    return list;
 }
 
 String ESP8266::getIPStatus(void)
 {
-    return "";
+    String list;
+    eATCIPSTATUS(list);
+    return list;
 }
 
 String ESP8266::getLocalIP(void)
 {
-    return "";
+    String list;
+    eATCIFSR(list);
+    return list;
 }
 
 bool ESP8266::enableMUX(void)
 {
-    return false;
+    return sATCIPMUX(1);
 }
 
 bool ESP8266::disableMUX(void)
 {
-    return false;
+    return sATCIPMUX(0);
 }
 
 bool ESP8266::createTCP(String addr, uint32_t port)
 {
-    return false;
+    return sATCIPSTARTSingle("TCP", addr, port);
 }
 
 bool ESP8266::releaseTCP(void)
 {
-    return false;
+    return eATCIPCLOSESingle();
 }
 
 bool ESP8266::registerUDP(String addr, uint32_t port)
 {
-    return false;
+    return sATCIPSTARTSingle("UDP", addr, port);
 }
 
 bool ESP8266::unregisterUDP(void)
 {
-    return false;
+    return eATCIPCLOSESingle();
 }
 
 bool ESP8266::createTCP(uint8_t mux_id, String addr, uint32_t port)
 {
-    return false;
+    return sATCIPSTARTMultiple(mux_id, "TCP", addr, port);
 }
 
 bool ESP8266::releaseTCP(uint8_t mux_id)
 {
-    return false;
+    return sATCIPCLOSEMulitple(mux_id);
 }
 
 bool ESP8266::registerUDP(uint8_t mux_id, String addr, uint32_t port)
 {
-    return false;
+    return sATCIPSTARTMultiple(mux_id, "UDP", addr, port);
 }
 
 bool ESP8266::unregisterUDP(uint8_t mux_id)
 {
-    return false;
+    return sATCIPCLOSEMulitple(mux_id);
 }
 
 bool ESP8266::setTCPServerTimeout(uint32_t timeout)
 {
-    return false;
+    return sATCIPSTO(timeout);
 }
 
 bool ESP8266::startTCPServer(uint32_t port)
 {
+    if (enableMUX() && sATCIPSERVER(1, port)) {
+        return true;
+    }
     return false;
 }
 
 bool ESP8266::stopTCPServer(void)
 {
+    sATCIPSERVER(0);
+    restart();
     return false;
 }
 
 bool ESP8266::send(const uint8_t *buffer, uint32_t len)
 {
-    return false;
+    return sATCIPSENDSingle(buffer, len);
+}
+
+bool ESP8266::send(uint8_t mux_id, const uint8_t *buffer, uint32_t len)
+{
+    return sATCIPSENDMultiple(mux_id, buffer, len);
+}
+
+uint32_t ESP8266::recv(uint8_t *buffer, uint32_t buffer_size, uint32_t timeout)
+{
+    return recvPkg(buffer, buffer_size, NULL, timeout, NULL);
 }
 
-bool ESP8266::send(uint8_t mux_id, const char *buffer, uint32_t len)
+uint32_t ESP8266::recv(uint8_t mux_id, uint8_t *buffer, uint32_t buffer_size, uint32_t timeout)
 {
-    return false;
+    uint8_t id;
+    uint32_t ret;
+    ret = recvPkg(buffer, buffer_size, NULL, timeout, &id);
+    if (ret > 0 && id == mux_id) {
+        return ret;
+    }
+    return 0;
+}
+
+uint32_t ESP8266::recv(uint8_t *coming_mux_id, uint8_t *buffer, uint32_t buffer_size, uint32_t timeout)
+{
+    return recvPkg(buffer, buffer_size, NULL, timeout, coming_mux_id);
 }
 
-uint32_t ESP8266::recv(uint8_t *buffer, uint32_t len, uint32_t timeout)
-{
-    return false;
-}
+/*----------------------------------------------------------------------------*/
 
-uint32_t ESP8266::recv(uint8_t mux_id, uint8_t *buffer, uint32_t len, uint32_t timeout)
+uint32_t ESP8266::recvPkg(uint8_t *buffer, uint8_t buffer_size, uint32_t *data_len, uint32_t timeout, uint8_t *coming_mux_id)
 {
-    return false;
+    String data;
+    char a;
+    int32_t index_PIPDcomma = -1;
+    int32_t index_colon = -1; /* : */
+    int32_t index_comma = -1; /* , */
+    int8_t id;
+    int32_t len;
+    bool has_data = false;
+    
+    unsigned long start = millis();
+    while (millis() - start < timeout) {
+        while(m_puart->available() > 0) {
+            a = m_puart->readChr();
+            data += a;
+        }
+        
+        index_PIPDcomma = data.indexOf("+IPD,");
+        if (index_PIPDcomma != -1) {
+            index_colon = data.indexOf(':', index_PIPDcomma + 5);
+            if (index_colon != -1) {
+                index_comma = data.indexOf(',', index_PIPDcomma + 5);
+                if (index_comma != -1) { /* +IPD,id,len:data */
+                    id = data.substring(index_PIPDcomma + 5, index_comma).toInt();
+                    if (id < 0 || id > 4) {
+                        return 0;
+                    }
+                    len = data.substring(index_comma + 1, index_colon).toInt();
+                    if (len <= 0) {
+                        return 0;
+                    }
+                    
+                } else { /* +IPD,len:data */
+                    len = data.substring(index_PIPDcomma + 5, index_colon).toInt();
+                    if (len <= 0) {
+                        return 0;
+                    }
+                }
+                has_data = true;
+                break;
+            }
+        }
+    }
+    
+    if (has_data) {
+        start = millis();
+        while (millis() - start < timeout) {
+            while(m_puart->available() > 0) {
+                a = m_puart->readChr();
+                data += a;
+            }
+            if (data.length() >= index_colon + 1 + len) {
+                if (data_len) {
+                    *data_len = len;    
+                }
+                if (index_comma != -1 && coming_mux_id) {
+                    *coming_mux_id = id;
+                }
+                uint32_t ret = len > buffer_size ? buffer_size : len;
+                memcpy(buffer, 
+                    data.substring(index_colon + 1, index_colon + 1 + len).c_str(), 
+                    ret);
+                return ret;
+            }
+        }
+    }
+    
+    return 0;
 }
 
-uint32_t ESP8266::recv(uint8_t *coming_mux_id, uint8_t *buffer, uint32_t len, uint32_t timeout)
-{
-    return false;
-}
-
-
 String ESP8266::recvString(String target, uint32_t timeout)
 {
     String data;
@@ -432,7 +523,7 @@
     }
     return false;
 }
-bool ESP8266::sATCIPSENDSingle(uint8_t *buffer, uint32_t len)
+bool ESP8266::sATCIPSENDSingle(const uint8_t *buffer, uint32_t len)
 {
     m_puart->flush();
     m_puart->print("AT+CIPSEND=");
@@ -446,7 +537,7 @@
     }
     return false;
 }
-bool ESP8266::sATCIPSENDMultiple(uint8_t mux_id, uint8_t *buffer, uint32_t len)
+bool ESP8266::sATCIPSENDMultiple(uint8_t mux_id, const uint8_t *buffer, uint32_t len)
 {
     m_puart->flush();
     m_puart->print("AT+CIPSEND=");