155 lines
2.9 KiB
C++
155 lines
2.9 KiB
C++
/*
|
|
* DTE.h
|
|
*
|
|
* Created: 20/09/2016 15:40:51
|
|
* Author: Neta Yahav
|
|
*/
|
|
|
|
#ifndef __DTE_H__
|
|
#define __DTE_H__
|
|
|
|
#include <Arduino.h>
|
|
|
|
class DTE
|
|
{
|
|
//variables
|
|
public:
|
|
enum CommandResult
|
|
{
|
|
EXPECT_BUSY,
|
|
EXPECT_TIMEOUT,
|
|
EXPECT_DELAY,
|
|
EXPECT_RESULT
|
|
};
|
|
|
|
protected:
|
|
private:
|
|
String buffer;
|
|
Stream& stream;
|
|
unsigned int bufferIndex;
|
|
unsigned int bufferSize;
|
|
String response[3];
|
|
unsigned long timeout;
|
|
unsigned long tick;
|
|
unsigned int match;
|
|
CommandResult result;
|
|
//functions
|
|
public:
|
|
DTE(Stream& stream, unsigned int size) : stream(stream), bufferSize(size), result(EXPECT_RESULT) { buffer.reserve(size); }
|
|
~DTE() {};
|
|
void SendCommand(const char* command, unsigned long timeout, const char* response1, const char* response2 = 0, const char* response3 = 0)
|
|
{
|
|
match = 0;
|
|
result = EXPECT_BUSY;
|
|
response[0] = response1;
|
|
response[1] = response2;
|
|
response[2] = response3;
|
|
this->timeout = timeout;
|
|
// clear rx buffer
|
|
while (stream.available())
|
|
{
|
|
stream.read();
|
|
}
|
|
// send command
|
|
stream.print(command);
|
|
buffer = "";
|
|
tick = millis();
|
|
proccess();
|
|
}
|
|
|
|
void SendCommand(const __FlashStringHelper* command, unsigned long timeout, const char* response1, const char* response2 = 0, const char* response3 = 0)
|
|
{
|
|
// char cmd[32];
|
|
|
|
match = 0;
|
|
result = EXPECT_BUSY;
|
|
response[0] = response1;
|
|
response[1] = response2;
|
|
response[2] = response3;
|
|
this->timeout = timeout;
|
|
// clear rx buffer
|
|
while (stream.available())
|
|
{
|
|
stream.read();
|
|
}
|
|
// send command
|
|
// strcpy_P(cmd, command);
|
|
stream.print((const __FlashStringHelper *)command);
|
|
// stream.print(cmd);
|
|
buffer = "";
|
|
tick = millis();
|
|
proccess();
|
|
}
|
|
|
|
void Delay(unsigned long delay)
|
|
{
|
|
timeout = delay;
|
|
result = EXPECT_DELAY;
|
|
tick = millis();
|
|
proccess();
|
|
}
|
|
bool getIsBusy()
|
|
{
|
|
proccess();
|
|
return (result == EXPECT_BUSY) || (result == EXPECT_DELAY);
|
|
}
|
|
CommandResult getResult() { return result ; }
|
|
unsigned int getMatch() { return match; }
|
|
String& getBuffer() { return buffer; }
|
|
protected:
|
|
private:
|
|
void proccess()
|
|
{
|
|
if(result == EXPECT_DELAY)
|
|
{
|
|
if(millis() - tick >= timeout)
|
|
result = EXPECT_RESULT;
|
|
|
|
return;
|
|
}
|
|
|
|
if(result != EXPECT_BUSY) return;
|
|
|
|
char c;
|
|
unsigned long now = millis();
|
|
|
|
while(millis() - tick < timeout)
|
|
{
|
|
while(stream.available() && (buffer.length() < (bufferSize)))
|
|
{
|
|
c = stream.read();
|
|
buffer += c;
|
|
if(buffer.endsWith(response[0]))
|
|
{
|
|
match = 0;
|
|
result = EXPECT_RESULT;
|
|
return;
|
|
}else if(response[1].length() != 0)
|
|
{
|
|
if(buffer.endsWith(response[1]))
|
|
{
|
|
match = 1;
|
|
result = EXPECT_RESULT;
|
|
return;
|
|
}
|
|
}else if(response[2].length() != 0)
|
|
{
|
|
if(buffer.endsWith(response[2]))
|
|
{
|
|
match = 2;
|
|
result = EXPECT_RESULT;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
if(millis() - now > 5)
|
|
return;
|
|
}
|
|
|
|
// time out
|
|
result = EXPECT_TIMEOUT;
|
|
}
|
|
}; //DTE
|
|
|
|
#endif //__DTE_H__
|