diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..79e17c2 Binary files /dev/null and b/.DS_Store differ diff --git a/StreamBufferedChannel.ino b/StreamBufferedChannel.ino new file mode 100644 index 0000000..d303941 --- /dev/null +++ b/StreamBufferedChannel.ino @@ -0,0 +1,29 @@ +#include + +#define SIZE 3 +uint16_t DATA[SIZE]={200, 128,150}; + + +StreamBuffer Channel; + +void setup() { +// put your setup code here, to run once: +Serial.begin(9600); +Channel.setMaxChannelNumber((uint8_t) SIZE); +} + +void loop() { +// put your main code here, to run repeatedly: +Channel.appendChannelArray(DATA,SIZE); + + + +Channel.transmitBufferAscii(Serial, "\t"); +//Channel.transmitBufferBinaryRaw8(Serial); +//Channel.transmitBufferBinaryRaw16(Serial); +//Channel.sendBufferAsciiTimeStamp(Serial, 12,"\t"); +//Channel.sendBufferBinaryTimeStamp(Serial, 12); + +delay(100); + +} diff --git a/StreamChannel/.DS_Store b/StreamChannel/.DS_Store new file mode 100644 index 0000000..72d6c8a Binary files /dev/null and b/StreamChannel/.DS_Store differ diff --git a/StreamChannel/StreamChannel.cpp b/StreamChannel/StreamChannel.cpp new file mode 100644 index 0000000..286cf48 --- /dev/null +++ b/StreamChannel/StreamChannel.cpp @@ -0,0 +1,144 @@ +#include "StreamChannel.hpp" + + + +bool StreamBuffer::isFull(){ + + + return ((_currentIndex==_definedSize)? true:false); + +} + + +StreamBuffer::StreamBuffer(){ + _definedSize=0; + _currentIndex=0; +} + + +void StreamBuffer::setMaxChannelNumber(uint8_t channelNo){ + _definedSize=channelNo; + + _buffer=new uint16_t[_definedSize]; + _lsbBuffer=new uint8_t[_definedSize]; + _msbBuffer=new uint8_t[_definedSize]; + + for (uint8_t i=0; i<_definedSize; i++){ + _buffer[i]=0; + _lsbBuffer[i]=0; + _msbBuffer[i]=0; + + } + + +} + + +void StreamBuffer::appendChannelData(uint16_t data){ + _currentIndex=_currentIndex%_definedSize; //set the _currentIndex to 0 when the buffer if full and this function is called to append a new data + + *(_buffer+_currentIndex)=data; + _currentIndex++; + + +} + +void StreamBuffer::Flush(){ + _currentIndex=0; + for (uint8_t i=0; i<_definedSize; i++) _buffer[i]=0; + +} + + +void StreamBuffer::appendChannelArray(uint16_t *dataSet, uint8_t arraySize){ + //the buffer is reset + Flush(); + +if((arraySize<=_definedSize)&&(arraySize>0)){ + //fill the buffer with this datSet + for (uint8_t i=0; iappendChannelData(dataSet[i]); + } + +}else if (arraySize>_definedSize){ + //drop other packets + for (uint8_t i=0; i<_definedSize;i++){ + this->appendChannelData(dataSet[i]); + } + + +}else{ + //dont do anything if the array size if less thant 0 + +} + + +} + + +void StreamBuffer::transmitBufferAscii(Stream &stream, String sepCar){ + +for (uint8_t i=0; i<_currentIndex; i++){ + + stream.print(_buffer[i]); + stream.print(sepCar); +} +stream.println(); + + +} + + +void StreamBuffer::transmitBufferBinaryRaw8(Stream &stream){ +for(uint8_t i=0; i<_currentIndex; i++){ + _lsbBuffer[i]=(_buffer[i] & 0xFF); + _msbBuffer[i]=(_buffer[i] >> 8) & 0xFF; +} + +String header="#"+ String(String(_currentIndex).length())+String(_currentIndex*sizeof(uint8_t)); +//Send MSB AS FIRST PACKET +stream.print(header); +stream.write((uint8_t *) _msbBuffer,_currentIndex*sizeof(uint8_t)); // Send the upper byte first +stream.println(); + +//Send LSB AS SECOND PACKET +stream.print(header); +stream.write((uint8_t *) _lsbBuffer ,_currentIndex*sizeof(uint8_t)); // Send the lower byte +stream.println(); + +} + + +void StreamBuffer::transmitBufferBinaryRaw16(Stream &stream){ + +String header="#"+ String(String(_currentIndex).length())+String(_currentIndex*sizeof(uint8_t)); +stream.print(header); +stream.write((char *) _buffer, (_currentIndex)*sizeof(uint16_t)); + + +} + + +void StreamBuffer::sendBufferAsciiTimeStamp(Stream &stream, unsigned long timeStamp, String sepCar){ +stream.print(timeStamp); +stream.print(sepCar); +this->transmitBufferAscii(stream,sepCar); + +} + + +void StreamBuffer::sendBufferBinaryTimeStamp(Stream &stream, unsigned long timeStamp){ +String header="#"+ String(String(_currentIndex).length())+String(_currentIndex*sizeof(uint8_t)+sizeof(unsigned long)); + +stream.print(header); +stream.write((char *) timeStamp, sizeof(unsigned long)); +stream.write((char *) _buffer, (_currentIndex)*sizeof(uint16_t)); + +} + + +StreamBuffer::~StreamBuffer(){ + delete[] _buffer; + delete[] _lsbBuffer; + delete[] _msbBuffer; +} diff --git a/StreamChannel/StreamChannel.hpp b/StreamChannel/StreamChannel.hpp new file mode 100644 index 0000000..d9bc8eb --- /dev/null +++ b/StreamChannel/StreamChannel.hpp @@ -0,0 +1,37 @@ +#ifndef _STREAMCHANNEL_HPP_ +#define _STREAMCHANNEL_HPP_ + +#include +#include + +class StreamBuffer{ + +private: + //Declaring variables being used betwween the functions + uint16_t *_buffer; + uint8_t *_lsbBuffer; + uint8_t *_msbBuffer; + uint8_t _definedSize; + uint8_t _currentIndex; + + bool isFull(); + +public: + //Declaring API to be implemented and used afterword + StreamBuffer(); + void setMaxChannelNumber(uint8_t channelNo=3); //Allocate a buffer of 8 bit long + void appendChannelData(uint16_t); //insert the value from one channel to the BufferChannelQueue + void appendChannelArray(uint16_t *, uint8_t); //add an array with values from each channels + void transmitBufferAscii(Stream &stream, String sepCar=";"); + void transmitBufferBinaryRaw8(Stream &stream); + void transmitBufferBinaryRaw16(Stream &stream); + void sendBufferAsciiTimeStamp(Stream &stream, unsigned long, String sepCar=";"); + void sendBufferBinaryTimeStamp(Stream &stream, unsigned long); + void Flush(); + ~StreamBuffer(); + +}; + +//extern StreamBuffer StreamChannel; + +#endif /*STREAMCHANNEL_H*/ diff --git a/examples/.DS_Store b/examples/.DS_Store new file mode 100644 index 0000000..0f17413 Binary files /dev/null and b/examples/.DS_Store differ diff --git a/examples/TestBufferAscii/TestBufferAscii.ino b/examples/TestBufferAscii/TestBufferAscii.ino new file mode 100644 index 0000000..7843fda --- /dev/null +++ b/examples/TestBufferAscii/TestBufferAscii.ino @@ -0,0 +1,17 @@ +#include + +#define SIZE 3 +uint16_t DATA[SIZE]={200, 128,150}; + + +StreamBuffer Channel; + +void setup() { +Serial.begin(9600); +Channel.setMaxChannelNumber((uint8_t) SIZE); +} + +void loop() { +Channel.appendChannelArray(DATA,SIZE); +Channel.transmitBufferAscii(Serial, "\t"); +} diff --git a/examples/TestBufferAsciiTime/TestBufferAsciiTime.ino b/examples/TestBufferAsciiTime/TestBufferAsciiTime.ino new file mode 100644 index 0000000..9ba554d --- /dev/null +++ b/examples/TestBufferAsciiTime/TestBufferAsciiTime.ino @@ -0,0 +1,33 @@ +#include + +#define SIZE 3 +uint16_t DATA[SIZE]={200, 128,150}; + +unsigned long previousTime = 0; + +StreamBuffer Channel; + +void setup() { +// put your setup code here, to run once: +Serial.begin(9600); +Channel.setMaxChannelNumber((uint8_t) SIZE); +} + +void loop() { + /* Updates frequently */ + previousTime = millis(); + + Channel.appendChannelArray(DATA,SIZE); + + unsigned long currentTime = millis(); + + Channel.sendBufferAsciiTimeStamp(Serial, (currentTime - previousTime),"\t"); + + /* Update the timing for the next time around */ + previousTime = currentTime; + + + +} + + diff --git a/examples/TestBufferBinary16bits/TestBufferBinary16bits.ino b/examples/TestBufferBinary16bits/TestBufferBinary16bits.ino new file mode 100644 index 0000000..bee74bf --- /dev/null +++ b/examples/TestBufferBinary16bits/TestBufferBinary16bits.ino @@ -0,0 +1,19 @@ +#include + +#define SIZE 3 +uint16_t DATA[SIZE]={200, 128,150}; + + +StreamBuffer Channel; + +void setup() { +Serial.begin(9600); +Channel.setMaxChannelNumber((uint8_t) SIZE); +} + +void loop() { +Channel.appendChannelArray(DATA,SIZE); +Channel.transmitBufferBinaryRaw16(Serial); + + +} diff --git a/examples/TestBufferBinary16bitsTime/TestBufferBinary16bitsTime.ino b/examples/TestBufferBinary16bitsTime/TestBufferBinary16bitsTime.ino new file mode 100644 index 0000000..1ff358e --- /dev/null +++ b/examples/TestBufferBinary16bitsTime/TestBufferBinary16bitsTime.ino @@ -0,0 +1,30 @@ +#include + +#define SIZE 3 +uint16_t DATA[SIZE]={200, 128,150}; + + +StreamBuffer Channel; + +void setup() { +Serial.begin(9600); +Channel.setMaxChannelNumber((uint8_t) SIZE); +} + +void loop() { + Channel.appendChannelArray(DATA,SIZE); + + /* Updates frequently */ + previousTime = millis(); + + Channel.appendChannelArray(DATA,SIZE); + + unsigned long currentTime = millis(); + + Channel.sendBufferBinaryTimeStamp(Serial, (currentTime - previousTime)); + + + /* Update the timing for the next time around */ + previousTime = currentTime; + +} diff --git a/examples/TestBufferBinary8bits/TestBufferBinary8bits.ino b/examples/TestBufferBinary8bits/TestBufferBinary8bits.ino new file mode 100644 index 0000000..df6a93b --- /dev/null +++ b/examples/TestBufferBinary8bits/TestBufferBinary8bits.ino @@ -0,0 +1,19 @@ +#include + +#define SIZE 3 +uint16_t DATA[SIZE]={200, 128,150}; + + +StreamBuffer Channel; + +void setup() { +Serial.begin(9600); +Channel.setMaxChannelNumber((uint8_t) SIZE); +} + +void loop() { +Channel.appendChannelArray(DATA,SIZE); + +Channel.transmitBufferBinaryRaw8(Serial); + +} diff --git a/examples/TestBufferBinary8bitsTime/TestBufferBinary8bitsTime.ino b/examples/TestBufferBinary8bitsTime/TestBufferBinary8bitsTime.ino new file mode 100644 index 0000000..50ed8e3 --- /dev/null +++ b/examples/TestBufferBinary8bitsTime/TestBufferBinary8bitsTime.ino @@ -0,0 +1,20 @@ +#include + +#define SIZE 3 +uint16_t DATA[SIZE]={200, 128,150}; + + +StreamBuffer Channel; + +void setup() { +// put your setup code here, to run once: +Serial.begin(9600); +Channel.setMaxChannelNumber((uint8_t) SIZE); +} + +void loop() { +// put your main code here, to run repeatedly: +Channel.appendChannelArray(DATA,SIZE); + + +}