mirror of
https://github.com/qmk/qmk_firmware.git
synced 2024-11-28 14:10:13 +00:00
Hanlde sending of zero bytes for small packets
This commit is contained in:
parent
a089eaa868
commit
f3beeb0270
@ -93,12 +93,31 @@ void recv_byte(byte_stuffer_state_t* state, uint8_t data) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void send_block(uint8_t* start, uint8_t* end, uint8_t num_non_zero) {
|
||||||
|
send_data(&num_non_zero, 1);
|
||||||
|
if (end > start) {
|
||||||
|
send_data(start, end-start);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void send_frame(uint8_t* data, uint16_t size) {
|
void send_frame(uint8_t* data, uint16_t size) {
|
||||||
|
const uint8_t zero = 0;
|
||||||
if (size > 0) {
|
if (size > 0) {
|
||||||
uint8_t numZeroes = size + 1;
|
uint8_t num_non_zero = 1;
|
||||||
const uint8_t zero = 0;
|
uint8_t* end = data + size;
|
||||||
send_data(&numZeroes, 1);
|
uint8_t* start = data;
|
||||||
send_data(data, size);
|
while (data < end) {
|
||||||
|
if (*data == 0) {
|
||||||
|
send_block(start, data, num_non_zero);
|
||||||
|
start = data + 1;
|
||||||
|
num_non_zero = 1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
num_non_zero++;
|
||||||
|
}
|
||||||
|
++data;
|
||||||
|
}
|
||||||
|
send_block(start, data, num_non_zero);
|
||||||
send_data(&zero, 1);
|
send_data(&zero, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -312,15 +312,63 @@ Ensure(ByteStuffer, send_zero_size_frame_does_nothing) {
|
|||||||
Ensure(ByteStuffer, send_one_byte_frame) {
|
Ensure(ByteStuffer, send_one_byte_frame) {
|
||||||
uint8_t data[] = {5};
|
uint8_t data[] = {5};
|
||||||
send_frame(data, 1);
|
send_frame(data, 1);
|
||||||
assert_that(sent_data_size, is_equal_to(3));
|
|
||||||
uint8_t expected[] = {2, 5, 0};
|
uint8_t expected[] = {2, 5, 0};
|
||||||
assert_that(sent_data, is_equal_to_contents_of(expected, 3));
|
assert_that(sent_data_size, is_equal_to(sizeof(expected)));
|
||||||
|
assert_that(sent_data, is_equal_to_contents_of(expected, sizeof(expected)));
|
||||||
}
|
}
|
||||||
|
|
||||||
Ensure(ByteStuffer, send_two_byte_frame) {
|
Ensure(ByteStuffer, send_two_byte_frame) {
|
||||||
uint8_t data[] = {5, 0x77};
|
uint8_t data[] = {5, 0x77};
|
||||||
send_frame(data, 2);
|
send_frame(data, 2);
|
||||||
assert_that(sent_data_size, is_equal_to(4));
|
|
||||||
uint8_t expected[] = {3, 5, 0x77, 0};
|
uint8_t expected[] = {3, 5, 0x77, 0};
|
||||||
assert_that(sent_data, is_equal_to_contents_of(expected, 4));
|
assert_that(sent_data_size, is_equal_to(sizeof(expected)));
|
||||||
|
assert_that(sent_data, is_equal_to_contents_of(expected, sizeof(expected)));
|
||||||
|
}
|
||||||
|
|
||||||
|
Ensure(ByteStuffer, send_one_byte_frame_with_zero) {
|
||||||
|
uint8_t data[] = {0};
|
||||||
|
send_frame(data, 1);
|
||||||
|
uint8_t expected[] = {1, 1, 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, send_two_byte_frame_starting_with_zero) {
|
||||||
|
uint8_t data[] = {0, 9};
|
||||||
|
send_frame(data, 2);
|
||||||
|
uint8_t expected[] = {1, 2, 9, 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, send_two_byte_frame_starting_with_non_zero) {
|
||||||
|
uint8_t data[] = {9, 0};
|
||||||
|
send_frame(data, 2);
|
||||||
|
uint8_t expected[] = {2, 9, 1, 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, send_three_byte_frame_zero_in_the_middle) {
|
||||||
|
uint8_t data[] = {9, 0, 0x68};
|
||||||
|
send_frame(data, 3);
|
||||||
|
uint8_t expected[] = {2, 9, 2, 0x68, 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, send_three_byte_frame_data_in_the_middle) {
|
||||||
|
uint8_t data[] = {0, 0x55, 0};
|
||||||
|
send_frame(data, 3);
|
||||||
|
uint8_t expected[] = {1, 2, 0x55, 1, 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, send_three_byte_frame_all_zeroes) {
|
||||||
|
uint8_t data[] = {0, 0, 0};
|
||||||
|
send_frame(data, 3);
|
||||||
|
uint8_t expected[] = {1, 1, 1, 1, 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 New Issue
Block a user