Merge pull request #1567 from Ralim/ble-settings-reset

BLE Settings rename + Unique Name
This commit is contained in:
Ben V. Brown
2023-02-12 11:06:45 +11:00
committed by GitHub
4 changed files with 194 additions and 204 deletions

View File

@@ -1,7 +1,13 @@
/** @file
* @brief Internal APIs for Bluetooth connection handling.
*/
#include "addr.h"
#include "atomic.h"
#include "slist.h"
#include "types.h"
#include "work_q.h"
#include <stddef.h>
#include <stdint.h>
/*
* Copyright (c) 2015 Intel Corporation
*
@@ -178,13 +184,9 @@ void bt_conn_reset_rx_state(struct bt_conn *conn);
void bt_conn_recv(struct bt_conn *conn, struct net_buf *buf, u8_t flags);
/* Send data over a connection */
int bt_conn_send_cb(struct bt_conn *conn, struct net_buf *buf,
bt_conn_tx_cb_t cb, void *user_data);
int bt_conn_send_cb(struct bt_conn *conn, struct net_buf *buf, bt_conn_tx_cb_t cb, void *user_data);
static inline int bt_conn_send(struct bt_conn *conn, struct net_buf *buf)
{
return bt_conn_send_cb(conn, buf, NULL, NULL);
}
static inline int bt_conn_send(struct bt_conn *conn, struct net_buf *buf) { return bt_conn_send_cb(conn, buf, NULL, NULL); }
/* Add a new LE connection */
struct bt_conn *bt_conn_add_le(u8_t id, const bt_addr_le_t *peer);
@@ -251,14 +253,12 @@ struct bt_conn *bt_conn_lookup_id(u8_t id);
/* Look up a connection state. For BT_ADDR_LE_ANY, returns the first connection
* with the specific state
*/
struct bt_conn *bt_conn_lookup_state_le(const bt_addr_le_t *peer,
const bt_conn_state_t state);
struct bt_conn *bt_conn_lookup_state_le(const bt_addr_le_t *peer, const bt_conn_state_t state);
/* Set connection object in certain state and perform action related to state */
void bt_conn_set_state(struct bt_conn *conn, bt_conn_state_t state);
int bt_conn_le_conn_update(struct bt_conn *conn,
const struct bt_le_conn_param *param);
int bt_conn_le_conn_update(struct bt_conn *conn, const struct bt_le_conn_param *param);
void notify_remote_info(struct bt_conn *conn);
@@ -268,8 +268,7 @@ bool le_param_req(struct bt_conn *conn, struct bt_le_conn_param *param);
#if defined(CONFIG_BT_SMP)
/* rand and ediv should be in BT order */
int bt_conn_le_start_encryption(struct bt_conn *conn, u8_t rand[8],
u8_t ediv[2], const u8_t *ltk, size_t len);
int bt_conn_le_start_encryption(struct bt_conn *conn, u8_t rand[8], u8_t ediv[2], const u8_t *ltk, size_t len);
/* Notify higher layers that RPA was resolved */
void bt_conn_identity_resolved(struct bt_conn *conn);
@@ -282,41 +281,27 @@ void bt_conn_security_changed(struct bt_conn *conn, enum bt_security_err err);
/* Prepare a PDU to be sent over a connection */
#if defined(CONFIG_NET_BUF_LOG)
struct net_buf *bt_conn_create_pdu_timeout_debug(struct net_buf_pool *pool,
size_t reserve, s32_t timeout,
const char *func, int line);
#define bt_conn_create_pdu_timeout(_pool, _reserve, _timeout) \
bt_conn_create_pdu_timeout_debug(_pool, _reserve, _timeout, \
__func__, __LINE__)
struct net_buf *bt_conn_create_pdu_timeout_debug(struct net_buf_pool *pool, size_t reserve, s32_t timeout, const char *func, int line);
#define bt_conn_create_pdu_timeout(_pool, _reserve, _timeout) bt_conn_create_pdu_timeout_debug(_pool, _reserve, _timeout, __func__, __LINE__)
#define bt_conn_create_pdu(_pool, _reserve) \
bt_conn_create_pdu_timeout_debug(_pool, _reserve, K_FOREVER, \
__func__, __line__)
#define bt_conn_create_pdu(_pool, _reserve) bt_conn_create_pdu_timeout_debug(_pool, _reserve, K_FOREVER, __func__, __line__)
#else
struct net_buf *bt_conn_create_pdu_timeout(struct net_buf_pool *pool,
size_t reserve, s32_t timeout);
struct net_buf *bt_conn_create_pdu_timeout(struct net_buf_pool *pool, size_t reserve, s32_t timeout);
#define bt_conn_create_pdu(_pool, _reserve) \
bt_conn_create_pdu_timeout(_pool, _reserve, K_FOREVER)
#define bt_conn_create_pdu(_pool, _reserve) bt_conn_create_pdu_timeout(_pool, _reserve, K_FOREVER)
#endif
/* Prepare a PDU to be sent over a connection */
#if defined(CONFIG_NET_BUF_LOG)
struct net_buf *bt_conn_create_frag_timeout_debug(size_t reserve, s32_t timeout,
const char *func, int line);
struct net_buf *bt_conn_create_frag_timeout_debug(size_t reserve, s32_t timeout, const char *func, int line);
#define bt_conn_create_frag_timeout(_reserve, _timeout) \
bt_conn_create_frag_timeout_debug(_reserve, _timeout, \
__func__, __LINE__)
#define bt_conn_create_frag_timeout(_reserve, _timeout) bt_conn_create_frag_timeout_debug(_reserve, _timeout, __func__, __LINE__)
#define bt_conn_create_frag(_reserve) \
bt_conn_create_frag_timeout_debug(_reserve, K_FOREVER, \
__func__, __LINE__)
#define bt_conn_create_frag(_reserve) bt_conn_create_frag_timeout_debug(_reserve, K_FOREVER, __func__, __LINE__)
#else
struct net_buf *bt_conn_create_frag_timeout(size_t reserve, s32_t timeout);
#define bt_conn_create_frag(_reserve) \
bt_conn_create_frag_timeout(_reserve, K_FOREVER)
#define bt_conn_create_frag(_reserve) bt_conn_create_frag_timeout(_reserve, K_FOREVER)
#endif
/* Initialize connection management */

View File

@@ -48,7 +48,9 @@
// Settings
#define BT_UUID_CHAR_BLE_SETTINGS_VALUE_SAVE BT_UUID_DECLARE_16(0)
#define BT_UUID_CHAR_BLE_SETTINGS_VALUE_SAVE BT_UUID_DECLARE_16(0xFFFF)
#define BT_UUID_CHAR_BLE_SETTINGS_VALUE_RESET BT_UUID_DECLARE_16(0xFFFE)
#define BT_UUID_CHAR_BLE_SETTINGS_VALUE_0 BT_UUID_DECLARE_16(0)
#define BT_UUID_CHAR_BLE_SETTINGS_VALUE_1 BT_UUID_DECLARE_16(1)
#define BT_UUID_CHAR_BLE_SETTINGS_VALUE_2 BT_UUID_DECLARE_16(2)
#define BT_UUID_CHAR_BLE_SETTINGS_VALUE_3 BT_UUID_DECLARE_16(3)

View File

@@ -129,7 +129,7 @@ int ble_char_read_status_callback(struct bt_conn *conn, const struct bt_gatt_att
return sizeof(temp);
break;
}
MSG("Unhandled attr read %d | %d\n", (uint32_t)attr->uuid, uuid_value);
MSG((char *)"Unhandled attr read %d | %d\n", (uint32_t)attr->uuid, uuid_value);
return 0;
}
int ble_char_read_bulk_value_callback(struct bt_conn *conn, const struct bt_gatt_attr *attr, void *buf, u16_t len, u16_t offset) {
@@ -194,17 +194,17 @@ int ble_char_read_setting_value_callback(struct bt_conn *conn, const struct bt_g
return 0;
}
uint16_t uuid_value = ((struct bt_uuid_16 *)attr->uuid)->val;
uint16_t temp = 0;
if (uuid_value == 0) {
uint16_t temp = 0xFFFF;
if (uuid_value <= SettingsOptions::SettingsOptionsLength) {
temp = getSettingValue((SettingsOptions)(uuid_value));
memcpy(buf, &temp, sizeof(temp));
return sizeof(temp);
} else if (uuid_value <= SettingsOptions::SettingsOptionsLength) {
temp = getSettingValue((SettingsOptions)(uuid_value - 1));
} else {
memcpy(buf, &temp, sizeof(temp));
return sizeof(temp);
}
MSG("Unhandled attr read %d | %d\n", (uint32_t)attr->uuid, uuid_value);
MSG((char *)"Unhandled attr read %d | %d\n", (uint32_t)attr->uuid, uuid_value);
return 0;
}
@@ -212,7 +212,7 @@ int ble_char_write_setting_value_callback(struct bt_conn *conn, const struct bt_
if (flags & BT_GATT_WRITE_FLAG_PREPARE) {
// Don't use prepare write data, execute write will upload data again.
BT_WARN("recv prepare write request\n");
BT_WARN((char *)"recv prepare write request\n");
return 0;
}
if (attr == NULL || attr->uuid == NULL) {
@@ -221,26 +221,31 @@ int ble_char_write_setting_value_callback(struct bt_conn *conn, const struct bt_
if (flags & BT_GATT_WRITE_FLAG_CMD) {
// Use write command data.
BT_WARN("recv write command\n");
BT_WARN((char *)"recv write command\n");
} else {
// Use write request / execute write data.
BT_WARN("recv write request / exce write\n");
BT_WARN((char *)"recv write request / exce write\n");
}
uint16_t uuid_value = ((struct bt_uuid_16 *)attr->uuid)->val;
if (len == 2) {
uint16_t new_value = 0;
memcpy(&new_value, buf, sizeof(new_value));
if (uuid_value == 0) {
if (uuid_value == 0xFFFF) {
if (new_value == 1) {
saveSettings();
return len;
}
} else if (uuid_value == 0xFFFE) {
if (new_value == 1) {
resetSettings();
return len;
}
} else if (uuid_value < SettingsOptions::SettingsOptionsLength) {
setSettingValue((SettingsOptions)(uuid_value - 1), new_value);
setSettingValue((SettingsOptions)(uuid_value), new_value);
return len;
}
}
MSG("Unhandled attr write %d | %d\n", (uint32_t)attr->uuid, uuid_value);
MSG((char *)"Unhandled attr write %d | %d\n", (uint32_t)attr->uuid, uuid_value);
return 0;
}

View File

@@ -26,9 +26,9 @@ NOTES
#include "log.h"
#include "uuid.h"
#include "BSP.h"
#include "ble_characteristics.h"
#include "ble_handlers.h"
bool pds_start;
static void ble_device_connected(struct bt_conn *conn, u8_t err);
@@ -167,7 +167,7 @@ static struct bt_gatt_attr attrs[] = {
BT_GATT_CHARACTERISTIC(BT_UUID_CHAR_BLE_LIVE_DEV_ID, BT_GATT_CHRC_READ, BT_GATT_PERM_READ, ble_char_read_bulk_value_callback, NULL, NULL),
BT_GATT_PRIMARY_SERVICE(BT_UUID_SVC_SETTINGS_DATA),
BT_GATT_CHARACTERISTIC(BT_UUID_CHAR_BLE_SETTINGS_VALUE_SAVE, BT_GATT_CHRC_READ | BT_GATT_CHRC_WRITE | BT_GATT_CHRC_WRITE_WITHOUT_RESP, BT_GATT_PERM_READ | BT_GATT_PERM_WRITE,
BT_GATT_CHARACTERISTIC(BT_UUID_CHAR_BLE_SETTINGS_VALUE_0, BT_GATT_CHRC_READ | BT_GATT_CHRC_WRITE | BT_GATT_CHRC_WRITE_WITHOUT_RESP, BT_GATT_PERM_READ | BT_GATT_PERM_WRITE,
ble_char_read_setting_value_callback, ble_char_write_setting_value_callback, NULL),
BT_GATT_CHARACTERISTIC(BT_UUID_CHAR_BLE_SETTINGS_VALUE_1, BT_GATT_CHRC_READ | BT_GATT_CHRC_WRITE | BT_GATT_CHRC_WRITE_WITHOUT_RESP, BT_GATT_PERM_READ | BT_GATT_PERM_WRITE,
ble_char_read_setting_value_callback, ble_char_write_setting_value_callback, NULL),
@@ -243,6 +243,11 @@ static struct bt_gatt_attr attrs[] = {
ble_char_read_setting_value_callback, ble_char_write_setting_value_callback, NULL),
BT_GATT_CHARACTERISTIC(BT_UUID_CHAR_BLE_SETTINGS_VALUE_37, BT_GATT_CHRC_READ | BT_GATT_CHRC_WRITE | BT_GATT_CHRC_WRITE_WITHOUT_RESP, BT_GATT_PERM_READ | BT_GATT_PERM_WRITE,
ble_char_read_setting_value_callback, ble_char_write_setting_value_callback, NULL),
BT_GATT_CHARACTERISTIC(BT_UUID_CHAR_BLE_SETTINGS_VALUE_SAVE, BT_GATT_CHRC_READ | BT_GATT_CHRC_WRITE | BT_GATT_CHRC_WRITE_WITHOUT_RESP, BT_GATT_PERM_READ | BT_GATT_PERM_WRITE,
ble_char_read_setting_value_callback, ble_char_write_setting_value_callback, NULL),
BT_GATT_CHARACTERISTIC(BT_UUID_CHAR_BLE_SETTINGS_VALUE_RESET, BT_GATT_CHRC_READ | BT_GATT_CHRC_WRITE | BT_GATT_CHRC_WRITE_WITHOUT_RESP, BT_GATT_PERM_READ | BT_GATT_PERM_WRITE,
ble_char_read_setting_value_callback, ble_char_write_setting_value_callback, NULL),
};
@@ -250,14 +255,10 @@ static struct bt_gatt_attr attrs[] = {
NAME
get_attr
*/
struct bt_gatt_attr *get_attr(u8_t index) {
return &attrs[index];
}
struct bt_gatt_attr *get_attr(u8_t index) { return &attrs[index]; }
static struct bt_gatt_service ble_tp_server = BT_GATT_SERVICE(attrs);
const char *DEVICE_BLE_NAME = "Pinecil";
// Start advertising with expected default values
int ble_start_adv(void) {
MSG("BLE Starting advertising\n");
@@ -267,16 +268,13 @@ int ble_start_adv(void) {
.interval_min = BT_GAP_ADV_FAST_INT_MIN_3,
.interval_max = BT_GAP_ADV_FAST_INT_MAX_3,
};
char nameBuffer[16];
int nameLen = snprintf(nameBuffer, 16, "Pinecil-%03d", (int)(getDeviceID() & 0xFFFF));
// scan and response data must each stay < 31 bytes
struct bt_data adv_data[2] = {
BT_DATA_BYTES(BT_DATA_FLAGS, (BT_LE_AD_NO_BREDR | BT_LE_AD_GENERAL)),
BT_DATA(BT_DATA_NAME_COMPLETE, DEVICE_BLE_NAME, strlen(DEVICE_BLE_NAME))
};
struct bt_data adv_data[2] = {BT_DATA_BYTES(BT_DATA_FLAGS, (BT_LE_AD_NO_BREDR | BT_LE_AD_GENERAL)), BT_DATA(BT_DATA_NAME_COMPLETE, nameBuffer, nameLen)};
struct bt_data scan_response_data[1] = {
BT_DATA(BT_DATA_UUID128_SOME, ((struct bt_uuid_128 *)BT_UUID_SVC_BULK_DATA)->val, 16)
};
struct bt_data scan_response_data[1] = {BT_DATA(BT_DATA_UUID128_SOME, ((struct bt_uuid_128 *)BT_UUID_SVC_BULK_DATA)->val, 16)};
return bt_le_adv_start(&adv_param, adv_data, ARRAY_SIZE(adv_data), scan_response_data, ARRAY_SIZE(scan_response_data));
}