ThreadedGSM/DTE.h

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__