初始提交

This commit is contained in:
2025-05-13 22:00:58 +08:00
commit e4c030b0c0
564 changed files with 78858 additions and 0 deletions

View File

@ -0,0 +1,8 @@
#===============================================================================
# @brief cmake file
# Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2023-2023. All rights reserved.
#===============================================================================
add_subdirectory_if_exist(src)
set(SOURCES "${SOURCES}" PARENT_SCOPE)
set(PUBLIC_HEADER "${PUBLIC_HEADER}" "${CMAKE_CURRENT_SOURCE_DIR}/inc" PARENT_SCOPE)

View File

@ -0,0 +1,54 @@
/*
* Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022. All rights reserved.
*
* Description: SLE private service register sample of client.
*/
/**
* @defgroup SLE UUID CLIENT API
* @ingroup
* @{
*/
#ifndef SLE_CLIENT_ADV_H
#define SLE_CLIENT_ADV_H
/**
* @if Eng
* @brief sle uuid client init.
* @attention NULL
* @retval ERRCODE_SLE_SUCCESS Excute successfully
* @retval ERRCODE_SLE_FAIL Execute fail
* @par Dependency:
* @li NULL
* @else
* @brief sle uuid客户端初始化。
* @attention NULL
* @retval ERRCODE_SLE_SUCCESS 执行成功
* @retval ERRCODE_SLE_FAIL 执行失败
* @par 依赖:
* @li NULL
* @endif
*/
void sle_client_init(ssapc_notification_callback notification_cb, ssapc_indication_callback indication_cb);
/**
* @if Eng
* @brief sle start scan.
* @attention NULL
* @retval ERRCODE_SLE_SUCCESS Excute successfully
* @retval ERRCODE_SLE_FAIL Execute fail
* @par Dependency:
* @li NULL
* @else
* @brief sle启动扫描。
* @attention NULL
* @retval ERRCODE_SLE_SUCCESS 执行成功
* @retval ERRCODE_SLE_FAIL 执行失败
* @par 依赖:
* @li NULL
* @endif
*/
void sle_start_scan(void);
#endif

View File

@ -0,0 +1,7 @@
#===============================================================================
# @brief cmake file
# Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2023-2023. All rights reserved.
#===============================================================================
set(SOURCES "${SOURCES}"
"${CMAKE_CURRENT_SOURCE_DIR}/sle_speed_client.c"
PARENT_SCOPE)

View File

@ -0,0 +1,376 @@
/**
* Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022. All rights reserved.
*
* Description: SLE private service register sample of client.
*/
#include "app_init.h"
#include "systick.h"
#include "tcxo.h"
#include "los_memory.h"
#include "securec.h"
#include "soc_osal.h"
#include "common_def.h"
#include "sle_device_discovery.h"
#include "sle_connection_manager.h"
#include "sle_ssap_client.h"
#include "sle_speed_client.h"
#undef THIS_FILE_ID
#define THIS_FILE_ID BTH_GLE_SAMPLE_UUID_CLIENT
#define SLE_MTU_SIZE_DEFAULT 1500
#define SLE_SEEK_INTERVAL_DEFAULT 100
#define SLE_SEEK_WINDOW_DEFAULT 100
#define UUID_16BIT_LEN 2
#define UUID_128BIT_LEN 16
#define SLE_SPEED_HUNDRED 100 /* 100 */
#define SPEED_DEFAULT_CONN_INTERVAL 0x14
#define SPEED_DEFAULT_TIMEOUT_MULTIPLIER 0x1f4
#define SPEED_DEFAULT_SCAN_INTERVAL 400
#define SPEED_DEFAULT_SCAN_WINDOW 20
static int g_recv_pkt_num = 0;
static uint64_t g_count_before_get_us;
static uint64_t g_count_after_get_us;
#ifdef CONFIG_LARGE_THROUGHPUT_CLIENT
#define RECV_PKT_CNT 1000
#else
#define RECV_PKT_CNT 1
#endif
static int g_rssi_sum = 0;
static int g_rssi_number = 0;
static sle_announce_seek_callbacks_t g_seek_cbk = {0};
static sle_connection_callbacks_t g_connect_cbk = {0};
static ssapc_callbacks_t g_ssapc_cbk = {0};
static sle_addr_t g_remote_addr = {0};
static uint16_t g_conn_id = 0;
static ssapc_find_service_result_t g_find_service_result = {0};
void sle_sample_sle_enable_cbk(errcode_t status)
{
if (status == 0) {
sle_start_scan();
}
}
void sle_sample_seek_enable_cbk(errcode_t status)
{
if (status == 0) {
return;
}
}
void sle_sample_seek_disable_cbk(errcode_t status)
{
if (status == 0) {
sle_connect_remote_device(&g_remote_addr);
}
}
void sle_sample_seek_result_info_cbk(sle_seek_result_info_t *seek_result_data)
{
if (seek_result_data != NULL) {
uint8_t mac[SLE_ADDR_LEN] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66};
if (memcmp(seek_result_data->addr.addr, mac, SLE_ADDR_LEN) == 0) {
(void)memcpy_s(&g_remote_addr, sizeof(sle_addr_t), &seek_result_data->addr, sizeof(sle_addr_t));
sle_stop_seek();
}
}
}
static uint32_t get_float_int(float in)
{
return (uint32_t)(((uint64_t)(in * SLE_SPEED_HUNDRED)) / SLE_SPEED_HUNDRED);
}
static uint32_t get_float_dec(float in)
{
return (uint32_t)(((uint64_t)(in * SLE_SPEED_HUNDRED)) % SLE_SPEED_HUNDRED);
}
static void sle_speed_notification_cb(uint8_t client_id, uint16_t conn_id, ssapc_handle_value_t *data,
errcode_t status)
{
unused(client_id);
unused(status);
sle_read_remote_device_rssi(conn_id); // 用于统计rssi均值
if (g_recv_pkt_num == 0) {
g_count_before_get_us = uapi_tcxo_get_us();
} else if (g_recv_pkt_num == RECV_PKT_CNT) {
g_count_after_get_us = uapi_tcxo_get_us();
printf("g_count_after_get_us = %llu, g_count_before_get_us = %llu, data_len = %d\r\n",
g_count_after_get_us, g_count_before_get_us, data->data_len);
float time = (float)(g_count_after_get_us - g_count_before_get_us) / 1000000.0; /* 1s = 1000000.0us */
printf("time = %d.%d s\r\n", get_float_int(time), get_float_dec(time));
uint16_t len = data->data_len;
float speed = len * RECV_PKT_CNT * 8 / time; /* 1B = 8bits */
printf("speed = %d.%d bps\r\n", get_float_int(speed), get_float_dec(speed));
g_recv_pkt_num = 0;
g_count_before_get_us = g_count_after_get_us;
}
g_recv_pkt_num++;
}
static void sle_speed_indication_cb(uint8_t client_id, uint16_t conn_id, ssapc_handle_value_t *data,
errcode_t status)
{
unused(status);
unused(conn_id);
unused(client_id);
osal_printk("\n sle_speed_indication_cb sle uart recived data : %s\r\n", data->data);
}
void sle_sample_seek_cbk_register(void)
{
g_seek_cbk.sle_enable_cb = sle_sample_sle_enable_cbk;
g_seek_cbk.seek_enable_cb = sle_sample_seek_enable_cbk;
g_seek_cbk.seek_disable_cb = sle_sample_seek_disable_cbk;
g_seek_cbk.seek_result_cb = sle_sample_seek_result_info_cbk;
}
void sle_sample_connect_state_changed_cbk(uint16_t conn_id, const sle_addr_t *addr,
sle_acb_state_t conn_state, sle_pair_state_t pair_state, sle_disc_reason_t disc_reason)
{
osal_printk("[ssap client] conn state changed conn_id:%d, addr:%02x***%02x%02x\n", conn_id, addr->addr[0],
addr->addr[4], addr->addr[5]); /* 0 4 5: addr index */
osal_printk("[ssap client] conn state changed disc_reason:0x%x\n", disc_reason);
if (conn_state == SLE_ACB_STATE_CONNECTED) {
if (pair_state == SLE_PAIR_NONE) {
sle_pair_remote_device(&g_remote_addr);
}
g_conn_id = conn_id;
}
}
void sle_sample_pair_complete_cbk(uint16_t conn_id, const sle_addr_t *addr, errcode_t status)
{
osal_printk("[ssap client] pair complete conn_id:%d, addr:%02x***%02x%02x\n", conn_id, addr->addr[0],
addr->addr[4], addr->addr[5]); /* 0 4 5: addr index */
if (status == 0) {
ssap_exchange_info_t info = {0};
info.mtu_size = SLE_MTU_SIZE_DEFAULT;
info.version = 1;
ssapc_exchange_info_req(1, g_conn_id, &info);
}
}
void sle_sample_update_cbk(uint16_t conn_id, errcode_t status, const sle_connection_param_update_evt_t *param)
{
unused(status);
osal_printk("[ssap client] updat state changed conn_id:%d, interval = %02x\n", conn_id, param->interval);
}
void sle_sample_update_req_cbk(uint16_t conn_id, errcode_t status, const sle_connection_param_update_req_t *param)
{
unused(conn_id);
unused(status);
osal_printk("[ssap client] sle_sample_update_req_cbk interval_min = %02x, interval_max = %02x\n",
param->interval_min, param->interval_max);
}
void sle_sample_read_rssi_cbk(uint16_t conn_id, int8_t rssi, errcode_t status)
{
unused(conn_id);
unused(status);
g_rssi_sum = g_rssi_sum + rssi;
g_rssi_number++;
if (g_rssi_number == RECV_PKT_CNT) {
osal_printk("rssi average = %d dbm\r\n", g_rssi_sum / g_rssi_number);
g_rssi_sum = 0;
g_rssi_number = 0;
}
}
void sle_sample_connect_cbk_register(void)
{
g_connect_cbk.connect_state_changed_cb = sle_sample_connect_state_changed_cbk;
g_connect_cbk.pair_complete_cb = sle_sample_pair_complete_cbk;
g_connect_cbk.connect_param_update_req_cb = sle_sample_update_req_cbk;
g_connect_cbk.connect_param_update_cb = sle_sample_update_cbk;
g_connect_cbk.read_rssi_cb = sle_sample_read_rssi_cbk;
}
void sle_sample_exchange_info_cbk(uint8_t client_id, uint16_t conn_id, ssap_exchange_info_t *param,
errcode_t status)
{
osal_printk("[ssap client] pair complete client id:%d status:%d\n", client_id, status);
osal_printk("[ssap client] exchange mtu, mtu size: %d, version: %d.\n",
param->mtu_size, param->version);
ssapc_find_structure_param_t find_param = {0};
find_param.type = SSAP_FIND_TYPE_PRIMARY_SERVICE;
find_param.start_hdl = 1;
find_param.end_hdl = 0xFFFF;
ssapc_find_structure(0, conn_id, &find_param);
}
void sle_sample_find_structure_cbk(uint8_t client_id, uint16_t conn_id, ssapc_find_service_result_t *service,
errcode_t status)
{
osal_printk("[ssap client] find structure cbk client: %d conn_id:%d status: %d \n",
client_id, conn_id, status);
osal_printk("[ssap client] find structure start_hdl:[0x%02x], end_hdl:[0x%02x], uuid len:%d\r\n",
service->start_hdl, service->end_hdl, service->uuid.len);
if (service->uuid.len == UUID_16BIT_LEN) {
osal_printk("[ssap client] structure uuid:[0x%02x][0x%02x]\r\n",
service->uuid.uuid[14], service->uuid.uuid[15]); /* 14 15: uuid index */
} else {
for (uint8_t idx = 0; idx < UUID_128BIT_LEN; idx++) {
osal_printk("[ssap client] structure uuid[%d]:[0x%02x]\r\n", idx, service->uuid.uuid[idx]);
}
}
g_find_service_result.start_hdl = service->start_hdl;
g_find_service_result.end_hdl = service->end_hdl;
memcpy_s(&g_find_service_result.uuid, sizeof(sle_uuid_t), &service->uuid, sizeof(sle_uuid_t));
}
void sle_sample_find_structure_cmp_cbk(uint8_t client_id, uint16_t conn_id,
ssapc_find_structure_result_t *structure_result, errcode_t status)
{
osal_printk("[ssap client] find structure cmp cbk client id:%d status:%d type:%d uuid len:%d \r\n",
client_id, status, structure_result->type, structure_result->uuid.len);
if (structure_result->uuid.len == UUID_16BIT_LEN) {
osal_printk("[ssap client] find structure cmp cbk structure uuid:[0x%02x][0x%02x]\r\n",
structure_result->uuid.uuid[14], structure_result->uuid.uuid[15]); /* 14 15: uuid index */
} else {
for (uint8_t idx = 0; idx < UUID_128BIT_LEN; idx++) {
osal_printk("[ssap client] find structure cmp cbk structure uuid[%d]:[0x%02x]\r\n", idx,
structure_result->uuid.uuid[idx]);
}
}
uint8_t data[] = {0x11, 0x22, 0x33, 0x44};
uint8_t len = sizeof(data);
ssapc_write_param_t param = {0};
param.handle = g_find_service_result.start_hdl;
param.type = SSAP_PROPERTY_TYPE_VALUE;
param.data_len = len;
param.data = data;
ssapc_write_req(0, conn_id, &param);
}
void sle_sample_find_property_cbk(uint8_t client_id, uint16_t conn_id,
ssapc_find_property_result_t *property, errcode_t status)
{
osal_printk("[ssap client] find property cbk, client id: %d, conn id: %d, operate ind: %d, "
"descriptors count: %d status:%d.\n", client_id, conn_id, property->operate_indication,
property->descriptors_count, status);
for (uint16_t idx = 0; idx < property->descriptors_count; idx++) {
osal_printk("[ssap client] find property cbk, descriptors type [%d]: 0x%02x.\n",
idx, property->descriptors_type[idx]);
}
if (property->uuid.len == UUID_16BIT_LEN) {
osal_printk("[ssap client] find property cbk, uuid: %02x %02x.\n",
property->uuid.uuid[14], property->uuid.uuid[15]); /* 14 15: uuid index */
} else if (property->uuid.len == UUID_128BIT_LEN) {
for (uint16_t idx = 0; idx < UUID_128BIT_LEN; idx++) {
osal_printk("[ssap client] find property cbk, uuid [%d]: %02x.\n",
idx, property->uuid.uuid[idx]);
}
}
}
void sle_sample_write_cfm_cbk(uint8_t client_id, uint16_t conn_id, ssapc_write_result_t *write_result,
errcode_t status)
{
osal_printk("[ssap client] write cfm cbk, client id: %d status:%d.\n", client_id, status);
ssapc_read_req(0, conn_id, write_result->handle, write_result->type);
}
void sle_sample_read_cfm_cbk(uint8_t client_id, uint16_t conn_id, ssapc_handle_value_t *read_data,
errcode_t status)
{
osal_printk("[ssap client] read cfm cbk client id: %d conn id: %d status: %d\n",
client_id, conn_id, status);
osal_printk("[ssap client] read cfm cbk handle: %d, type: %d , len: %d\n",
read_data->handle, read_data->type, read_data->data_len);
for (uint16_t idx = 0; idx < read_data->data_len; idx++) {
osal_printk("[ssap client] read cfm cbk[%d] 0x%02x\r\n", idx, read_data->data[idx]);
}
}
void sle_sample_ssapc_cbk_register(ssapc_notification_callback notification_cb,
ssapc_notification_callback indication_cb)
{
g_ssapc_cbk.exchange_info_cb = sle_sample_exchange_info_cbk;
g_ssapc_cbk.find_structure_cb = sle_sample_find_structure_cbk;
g_ssapc_cbk.find_structure_cmp_cb = sle_sample_find_structure_cmp_cbk;
g_ssapc_cbk.ssapc_find_property_cbk = sle_sample_find_property_cbk;
g_ssapc_cbk.write_cfm_cb = sle_sample_write_cfm_cbk;
g_ssapc_cbk.read_cfm_cb = sle_sample_read_cfm_cbk;
g_ssapc_cbk.notification_cb = notification_cb;
g_ssapc_cbk.indication_cb = indication_cb;
}
void sle_speed_connect_param_init(void)
{
sle_default_connect_param_t param = {0};
param.enable_filter_policy = 0;
param.gt_negotiate = 0;
param.initiate_phys = 1;
param.max_interval = SPEED_DEFAULT_CONN_INTERVAL;
param.min_interval = SPEED_DEFAULT_CONN_INTERVAL;
param.scan_interval = SPEED_DEFAULT_SCAN_INTERVAL;
param.scan_window = SPEED_DEFAULT_SCAN_WINDOW;
param.timeout = SPEED_DEFAULT_TIMEOUT_MULTIPLIER;
sle_default_connection_param_set(&param);
}
void sle_client_init(ssapc_notification_callback notification_cb, ssapc_indication_callback indication_cb)
{
uint8_t local_addr[SLE_ADDR_LEN] = {0x13, 0x67, 0x5c, 0x07, 0x00, 0x51};
sle_addr_t local_address;
local_address.type = 0;
(void)memcpy_s(local_address.addr, SLE_ADDR_LEN, local_addr, SLE_ADDR_LEN);
sle_sample_seek_cbk_register();
sle_speed_connect_param_init();
sle_sample_connect_cbk_register();
sle_sample_ssapc_cbk_register(notification_cb, indication_cb);
sle_announce_seek_register_callbacks(&g_seek_cbk);
sle_connection_register_callbacks(&g_connect_cbk);
ssapc_register_callbacks(&g_ssapc_cbk);
enable_sle();
sle_set_local_addr(&local_address);
}
void sle_start_scan()
{
sle_seek_param_t param = {0};
param.own_addr_type = 0;
param.filter_duplicates = 0;
param.seek_filter_policy = 0;
param.seek_phys = 1;
param.seek_type[0] = 0;
param.seek_interval[0] = SLE_SEEK_INTERVAL_DEFAULT;
param.seek_window[0] = SLE_SEEK_WINDOW_DEFAULT;
sle_set_seek_param(&param);
sle_start_seek();
}
int sle_speed_init(void)
{
osal_msleep(1000); /* sleep 1000ms */
sle_client_init(sle_speed_notification_cb, sle_speed_indication_cb);
return 0;
}
#define SLE_SPEED_TASK_PRIO 26
#define SLE_SPEED_STACK_SIZE 0x2000
static void sle_speed_entry(void)
{
osal_task *task_handle = NULL;
osal_kthread_lock();
task_handle = osal_kthread_create((osal_kthread_handler)sle_speed_init, 0, "RadarTask", SLE_SPEED_STACK_SIZE);
if (task_handle != NULL) {
osal_kthread_set_priority(task_handle, SLE_SPEED_TASK_PRIO);
osal_kfree(task_handle);
}
osal_kthread_unlock();
}
/* Run the blinky_entry. */
app_run(sle_speed_entry);