fix(nimble): Fixed services: DIS, SPS, and HIDS

This commit is contained in:
Sumeet Singh
2024-11-28 12:33:01 +05:30
committed by Rahul Tank
parent 13616e2c30
commit b64455b3bd
5 changed files with 80 additions and 13 deletions
@@ -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;
};
/**
+50 -2
View File
@@ -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);
}
+6 -8
View File
@@ -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);
+2 -2
View File
@@ -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: