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
This commit is contained in:
parent
b86a400a82
commit
72925fae1c
@ -1,3 +1,3 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#define PROTOBUF_MAJOR_VERSION 0
|
#define PROTOBUF_MAJOR_VERSION 0
|
||||||
#define PROTOBUF_MINOR_VERSION 1
|
#define PROTOBUF_MINOR_VERSION 2
|
||||||
|
@ -1 +1 @@
|
|||||||
Subproject commit 93b9cf3af76664a27646494341a63281a9022740
|
Subproject commit 232e7e9a50b12a95f950fabb515204775e51b04a
|
@ -3,15 +3,20 @@
|
|||||||
#include "ble.h"
|
#include "ble.h"
|
||||||
|
|
||||||
#include <furi.h>
|
#include <furi.h>
|
||||||
|
#include <m-string.h>
|
||||||
|
#include <protobuf_version.h>
|
||||||
|
|
||||||
#define TAG "BtDevInfoSvc"
|
#define TAG "BtDevInfoSvc"
|
||||||
|
|
||||||
|
#define DEV_INFO_RPC_VERSION_CHAR_MAX_SIZE (10)
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint16_t service_handle;
|
uint16_t service_handle;
|
||||||
uint16_t man_name_char_handle;
|
uint16_t man_name_char_handle;
|
||||||
uint16_t serial_num_char_handle;
|
uint16_t serial_num_char_handle;
|
||||||
uint16_t firmware_rev_char_handle;
|
uint16_t firmware_rev_char_handle;
|
||||||
uint16_t software_rev_char_handle;
|
uint16_t software_rev_char_handle;
|
||||||
|
uint16_t rpc_version_char_handle;
|
||||||
} DevInfoSvc;
|
} DevInfoSvc;
|
||||||
|
|
||||||
static DevInfoSvc* dev_info_svc = NULL;
|
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
|
static const char dev_info_software_rev_num[] = GIT_COMMIT " " GIT_BRANCH " " GIT_BRANCH_NUM
|
||||||
" " BUILD_DATE;
|
" " 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() {
|
void dev_info_svc_start() {
|
||||||
dev_info_svc = malloc(sizeof(DevInfoSvc));
|
dev_info_svc = malloc(sizeof(DevInfoSvc));
|
||||||
tBleStatus status;
|
tBleStatus status;
|
||||||
@ -29,7 +37,7 @@ void dev_info_svc_start() {
|
|||||||
// Add Device Information Service
|
// Add Device Information Service
|
||||||
uint16_t uuid = DEVICE_INFORMATION_SERVICE_UUID;
|
uint16_t uuid = DEVICE_INFORMATION_SERVICE_UUID;
|
||||||
status = aci_gatt_add_service(
|
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) {
|
if(status) {
|
||||||
FURI_LOG_E(TAG, "Failed to add Device Information Service: %d", status);
|
FURI_LOG_E(TAG, "Failed to add Device Information Service: %d", status);
|
||||||
}
|
}
|
||||||
@ -95,6 +103,20 @@ void dev_info_svc_start() {
|
|||||||
if(status) {
|
if(status) {
|
||||||
FURI_LOG_E(TAG, "Failed to add software revision char: %d", 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
|
// Update characteristics
|
||||||
status = aci_gatt_update_char_value(
|
status = aci_gatt_update_char_value(
|
||||||
@ -133,6 +155,18 @@ void dev_info_svc_start() {
|
|||||||
if(status) {
|
if(status) {
|
||||||
FURI_LOG_E(TAG, "Failed to update software revision char: %d", 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() {
|
void dev_info_svc_stop() {
|
||||||
@ -159,6 +193,11 @@ void dev_info_svc_stop() {
|
|||||||
if(status) {
|
if(status) {
|
||||||
FURI_LOG_E(TAG, "Failed to delete software revision char: %d", 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
|
// Delete service
|
||||||
status = aci_gatt_del_service(dev_info_svc->service_handle);
|
status = aci_gatt_del_service(dev_info_svc->service_handle);
|
||||||
if(status) {
|
if(status) {
|
||||||
|
@ -3,15 +3,20 @@
|
|||||||
#include "ble.h"
|
#include "ble.h"
|
||||||
|
|
||||||
#include <furi.h>
|
#include <furi.h>
|
||||||
|
#include <m-string.h>
|
||||||
|
#include <protobuf_version.h>
|
||||||
|
|
||||||
#define TAG "BtDevInfoSvc"
|
#define TAG "BtDevInfoSvc"
|
||||||
|
|
||||||
|
#define DEV_INFO_RPC_VERSION_CHAR_MAX_SIZE (10)
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint16_t service_handle;
|
uint16_t service_handle;
|
||||||
uint16_t man_name_char_handle;
|
uint16_t man_name_char_handle;
|
||||||
uint16_t serial_num_char_handle;
|
uint16_t serial_num_char_handle;
|
||||||
uint16_t firmware_rev_char_handle;
|
uint16_t firmware_rev_char_handle;
|
||||||
uint16_t software_rev_char_handle;
|
uint16_t software_rev_char_handle;
|
||||||
|
uint16_t rpc_version_char_handle;
|
||||||
} DevInfoSvc;
|
} DevInfoSvc;
|
||||||
|
|
||||||
static DevInfoSvc* dev_info_svc = NULL;
|
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
|
static const char dev_info_software_rev_num[] = GIT_COMMIT " " GIT_BRANCH " " GIT_BRANCH_NUM
|
||||||
" " BUILD_DATE;
|
" " 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() {
|
void dev_info_svc_start() {
|
||||||
dev_info_svc = malloc(sizeof(DevInfoSvc));
|
dev_info_svc = malloc(sizeof(DevInfoSvc));
|
||||||
tBleStatus status;
|
tBleStatus status;
|
||||||
@ -29,7 +37,7 @@ void dev_info_svc_start() {
|
|||||||
// Add Device Information Service
|
// Add Device Information Service
|
||||||
uint16_t uuid = DEVICE_INFORMATION_SERVICE_UUID;
|
uint16_t uuid = DEVICE_INFORMATION_SERVICE_UUID;
|
||||||
status = aci_gatt_add_service(
|
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) {
|
if(status) {
|
||||||
FURI_LOG_E(TAG, "Failed to add Device Information Service: %d", status);
|
FURI_LOG_E(TAG, "Failed to add Device Information Service: %d", status);
|
||||||
}
|
}
|
||||||
@ -95,6 +103,20 @@ void dev_info_svc_start() {
|
|||||||
if(status) {
|
if(status) {
|
||||||
FURI_LOG_E(TAG, "Failed to add software revision char: %d", 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
|
// Update characteristics
|
||||||
status = aci_gatt_update_char_value(
|
status = aci_gatt_update_char_value(
|
||||||
@ -133,6 +155,18 @@ void dev_info_svc_start() {
|
|||||||
if(status) {
|
if(status) {
|
||||||
FURI_LOG_E(TAG, "Failed to update software revision char: %d", 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() {
|
void dev_info_svc_stop() {
|
||||||
@ -159,6 +193,11 @@ void dev_info_svc_stop() {
|
|||||||
if(status) {
|
if(status) {
|
||||||
FURI_LOG_E(TAG, "Failed to delete software revision char: %d", 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
|
// Delete service
|
||||||
status = aci_gatt_del_service(dev_info_svc->service_handle);
|
status = aci_gatt_del_service(dev_info_svc->service_handle);
|
||||||
if(status) {
|
if(status) {
|
||||||
|
Loading…
Reference in New Issue
Block a user