Merge remote-tracking branch 'origin/dev' into release-candidate

This commit is contained in:
Aleksandr Kutuzov 2023-06-15 21:27:44 +09:00
commit 7081d76e7b
3 changed files with 30 additions and 20 deletions

View File

@ -330,6 +330,7 @@ static void gap_init_svc(Gap* gap) {
if(status) { if(status) {
FURI_LOG_E(TAG, "Failed updating name characteristic: %d", status); FURI_LOG_E(TAG, "Failed updating name characteristic: %d", status);
} }
uint8_t gap_appearence_char_uuid[2] = { uint8_t gap_appearence_char_uuid[2] = {
gap->config->appearance_char & 0xff, gap->config->appearance_char >> 8}; gap->config->appearance_char & 0xff, gap->config->appearance_char >> 8};
status = aci_gatt_update_char_value( status = aci_gatt_update_char_value(

View File

@ -22,6 +22,10 @@ typedef struct {
static_assert(sizeof(HidSvcReportId) == sizeof(uint16_t), "HidSvcReportId must be 2 bytes"); static_assert(sizeof(HidSvcReportId) == sizeof(uint16_t), "HidSvcReportId must be 2 bytes");
static const Service_UUID_t hid_svc_uuid = {
.Service_UUID_16 = HUMAN_INTERFACE_DEVICE_SERVICE_UUID,
};
static bool static bool
hid_svc_char_desc_data_callback(const void* context, const uint8_t** data, uint16_t* data_len) { hid_svc_char_desc_data_callback(const void* context, const uint8_t** data, uint16_t* data_len) {
const HidSvcReportId* report_id = context; const HidSvcReportId* report_id = context;
@ -148,18 +152,15 @@ static SVCCTL_EvtAckStatus_t hid_svc_event_handler(void* event) {
void hid_svc_start() { void hid_svc_start() {
tBleStatus status; tBleStatus status;
hid_svc = malloc(sizeof(HIDSvc)); hid_svc = malloc(sizeof(HIDSvc));
Service_UUID_t svc_uuid = {};
// Register event handler // Register event handler
SVCCTL_RegisterSvcHandler(hid_svc_event_handler); SVCCTL_RegisterSvcHandler(hid_svc_event_handler);
// Add service
svc_uuid.Service_UUID_16 = HUMAN_INTERFACE_DEVICE_SERVICE_UUID;
/** /**
* Add Human Interface Device Service * Add Human Interface Device Service
*/ */
status = aci_gatt_add_service( status = aci_gatt_add_service(
UUID_TYPE_16, UUID_TYPE_16,
&svc_uuid, &hid_svc_uuid,
PRIMARY_SERVICE, PRIMARY_SERVICE,
2 + /* protocol mode */ 2 + /* protocol mode */
(4 * HID_SVC_INPUT_REPORT_COUNT) + (3 * HID_SVC_OUTPUT_REPORT_COUNT) + (4 * HID_SVC_INPUT_REPORT_COUNT) + (3 * HID_SVC_OUTPUT_REPORT_COUNT) +
@ -170,10 +171,12 @@ void hid_svc_start() {
FURI_LOG_E(TAG, "Failed to add HID service: %d", status); FURI_LOG_E(TAG, "Failed to add HID service: %d", status);
} }
for(size_t i = 0; i < HidSvcGattCharacteristicCount; i++) { // Maintain previously defined characteristic order
flipper_gatt_characteristic_init( flipper_gatt_characteristic_init(
hid_svc->svc_handle, &hid_svc_chars[i], &hid_svc->chars[i]); hid_svc->svc_handle,
} &hid_svc_chars[HidSvcGattCharacteristicProtocolMode],
&hid_svc->chars[HidSvcGattCharacteristicProtocolMode]);
uint8_t protocol_mode = 1; uint8_t protocol_mode = 1;
flipper_gatt_characteristic_update( flipper_gatt_characteristic_update(
hid_svc->svc_handle, hid_svc->svc_handle,
@ -215,6 +218,12 @@ void hid_svc_start() {
&hid_report_chars[report_type_idx].chars[report_idx]); &hid_report_chars[report_type_idx].chars[report_idx]);
} }
} }
// Setup remaining characteristics
for(size_t i = HidSvcGattCharacteristicReportMap; i < HidSvcGattCharacteristicCount; i++) {
flipper_gatt_characteristic_init(
hid_svc->svc_handle, &hid_svc_chars[i], &hid_svc->chars[i]);
}
} }
bool hid_svc_update_report_map(const uint8_t* data, uint16_t len) { bool hid_svc_update_report_map(const uint8_t* data, uint16_t len) {

View File

@ -10,24 +10,14 @@
#define TAG "BtSerialSvc" #define TAG "BtSerialSvc"
typedef enum { typedef enum {
SerialSvcGattCharacteristicTx = 0, SerialSvcGattCharacteristicRx = 0,
SerialSvcGattCharacteristicRx, SerialSvcGattCharacteristicTx,
SerialSvcGattCharacteristicFlowCtrl, SerialSvcGattCharacteristicFlowCtrl,
SerialSvcGattCharacteristicStatus, SerialSvcGattCharacteristicStatus,
SerialSvcGattCharacteristicCount, SerialSvcGattCharacteristicCount,
} SerialSvcGattCharacteristicId; } SerialSvcGattCharacteristicId;
static const FlipperGattCharacteristicParams serial_svc_chars[SerialSvcGattCharacteristicCount] = { static const FlipperGattCharacteristicParams serial_svc_chars[SerialSvcGattCharacteristicCount] = {
[SerialSvcGattCharacteristicTx] =
{.name = "TX",
.data_prop_type = FlipperGattCharacteristicDataFixed,
.data.fixed.length = SERIAL_SVC_DATA_LEN_MAX,
.uuid.Char_UUID_128 = SERIAL_SVC_TX_CHAR_UUID,
.uuid_type = UUID_TYPE_128,
.char_properties = CHAR_PROP_READ | CHAR_PROP_INDICATE,
.security_permissions = ATTR_PERMISSION_AUTHEN_READ,
.gatt_evt_mask = GATT_DONT_NOTIFY_EVENTS,
.is_variable = CHAR_VALUE_LEN_VARIABLE},
[SerialSvcGattCharacteristicRx] = [SerialSvcGattCharacteristicRx] =
{.name = "RX", {.name = "RX",
.data_prop_type = FlipperGattCharacteristicDataFixed, .data_prop_type = FlipperGattCharacteristicDataFixed,
@ -38,6 +28,16 @@ static const FlipperGattCharacteristicParams serial_svc_chars[SerialSvcGattChara
.security_permissions = ATTR_PERMISSION_AUTHEN_READ | ATTR_PERMISSION_AUTHEN_WRITE, .security_permissions = ATTR_PERMISSION_AUTHEN_READ | ATTR_PERMISSION_AUTHEN_WRITE,
.gatt_evt_mask = GATT_NOTIFY_ATTRIBUTE_WRITE, .gatt_evt_mask = GATT_NOTIFY_ATTRIBUTE_WRITE,
.is_variable = CHAR_VALUE_LEN_VARIABLE}, .is_variable = CHAR_VALUE_LEN_VARIABLE},
[SerialSvcGattCharacteristicTx] =
{.name = "TX",
.data_prop_type = FlipperGattCharacteristicDataFixed,
.data.fixed.length = SERIAL_SVC_DATA_LEN_MAX,
.uuid.Char_UUID_128 = SERIAL_SVC_TX_CHAR_UUID,
.uuid_type = UUID_TYPE_128,
.char_properties = CHAR_PROP_READ | CHAR_PROP_INDICATE,
.security_permissions = ATTR_PERMISSION_AUTHEN_READ,
.gatt_evt_mask = GATT_DONT_NOTIFY_EVENTS,
.is_variable = CHAR_VALUE_LEN_VARIABLE},
[SerialSvcGattCharacteristicFlowCtrl] = [SerialSvcGattCharacteristicFlowCtrl] =
{.name = "Flow control", {.name = "Flow control",
.data_prop_type = FlipperGattCharacteristicDataFixed, .data_prop_type = FlipperGattCharacteristicDataFixed,