温度センサLM75BとWi-FiモジュールESP-WROOM-02をmbed LPC1114FN28に繋げて、温度をIFTTTのMaker Channelに出力するプログラム

Dependencies:   LM75B mbed

Committer:
jksoft
Date:
Sun May 15 11:47:02 2016 +0000
Revision:
0:53a512d5a7ba
??

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jksoft 0:53a512d5a7ba 1 /* Copyright (C) 2012 mbed.org, MIT License
jksoft 0:53a512d5a7ba 2 *
jksoft 0:53a512d5a7ba 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
jksoft 0:53a512d5a7ba 4 * and associated documentation files (the "Software"), to deal in the Software without restriction,
jksoft 0:53a512d5a7ba 5 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
jksoft 0:53a512d5a7ba 6 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
jksoft 0:53a512d5a7ba 7 * furnished to do so, subject to the following conditions:
jksoft 0:53a512d5a7ba 8 *
jksoft 0:53a512d5a7ba 9 * The above copyright notice and this permission notice shall be included in all copies or
jksoft 0:53a512d5a7ba 10 * substantial portions of the Software.
jksoft 0:53a512d5a7ba 11 *
jksoft 0:53a512d5a7ba 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
jksoft 0:53a512d5a7ba 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
jksoft 0:53a512d5a7ba 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
jksoft 0:53a512d5a7ba 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
jksoft 0:53a512d5a7ba 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
jksoft 0:53a512d5a7ba 17 */
jksoft 0:53a512d5a7ba 18
jksoft 0:53a512d5a7ba 19 #include "mbed.h"
jksoft 0:53a512d5a7ba 20 #include "ESP8266.h"
jksoft 0:53a512d5a7ba 21 #include "Endpoint.h"
jksoft 0:53a512d5a7ba 22
jksoft 0:53a512d5a7ba 23 //#include <string>
jksoft 0:53a512d5a7ba 24 //#include <algorithm>
jksoft 0:53a512d5a7ba 25
jksoft 0:53a512d5a7ba 26 //Debug is disabled by default
jksoft 0:53a512d5a7ba 27 #if 0
jksoft 0:53a512d5a7ba 28 #define DBG(x, ...) pc.printf("[ESP8266 : DBG]"x" \t[%s,%d]\r\n", ##__VA_ARGS__,__FILE__,__LINE__);
jksoft 0:53a512d5a7ba 29 #define WARN(x, ...) pc.printf("[ESP8266 : WARN]"x" \t[%s,%d]\r\n", ##__VA_ARGS__,__FILE__,__LINE__);
jksoft 0:53a512d5a7ba 30 #define ERR(x, ...) pc.printf("[ESP8266 : ERR]"x" \t[%s,%d]\r\n", ##__VA_ARGS__,__FILE__,__LINE__);
jksoft 0:53a512d5a7ba 31 #else
jksoft 0:53a512d5a7ba 32 #define DBG(x, ...) //wait_us(10);
jksoft 0:53a512d5a7ba 33 #define WARN(x, ...) //wait_us(10);
jksoft 0:53a512d5a7ba 34 #define ERR(x, ...)
jksoft 0:53a512d5a7ba 35 #endif
jksoft 0:53a512d5a7ba 36
jksoft 0:53a512d5a7ba 37 #if 0
jksoft 0:53a512d5a7ba 38 #define INFO(x, ...) printf("[ESP8266 : INFO]"x" \t[%s,%d]\r\n", ##__VA_ARGS__,__FILE__,__LINE__);
jksoft 0:53a512d5a7ba 39 #else
jksoft 0:53a512d5a7ba 40 #define INFO(x, ...)
jksoft 0:53a512d5a7ba 41 #endif
jksoft 0:53a512d5a7ba 42
jksoft 0:53a512d5a7ba 43 #define ESP_MAX_TRY_JOIN 3
jksoft 0:53a512d5a7ba 44 #define ESP_MAXID 4 // the largest possible ID Value (max num of sockets possible)
jksoft 0:53a512d5a7ba 45
jksoft 0:53a512d5a7ba 46 ESP8266 * ESP8266::inst;
jksoft 0:53a512d5a7ba 47 char* ip = NULL;
jksoft 0:53a512d5a7ba 48
jksoft 0:53a512d5a7ba 49 ESP8266::ESP8266(PinName tx, PinName rx, PinName reset, const char *ssid, const char *phrase, uint32_t baud) :
jksoft 0:53a512d5a7ba 50 wifi(tx, rx), reset_pin(reset), buf_ESP8266(ESP_MBUFFE_MAX)
jksoft 0:53a512d5a7ba 51 {
jksoft 0:53a512d5a7ba 52 INFO("Initializing ESP8266 object");
jksoft 0:53a512d5a7ba 53 memset(&state, 0, sizeof(state));
jksoft 0:53a512d5a7ba 54
jksoft 0:53a512d5a7ba 55
jksoft 0:53a512d5a7ba 56 strcpy(this->ssid, ssid);
jksoft 0:53a512d5a7ba 57 strcpy(this->phrase, phrase);
jksoft 0:53a512d5a7ba 58 inst = this;
jksoft 0:53a512d5a7ba 59 attach_rx(false);
jksoft 0:53a512d5a7ba 60
jksoft 0:53a512d5a7ba 61 wifi.baud(baud); // initial baud rate of the ESP8266
jksoft 0:53a512d5a7ba 62
jksoft 0:53a512d5a7ba 63 state.associated = false;
jksoft 0:53a512d5a7ba 64 state.cmdMode = false;
jksoft 0:53a512d5a7ba 65 }
jksoft 0:53a512d5a7ba 66
jksoft 0:53a512d5a7ba 67 bool ESP8266::join()
jksoft 0:53a512d5a7ba 68 {
jksoft 0:53a512d5a7ba 69 char cmd[100];
jksoft 0:53a512d5a7ba 70 sendCommand( "AT+CWMODE=1", "change", NULL, 1000);
jksoft 0:53a512d5a7ba 71 //string cmd="AT+CWJAP=\""+(string)this->ssid+"\",\""+(string)this->phrase+"\"";
jksoft 0:53a512d5a7ba 72 sprintf(cmd,"AT+CWJAP=\"%s\",\"%s\"",this->ssid,this->phrase);
jksoft 0:53a512d5a7ba 73 if( sendCommand( cmd, "OK", NULL, 10000) ) {
jksoft 0:53a512d5a7ba 74 // successfully joined the network
jksoft 0:53a512d5a7ba 75 state.associated = true;
jksoft 0:53a512d5a7ba 76 INFO("ssid: %s, phrase: %s", this->ssid, this->phrase);
jksoft 0:53a512d5a7ba 77 return true;
jksoft 0:53a512d5a7ba 78 }
jksoft 0:53a512d5a7ba 79 return false;
jksoft 0:53a512d5a7ba 80 }
jksoft 0:53a512d5a7ba 81
jksoft 0:53a512d5a7ba 82 bool ESP8266::connect()
jksoft 0:53a512d5a7ba 83 {
jksoft 0:53a512d5a7ba 84 sendCommand("AT+CWDHCP=1,1","OK",NULL,1000); // DHCP Enabled in Station Mode
jksoft 0:53a512d5a7ba 85 return ESP8266::join();
jksoft 0:53a512d5a7ba 86 }
jksoft 0:53a512d5a7ba 87
jksoft 0:53a512d5a7ba 88 bool ESP8266::is_connected()
jksoft 0:53a512d5a7ba 89 {
jksoft 0:53a512d5a7ba 90 return true;
jksoft 0:53a512d5a7ba 91 }
jksoft 0:53a512d5a7ba 92
jksoft 0:53a512d5a7ba 93 bool ESP8266::start(bool type,char* ip, int port, int id)
jksoft 0:53a512d5a7ba 94 {
jksoft 0:53a512d5a7ba 95 char cmd[256];
jksoft 0:53a512d5a7ba 96 // Error Check
jksoft 0:53a512d5a7ba 97 if(id > ESP_MAXID) {
jksoft 0:53a512d5a7ba 98 ERR("startUDPMulti: max id is: %d, id given is %d",ESP_MAXID,id);
jksoft 0:53a512d5a7ba 99 return false;
jksoft 0:53a512d5a7ba 100 }
jksoft 0:53a512d5a7ba 101 // Single Connection Mode
jksoft 0:53a512d5a7ba 102 if(id < 0) {
jksoft 0:53a512d5a7ba 103 DBG("Start Single Connection Mode");
jksoft 0:53a512d5a7ba 104 //char portstr[5];
jksoft 0:53a512d5a7ba 105 bool check [3] = {0};
jksoft 0:53a512d5a7ba 106 //sprintf(portstr, "%d", port);
jksoft 0:53a512d5a7ba 107 switch(type) {
jksoft 0:53a512d5a7ba 108 case ESP_UDP_TYPE : //UDP
jksoft 0:53a512d5a7ba 109 sprintf(cmd,"AT+CIPSTART=\"UDP\",\"%s\",%d",ip,port);
jksoft 0:53a512d5a7ba 110 check[0] = sendCommand(cmd, "OK", NULL, 10000);
jksoft 0:53a512d5a7ba 111 //check[0] = sendCommand(( "AT+CIPSTART=\"UDP\",\"" + (string) ip + "\"," + (string) portstr ).c_str(), "OK", NULL, 10000);
jksoft 0:53a512d5a7ba 112 break;
jksoft 0:53a512d5a7ba 113 case ESP_TCP_TYPE : //TCP
jksoft 0:53a512d5a7ba 114 sprintf(cmd,"AT+CIPSTART=\"TCP\",\"%s\",%d",ip,port);
jksoft 0:53a512d5a7ba 115 check[0] = sendCommand(cmd, "OK", NULL, 10000);
jksoft 0:53a512d5a7ba 116 //check[0] = sendCommand(( "AT+CIPSTART=\"TCP\",\"" + (string) ip + "\"," + (string) portstr ).c_str(), "OK", NULL, 10000);
jksoft 0:53a512d5a7ba 117 break;
jksoft 0:53a512d5a7ba 118 default:
jksoft 0:53a512d5a7ba 119 ERR("Default hit for starting connection, this shouldnt be possible!!");
jksoft 0:53a512d5a7ba 120 break;
jksoft 0:53a512d5a7ba 121 }
jksoft 0:53a512d5a7ba 122 check[1] = sendCommand("AT+CIPMODE=1", "OK", NULL, 1000);// go into transparent mode
jksoft 0:53a512d5a7ba 123 check[2] = sendCommand("AT+CIPSEND", ">", NULL, 1000);// go into transparent mode
jksoft 0:53a512d5a7ba 124 // check that all commands were sucessful
jksoft 0:53a512d5a7ba 125 if(check[0] and check[1] and check[2]) {
jksoft 0:53a512d5a7ba 126 state.cmdMode = false;
jksoft 0:53a512d5a7ba 127 return true;
jksoft 0:53a512d5a7ba 128 } else {
jksoft 0:53a512d5a7ba 129 ERR("startUDPTransparent Failed for ip:%s, port:%d",ip,port);
jksoft 0:53a512d5a7ba 130 return false;
jksoft 0:53a512d5a7ba 131 }
jksoft 0:53a512d5a7ba 132 }
jksoft 0:53a512d5a7ba 133 // Multi Connection Mode
jksoft 0:53a512d5a7ba 134 else {
jksoft 0:53a512d5a7ba 135 //TODO: impliment Multi Connection Mode
jksoft 0:53a512d5a7ba 136 ERR("Not currently Supported!");
jksoft 0:53a512d5a7ba 137 return false;
jksoft 0:53a512d5a7ba 138 }
jksoft 0:53a512d5a7ba 139 }
jksoft 0:53a512d5a7ba 140
jksoft 0:53a512d5a7ba 141 bool ESP8266::startUDP(char* ip, int port, int id, int length)
jksoft 0:53a512d5a7ba 142 {
jksoft 0:53a512d5a7ba 143 char cmd[256];
jksoft 0:53a512d5a7ba 144 char portstr[5];
jksoft 0:53a512d5a7ba 145 char idstr[1];
jksoft 0:53a512d5a7ba 146 char lenstr[2];
jksoft 0:53a512d5a7ba 147
jksoft 0:53a512d5a7ba 148 sprintf(portstr, "%d", port);
jksoft 0:53a512d5a7ba 149 sprintf(idstr, "%d", id);
jksoft 0:53a512d5a7ba 150 sprintf(lenstr, "%d", length);
jksoft 0:53a512d5a7ba 151
jksoft 0:53a512d5a7ba 152 sendCommand("AT+CIPMUX=1", "OK", NULL, 1000);
jksoft 0:53a512d5a7ba 153 sprintf(cmd,"AT+CIPSTART=%d,\"UDP\",\"%s\",%d,1112,0",id,ip,port);
jksoft 0:53a512d5a7ba 154 sendCommand(cmd, "OK", NULL, 10000);
jksoft 0:53a512d5a7ba 155 //sendCommand(( "AT+CIPSTART=" + string(idstr) + ",\"UDP\",\"" + (string) ip + "\"," + (string) portstr + ",1112,0").c_str(), "OK", NULL, 10000);
jksoft 0:53a512d5a7ba 156 sprintf(cmd,"AT+CIPSEND=%d,%d",id,length);
jksoft 0:53a512d5a7ba 157 sendCommand(cmd, ">", NULL, 1000);// go into transparent mode
jksoft 0:53a512d5a7ba 158 //sendCommand(("AT+CIPSEND=" + (string)idstr + "," + (string)lenstr).c_str(), ">", NULL, 1000);// go into transparent mode
jksoft 0:53a512d5a7ba 159 DBG("Data Mode\r\n");
jksoft 0:53a512d5a7ba 160 state.cmdMode = false;
jksoft 0:53a512d5a7ba 161
jksoft 0:53a512d5a7ba 162 return true;
jksoft 0:53a512d5a7ba 163 }
jksoft 0:53a512d5a7ba 164
jksoft 0:53a512d5a7ba 165 bool ESP8266::startTCPServer(int port)
jksoft 0:53a512d5a7ba 166 {
jksoft 0:53a512d5a7ba 167 char cmd[100];
jksoft 0:53a512d5a7ba 168 bool command_results[3];
jksoft 0:53a512d5a7ba 169 command_results[0]=sendCommand("AT+CWMODE=3", "OK", NULL, 1000);
jksoft 0:53a512d5a7ba 170 command_results[1]=sendCommand("AT+CIPMUX=1", "OK", NULL, 1000);
jksoft 0:53a512d5a7ba 171 if(port == 333){
jksoft 0:53a512d5a7ba 172 command_results[2]=sendCommand("AT+CIPSERVER=1", "OK", NULL, 1000);
jksoft 0:53a512d5a7ba 173 }
jksoft 0:53a512d5a7ba 174 else{
jksoft 0:53a512d5a7ba 175 sprintf(cmd,"AT+CIPSERVER=1,%d",port);
jksoft 0:53a512d5a7ba 176 command_results[2]=sendCommand(cmd, "OK", NULL, 1000);
jksoft 0:53a512d5a7ba 177 }
jksoft 0:53a512d5a7ba 178 //sendCommand("AT+CIFSR", "OK", NULL, 1000);
jksoft 0:53a512d5a7ba 179 DBG("Data Mode\r\n");
jksoft 0:53a512d5a7ba 180 state.cmdMode = false;
jksoft 0:53a512d5a7ba 181 if (command_results[0] and command_results[1] and command_results[2]){
jksoft 0:53a512d5a7ba 182 return true;
jksoft 0:53a512d5a7ba 183 }
jksoft 0:53a512d5a7ba 184 else{
jksoft 0:53a512d5a7ba 185 return false;
jksoft 0:53a512d5a7ba 186 }
jksoft 0:53a512d5a7ba 187 }
jksoft 0:53a512d5a7ba 188
jksoft 0:53a512d5a7ba 189 bool ESP8266::close()
jksoft 0:53a512d5a7ba 190 {
jksoft 0:53a512d5a7ba 191 wait(0.1f);
jksoft 0:53a512d5a7ba 192 send("+++",3);
jksoft 0:53a512d5a7ba 193 wait(1.0f);
jksoft 0:53a512d5a7ba 194 state.cmdMode = true;
jksoft 0:53a512d5a7ba 195 sendCommand("AT+CIPCLOSE","OK", NULL, 10000);
jksoft 0:53a512d5a7ba 196 return true;
jksoft 0:53a512d5a7ba 197 }
jksoft 0:53a512d5a7ba 198
jksoft 0:53a512d5a7ba 199 bool ESP8266::disconnect()
jksoft 0:53a512d5a7ba 200 {
jksoft 0:53a512d5a7ba 201 // if already disconnected, return
jksoft 0:53a512d5a7ba 202 if (!state.associated)
jksoft 0:53a512d5a7ba 203 return true;
jksoft 0:53a512d5a7ba 204 // send command to quit AP
jksoft 0:53a512d5a7ba 205 sendCommand("AT+CWQAP", "OK", NULL, 10000);
jksoft 0:53a512d5a7ba 206 state.associated = false;
jksoft 0:53a512d5a7ba 207 return true;
jksoft 0:53a512d5a7ba 208 }
jksoft 0:53a512d5a7ba 209
jksoft 0:53a512d5a7ba 210 int ESP8266::strfind(const char *str,const char *chkstr,int pos)
jksoft 0:53a512d5a7ba 211 {
jksoft 0:53a512d5a7ba 212 if( (strlen(str)-pos) < strlen(chkstr) ) return(-1);
jksoft 0:53a512d5a7ba 213
jksoft 0:53a512d5a7ba 214
jksoft 0:53a512d5a7ba 215 for(int i=pos;i<strlen(str);i++)
jksoft 0:53a512d5a7ba 216 {
jksoft 0:53a512d5a7ba 217 if(memcmp(chkstr,&str[i],strlen(chkstr))==0)
jksoft 0:53a512d5a7ba 218 {
jksoft 0:53a512d5a7ba 219 return(i);
jksoft 0:53a512d5a7ba 220 }
jksoft 0:53a512d5a7ba 221 }
jksoft 0:53a512d5a7ba 222 return(-1);
jksoft 0:53a512d5a7ba 223 }
jksoft 0:53a512d5a7ba 224
jksoft 0:53a512d5a7ba 225 char* ESP8266::substr(const char *str , char *outstr , int pos1 , int pos2 )
jksoft 0:53a512d5a7ba 226 {
jksoft 0:53a512d5a7ba 227 int size = pos2 - pos1;
jksoft 0:53a512d5a7ba 228
jksoft 0:53a512d5a7ba 229 memcpy(outstr , &str[pos1] , size );
jksoft 0:53a512d5a7ba 230 outstr[size] = '\0';
jksoft 0:53a512d5a7ba 231
jksoft 0:53a512d5a7ba 232 return(outstr);
jksoft 0:53a512d5a7ba 233 }
jksoft 0:53a512d5a7ba 234
jksoft 0:53a512d5a7ba 235 int ESP8266::strcount(const char *str , char countstr )
jksoft 0:53a512d5a7ba 236 {
jksoft 0:53a512d5a7ba 237 int ret = 0;
jksoft 0:53a512d5a7ba 238
jksoft 0:53a512d5a7ba 239 for(int i = 0 ; i < strlen(str) ; i++)
jksoft 0:53a512d5a7ba 240 {
jksoft 0:53a512d5a7ba 241 if( str[i] == countstr )
jksoft 0:53a512d5a7ba 242 {
jksoft 0:53a512d5a7ba 243 ret++;
jksoft 0:53a512d5a7ba 244 }
jksoft 0:53a512d5a7ba 245
jksoft 0:53a512d5a7ba 246 }
jksoft 0:53a512d5a7ba 247
jksoft 0:53a512d5a7ba 248 return(ret);
jksoft 0:53a512d5a7ba 249 }
jksoft 0:53a512d5a7ba 250
jksoft 0:53a512d5a7ba 251 /*
jksoft 0:53a512d5a7ba 252 Assuming Returned data looks like this:
jksoft 0:53a512d5a7ba 253 +CIFSR:STAIP,"192.168.11.2"
jksoft 0:53a512d5a7ba 254 +CIFSR:STAMAC,"18:fe:34:9f:3a:f5"
jksoft 0:53a512d5a7ba 255 grabbing IP from first set of quotation marks
jksoft 0:53a512d5a7ba 256 */
jksoft 0:53a512d5a7ba 257 char* ESP8266::getIPAddress()
jksoft 0:53a512d5a7ba 258 {
jksoft 0:53a512d5a7ba 259 char result[30] = {0};
jksoft 0:53a512d5a7ba 260 char tmp[30] = {0};
jksoft 0:53a512d5a7ba 261 int check = 0;
jksoft 0:53a512d5a7ba 262 check = sendCommand("AT+CIFSR", NULL, result, 1000);
jksoft 0:53a512d5a7ba 263 //pc.printf("\r\nReceivedInfo for IP Command is: %s\r\n",result);
jksoft 0:53a512d5a7ba 264 ip = ipString;
jksoft 0:53a512d5a7ba 265 if(check) {
jksoft 0:53a512d5a7ba 266 // Success
jksoft 0:53a512d5a7ba 267 uint8_t pos1 = 0, pos2 = 0;
jksoft 0:53a512d5a7ba 268 //uint8_t pos3 = 0, pos4 = 0;
jksoft 0:53a512d5a7ba 269 pos1 = strfind(result,"+CIFSR:STAIP",0);
jksoft 0:53a512d5a7ba 270 //pos1 = resultString.find("+CIFSR:STAIP");
jksoft 0:53a512d5a7ba 271 pos1 = strfind(result,"\"",pos1);
jksoft 0:53a512d5a7ba 272 //pos1 = resultString.find('"',pos1);
jksoft 0:53a512d5a7ba 273 pos2 = strfind(result,"\"",pos1+1);
jksoft 0:53a512d5a7ba 274 //pos2 = resultString.find('"',pos1+1);
jksoft 0:53a512d5a7ba 275 //pos3 = resultString.find('"',pos2+1); //would find mac address
jksoft 0:53a512d5a7ba 276 //pos4 = resultString.find('"',pos3+1);
jksoft 0:53a512d5a7ba 277 strncpy(ipString,substr(result,tmp,pos1,pos2),sizeof(ipString));
jksoft 0:53a512d5a7ba 278 INFO("IP: %s",ipString);
jksoft 0:53a512d5a7ba 279 ip = ipString;
jksoft 0:53a512d5a7ba 280
jksoft 0:53a512d5a7ba 281 } else {
jksoft 0:53a512d5a7ba 282 // Failure
jksoft 0:53a512d5a7ba 283 ERR("getIPAddress() failed");
jksoft 0:53a512d5a7ba 284 ip = NULL;
jksoft 0:53a512d5a7ba 285 }
jksoft 0:53a512d5a7ba 286 return ip;
jksoft 0:53a512d5a7ba 287 }
jksoft 0:53a512d5a7ba 288
jksoft 0:53a512d5a7ba 289 bool ESP8266::gethostbyname(const char * host, char * ip)
jksoft 0:53a512d5a7ba 290 {
jksoft 0:53a512d5a7ba 291 int nb_digits = 0;
jksoft 0:53a512d5a7ba 292 char tmp[100];
jksoft 0:53a512d5a7ba 293
jksoft 0:53a512d5a7ba 294 strcpy(ip,host);
jksoft 0:53a512d5a7ba 295
jksoft 0:53a512d5a7ba 296 return true;
jksoft 0:53a512d5a7ba 297
jksoft 0:53a512d5a7ba 298 // no dns needed
jksoft 0:53a512d5a7ba 299 int pos = strfind(host,".",0);
jksoft 0:53a512d5a7ba 300 if (pos != -1) {
jksoft 0:53a512d5a7ba 301 nb_digits = atoi(substr(host,tmp,0,pos));
jksoft 0:53a512d5a7ba 302 }
jksoft 0:53a512d5a7ba 303 //printf("substrL %s\r\n", sub.c_str());
jksoft 0:53a512d5a7ba 304 if (strcount(host,'.') == 3 && nb_digits > 0) {
jksoft 0:53a512d5a7ba 305 strcpy(ip, host);
jksoft 0:53a512d5a7ba 306 return true;
jksoft 0:53a512d5a7ba 307 } else {
jksoft 0:53a512d5a7ba 308 // dns needed, not currently available
jksoft 0:53a512d5a7ba 309 ERR("gethostbyname(): DNS Not currently available, only use IP Addresses!");
jksoft 0:53a512d5a7ba 310 return false;
jksoft 0:53a512d5a7ba 311 }
jksoft 0:53a512d5a7ba 312 }
jksoft 0:53a512d5a7ba 313
jksoft 0:53a512d5a7ba 314 void ESP8266::reset()
jksoft 0:53a512d5a7ba 315 {
jksoft 0:53a512d5a7ba 316 reset_pin = 0;
jksoft 0:53a512d5a7ba 317 wait_us(20);
jksoft 0:53a512d5a7ba 318 reset_pin = 1;
jksoft 0:53a512d5a7ba 319 //wait(1);
jksoft 0:53a512d5a7ba 320 //reset_pin = !reset_pin
jksoft 0:53a512d5a7ba 321 //send("+++",3);
jksoft 0:53a512d5a7ba 322 wait(1);
jksoft 0:53a512d5a7ba 323 state.cmdMode = true;
jksoft 0:53a512d5a7ba 324 sendCommand("AT", "OK", NULL, 1000);
jksoft 0:53a512d5a7ba 325 sendCommand("AT+RST", "ready", NULL, 10000);
jksoft 0:53a512d5a7ba 326 state.associated = false;
jksoft 0:53a512d5a7ba 327
jksoft 0:53a512d5a7ba 328 }
jksoft 0:53a512d5a7ba 329
jksoft 0:53a512d5a7ba 330 bool ESP8266::reboot()
jksoft 0:53a512d5a7ba 331 {
jksoft 0:53a512d5a7ba 332 reset();
jksoft 0:53a512d5a7ba 333 return true;
jksoft 0:53a512d5a7ba 334 }
jksoft 0:53a512d5a7ba 335
jksoft 0:53a512d5a7ba 336 void ESP8266::handler_rx(void)
jksoft 0:53a512d5a7ba 337 {
jksoft 0:53a512d5a7ba 338 //read characters
jksoft 0:53a512d5a7ba 339 char c;
jksoft 0:53a512d5a7ba 340 while (wifi.readable()) {
jksoft 0:53a512d5a7ba 341 c=wifi.getc();
jksoft 0:53a512d5a7ba 342 buf_ESP8266.queue(c);
jksoft 0:53a512d5a7ba 343 //if (state.cmdMode) pc.printf("%c",c); //debug echo, needs fast serial console to prevent UART overruns
jksoft 0:53a512d5a7ba 344 }
jksoft 0:53a512d5a7ba 345 }
jksoft 0:53a512d5a7ba 346
jksoft 0:53a512d5a7ba 347 void ESP8266::attach_rx(bool callback)
jksoft 0:53a512d5a7ba 348 {
jksoft 0:53a512d5a7ba 349 if (!callback) {
jksoft 0:53a512d5a7ba 350 wifi.attach(NULL);
jksoft 0:53a512d5a7ba 351 }
jksoft 0:53a512d5a7ba 352 else {
jksoft 0:53a512d5a7ba 353 wifi.attach(this, &ESP8266::handler_rx);
jksoft 0:53a512d5a7ba 354 }
jksoft 0:53a512d5a7ba 355 }
jksoft 0:53a512d5a7ba 356
jksoft 0:53a512d5a7ba 357 int ESP8266::readable()
jksoft 0:53a512d5a7ba 358 {
jksoft 0:53a512d5a7ba 359 return buf_ESP8266.available();
jksoft 0:53a512d5a7ba 360 }
jksoft 0:53a512d5a7ba 361
jksoft 0:53a512d5a7ba 362 int ESP8266::writeable()
jksoft 0:53a512d5a7ba 363 {
jksoft 0:53a512d5a7ba 364 return wifi.writeable();
jksoft 0:53a512d5a7ba 365 }
jksoft 0:53a512d5a7ba 366
jksoft 0:53a512d5a7ba 367 char ESP8266::getc()
jksoft 0:53a512d5a7ba 368 {
jksoft 0:53a512d5a7ba 369 char c=0;
jksoft 0:53a512d5a7ba 370 while (!buf_ESP8266.available());
jksoft 0:53a512d5a7ba 371 buf_ESP8266.dequeue(&c);
jksoft 0:53a512d5a7ba 372 return c;
jksoft 0:53a512d5a7ba 373 }
jksoft 0:53a512d5a7ba 374
jksoft 0:53a512d5a7ba 375 int ESP8266::putc(char c)
jksoft 0:53a512d5a7ba 376 {
jksoft 0:53a512d5a7ba 377 while (!wifi.writeable() || wifi.readable()); //wait for echoed command characters to be read first
jksoft 0:53a512d5a7ba 378 return wifi.putc(c);
jksoft 0:53a512d5a7ba 379 }
jksoft 0:53a512d5a7ba 380
jksoft 0:53a512d5a7ba 381 void ESP8266::flush()
jksoft 0:53a512d5a7ba 382 {
jksoft 0:53a512d5a7ba 383 buf_ESP8266.flush();
jksoft 0:53a512d5a7ba 384 }
jksoft 0:53a512d5a7ba 385
jksoft 0:53a512d5a7ba 386 int ESP8266::send(const char * buf, int len)
jksoft 0:53a512d5a7ba 387 {
jksoft 0:53a512d5a7ba 388 //TODO: need to add handler for data > 2048B, this is the max packet size of the ESP8266.
jksoft 0:53a512d5a7ba 389 if(len >= 2048){
jksoft 0:53a512d5a7ba 390 WARN("send buffer >= 2048B, need to chunk this up to be less.");
jksoft 0:53a512d5a7ba 391 }
jksoft 0:53a512d5a7ba 392 const char* bufptr=buf;
jksoft 0:53a512d5a7ba 393 for(int i=0; i<len; i++) {
jksoft 0:53a512d5a7ba 394 putc((int)*bufptr++);
jksoft 0:53a512d5a7ba 395 }
jksoft 0:53a512d5a7ba 396 return len;
jksoft 0:53a512d5a7ba 397 }
jksoft 0:53a512d5a7ba 398
jksoft 0:53a512d5a7ba 399 bool ESP8266::sendCommand(const char * cmd, const char * ACK, char * res, int timeout)
jksoft 0:53a512d5a7ba 400 {
jksoft 0:53a512d5a7ba 401 char read;
jksoft 0:53a512d5a7ba 402 char checking[512] = "";
jksoft 0:53a512d5a7ba 403 int checking_size = 0;
jksoft 0:53a512d5a7ba 404 int fond = -1;
jksoft 0:53a512d5a7ba 405 Timer tmr;
jksoft 0:53a512d5a7ba 406 int result = 0;
jksoft 0:53a512d5a7ba 407
jksoft 0:53a512d5a7ba 408 DBG("sendCmd:\t %s",cmd);
jksoft 0:53a512d5a7ba 409
jksoft 0:53a512d5a7ba 410 attach_rx(true);
jksoft 0:53a512d5a7ba 411
jksoft 0:53a512d5a7ba 412 //We flush the buffer
jksoft 0:53a512d5a7ba 413 while (readable())
jksoft 0:53a512d5a7ba 414 getc();
jksoft 0:53a512d5a7ba 415
jksoft 0:53a512d5a7ba 416 if (!ACK || !strcmp(ACK, "NO")) {
jksoft 0:53a512d5a7ba 417 for (int i = 0; i < strlen(cmd); i++) {
jksoft 0:53a512d5a7ba 418 result = (putc(cmd[i]) == cmd[i]) ? result + 1 : result;
jksoft 0:53a512d5a7ba 419 wait(0.005f); // prevents stuck recieve ready (?) need to let echoed character get read first
jksoft 0:53a512d5a7ba 420 }
jksoft 0:53a512d5a7ba 421 putc(13); //CR
jksoft 0:53a512d5a7ba 422 wait(0.005f); // wait for echo
jksoft 0:53a512d5a7ba 423 putc(10); //LF
jksoft 0:53a512d5a7ba 424
jksoft 0:53a512d5a7ba 425 } else {
jksoft 0:53a512d5a7ba 426 //We flush the buffer
jksoft 0:53a512d5a7ba 427 while (readable())
jksoft 0:53a512d5a7ba 428 getc();
jksoft 0:53a512d5a7ba 429
jksoft 0:53a512d5a7ba 430 tmr.start();
jksoft 0:53a512d5a7ba 431 for (int i = 0; i < strlen(cmd); i++) {
jksoft 0:53a512d5a7ba 432 result = (putc(cmd[i]) == cmd[i]) ? result + 1 : result;
jksoft 0:53a512d5a7ba 433 wait(.005); // wait for echo
jksoft 0:53a512d5a7ba 434 }
jksoft 0:53a512d5a7ba 435 putc(13); //CR
jksoft 0:53a512d5a7ba 436 wait(0.005f); // wait for echo
jksoft 0:53a512d5a7ba 437 putc(10); //LF
jksoft 0:53a512d5a7ba 438
jksoft 0:53a512d5a7ba 439 while (1) {
jksoft 0:53a512d5a7ba 440 if (tmr.read_ms() > timeout) {
jksoft 0:53a512d5a7ba 441 //We flush the buffer
jksoft 0:53a512d5a7ba 442 while (readable())
jksoft 0:53a512d5a7ba 443 getc();
jksoft 0:53a512d5a7ba 444
jksoft 0:53a512d5a7ba 445 DBG("check:\t %s", checking);
jksoft 0:53a512d5a7ba 446
jksoft 0:53a512d5a7ba 447 attach_rx(true);
jksoft 0:53a512d5a7ba 448 return -1;
jksoft 0:53a512d5a7ba 449 } else if (readable()) {
jksoft 0:53a512d5a7ba 450 read = getc();
jksoft 0:53a512d5a7ba 451 //pc.printf("%c",read); //debug echo
jksoft 0:53a512d5a7ba 452 if ( read != '\r' && read != '\n') {
jksoft 0:53a512d5a7ba 453 checking[checking_size] = read;
jksoft 0:53a512d5a7ba 454 checking_size++;
jksoft 0:53a512d5a7ba 455 checking[checking_size] = '\0';
jksoft 0:53a512d5a7ba 456 fond = strfind(checking,ACK,0);
jksoft 0:53a512d5a7ba 457 if (fond != -1) {
jksoft 0:53a512d5a7ba 458 wait(0.01f);
jksoft 0:53a512d5a7ba 459
jksoft 0:53a512d5a7ba 460 //We flush the buffer
jksoft 0:53a512d5a7ba 461 while (readable())
jksoft 0:53a512d5a7ba 462 read = getc();
jksoft 0:53a512d5a7ba 463 //printf("%c",read); //debug echo
jksoft 0:53a512d5a7ba 464 break;
jksoft 0:53a512d5a7ba 465 }
jksoft 0:53a512d5a7ba 466 }
jksoft 0:53a512d5a7ba 467 }
jksoft 0:53a512d5a7ba 468 }
jksoft 0:53a512d5a7ba 469 DBG("check: %s", checking);
jksoft 0:53a512d5a7ba 470
jksoft 0:53a512d5a7ba 471 attach_rx(true);
jksoft 0:53a512d5a7ba 472 return result;
jksoft 0:53a512d5a7ba 473 }
jksoft 0:53a512d5a7ba 474
jksoft 0:53a512d5a7ba 475 //the user wants the result from the command (ACK == NULL, res != NULL)
jksoft 0:53a512d5a7ba 476 if (res != NULL) {
jksoft 0:53a512d5a7ba 477 int i = 0;
jksoft 0:53a512d5a7ba 478 Timer timeout;
jksoft 0:53a512d5a7ba 479 timeout.start();
jksoft 0:53a512d5a7ba 480 tmr.reset();
jksoft 0:53a512d5a7ba 481 while (1) {
jksoft 0:53a512d5a7ba 482 if (timeout.read() > 2) {
jksoft 0:53a512d5a7ba 483 if (i == 0) {
jksoft 0:53a512d5a7ba 484 res = NULL;
jksoft 0:53a512d5a7ba 485 break;
jksoft 0:53a512d5a7ba 486 }
jksoft 0:53a512d5a7ba 487 res[i] = '\0';
jksoft 0:53a512d5a7ba 488 DBG("user str 1: %s", res);
jksoft 0:53a512d5a7ba 489
jksoft 0:53a512d5a7ba 490 break;
jksoft 0:53a512d5a7ba 491 } else {
jksoft 0:53a512d5a7ba 492 if (tmr.read_ms() > 300) {
jksoft 0:53a512d5a7ba 493 res[i] = '\0';
jksoft 0:53a512d5a7ba 494 DBG("user str: %s", res);
jksoft 0:53a512d5a7ba 495
jksoft 0:53a512d5a7ba 496 break;
jksoft 0:53a512d5a7ba 497 }
jksoft 0:53a512d5a7ba 498 if (readable()) {
jksoft 0:53a512d5a7ba 499 tmr.start();
jksoft 0:53a512d5a7ba 500 read = getc();
jksoft 0:53a512d5a7ba 501
jksoft 0:53a512d5a7ba 502 // we drop \r and \n
jksoft 0:53a512d5a7ba 503 if ( read != '\r' && read != '\n') {
jksoft 0:53a512d5a7ba 504 res[i++] = read;
jksoft 0:53a512d5a7ba 505 }
jksoft 0:53a512d5a7ba 506 }
jksoft 0:53a512d5a7ba 507 }
jksoft 0:53a512d5a7ba 508 }
jksoft 0:53a512d5a7ba 509 DBG("user str: %s", res);
jksoft 0:53a512d5a7ba 510 }
jksoft 0:53a512d5a7ba 511
jksoft 0:53a512d5a7ba 512 //We flush the buffer
jksoft 0:53a512d5a7ba 513 while (readable())
jksoft 0:53a512d5a7ba 514 getc();
jksoft 0:53a512d5a7ba 515
jksoft 0:53a512d5a7ba 516 attach_rx(true);
jksoft 0:53a512d5a7ba 517 DBG("result: %d", result)
jksoft 0:53a512d5a7ba 518 return result;
jksoft 0:53a512d5a7ba 519 }