diff --git a/R2D2 Easy Transfer b/R2D2 Easy Transfer new file mode 100644 index 0000000..4fb3890 --- /dev/null +++ b/R2D2 Easy Transfer @@ -0,0 +1,84 @@ +#include "EasyTransfer.h" + + + + +//Captures address and size of struct +void EasyTransfer::begin(uint8_t * ptr, uint8_t length, HardwareSerial *theSerial){ +address = ptr; +size = length; +_serial = theSerial; +} + +//Sends out struct in binary, with header, length info and checksum +void EasyTransfer::sendData(){ + uint8_t CS = size; + _serial->write(0x06); + _serial->write(0x85); + _serial->write(size); + for(int i = 0; iwrite(*(address+i)); + } + _serial->write(CS); + +} + +boolean EasyTransfer::receiveData(){ + + //start off by looking for the header bytes. If they were already found in a previous call, skip it. + if(rx_len == 0){ + //this size check may be redundant due to the size check below, but for now I'll leave it the way it is. + if(_serial->available() >= 3){ + //this will block until a 0x06 is found or buffer size becomes less then 3. + while(_serial->read() != 0x06) { + //This will trash any preamble junk in the serial buffer + //but we need to make sure there is enough in the buffer to process while we trash the rest + //if the buffer becomes too empty, we will escape and try again on the next call + if(_serial->available() < 3) + return false; + } + if (_serial->read() == 0x85){ + rx_len = _serial->read(); + //make sure the binary structs on both Arduinos are the same size. + if(rx_len != size){ + rx_len = 0; + return false; + } + } + } + } + + //we get here if we already found the header bytes, the struct size matched what we know, and now we are byte aligned. + if(rx_len != 0){ + while(_serial->available() && rx_array_inx <= rx_len){ + rx_array[rx_array_inx++] = _serial->read(); + } + + if(rx_len == (rx_array_inx-1)){ + //seem to have got whole message + //last uint8_t is CS + calc_CS = rx_len; + for (int i = 0; i