From e15a7e1267a6f733d734c5d3b59f3acc28bb4b29 Mon Sep 17 00:00:00 2001 From: Jakob Odersky Date: Mon, 25 Feb 2013 19:39:53 +0100 Subject: initial commit --- arduino/ace_cpp_old/Framer.cpp | 101 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 arduino/ace_cpp_old/Framer.cpp (limited to 'arduino/ace_cpp_old/Framer.cpp') diff --git a/arduino/ace_cpp_old/Framer.cpp b/arduino/ace_cpp_old/Framer.cpp new file mode 100644 index 0000000..03335af --- /dev/null +++ b/arduino/ace_cpp_old/Framer.cpp @@ -0,0 +1,101 @@ +#include "Framer.h" + +Framer::Framer(): + state(WAITING), + position(-1), + checksum(0) { +} + +void Framer::reset() { + position = -1; + checksum = 0x00; +} + +void Framer::accept(uint8_t byte) { + + //if a new byte would cause an overflow, restart frame + //note that this should not happen if both communicating parties have defined the same maximum frame length + if (position >= MAX_FRAME_SIZE) { + reset(); + return; + } + + if (position != -1) { // i.e. a previous byte exists + frameBuffer[position] = staged; + checksum = checksum ^ staged; + } + + position += 1; + staged = byte; + +} + +void Framer::put(uint8_t byte) { + + switch(state) { + case ESCAPING: + accept(byte); + state = RECEIVING; + break; + + case WAITING: + if (byte == START) { + reset(); + state = RECEIVING; + } + break; + + case RECEIVING: + switch(byte) { + case ESCAPE: + state = ESCAPING; + break; + case START: + reset(); + break; + case STOP: + state = WAITING; + if (staged == checksum) { //at this point, staged byte is the checksum sent in the frame (last byte of frame) + onFrame(position, frameBuffer); + } + break; + + default: + accept(byte); + break; + } + } +} + + + +void Framer::send(uint16_t length, const uint8_t * const data) { + uint8_t checksum = 0x00; + uint8_t byte; + + onSendByte(START); + for (int i = 0; i < length; ++i) { + byte = data[i]; + if (isCommandByte(byte)) + onSendByte(ESCAPE); + checksum = checksum ^ byte; + isCommandByte(byte); + } + if (isCommandByte(checksum)) { + onSendByte(ESCAPE); + } + onSendByte(checksum); + onSendByte(STOP); +}; + + + //~ cli(); + //~ TCCR1A = 0; // set entire TCCR1A register to 0 + //~ TCCR1B = 0; // same for TCCR1B + //~ // turn on CTC mode: + //~ TCCR1B |= (1 << WGM12); + //~ // set CS31 for 64 prescaler + //~ TCCR1B |= (1 << CS11); + //~ // set compare match register to desired timer count: + //~ OCR1A = F_CPU / 1000 / 64; // should be 250 for F_CPU=16Mhz and f = 1000Hz + //~ sei(); -- cgit v1.2.3