]> git.donarmstrong.com Git - qmk_firmware.git/commitdiff
Add sending of small frames with no zeroes
authorFred Sundvik <fsundvik@gmail.com>
Sun, 14 Feb 2016 15:45:25 +0000 (17:45 +0200)
committerFred Sundvik <fsundvik@gmail.com>
Sun, 14 Feb 2016 15:45:25 +0000 (17:45 +0200)
serial_link/protocol/byte_stuffer.c
serial_link/protocol/byte_stuffer.h
serial_link/protocol/physical.h [new file with mode: 0644]
serial_link/tests/byte_stuffer_tests.c

index f0071b1f7777c4dcb155b4831eb1dad987fae3b7..dfd5942ebc206dc95b23d91e3fca41f31990d39c 100644 (file)
@@ -24,7 +24,7 @@ SOFTWARE.
 
 #include "protocol/byte_stuffer.h"
 #include "protocol/frame_validator.h"
-#include <stdio.h>
+#include "protocol/physical.h"
 
 // This implements the "Consistent overhead byte stuffing protocol"
 // https://en.wikipedia.org/wiki/Consistent_Overhead_Byte_Stuffing
@@ -92,3 +92,13 @@ void recv_byte(byte_stuffer_state_t* state, uint8_t data) {
         }
     }
 }
+
+void send_frame(uint8_t* data, uint16_t size) {
+    if (size > 0) {
+        uint8_t numZeroes = size + 1;
+        const uint8_t zero = 0;
+        send_data(&numZeroes, 1);
+        send_data(data, size);
+        send_data(&zero, 1);
+    }
+}
index 9a5551fab583de886617d957242fab47c53d6409..ea6b8451d4e90b7317168d711744cfec0f972883 100644 (file)
@@ -25,3 +25,4 @@ SOFTWARE.
 typedef struct byte_stuffer_state byte_stuffer_state_t;
 void init_byte_stuffer_state(byte_stuffer_state_t* state);
 void recv_byte(byte_stuffer_state_t* state, uint8_t data);
+void send_frame(uint8_t* data, uint16_t size);
diff --git a/serial_link/protocol/physical.h b/serial_link/protocol/physical.h
new file mode 100644 (file)
index 0000000..73a7855
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+The MIT License (MIT)
+
+Copyright (c) 2016 Fred Sundvik
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+
+void send_data(const uint8_t* data, uint16_t size);
index bfa0193861b27604d8f4964504d825bffdaeb015..6e44c9170c5e6e7e4cf4adf6cfd6407ddd2606f7 100644 (file)
@@ -27,12 +27,16 @@ SOFTWARE.
 #include "protocol/byte_stuffer.h"
 #include "protocol/byte_stuffer.c"
 #include "protocol/frame_validator.h"
+#include "protocol/physical.h"
 
-byte_stuffer_state_t state;
+static byte_stuffer_state_t state;
+static uint8_t sent_data[MAX_FRAME_SIZE*2];
+static uint16_t sent_data_size;
 
 Describe(ByteStuffer);
 BeforeEach(ByteStuffer) {
     init_byte_stuffer_state(&state);
+    sent_data_size = 0;
 }
 AfterEach(ByteStuffer) {}
 
@@ -40,6 +44,11 @@ void recv_frame(uint8_t* data, uint16_t size) {
     mock(data, size);
 }
 
+void send_data(const uint8_t* data, uint16_t size) {
+    memcpy(sent_data + sent_data_size, data, size);
+    sent_data_size += size;
+}
+
 Ensure(ByteStuffer, receives_no_frame_for_a_single_zero_byte) {
     never_expect(recv_frame);
     recv_byte(&state, 0);
@@ -66,7 +75,7 @@ Ensure(ByteStuffer, receives_single_byte_valid_frame) {
     expect(recv_frame,
         when(size, is_equal_to(1)),
         when(data, is_equal_to_contents_of(expected, 1))
-        );
+    );
     recv_byte(&state, 2);
     recv_byte(&state, 0x37);
     recv_byte(&state, 0);
@@ -77,7 +86,7 @@ Ensure(ByteStuffer, receives_three_bytes_valid_frame) {
     expect(recv_frame,
         when(size, is_equal_to(3)),
         when(data, is_equal_to_contents_of(expected, 3))
-        );
+    );
     recv_byte(&state, 4);
     recv_byte(&state, 0x37);
     recv_byte(&state, 0x99);
@@ -90,7 +99,7 @@ Ensure(ByteStuffer, receives_single_zero_valid_frame) {
     expect(recv_frame,
         when(size, is_equal_to(1)),
         when(data, is_equal_to_contents_of(expected, 1))
-        );
+    );
     recv_byte(&state, 1);
     recv_byte(&state, 1);
     recv_byte(&state, 0);
@@ -101,7 +110,7 @@ Ensure(ByteStuffer, receives_valid_frame_with_zeroes) {
     expect(recv_frame,
         when(size, is_equal_to(4)),
         when(data, is_equal_to_contents_of(expected, 4))
-        );
+    );
     recv_byte(&state, 2);
     recv_byte(&state, 5);
     recv_byte(&state, 2);
@@ -116,11 +125,11 @@ Ensure(ByteStuffer, receives_two_valid_frames) {
     expect(recv_frame,
         when(size, is_equal_to(2)),
         when(data, is_equal_to_contents_of(expected1, 2))
-        );
+    );
     expect(recv_frame,
         when(size, is_equal_to(1)),
         when(data, is_equal_to_contents_of(expected2, 1))
-        );
+    );
     recv_byte(&state, 2);
     recv_byte(&state, 5);
     recv_byte(&state, 1);
@@ -135,7 +144,7 @@ Ensure(ByteStuffer, receives_valid_frame_after_unexpected_zero) {
     expect(recv_frame,
         when(size, is_equal_to(2)),
         when(data, is_equal_to_contents_of(expected, 2))
-        );
+    );
     recv_byte(&state, 3);
     recv_byte(&state, 1);
     recv_byte(&state, 0);
@@ -150,7 +159,7 @@ Ensure(ByteStuffer, receives_valid_frame_after_unexpected_non_zero) {
     expect(recv_frame,
         when(size, is_equal_to(2)),
         when(data, is_equal_to_contents_of(expected, 2))
-        );
+    );
     recv_byte(&state, 2);
     recv_byte(&state, 9);
     recv_byte(&state, 4); // This should have been zero
@@ -170,7 +179,7 @@ Ensure(ByteStuffer, receives_a_valid_frame_with_over254_non_zeroes_and_then_end_
     expect(recv_frame,
         when(size, is_equal_to(254)),
         when(data, is_equal_to_contents_of(expected, 254))
-        );
+    );
     recv_byte(&state, 0xFF);
     for (i=0;i<254;i++) {
         recv_byte(&state, i+1);
@@ -188,7 +197,7 @@ Ensure(ByteStuffer, receives_a_valid_frame_with_over254_non_zeroes_next_byte_is_
     expect(recv_frame,
         when(size, is_equal_to(255)),
         when(data, is_equal_to_contents_of(expected, 255))
-        );
+    );
     recv_byte(&state, 0xFF);
     for (i=0;i<254;i++) {
         recv_byte(&state, i+1);
@@ -208,7 +217,7 @@ Ensure(ByteStuffer, receives_a_valid_frame_with_over254_non_zeroes_next_byte_is_
     expect(recv_frame,
         when(size, is_equal_to(255)),
         when(data, is_equal_to_contents_of(expected, 255))
-        );
+    );
     recv_byte(&state, 0xFF);
     for (i=0;i<254;i++) {
         recv_byte(&state, i+1);
@@ -233,7 +242,7 @@ Ensure(ByteStuffer, receives_two_long_frames_and_some_more) {
     expect(recv_frame,
         when(size, is_equal_to(515)),
         when(data, is_equal_to_contents_of(expected, 510))
-        );
+    );
     recv_byte(&state, 0xFF);
     for (i=0;i<254;i++) {
         recv_byte(&state, i+1);
@@ -258,7 +267,7 @@ Ensure(ByteStuffer, receives_an_all_zeros_frame_that_is_maximum_size) {
     expect(recv_frame,
         when(size, is_equal_to(MAX_FRAME_SIZE)),
         when(data, is_equal_to_contents_of(expected, MAX_FRAME_SIZE))
-        );
+    );
     int i;
     recv_byte(&state, 1);
     for(i=0;i<MAX_FRAME_SIZE;i++) {
@@ -284,7 +293,7 @@ Ensure(ByteStuffer, received_frame_is_aborted_when_its_too_long) {
     expect(recv_frame,
         when(size, is_equal_to(1)),
         when(data, is_equal_to_contents_of(expected, 1))
-        );
+    );
     int i;
     recv_byte(&state, 1);
     for(i=0;i<MAX_FRAME_SIZE;i++) {
@@ -294,3 +303,24 @@ Ensure(ByteStuffer, received_frame_is_aborted_when_its_too_long) {
     recv_byte(&state, 1);
     recv_byte(&state, 0);
 }
+
+Ensure(ByteStuffer, send_zero_size_frame_does_nothing) {
+    assert_that(sent_data_size, is_equal_to(0));
+    send_frame(NULL, 0);
+}
+
+Ensure(ByteStuffer, send_one_byte_frame) {
+    uint8_t data[] = {5};
+    send_frame(data, 1);
+    assert_that(sent_data_size, is_equal_to(3));
+    uint8_t expected[] = {2, 5, 0};
+    assert_that(sent_data, is_equal_to_contents_of(expected, 3));
+}
+
+Ensure(ByteStuffer, send_two_byte_frame) {
+    uint8_t data[] = {5, 0x77};
+    send_frame(data, 2);
+    assert_that(sent_data_size, is_equal_to(4));
+    uint8_t expected[] = {3, 5, 0x77, 0};
+    assert_that(sent_data, is_equal_to_contents_of(expected, 4));
+}