# ifndef _SerialChannel_h_
# define _SerialChannel_h_
//#define ENABLE_SERIAL_CHANNEL
# ifdef ENABLE_SERIAL_CHANNEL
# 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 // ENABLE_SERIAL_CHANNEL
# endif