]> git.donarmstrong.com Git - qmk_firmware.git/commitdiff
Add byte stuffer recv handling of too long frames
authorFred Sundvik <fsundvik@gmail.com>
Sun, 14 Feb 2016 13:57:44 +0000 (15:57 +0200)
committerFred Sundvik <fsundvik@gmail.com>
Sun, 14 Feb 2016 13:57:44 +0000 (15:57 +0200)
.gitignore [new file with mode: 0644]
serial_link/protocol/byte_stuffer.c
serial_link/tests/byte_stuffer_tests.c

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..2d68e20
--- /dev/null
@@ -0,0 +1 @@
+*.stackdump
index cc7afe97ae99a53c97dabf83ffd29d713b60f686..f0071b1f7777c4dcb155b4831eb1dad987fae3b7 100644 (file)
@@ -45,9 +45,6 @@ void init_byte_stuffer_state(byte_stuffer_state_t* state) {
     state->long_frame = false;
 }
 
-static void start_frame(byte_stuffer_state_t* state, uint8_t data) {
-}
-
 void recv_byte(byte_stuffer_state_t* state, uint8_t data) {
     // Start of a new frame
     if (state->next_zero == 0) {
@@ -61,7 +58,9 @@ void recv_byte(byte_stuffer_state_t* state, uint8_t data) {
     if (data == 0) {
         if (state->next_zero == 0) {
             // The frame is completed
-            recv_frame(state->data, state->data_pos);
+            if (state->data_pos > 0) {
+                recv_frame(state->data, state->data_pos);
+            }
         }
         else {
             // The frame is invalid, so reset
@@ -69,8 +68,16 @@ void recv_byte(byte_stuffer_state_t* state, uint8_t data) {
         }
     }
     else {
-        if (state->next_zero == 0) {
+        if (state->data_pos == MAX_FRAME_SIZE) {
+            // We exceeded our maximum frame size
+            // therefore there's nothing else to do than reset to a new frame
+            state->next_zero = data;
+            state->long_frame = data == 0xFF;
+            state->data_pos = 0;
+        }
+        else if (state->next_zero == 0) {
             if (state->long_frame) {
+                // This is part of a long frame, so continue
                 state->next_zero = data;
                 state->long_frame = data == 0xFF;
             }
index a28c3619382b013171af6ae83c8003e114bc02d0..bfa0193861b27604d8f4964504d825bffdaeb015 100644 (file)
@@ -55,6 +55,12 @@ Ensure(ByteStuffer, receives_no_frame_for_a_single_random_byte) {
     recv_byte(&state, 0x4A);
 }
 
+Ensure(ByteStuffer, receives_no_frame_for_a_zero_length_frame) {
+    never_expect(recv_frame);
+    recv_byte(&state, 1);
+    recv_byte(&state, 0);
+}
+
 Ensure(ByteStuffer, receives_single_byte_valid_frame) {
     uint8_t expected[] = {0x37};
     expect(recv_frame,
@@ -246,3 +252,45 @@ Ensure(ByteStuffer, receives_two_long_frames_and_some_more) {
     recv_byte(&state, 7);
     recv_byte(&state, 0);
 }
+
+Ensure(ByteStuffer, receives_an_all_zeros_frame_that_is_maximum_size) {
+    uint8_t expected[MAX_FRAME_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++) {
+       recv_byte(&state, 1);
+    }
+    recv_byte(&state, 0);
+}
+
+Ensure(ByteStuffer, doesnt_recv_a_frame_thats_too_long_all_zeroes) {
+    uint8_t expected[1] = {0};
+    never_expect(recv_frame);
+    int i;
+    recv_byte(&state, 1);
+    for(i=0;i<MAX_FRAME_SIZE;i++) {
+       recv_byte(&state, 1);
+    }
+    recv_byte(&state, 1);
+    recv_byte(&state, 0);
+}
+
+Ensure(ByteStuffer, received_frame_is_aborted_when_its_too_long) {
+    uint8_t expected[1] = {1};
+    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++) {
+       recv_byte(&state, 1);
+    }
+    recv_byte(&state, 2);
+    recv_byte(&state, 1);
+    recv_byte(&state, 0);
+}