From 72925fae1c72dcaba7ba397f4aa87b69473c425d Mon Sep 17 00:00:00 2001 From: gornekich Date: Fri, 18 Mar 2022 13:42:04 +0300 Subject: [PATCH] BLE add RPC Version characteristic (#1035) * ble: add rpc version to device info service * protobuf: update protobuf submodule with new version * protobuf: update protobuf version --- assets/compiled/protobuf_version.h | 2 +- assets/protobuf | 2 +- .../targets/f6/ble_glue/dev_info_service.c | 41 ++++++++++++++++++- .../targets/f7/ble_glue/dev_info_service.c | 41 ++++++++++++++++++- 4 files changed, 82 insertions(+), 4 deletions(-) diff --git a/assets/compiled/protobuf_version.h b/assets/compiled/protobuf_version.h index 0dac543b..1e438d71 100644 --- a/assets/compiled/protobuf_version.h +++ b/assets/compiled/protobuf_version.h @@ -1,3 +1,3 @@ #pragma once #define PROTOBUF_MAJOR_VERSION 0 -#define PROTOBUF_MINOR_VERSION 1 +#define PROTOBUF_MINOR_VERSION 2 diff --git a/assets/protobuf b/assets/protobuf index 93b9cf3a..232e7e9a 160000 --- a/assets/protobuf +++ b/assets/protobuf @@ -1 +1 @@ -Subproject commit 93b9cf3af76664a27646494341a63281a9022740 +Subproject commit 232e7e9a50b12a95f950fabb515204775e51b04a diff --git a/firmware/targets/f6/ble_glue/dev_info_service.c b/firmware/targets/f6/ble_glue/dev_info_service.c index 80d7b0eb..ebee56ba 100644 --- a/firmware/targets/f6/ble_glue/dev_info_service.c +++ b/firmware/targets/f6/ble_glue/dev_info_service.c @@ -3,15 +3,20 @@ #include "ble.h" #include +#include +#include #define TAG "BtDevInfoSvc" +#define DEV_INFO_RPC_VERSION_CHAR_MAX_SIZE (10) + typedef struct { uint16_t service_handle; uint16_t man_name_char_handle; uint16_t serial_num_char_handle; uint16_t firmware_rev_char_handle; uint16_t software_rev_char_handle; + uint16_t rpc_version_char_handle; } DevInfoSvc; static DevInfoSvc* dev_info_svc = NULL; @@ -22,6 +27,9 @@ static const char dev_info_firmware_rev_num[] = TOSTRING(TARGET); static const char dev_info_software_rev_num[] = GIT_COMMIT " " GIT_BRANCH " " GIT_BRANCH_NUM " " BUILD_DATE; +static const uint8_t dev_info_rpc_version_uuid[] = + {0x33, 0xa9, 0xb5, 0x3e, 0x87, 0x5d, 0x1a, 0x8e, 0xc8, 0x47, 0x5e, 0xae, 0x6d, 0x66, 0xf6, 0x03}; + void dev_info_svc_start() { dev_info_svc = malloc(sizeof(DevInfoSvc)); tBleStatus status; @@ -29,7 +37,7 @@ void dev_info_svc_start() { // Add Device Information Service uint16_t uuid = DEVICE_INFORMATION_SERVICE_UUID; status = aci_gatt_add_service( - UUID_TYPE_16, (Service_UUID_t*)&uuid, PRIMARY_SERVICE, 9, &dev_info_svc->service_handle); + UUID_TYPE_16, (Service_UUID_t*)&uuid, PRIMARY_SERVICE, 11, &dev_info_svc->service_handle); if(status) { FURI_LOG_E(TAG, "Failed to add Device Information Service: %d", status); } @@ -95,6 +103,20 @@ void dev_info_svc_start() { if(status) { FURI_LOG_E(TAG, "Failed to add software revision char: %d", status); } + status = aci_gatt_add_char( + dev_info_svc->service_handle, + UUID_TYPE_128, + (const Char_UUID_t*)dev_info_rpc_version_uuid, + DEV_INFO_RPC_VERSION_CHAR_MAX_SIZE, + CHAR_PROP_READ, + ATTR_PERMISSION_AUTHEN_READ, + GATT_DONT_NOTIFY_EVENTS, + 10, + CHAR_VALUE_LEN_CONSTANT, + &dev_info_svc->rpc_version_char_handle); + if(status) { + FURI_LOG_E(TAG, "Failed to add rpc version characteristic: %d", status); + } // Update characteristics status = aci_gatt_update_char_value( @@ -133,6 +155,18 @@ void dev_info_svc_start() { if(status) { FURI_LOG_E(TAG, "Failed to update software revision char: %d", status); } + string_t rpc_version; + string_init_printf(rpc_version, "%d.%d", PROTOBUF_MAJOR_VERSION, PROTOBUF_MINOR_VERSION); + status = aci_gatt_update_char_value( + dev_info_svc->service_handle, + dev_info_svc->rpc_version_char_handle, + 0, + strlen(string_get_cstr(rpc_version)), + (uint8_t*)string_get_cstr(rpc_version)); + if(status) { + FURI_LOG_E(TAG, "Failed to update rpc version char: %d", status); + } + string_clear(rpc_version); } void dev_info_svc_stop() { @@ -159,6 +193,11 @@ void dev_info_svc_stop() { if(status) { FURI_LOG_E(TAG, "Failed to delete software revision char: %d", status); } + status = + aci_gatt_del_char(dev_info_svc->service_handle, dev_info_svc->rpc_version_char_handle); + if(status) { + FURI_LOG_E(TAG, "Failed to delete rpc version char: %d", status); + } // Delete service status = aci_gatt_del_service(dev_info_svc->service_handle); if(status) { diff --git a/firmware/targets/f7/ble_glue/dev_info_service.c b/firmware/targets/f7/ble_glue/dev_info_service.c index 80d7b0eb..ebee56ba 100644 --- a/firmware/targets/f7/ble_glue/dev_info_service.c +++ b/firmware/targets/f7/ble_glue/dev_info_service.c @@ -3,15 +3,20 @@ #include "ble.h" #include +#include +#include #define TAG "BtDevInfoSvc" +#define DEV_INFO_RPC_VERSION_CHAR_MAX_SIZE (10) + typedef struct { uint16_t service_handle; uint16_t man_name_char_handle; uint16_t serial_num_char_handle; uint16_t firmware_rev_char_handle; uint16_t software_rev_char_handle; + uint16_t rpc_version_char_handle; } DevInfoSvc; static DevInfoSvc* dev_info_svc = NULL; @@ -22,6 +27,9 @@ static const char dev_info_firmware_rev_num[] = TOSTRING(TARGET); static const char dev_info_software_rev_num[] = GIT_COMMIT " " GIT_BRANCH " " GIT_BRANCH_NUM " " BUILD_DATE; +static const uint8_t dev_info_rpc_version_uuid[] = + {0x33, 0xa9, 0xb5, 0x3e, 0x87, 0x5d, 0x1a, 0x8e, 0xc8, 0x47, 0x5e, 0xae, 0x6d, 0x66, 0xf6, 0x03}; + void dev_info_svc_start() { dev_info_svc = malloc(sizeof(DevInfoSvc)); tBleStatus status; @@ -29,7 +37,7 @@ void dev_info_svc_start() { // Add Device Information Service uint16_t uuid = DEVICE_INFORMATION_SERVICE_UUID; status = aci_gatt_add_service( - UUID_TYPE_16, (Service_UUID_t*)&uuid, PRIMARY_SERVICE, 9, &dev_info_svc->service_handle); + UUID_TYPE_16, (Service_UUID_t*)&uuid, PRIMARY_SERVICE, 11, &dev_info_svc->service_handle); if(status) { FURI_LOG_E(TAG, "Failed to add Device Information Service: %d", status); } @@ -95,6 +103,20 @@ void dev_info_svc_start() { if(status) { FURI_LOG_E(TAG, "Failed to add software revision char: %d", status); } + status = aci_gatt_add_char( + dev_info_svc->service_handle, + UUID_TYPE_128, + (const Char_UUID_t*)dev_info_rpc_version_uuid, + DEV_INFO_RPC_VERSION_CHAR_MAX_SIZE, + CHAR_PROP_READ, + ATTR_PERMISSION_AUTHEN_READ, + GATT_DONT_NOTIFY_EVENTS, + 10, + CHAR_VALUE_LEN_CONSTANT, + &dev_info_svc->rpc_version_char_handle); + if(status) { + FURI_LOG_E(TAG, "Failed to add rpc version characteristic: %d", status); + } // Update characteristics status = aci_gatt_update_char_value( @@ -133,6 +155,18 @@ void dev_info_svc_start() { if(status) { FURI_LOG_E(TAG, "Failed to update software revision char: %d", status); } + string_t rpc_version; + string_init_printf(rpc_version, "%d.%d", PROTOBUF_MAJOR_VERSION, PROTOBUF_MINOR_VERSION); + status = aci_gatt_update_char_value( + dev_info_svc->service_handle, + dev_info_svc->rpc_version_char_handle, + 0, + strlen(string_get_cstr(rpc_version)), + (uint8_t*)string_get_cstr(rpc_version)); + if(status) { + FURI_LOG_E(TAG, "Failed to update rpc version char: %d", status); + } + string_clear(rpc_version); } void dev_info_svc_stop() { @@ -159,6 +193,11 @@ void dev_info_svc_stop() { if(status) { FURI_LOG_E(TAG, "Failed to delete software revision char: %d", status); } + status = + aci_gatt_del_char(dev_info_svc->service_handle, dev_info_svc->rpc_version_char_handle); + if(status) { + FURI_LOG_E(TAG, "Failed to delete rpc version char: %d", status); + } // Delete service status = aci_gatt_del_service(dev_info_svc->service_handle); if(status) {