| /* |
| * Copyright (c) 2022 Nordic Semiconductor ASA |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #include <stddef.h> |
| |
| #include <zephyr/kernel.h> |
| |
| #include <zephyr/sys/printk.h> |
| #include <zephyr/sys/util.h> |
| |
| #include "bs_types.h" |
| #include "bs_tracing.h" |
| #include "time_machine.h" |
| #include "bstests.h" |
| |
| #define COUNT 5000 /* Arbitrary GATT Write Cmd iterations used */ |
| |
| /* Write Throughput calculation: |
| * Measure interval = 1 s |
| * Connection interval = 50 ms |
| * No. of connection intervals = 20 |
| * Single Tx time, 2M PHY = 1064 us |
| * tIFS = 150 us |
| * Single Tx duration = 1214 us |
| * Full duplex Tx-Rx duration = 2428 us |
| * Implementation dependent event overhead = 340 us |
| * Max. incomplete PDU time = 1064 us |
| * Max. radio idle time per 1 second = (1064 + 340) * 20 = 28080 us |
| * Packets per 1 second = (1000000 - 28080) / 2428 = 400.297 |
| * GATT Write data length = 244 bytes |
| * Throughput = 400 * 244 * 8 = 780800 bps |
| */ |
| #define WRITE_RATE 780800 /* GATT Write bps recorded in this test */ |
| |
| extern uint32_t central_gatt_write(uint32_t count); |
| extern uint32_t peripheral_gatt_write(uint32_t count); |
| |
| #define FAIL(...) \ |
| do { \ |
| bst_result = Failed; \ |
| bs_trace_error_time_line(__VA_ARGS__); \ |
| } while (0) |
| |
| #define PASS(...) \ |
| do { \ |
| bst_result = Passed; \ |
| bs_trace_info_time(1, __VA_ARGS__); \ |
| } while (0) |
| |
| extern enum bst_result_t bst_result; |
| |
| static void test_central_main(void) |
| { |
| uint32_t write_rate; |
| |
| write_rate = central_gatt_write(COUNT); |
| |
| printk("%s: Write Rate = %u bps\n", __func__, write_rate); |
| if (write_rate == WRITE_RATE) { |
| PASS("Central tests passed\n"); |
| } else { |
| FAIL("Central tests failed\n"); |
| } |
| |
| /* Give extra time for peripheral side to finish its iterations */ |
| k_sleep(K_SECONDS(1)); |
| |
| bs_trace_silent_exit(0); |
| } |
| |
| static void test_peripheral_main(void) |
| { |
| uint32_t write_rate; |
| |
| write_rate = peripheral_gatt_write(COUNT); |
| |
| printk("%s: Write Rate = %u bps\n", __func__, write_rate); |
| if (write_rate == WRITE_RATE) { |
| PASS("Peripheral tests passed\n"); |
| } else { |
| FAIL("Peripheral tests failed\n"); |
| } |
| } |
| |
| static void test_gatt_write_init(void) |
| { |
| bst_ticker_set_next_tick_absolute(60e6); |
| bst_result = In_progress; |
| } |
| |
| static void test_gatt_write_tick(bs_time_t HW_device_time) |
| { |
| bst_result = Failed; |
| bs_trace_error_line("Test GATT Write finished.\n"); |
| } |
| |
| static const struct bst_test_instance test_def[] = { |
| { |
| .test_id = "central", |
| .test_descr = "Central GATT Write", |
| .test_post_init_f = test_gatt_write_init, |
| .test_tick_f = test_gatt_write_tick, |
| .test_main_f = test_central_main |
| }, |
| { |
| .test_id = "peripheral", |
| .test_descr = "Peripheral GATT Write", |
| .test_post_init_f = test_gatt_write_init, |
| .test_tick_f = test_gatt_write_tick, |
| .test_main_f = test_peripheral_main |
| }, |
| BSTEST_END_MARKER |
| }; |
| |
| struct bst_test_list *test_gatt_write_install(struct bst_test_list *tests) |
| { |
| return bst_add_tests(tests, test_def); |
| } |
| |
| bst_test_install_t test_installers[] = { |
| test_gatt_write_install, |
| NULL |
| }; |
| |
| void main(void) |
| { |
| bst_main(); |
| } |