void ESP8266::readResponse(unsigned long timeout, void(*handler)(uint8_t serialResponseStatus)) {
	switch (state) {
	case STATE_IDLE:
	case STATE_CONNECTED:
	case STATE_SENDING_DATA:
	case STATE_RESETING:
		state = STATE_RECIVING_DATA;
		serialResponseTimestamp = currentTimestamp;
		serialResponseTimeout = timeout;
		serialResponseHandler = handler;
		strcpy(buffer, "");
		bufferCursor = 0; 
		//DBG("started listening\r\n");
		break;

	case STATE_RECIVING_DATA:
		if ((currentTimestamp - serialResponseTimestamp) > serialResponseTimeout 
			|| currentTimestamp < serialResponseTimestamp 
			|| (bufferFind(responseTrueKeywords) 
			|| bufferFind(responseFalseKeywords) 
			|| bufferCursor == (SERIAL_RX_BUFFER_SIZE - 1))) {
			state = STATE_DATA_RECIVED;
			if (bufferFind(responseTrueKeywords) || bufferCursor == (SERIAL_RX_BUFFER_SIZE - 1)) {
				//DBG(F("serial true \r\n"));
				handler(SERIAL_RESPONSE_TRUE);
			}
			else if (bufferFind(responseFalseKeywords)) {
				//DBG(F("serial false \r\n"));
				handler(SERIAL_RESPONSE_FALSE);
			}
			else {
				//DBG(F("serial timeout \r\n"));
				handler(SERIAL_RESPONSE_TIMEOUT);
			}
		}
		else {
			while (_wifiSerial.available() > 0)
			{
				if (bufferCursor < (SERIAL_RX_BUFFER_SIZE-1)){
					buffer[bufferCursor] = _wifiSerial.read();
					bufferCursor++;
				}
				else {
					DBG(F("ESP8266 lib buffer overflow \r\n"));
					//empty the wifiSerial buffer'
					serialFlush();
					break;
				}
			}
			buffer[bufferCursor] = '\0';
		}
		break;
	}

	lastActivityTimestamp = currentTimestamp;
	//DBG(state);
}
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;
}
Exemplo n.º 3
0
void ESP8266::readResponse(unsigned long timeout) {


	//switch (state) {
	//case STATE_IDLE:
	//case STATE_CONNECTED:
	//case STATE_SENDING_DATA:
	//case STATE_RESETING:
	//	state = STATE_RECIVING_DATA;
	//	serialResponseTimestamp = currentTimestamp;
	//	serialResponseTimeout = timeout;
	//	serialResponseHandler = handler;
	//	strcpy(buffer, "");
	//	bufferCursor = 0; 
	//	//DBG("started listening\r\n");
	//	break;

	//case STATE_RECIVING_DATA:
	if ((currentTimestamp - serialResponseTimestamp) > serialResponseTimeout 
		|| currentTimestamp < serialResponseTimestamp 
		|| (bufferFind(responseTrueKeywords) 
		|| bufferFind(responseFalseKeywords) 
		|| bufferCursor == (SERIAL_RX_BUFFER_SIZE - 1))) {
			//state = STATE_DATA_RECIVED;


			if (bufferFind(responseTrueKeywords) || bufferCursor == (SERIAL_RX_BUFFER_SIZE - 1)) {
				//DBG(F("serial true \r\n"));
				callSerialResponseMethod(SERIAL_RESPONSE_TRUE);
			}
			else if (bufferFind(responseFalseKeywords)) {
				//DBG(F("serial false \r\n"));
				callSerialResponseMethod(SERIAL_RESPONSE_FALSE);
			}
			else {
				//DBG(F("serial timeout \r\n"));
				callSerialResponseMethod(SERIAL_RESPONSE_TIMEOUT);
			}

	}
	else {

		/*Serial.println("readResponse");
		if(m_puart->available() > 0) {
		char a = m_puart->read();


		}*/

		/*String data;
		char a;

		while(m_puart->available() > 0) {
		a = m_puart->read();

		Serial.println(a);

		if(a == '\0') continue;
		data += a;
		}*/


		while (m_puart->available() > 0)
		{
			//Serial.println("available");
			if (bufferCursor < (SERIAL_RX_BUFFER_SIZE-1)){
				buffer[bufferCursor] =m_puart->read();
				Serial.print( buffer[bufferCursor]);
				bufferCursor++;
			}
			else {
				//DBG(F("ESP8266 lib buffer overflow \r\n"));
				//empty the wifiSerial buffer'
				rx_empty();
				break;
			}


		}
		buffer[bufferCursor] = '\0';
		//bufferCursor = 0;
	}
	/*break;
	}*/

	//lastActivityTimestamp = currentTimestamp;
	////DBG(state);
}