181 lines
3.5 KiB
C++
181 lines
3.5 KiB
C++
#include "SLIPEncodedBluetoothSerial.h"
|
|
#include "BluetoothSerial.h"
|
|
|
|
/*
|
|
CONSTRUCTOR
|
|
*/
|
|
//instantiate with the tranmission layer
|
|
//use BluetoothSerial
|
|
SLIPEncodedBluetoothSerial::SLIPEncodedBluetoothSerial(BluetoothSerial &s){
|
|
serial = &s;
|
|
rstate = CHAR;
|
|
}
|
|
|
|
static const uint8_t eot = 0300;
|
|
static const uint8_t slipesc = 0333;
|
|
static const uint8_t slipescend = 0334;
|
|
static const uint8_t slipescesc = 0335;
|
|
/*
|
|
SERIAL METHODS
|
|
*/
|
|
bool SLIPEncodedBluetoothSerial::endofPacket()
|
|
{
|
|
if(rstate == SECONDEOT)
|
|
{
|
|
rstate = CHAR;
|
|
return true;
|
|
}
|
|
if (rstate==FIRSTEOT)
|
|
{
|
|
if(serial->available())
|
|
{
|
|
uint8_t c =serial->peek();
|
|
if(c==eot)
|
|
{
|
|
serial->read(); // throw it on the floor
|
|
}
|
|
}
|
|
rstate = CHAR;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
int SLIPEncodedBluetoothSerial::available(){
|
|
back:
|
|
int cnt = serial->available();
|
|
|
|
if(cnt==0)
|
|
return 0;
|
|
if(rstate==CHAR)
|
|
{
|
|
uint8_t c =serial->peek();
|
|
if(c==slipesc)
|
|
{
|
|
rstate = SLIPESC;
|
|
serial->read(); // throw it on the floor
|
|
goto back;
|
|
}
|
|
else if( c==eot)
|
|
{
|
|
rstate = FIRSTEOT;
|
|
serial->read(); // throw it on the floor
|
|
goto back;
|
|
}
|
|
return 1; // we may have more but this is the only sure bet
|
|
}
|
|
else if(rstate==SLIPESC)
|
|
return 1;
|
|
else if(rstate==FIRSTEOT)
|
|
{
|
|
if(serial->peek()==eot)
|
|
{
|
|
rstate = SECONDEOT;
|
|
serial->read(); // throw it on the floor
|
|
return 0;
|
|
}
|
|
rstate = CHAR;
|
|
}else if (rstate==SECONDEOT) {
|
|
rstate = CHAR;
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
//reads a byte from the buffer
|
|
int SLIPEncodedBluetoothSerial::read(){
|
|
back:
|
|
uint8_t c = serial->read();
|
|
if(rstate==CHAR)
|
|
{
|
|
if(c==slipesc)
|
|
{
|
|
rstate=SLIPESC;
|
|
goto back;
|
|
}
|
|
else if(c==eot){
|
|
|
|
return -1; // xxx this is an error
|
|
}
|
|
return c;
|
|
}
|
|
else
|
|
if(rstate==SLIPESC)
|
|
{
|
|
rstate=CHAR;
|
|
if(c==slipescend)
|
|
return eot;
|
|
else if(c==slipescesc)
|
|
return slipesc;
|
|
else {
|
|
// insert some error code here
|
|
return -1;
|
|
}
|
|
|
|
}
|
|
else
|
|
return -1;
|
|
}
|
|
|
|
// as close as we can get to correct behavior
|
|
int SLIPEncodedBluetoothSerial::peek(){
|
|
uint8_t c = serial->peek();
|
|
if(rstate==SLIPESC)
|
|
{
|
|
if(c==slipescend)
|
|
return eot;
|
|
else if(c==slipescesc)
|
|
return slipesc;
|
|
}
|
|
return c;
|
|
}
|
|
|
|
//the arduino and wiring libraries have different return types for the write function
|
|
#if defined(WIRING) || defined(BOARD_DEFS_H)
|
|
|
|
//encode SLIP
|
|
void SLIPEncodedBluetoothSerial::write(uint8_t b){
|
|
if(b == eot){
|
|
serial->write(slipesc);
|
|
return serial->write(slipescend);
|
|
} else if(b==slipesc) {
|
|
serial->write(slipesc);
|
|
return serial->write(slipescesc);
|
|
} else {
|
|
return serial->write(b);
|
|
}
|
|
}
|
|
void SLIPEncodedBluetoothSerial::write(const uint8_t *buffer, size_t size) { while(size--) write(*buffer++); }
|
|
#else
|
|
//encode SLIP
|
|
size_t SLIPEncodedBluetoothSerial::write(uint8_t b){
|
|
if(b == eot){
|
|
serial->write(slipesc);
|
|
return serial->write(slipescend);
|
|
} else if(b==slipesc) {
|
|
serial->write(slipesc);
|
|
return serial->write(slipescesc);
|
|
} else {
|
|
return serial->write(b);
|
|
}
|
|
}
|
|
size_t SLIPEncodedBluetoothSerial::write(const uint8_t *buffer, size_t size) { size_t result=0; while(size--) result = write(*buffer++); return result; }
|
|
|
|
#endif
|
|
|
|
void SLIPEncodedBluetoothSerial::begin(String name){
|
|
serial->begin(name);
|
|
}
|
|
//SLIP specific method which begins a transmitted packet
|
|
void SLIPEncodedBluetoothSerial::beginPacket() { serial->write(eot); }
|
|
|
|
//signify the end of the packet with an EOT
|
|
void SLIPEncodedBluetoothSerial::endPacket(){
|
|
serial->write(eot);
|
|
|
|
}
|
|
|
|
void SLIPEncodedBluetoothSerial::flush(){
|
|
serial->flush();
|
|
}
|