test
Fork of ESP8266 by
Diff: ESP8266.cpp
- Revision:
- 18:11f2f6bd2e97
- Parent:
- 17:8b541b19f391
- Child:
- 20:32e5a5a328e0
diff -r 8b541b19f391 -r 11f2f6bd2e97 ESP8266.cpp --- 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(); +} +