diff --git a/src/btstack_ring_buffer.c b/src/btstack_ring_buffer.c index 29f8d7ea0..91ba65821 100644 --- a/src/btstack_ring_buffer.c +++ b/src/btstack_ring_buffer.c @@ -47,6 +47,7 @@ #define ERROR_CODE_MEMORY_CAPACITY_EXCEEDED 0x07 + // init ring buffer void btstack_ring_buffer_init(btstack_ring_buffer_t * ring_buffer, uint8_t * storage, uint16_t storage_size){ ring_buffer->storage = storage; @@ -78,7 +79,6 @@ int btstack_ring_buffer_write(btstack_ring_buffer_t * ring_buffer, uint8_t * dat if (btstack_ring_buffer_bytes_free(ring_buffer) < data_length){ return ERROR_CODE_MEMORY_CAPACITY_EXCEEDED; } - // printf("\n\nbtstack_ring_buffer_write %d, ring_buffer->size %d\n", data_length, ring_buffer->size); int count = 0; while (count < data_length){ if (ring_buffer->last_written_index < ring_buffer->size - 1){ @@ -97,7 +97,7 @@ int btstack_ring_buffer_write(btstack_ring_buffer_t * ring_buffer, uint8_t * dat // fetch data_length bytes from ring buffer void btstack_ring_buffer_read(btstack_ring_buffer_t * ring_buffer, uint8_t * data, uint16_t data_length, uint16_t * number_of_bytes_read){ uint32_t count = 0; - while (*number_of_bytes_read < data_length && btstack_ring_buffer_bytes_available(ring_buffer)){ + while (count < data_length && btstack_ring_buffer_bytes_available(ring_buffer)){ if (ring_buffer->last_read_index < ring_buffer->last_written_index ) { ring_buffer->last_read_index++; } else { diff --git a/test/ring_buffer/btstack_ring_buffer_test.c b/test/ring_buffer/btstack_ring_buffer_test.c index 289d93af4..4abf2793d 100644 --- a/test/ring_buffer/btstack_ring_buffer_test.c +++ b/test/ring_buffer/btstack_ring_buffer_test.c @@ -70,6 +70,24 @@ TEST(RingBuffer, ReadWrite){ } } +TEST(RingBuffer, ReadWriteChunks){ + uint8_t test_write_data[] = {1,2,3,4,5,6}; + int test_data_size = sizeof(test_write_data); + int chunk_size = 3; + uint8_t test_read_data[chunk_size]; + + btstack_ring_buffer_write(&ring_buffer, test_write_data, test_data_size); + CHECK_EQUAL(test_data_size, btstack_ring_buffer_bytes_available(&ring_buffer)); + + while (test_data_size){ + memset(test_read_data, 0, chunk_size); + uint16_t number_of_bytes_read = 0; + btstack_ring_buffer_read(&ring_buffer, test_read_data, chunk_size, &number_of_bytes_read); + test_data_size -= chunk_size; + CHECK_EQUAL(test_data_size, btstack_ring_buffer_bytes_available(&ring_buffer)); + } +} + int main (int argc, const char * argv[]){ return CommandLineTestRunner::RunAllTests(argc, argv); } \ No newline at end of file