Add byte stuffing send support for large frames

example_keyboards
Fred Sundvik 9 years ago
parent 2f3ea76428
commit 6956c177da

@ -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,11 +104,20 @@ 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 (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);
start = data;
num_non_zero = 1;
}
else {
if (*data == 0) { if (*data == 0) {
// A zero encountered, so send the block
send_block(start, data, num_non_zero); send_block(start, data, num_non_zero);
start = data + 1; start = data + 1;
num_non_zero = 1; num_non_zero = 1;
@ -117,6 +127,7 @@ void send_frame(uint8_t* data, uint16_t size) {
} }
++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…
Cancel
Save