blob: 06a39a05caac9a6fbe3e32a191c4880fbae5e671 [file] [log] [blame]
/*
* 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();
}