modified by ohneta

Dependencies:   ESP8266

Dependents:   HelloESP8266Interface_mine

Fork of ESP8266Interface by NetworkSocketAPI

Revision:
18:9fc7976c7b27
Parent:
16:b2f781416464
Child:
19:783c46b13285
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ESP8266Interface.cpp	Fri Jul 17 23:15:21 2015 +0000
@@ -0,0 +1,251 @@
+/* ESP8266Interface Example
+ * Copyright (c) 2015 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+#include "ESP8266Interface.h"
+#include <string>
+
+ESP8266Interface::ESP8266Interface(PinName tx, PinName rx)
+: serial(tx, rx), atParser(&serial)
+{
+    serial.baud(115200);
+    availableID = new int[5];
+    for(int i = 0; i<4; i++){
+        availableID[i] = -1;
+    }
+}
+
+ESP8266Interface::ESP8266Interface(PinName tx, PinName rx, const char *ap, const char *pass_phrase, wifi_security_t security, uint32_t timeout_ms)
+: serial(tx, rx), atParser(&serial)
+{
+
+}
+
+int32_t ESP8266Interface::init(void) 
+{   
+    if(!atParser.command("AT","OK"))
+        return -1;
+    if(!atParser.command("AT+RST", "OK\r\nready"))
+        return -1;
+    if(!atParser.command("AT+CWMODE=3", "OK"))
+        return -1;
+    if(!atParser.command("AT+CIPMUX=1", "OK"))
+        return -1;
+    return 0;
+    
+}
+
+int32_t ESP8266Interface::init(const char *ip, const char *mask, const char *gateway) 
+{
+    return -1;
+}
+
+int32_t ESP8266Interface::connect(uint32_t timeout_ms) 
+{
+    return -1;
+}
+
+int32_t ESP8266Interface::connect(const char *ap, const char *pass_phrase, wifi_security_t security, uint32_t timeout_ms)
+{
+    if(!atParser.command("AT+CWDHCP=2,1","OK"))
+        return -1;
+    string connect_command = "AT+CWJAP=\""+(string)ap+"\",\""+(string)pass_phrase+"\"";
+    atParser.setTimeout(10000);
+    if(!atParser.command(connect_command.c_str(),"OK")){
+        return -1;
+    }
+    return 0;    
+}
+
+int32_t ESP8266Interface::disconnect(void) const
+{
+    return -1;
+}
+
+char *ESP8266Interface::getIPAddress(void)
+{
+    char* ip;
+    if(!atParser.command("AT+CIFSR", "+CIFSR:%s OK", ip))
+        return NULL;
+    return ip;
+}
+
+char *ESP8266Interface::getGateway(void) const
+{
+    return 0;
+}
+
+char *ESP8266Interface::getNetworkMask(void) const
+{
+    return 0;
+}
+
+char *ESP8266Interface::getMACAddress(void) const
+{
+    return 0;
+}
+
+int32_t ESP8266Interface::isConnected(void) 
+{
+    return (getIPAddress()==NULL) ? -1 : 0;
+}
+
+SocketInterface *ESP8266Interface::allocateSocket(socket_protocol_t socketProtocol) 
+{   
+    int id = -1;
+    uuidCounter += 1;
+    //Look through the array of available sockets for an unused ID
+    for(int i=0; i<sizeof(availableID); i++){
+        if (availableID[i] == -1){
+            id = i;   
+            availableID[i] = uuidCounter;
+            break;
+        }
+    }
+    if (id == -1){
+        return NULL;//tried  to allocate more than the maximum 5 sockets   
+    }
+    ESP8266Socket *socket = new ESP8266Socket(uuidCounter, &atParser, socketProtocol, (uint8_t)id);
+    return socket;
+}
+
+int ESP8266Interface::deallocateSocket(SocketInterface *socket) 
+{
+    int id = (int)static_cast<ESP8266Socket*>(socket)->getID();
+    availableID[id] = -1;
+    return id;
+}
+
+ESP8266Socket::ESP8266Socket(uint32_t handle, ATParser *atParser, socket_protocol_t type, uint8_t id)
+: _handle(handle), atParser(atParser), _id(id)
+{
+    SocketInterface::_type = type;
+}
+
+const char *ESP8266Socket::getHostByName(const char *name) const
+{
+    return 0;
+}
+
+void ESP8266Socket::setAddress(const char* addr)
+{
+    _addr = (char*)addr;
+}
+
+void ESP8266Socket::setPort(uint16_t port) 
+{
+     _port = port;
+}
+
+void ESP8266Socket::setAddressPort(const char* addr, uint16_t port)
+{
+    _addr = (char*)addr;
+    _port = port;
+}
+
+const char *ESP8266Socket::getAddress(void) const
+{
+    return (const char*)_addr;
+}
+
+uint16_t ESP8266Socket::getPort(void) const
+{
+    return _port;
+}
+
+
+int32_t ESP8266Socket::bind(uint16_t port) const
+{
+    return -1;
+}
+
+int32_t ESP8266Socket::listen(void) const
+{
+    return -1;
+}
+
+int32_t ESP8266Socket::accept() const
+{
+    return -1;
+}
+
+int32_t ESP8266Socket::open() 
+{
+    char portstr[5];
+    char idstr[2];
+    sprintf(idstr,"%d",_id);
+    sprintf(portstr, "%d", _port);
+
+    string sock_type;
+    if(_type == SOCK_UDP)
+        sock_type = "UDP";
+    else if(_type == SOCK_TCP)
+        sock_type = "TCP";
+    string start_command = "AT+CIPSTART="+(string)idstr+",\""+sock_type+"\",\""+(string)_addr+"\","+(string)portstr;
+    if(!atParser->command(start_command.c_str(),"OK")){
+        return -1;//opening socket not succesful
+    }
+    return 0;
+        
+}
+
+int32_t ESP8266Socket::send(const void *data, uint32_t amount, uint32_t timeout_ms) 
+{
+    char idstr[2];
+    sprintf(idstr,"%d",_id);
+    char lenstr[5];
+    sprintf(lenstr,"%d",(int)amount);
+    
+    atParser->setTimeout((int)timeout_ms);
+    
+    string send_command = "AT+CIPSEND="+(string)idstr+","+(string)lenstr;
+    if(!atParser->send(send_command.c_str())){ 
+        return -1;
+    }
+    atParser->write((char*)data, (int)amount);
+    return 0;
+}
+
+uint32_t ESP8266Socket::recv(void *data, uint32_t amount, uint32_t timeout_ms)
+{
+    atParser->setTimeout((int)timeout_ms);
+    char idstr[2];
+    sprintf(idstr,"%d",_id);
+    string matching = "+IPD,"+(string)idstr+",%d:";
+    int length;
+    if(!atParser->recv(matching.c_str(),&length))
+        return 0;
+    
+    if(!atParser->read((char *)data,length))
+        return 0;
+    
+    return length;   
+}
+
+int32_t ESP8266Socket::close() const
+{
+    char idstr[2];
+    sprintf(idstr,"%d",_id);
+    string close_command = "AT+CIPCLOSE="+(string)idstr;  
+    
+    if(!atParser->command(close_command.c_str(),"OK")){
+        return -1;//opening socket not succesful
+    }
+    return 0;
+}
+uint8_t ESP8266Socket::getID()
+{
+    return _id;   
+}
\ No newline at end of file