#include "Arduino.h" #include "SerialChannel.h" byte SerialChannel::nextId = 1; SerialChannel* SerialChannel::first = 0; SerialChannel::Message SerialChannel::buffer1[SerialChannel::MaxPendingMessages]; SerialChannel::Message SerialChannel::buffer2[SerialChannel::MaxPendingMessages]; SerialChannel::Message* SerialChannel::backBuffer; byte SerialChannel::backBufferPos; byte SerialChannel::frontBufferSize; SerialChannel::SerialChannel(const char* name_) : next(0) , id((byte)-1) , name(name_) { if(first == 0) first = this; else { SerialChannel* c = first; while(c->next != 0) c = c->next; c->next = this; } id = nextId++; } void SerialChannel::beginWriteInChannel(byte id, short byteCount, unsigned long time) { Serial.write("START"); Serial.write(id); writeULong(time); writeShort(byteCount); } void SerialChannel::write(byte* data, short byteCount, unsigned long time) { beginWrite(byteCount, time); continueWrite(data, byteCount); } void SerialChannel::beginWrite(short byteCount, unsigned long time) { if (time == (unsigned long)-1) time = micros(); handleConnection(); beginWriteInChannel(id, byteCount, time); } void SerialChannel::continueWrite(byte* data, short byteCount) { Serial.write(data, byteCount); } void SerialChannel::write(const char* text, unsigned long time) { write((byte*)text, strlen(text), time); } void SerialChannel::append(byte* data, short byteCount, unsigned long time) { if (time == (unsigned long)-1) time = micros(); Message& msg = backBuffer[backBufferPos++]; if (backBufferPos >= MaxPendingMessages) backBufferPos = MaxPendingMessages - 1; msg.id = id; msg.data = data; msg.byteCount = byteCount; msg.time = time; } void SerialChannel::append(const char* text, unsigned long time) { append((byte*)text, strlen(text), time); } void SerialChannel::swap() { backBuffer = backBuffer == buffer1 ? buffer2 : buffer1; frontBufferSize = backBufferPos; backBufferPos = 0; } void SerialChannel::flush() { handleConnection(); Message* frontBuffer = backBuffer == buffer1 ? buffer2 : buffer1; for (Message* msg = frontBuffer; msg < frontBuffer + frontBufferSize; ++msg) { beginWriteInChannel(msg->id, msg->byteCount, msg->time); Serial.write(msg->data, msg->byteCount); } } void SerialChannel::writeShort(short num) { Serial.write((byte*)&num, 2); } void SerialChannel::writeULong(unsigned long num) { Serial.write((byte*)&num, 4); } void SerialChannel::handleConnection() { int b = Serial.read(); if(b == (int)'C') { Serial.write("CONNECTION"); SerialChannel* c = first; while(c) { Serial.write("START"); Serial.write(0); Serial.write("ChannelInit"); Serial.write(c->id); writeShort(strlen(c->name)); Serial.write(c->name); c = c->next; } Serial.flush(); } }