char * ESP8266::sendATCommand(char cmd[], char keyword[], unsigned long timeout)
{
	_wifiSerial.flush();
	_wifiSerial.print(cmd);

	unsigned long start;
	start = millis();
	bufferCursor = 0;
	setResponseTrueKeywords(keyword);

	while (millis() - start < timeout) {
		if (_wifiSerial.available() > 0)
		{
			buffer[bufferCursor] = _wifiSerial.read();
			bufferCursor++;
		}
		buffer[bufferCursor] = '\0';
		if (bufferFind(responseTrueKeywords))
		{
			break;
		}
	}

	return buffer;
}
void ESP8266::fetchIP(void)
{
	_wifiSerial.println(F("AT+CIFSR"));

	setResponseTrueKeywords(KEYWORD_OK);
	setResponseFalseKeywords(KEYWORD_ERROR);
	readResponse(10000, PostFetchIP);
}
void ESP8266::disconnect()
{
	autoconnect = false;
	_wifiSerial.println(F("AT+CWQAP"));
	setResponseTrueKeywords(KEYWORD_OK);
	setResponseFalseKeywords();
	readResponse(3000, PostDisconnect);
}
void ESP8266::closeConnection(void)
{
	wifi.state = STATE_CONNECTED;
	_wifiSerial.println(F("AT+CIPCLOSE"));
	setResponseTrueKeywords(KEYWORD_OK, KEYWORD_ERROR);
	setResponseFalseKeywords();
	readResponse(10000, PostCloseConnection);
}
void ESP8266::recvString(char target[], uint32_t timeout)
{
	bufferCursor = 0; 
	serialResponseTimestamp = millis();
	serialResponseTimeout = timeout;

	setResponseTrueKeywords(target);
	setResponseFalseKeywords();
}
void ESP8266::checkConnection() {
	state = STATE_SENDING_DATA;
	_wifiSerial.println(F("AT+CIPSTATUS"));

	setResponseTrueKeywords(KEYWORD_OK);
	setResponseFalseKeywords(KEYWORD_ERROR);
	readResponse(15000, PostCheckConnection);

}
void ESP8266::confMode(byte a)
{
	_wifiSerial.print(F("AT+CWMODE="));
	_wifiSerial.println(a);

	setResponseTrueKeywords(KEYWORD_OK);
	setResponseFalseKeywords(KEYWORD_ERROR);
	readResponse(2000, PostConfMode);
}
void ESP8266::confConnection(boolean mode)
{
	_wifiSerial.print(F("AT+CIPMUX="));
	_wifiSerial.println(mode);

	setResponseTrueKeywords(KEYWORD_OK);
	setResponseFalseKeywords();
	readResponse(3000, PostConfConnection);

}
void ESP8266::connectToServer() {
	state = STATE_SENDING_DATA;
	_wifiSerial.print(F("AT+CIPSTART=\"TCP\",\""));
	_wifiSerial.print(requests[0].serverIP);
	_wifiSerial.print(F("\","));
	_wifiSerial.println(requests[0].port);

	setResponseTrueKeywords(KEYWORD_OK, KEYWORD_ALREAY_CONNECT);
	setResponseFalseKeywords(KEYWORD_ERROR);
	readResponse(5000, PostConnectToServer);
}
void ESP8266::softReset(void)
{
	connected = false;
	strcpy(ip, "");
	state = STATE_RESETING;
	_wifiSerial.println(F("AT+RST"));

	setResponseTrueKeywords(KEYWORD_READY);
	setResponseFalseKeywords();
	readResponse(15000, PostSoftReset);
}
void ESP8266::connectAP(char _ssid[], char _pwd[])
{
	_wifiSerial.print(F("AT+CWJAP=\""));
	_wifiSerial.print(_ssid);
	_wifiSerial.print(F("\",\""));
	_wifiSerial.print(_pwd);
	_wifiSerial.println(F("\""));

	setResponseTrueKeywords(KEYWORD_OK);
	setResponseFalseKeywords(KEYWORD_FAIL);
	readResponse(10000, PostConnectAP);
}
void ESP8266::SendDataLength()
{
	wifi.state = STATE_SENDING_DATA;
	int length = 79;

	if (wifi.requests[0].method != NULL) {
		length = length + strlen(wifi.requests[0].method);
	}

	if (wifi.requests[0].url != NULL) {
		length = length + strlen(wifi.requests[0].url);
	}

	if (wifi.requests[0].serverIP != NULL) {
		length = length + strlen(wifi.requests[0].serverIP);
	}

	if (wifi.requests[0].queryData != NULL) {
		length = length + 3 + strlen(wifi.requests[0].queryData);
	}
	if (wifi.requests[0].postData != NULL) {
		length = length + 20 + strlen(wifi.requests[0].postData);
		if (strlen(wifi.requests[0].postData) > 9) {
			length++;
		}
		if (strlen(wifi.requests[0].postData) > 99) {
			length++;
		}
		if (strlen(wifi.requests[0].postData) > 999) {
			length++;
		}
	}
	//DBG("data length ");
	//DBG(length);
	//DBG("\r\n");
	_wifiSerial.print(F("AT+CIPSEND="));
	_wifiSerial.println(length);

	setResponseTrueKeywords(KEYWORD_CURSOR);
	setResponseFalseKeywords();
	readResponse(5000, SendData);
}