|
|
|
#ifndef _SerialChannel_h_
|
|
|
|
#define _SerialChannel_h_
|
|
|
|
|
|
|
|
#define SC_APPEND_STR(str) append((byte*)str, sizeof(str)-1)
|
|
|
|
#define SC_APPEND_STR_INT(str, arg0) appendInt(str, sizeof(str)-1, arg0)
|
|
|
|
|
|
|
|
#define SC_APPEND_STR_TIME(str, time) append((byte*)str, sizeof(str)-1, time)
|
|
|
|
|
|
|
|
class SerialChannel
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
struct Message
|
|
|
|
{
|
|
|
|
unsigned long time;
|
|
|
|
long longArg0;
|
|
|
|
byte* data;
|
|
|
|
short byteCount;
|
|
|
|
byte id;
|
|
|
|
};
|
|
|
|
|
|
|
|
private:
|
|
|
|
static const byte MaxPendingMessages = 32;
|
|
|
|
|
|
|
|
static SerialChannel* first;
|
|
|
|
SerialChannel* next;
|
|
|
|
|
|
|
|
static byte nextId;
|
|
|
|
byte id;
|
|
|
|
const char* name;
|
|
|
|
|
|
|
|
static Message buffer1[MaxPendingMessages];
|
|
|
|
static Message buffer2[MaxPendingMessages];
|
|
|
|
static volatile Message* backBuffer;
|
|
|
|
static volatile byte backBufferPos;
|
|
|
|
static byte frontBufferSize;
|
|
|
|
|
|
|
|
public:
|
|
|
|
SerialChannel(const char* name_);
|
|
|
|
|
|
|
|
static void beginWriteInChannel(byte id, short byteCount, unsigned long time);
|
|
|
|
void write(byte* data, short byteCount, unsigned long time = (unsigned long)-1);
|
|
|
|
void write(const char* text, unsigned long time = (unsigned long)-1);
|
|
|
|
|
|
|
|
void beginWrite(short byteCount, unsigned long time = (unsigned long)-1);
|
|
|
|
void continueWrite(byte* data, short byteCount);
|
|
|
|
|
|
|
|
Message& append(byte* data, short byteCount, unsigned long time = (unsigned long)-1);
|
|
|
|
void append(const char* text, unsigned long time = (unsigned long)-1);
|
|
|
|
void appendInt(const char* text, short textLength, int arg0, unsigned long time = (unsigned long)-1);
|
|
|
|
static void swap();
|
|
|
|
static void flush();
|
|
|
|
|
|
|
|
private:
|
|
|
|
static void handleConnection();
|
|
|
|
static void writeShort(short num);
|
|
|
|
static void writeULong(unsigned long num);
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|