mirror of
https://github.com/espressif/esp-nimble.git
synced 2026-09-13 04:30:03 +00:00
fix(nimble): Fixed services: DIS, SPS, and HIDS
This commit is contained in:
@@ -42,7 +42,16 @@
|
||||
#define BLE_SVC_DIS_CHR_UUID16_HARDWARE_REVISION 0x2A27
|
||||
#define BLE_SVC_DIS_CHR_UUID16_SOFTWARE_REVISION 0x2A28
|
||||
#define BLE_SVC_DIS_CHR_UUID16_MANUFACTURER_NAME 0x2A29
|
||||
#define BLE_SVC_DIS_CHR_UUID16_IEEE_REG_CERT_LIST 0x2A2A
|
||||
#define BLE_SVC_DIS_CHR_UUID16_PNP_ID 0x2A50
|
||||
#define BLE_SVC_DIS_CHR_UUID16_UDI 0x2BFF
|
||||
|
||||
#if MYNEWT_VAL(BLE_SVC_DIS_INCLUDED)
|
||||
/** One PTS Case requires this DIS to be included. */
|
||||
static const ble_uuid128_t ble_svc_dis_include_uuid =
|
||||
BLE_UUID128_INIT(0x2d, 0x71, 0xa2, 0x59, 0xb4, 0x58, 0xc8, 0x12,
|
||||
0x99, 0x99, 0x43, 0x95, 0x12, 0x2f, 0x46, 0xFF);
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Structure holding data for the main characteristics
|
||||
@@ -81,14 +90,26 @@ struct ble_svc_dis_data {
|
||||
/**
|
||||
* System ID.
|
||||
* Represent the System Id of the device.
|
||||
* Length: 8 Octets
|
||||
*/
|
||||
const char *system_id;
|
||||
|
||||
/**
|
||||
* PNP ID.
|
||||
* Represent the PNP Id of the device.
|
||||
* Length: 7 Octets
|
||||
*/
|
||||
const char *pnp_id;
|
||||
|
||||
/**
|
||||
* IEEE 11073-20601 Regulatory Certification Data List
|
||||
*/
|
||||
const char *ieee;
|
||||
|
||||
/**
|
||||
* UDI for Medical Devices
|
||||
*/
|
||||
const char *udi;
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -32,6 +32,9 @@ struct ble_svc_dis_data ble_svc_dis_data = {
|
||||
.software_revision = MYNEWT_VAL(BLE_SVC_DIS_SOFTWARE_REVISION_DEFAULT),
|
||||
.manufacturer_name = MYNEWT_VAL(BLE_SVC_DIS_MANUFACTURER_NAME_DEFAULT),
|
||||
.system_id = MYNEWT_VAL(BLE_SVC_DIS_SYSTEM_ID_DEFAULT),
|
||||
.pnp_id = MYNEWT_VAL(BLE_SVC_DIS_PNP_ID_DEFAULT),
|
||||
.ieee = "dummy_data",
|
||||
.udi = NULL, /** For now no UID fields are supported */
|
||||
};
|
||||
|
||||
/* Access function */
|
||||
@@ -50,7 +53,11 @@ ble_svc_dis_access(uint16_t conn_handle, uint16_t attr_handle,
|
||||
|
||||
static const struct ble_gatt_svc_def ble_svc_dis_defs[] = {
|
||||
{ /*** Service: Device Information Service (DIS). */
|
||||
#if !MYNEWT_VAL(BLE_SVC_DIS_INCLUDED)
|
||||
.type = BLE_GATT_SVC_TYPE_PRIMARY,
|
||||
#else
|
||||
.type = BLE_GATT_SVC_TYPE_SECONDARY,
|
||||
#endif
|
||||
.uuid = BLE_UUID16_DECLARE(BLE_SVC_DIS_UUID16),
|
||||
.characteristics = (struct ble_gatt_chr_def[]) { {
|
||||
#if (MYNEWT_VAL(BLE_SVC_DIS_MODEL_NUMBER_READ_PERM) >= 0)
|
||||
@@ -109,6 +116,11 @@ static const struct ble_gatt_svc_def ble_svc_dis_defs[] = {
|
||||
MYNEWT_VAL(BLE_SVC_DIS_SYSTEM_ID_READ_PERM),
|
||||
}, {
|
||||
#endif
|
||||
/*** Chatacteristic: IEEE 11073-20601 Regulatory Certification Data List */
|
||||
.uuid = BLE_UUID16_DECLARE(BLE_SVC_DIS_CHR_UUID16_IEEE_REG_CERT_LIST),
|
||||
.access_cb = ble_svc_dis_access,
|
||||
.flags = BLE_GATT_CHR_F_READ,
|
||||
}, {
|
||||
#if (MYNEWT_VAL(BLE_SVC_DIS_PNP_ID_READ_PERM) >= 0)
|
||||
/*** Characteristic: PNP Id */
|
||||
.uuid = BLE_UUID16_DECLARE(BLE_SVC_DIS_CHR_UUID16_PNP_ID),
|
||||
@@ -117,6 +129,11 @@ static const struct ble_gatt_svc_def ble_svc_dis_defs[] = {
|
||||
MYNEWT_VAL(BLE_SVC_DIS_PNP_ID_READ_PERM),
|
||||
}, {
|
||||
#endif
|
||||
/*** UDI for Medical Devices */
|
||||
.uuid = BLE_UUID16_DECLARE(BLE_SVC_DIS_CHR_UUID16_UDI),
|
||||
.access_cb = ble_svc_dis_access,
|
||||
.flags = BLE_GATT_CHR_F_READ
|
||||
}, {
|
||||
|
||||
0, /* No more characteristics in this service */
|
||||
}, }
|
||||
@@ -127,6 +144,17 @@ static const struct ble_gatt_svc_def ble_svc_dis_defs[] = {
|
||||
},
|
||||
};
|
||||
|
||||
#if MYNEWT_VAL(BLE_SVC_DIS_INCLUDED)
|
||||
const struct ble_gatt_svc_def *included_services[] = {ble_svc_dis_defs, NULL};
|
||||
const struct ble_gatt_svc_def ble_svc_dis_include_def[] = {
|
||||
{
|
||||
.type = BLE_GATT_SVC_TYPE_PRIMARY,
|
||||
.uuid = &ble_svc_dis_include_uuid.u,
|
||||
.includes = included_services,
|
||||
}
|
||||
};
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Simple read access callback for the device information service
|
||||
* characteristic.
|
||||
@@ -224,8 +252,22 @@ ble_svc_dis_access(uint16_t conn_handle, uint16_t attr_handle,
|
||||
info = MYNEWT_VAL(BLE_SVC_PNP_SYSTEM_ID_DEFAULT);
|
||||
}
|
||||
#endif
|
||||
uint8_t flag = 0x01;
|
||||
os_mbuf_append(ctxt->om, &flag, sizeof flag);
|
||||
break;
|
||||
#endif
|
||||
case BLE_SVC_DIS_CHR_UUID16_IEEE_REG_CERT_LIST:
|
||||
info = ble_svc_dis_data.ieee;
|
||||
break;
|
||||
|
||||
case BLE_SVC_DIS_CHR_UUID16_UDI:
|
||||
info = ble_svc_dis_data.udi;
|
||||
if (info == NULL) {
|
||||
uint8_t flag = 0x00;
|
||||
os_mbuf_append(ctxt->om, &flag, sizeof(flag));
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
assert(0);
|
||||
return BLE_ATT_ERR_UNLIKELY;
|
||||
@@ -355,9 +397,15 @@ ble_svc_dis_init(void)
|
||||
/* Ensure this function only gets called by sysinit. */
|
||||
SYSINIT_ASSERT_ACTIVE();
|
||||
|
||||
rc = ble_gatts_count_cfg(ble_svc_dis_defs);
|
||||
#if !MYNEWT_VAL(BLE_SVC_DIS_INCLUDED)
|
||||
const struct ble_gatt_svc_def * defs = ble_svc_dis_defs;
|
||||
#else
|
||||
const struct ble_gatt_svc_def * defs = ble_svc_dis_include_def;
|
||||
#endif
|
||||
|
||||
rc = ble_gatts_count_cfg(defs);
|
||||
SYSINIT_PANIC_ASSERT(rc == 0);
|
||||
|
||||
rc = ble_gatts_add_svcs(ble_svc_dis_defs);
|
||||
rc = ble_gatts_add_svcs(defs);
|
||||
SYSINIT_PANIC_ASSERT(rc == 0);
|
||||
}
|
||||
|
||||
@@ -190,12 +190,11 @@ fill_boot_kbd_inp(uint8_t instance)
|
||||
.access_cb = ble_svc_hid_access,
|
||||
.val_handle = &hid_instances[instance].kbd_inp_handle,
|
||||
.flags = BLE_GATT_CHR_F_READ | BLE_GATT_CHR_F_NOTIFY |
|
||||
BLE_GATT_CHR_F_WRITE |
|
||||
#if MYNEWT_VAL(BLE_SM_LVL) == 2
|
||||
BLE_GATT_CHR_F_READ_ENC | BLE_GATT_CHR_F_WRITE_ENC |
|
||||
BLE_GATT_CHR_F_READ_ENC |
|
||||
#elif MYNEWT_VAL(BLE_SM_LVL) == 3
|
||||
BLE_GATT_CHR_F_READ_AUTHEN | BLE_GATT_CHR_F_WRITE_AUTHEN |
|
||||
BLE_GATT_CHR_F_READ_ENC | BLE_GATT_CHR_F_WRITE_ENC |
|
||||
BLE_GATT_CHR_F_READ_AUTHEN |
|
||||
BLE_GATT_CHR_F_READ_ENC |
|
||||
#endif
|
||||
0,
|
||||
};
|
||||
@@ -247,12 +246,11 @@ fill_boot_mouse_inp(uint8_t instance)
|
||||
.access_cb = ble_svc_hid_access,
|
||||
.val_handle = &hid_instances[instance].mouse_inp_handle,
|
||||
.flags = BLE_GATT_CHR_F_READ | BLE_GATT_CHR_F_NOTIFY |
|
||||
BLE_GATT_CHR_F_WRITE |
|
||||
#if MYNEWT_VAL(BLE_SM_LVL) == 2
|
||||
BLE_GATT_CHR_F_READ_ENC | BLE_GATT_CHR_F_WRITE_ENC |
|
||||
BLE_GATT_CHR_F_READ_ENC |
|
||||
#elif MYNEWT_VAL(BLE_SM_LVL) == 3
|
||||
BLE_GATT_CHR_F_READ_AUTHEN | BLE_GATT_CHR_F_WRITE_AUTHEN |
|
||||
BLE_GATT_CHR_F_READ_ENC | BLE_GATT_CHR_F_WRITE_ENC |
|
||||
BLE_GATT_CHR_F_READ_AUTHEN |
|
||||
BLE_GATT_CHR_F_READ_ENC |
|
||||
#endif
|
||||
0,
|
||||
};
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
|
||||
|
||||
#define BLE_SVC_SPS_UUID16 0x1813
|
||||
#define BLE_SVC_SPS_CHR_UUID16_SCAN_ITVL_WINDOW 0x2A23
|
||||
#define BLE_SVC_SPS_CHR_UUID16_SCAN_ITVL_WINDOW 0x2A4F
|
||||
#define BLE_SVC_SPS_CHR_UUID16_SCAN_REFRESH 0x2A31
|
||||
|
||||
void ble_svc_sps_scan_refresh(void);
|
||||
|
||||
@@ -100,9 +100,9 @@ ble_svc_sps_access(uint16_t conn_handle, uint16_t attr_handle,
|
||||
case BLE_SVC_SPS_CHR_UUID16_SCAN_ITVL_WINDOW:
|
||||
assert(ctxt->op == BLE_GATT_ACCESS_OP_WRITE_CHR);
|
||||
rc = ble_svc_sps_chr_write(ctxt->om, 0, sizeof(ble_scan_itvl) + sizeof(ble_scan_window), &write_val, NULL);
|
||||
if(rc != 0) {
|
||||
if(rc == 0) {
|
||||
ble_scan_itvl = (write_val & 0xffff0000) >> 16;
|
||||
ble_scan_window = (write_val && 0x0000ffff);
|
||||
ble_scan_window = (write_val & 0x0000ffff);
|
||||
}
|
||||
return rc == 0 ? 0 : BLE_ATT_ERR_INSUFFICIENT_RES;
|
||||
case BLE_SVC_SPS_CHR_UUID16_SCAN_REFRESH:
|
||||
|
||||
Reference in New Issue
Block a user