Add byte stuffing send support for large frames
This commit is contained in:
parent
2f3ea76428
commit
6956c177da
2 changed files with 72 additions and 5 deletions
|
@ -25,6 +25,7 @@ SOFTWARE.
|
||||||
#include "protocol/byte_stuffer.h"
|
#include "protocol/byte_stuffer.h"
|
||||||
#include "protocol/frame_validator.h"
|
#include "protocol/frame_validator.h"
|
||||||
#include "protocol/physical.h"
|
#include "protocol/physical.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
// This implements the "Consistent overhead byte stuffing protocol"
|
// This implements the "Consistent overhead byte stuffing protocol"
|
||||||
// https://en.wikipedia.org/wiki/Consistent_Overhead_Byte_Stuffing
|
// https://en.wikipedia.org/wiki/Consistent_Overhead_Byte_Stuffing
|
||||||
|
@ -103,19 +104,29 @@ static void send_block(uint8_t* start, uint8_t* end, uint8_t num_non_zero) {
|
||||||
void send_frame(uint8_t* data, uint16_t size) {
|
void send_frame(uint8_t* data, uint16_t size) {
|
||||||
const uint8_t zero = 0;
|
const uint8_t zero = 0;
|
||||||
if (size > 0) {
|
if (size > 0) {
|
||||||
uint8_t num_non_zero = 1;
|
uint16_t num_non_zero = 1;
|
||||||
uint8_t* end = data + size;
|
uint8_t* end = data + size;
|
||||||
uint8_t* start = data;
|
uint8_t* start = data;
|
||||||
while (data < end) {
|
while (data < end) {
|
||||||
if (*data == 0) {
|
if (num_non_zero == 0xFF) {
|
||||||
|
// There's more data after big non-zero block
|
||||||
|
// So send it, and start a new block
|
||||||
send_block(start, data, num_non_zero);
|
send_block(start, data, num_non_zero);
|
||||||
start = data + 1;
|
start = data;
|
||||||
num_non_zero = 1;
|
num_non_zero = 1;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
num_non_zero++;
|
if (*data == 0) {
|
||||||
|
// A zero encountered, so send the block
|
||||||
|
send_block(start, data, num_non_zero);
|
||||||
|
start = data + 1;
|
||||||
|
num_non_zero = 1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
num_non_zero++;
|
||||||
|
}
|
||||||
|
++data;
|
||||||
}
|
}
|
||||||
++data;
|
|
||||||
}
|
}
|
||||||
send_block(start, data, num_non_zero);
|
send_block(start, data, num_non_zero);
|
||||||
send_data(&zero, 1);
|
send_data(&zero, 1);
|
||||||
|
|
|
@ -372,3 +372,59 @@ Ensure(ByteStuffer, sends_three_byte_frame_with_all_zeroes) {
|
||||||
assert_that(sent_data_size, is_equal_to(sizeof(expected)));
|
assert_that(sent_data_size, is_equal_to(sizeof(expected)));
|
||||||
assert_that(sent_data, is_equal_to_contents_of(expected, sizeof(expected)));
|
assert_that(sent_data, is_equal_to_contents_of(expected, sizeof(expected)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Ensure(ByteStuffer, sends_frame_with_254_non_zeroes) {
|
||||||
|
uint8_t data[254];
|
||||||
|
int i;
|
||||||
|
for(i=0;i<254;i++) {
|
||||||
|
data[i] = i + 1;
|
||||||
|
}
|
||||||
|
send_frame(data, 254);
|
||||||
|
uint8_t expected[256];
|
||||||
|
expected[0] = 0xFF;
|
||||||
|
for(i=1;i<255;i++) {
|
||||||
|
expected[i] = i;
|
||||||
|
}
|
||||||
|
expected[255] = 0;
|
||||||
|
assert_that(sent_data_size, is_equal_to(sizeof(expected)));
|
||||||
|
assert_that(sent_data, is_equal_to_contents_of(expected, sizeof(expected)));
|
||||||
|
}
|
||||||
|
|
||||||
|
Ensure(ByteStuffer, sends_frame_with_255_non_zeroes) {
|
||||||
|
uint8_t data[255];
|
||||||
|
int i;
|
||||||
|
for(i=0;i<255;i++) {
|
||||||
|
data[i] = i + 1;
|
||||||
|
}
|
||||||
|
send_frame(data, 255);
|
||||||
|
uint8_t expected[258];
|
||||||
|
expected[0] = 0xFF;
|
||||||
|
for(i=1;i<255;i++) {
|
||||||
|
expected[i] = i;
|
||||||
|
}
|
||||||
|
expected[255] = 2;
|
||||||
|
expected[256] = 255;
|
||||||
|
expected[257] = 0;
|
||||||
|
assert_that(sent_data_size, is_equal_to(sizeof(expected)));
|
||||||
|
assert_that(sent_data, is_equal_to_contents_of(expected, sizeof(expected)));
|
||||||
|
}
|
||||||
|
|
||||||
|
Ensure(ByteStuffer, sends_frame_with_254_non_zeroes_followed_by_zero) {
|
||||||
|
uint8_t data[255];
|
||||||
|
int i;
|
||||||
|
for(i=0;i<254;i++) {
|
||||||
|
data[i] = i + 1;
|
||||||
|
}
|
||||||
|
data[255] = 0;
|
||||||
|
send_frame(data, 255);
|
||||||
|
uint8_t expected[258];
|
||||||
|
expected[0] = 0xFF;
|
||||||
|
for(i=1;i<255;i++) {
|
||||||
|
expected[i] = i;
|
||||||
|
}
|
||||||
|
expected[255] = 1;
|
||||||
|
expected[256] = 1;
|
||||||
|
expected[257] = 0;
|
||||||
|
assert_that(sent_data_size, is_equal_to(sizeof(expected)));
|
||||||
|
assert_that(sent_data, is_equal_to_contents_of(expected, sizeof(expected)));
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue