Welcome to mirror list, hosted at ThFree Co, Russian Federation.

dev_info_service.c « ble_glue « f6 « targets « firmware - github.com/ClusterM/flipperzero-firmware.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 1c9b94ebdaf00edc4d8ee3528c1e66bf3413c169 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
#include "dev_info_service.h"
#include "app_common.h"
#include "ble.h"

#include <furi.h>

#define TAG "BtDevInfoSvc"

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;
} DevInfoSvc;

static DevInfoSvc* dev_info_svc = NULL;

static const char dev_info_man_name[] = "Flipper Devices Inc.";
static const char dev_info_serial_num[] = "1.0";
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;

void dev_info_svc_start() {
    dev_info_svc = furi_alloc(sizeof(DevInfoSvc));
    tBleStatus status;

    // 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);
    if(status) {
        FURI_LOG_E(TAG, "Failed to add Device Information Service: %d", status);
    }

    // Add characteristics
    uuid = MANUFACTURER_NAME_UUID;
    status = aci_gatt_add_char(
        dev_info_svc->service_handle,
        UUID_TYPE_16,
        (Char_UUID_t*)&uuid,
        strlen(dev_info_man_name),
        CHAR_PROP_READ,
        ATTR_PERMISSION_AUTHEN_READ,
        GATT_DONT_NOTIFY_EVENTS,
        10,
        CHAR_VALUE_LEN_CONSTANT,
        &dev_info_svc->man_name_char_handle);
    if(status) {
        FURI_LOG_E(TAG, "Failed to add manufacturer name char: %d", status);
    }
    uuid = SERIAL_NUMBER_UUID;
    status = aci_gatt_add_char(
        dev_info_svc->service_handle,
        UUID_TYPE_16,
        (Char_UUID_t*)&uuid,
        strlen(dev_info_serial_num),
        CHAR_PROP_READ,
        ATTR_PERMISSION_AUTHEN_READ,
        GATT_DONT_NOTIFY_EVENTS,
        10,
        CHAR_VALUE_LEN_CONSTANT,
        &dev_info_svc->serial_num_char_handle);
    if(status) {
        FURI_LOG_E(TAG, "Failed to add serial number char: %d", status);
    }
    uuid = FIRMWARE_REVISION_UUID;
    status = aci_gatt_add_char(
        dev_info_svc->service_handle,
        UUID_TYPE_16,
        (Char_UUID_t*)&uuid,
        strlen(dev_info_firmware_rev_num),
        CHAR_PROP_READ,
        ATTR_PERMISSION_AUTHEN_READ,
        GATT_DONT_NOTIFY_EVENTS,
        10,
        CHAR_VALUE_LEN_CONSTANT,
        &dev_info_svc->firmware_rev_char_handle);
    if(status) {
        FURI_LOG_E(TAG, "Failed to add firmware revision char: %d", status);
    }
    uuid = SOFTWARE_REVISION_UUID;
    status = aci_gatt_add_char(
        dev_info_svc->service_handle,
        UUID_TYPE_16,
        (Char_UUID_t*)&uuid,
        strlen(dev_info_software_rev_num),
        CHAR_PROP_READ,
        ATTR_PERMISSION_AUTHEN_READ,
        GATT_DONT_NOTIFY_EVENTS,
        10,
        CHAR_VALUE_LEN_CONSTANT,
        &dev_info_svc->software_rev_char_handle);
    if(status) {
        FURI_LOG_E(TAG, "Failed to add software revision char: %d", status);
    }

    // Update characteristics
    status = aci_gatt_update_char_value(
        dev_info_svc->service_handle,
        dev_info_svc->man_name_char_handle,
        0,
        strlen(dev_info_man_name),
        (uint8_t*)dev_info_man_name);
    if(status) {
        FURI_LOG_E(TAG, "Failed to update manufacturer name char: %d", status);
    }
    status = aci_gatt_update_char_value(
        dev_info_svc->service_handle,
        dev_info_svc->serial_num_char_handle,
        0,
        strlen(dev_info_serial_num),
        (uint8_t*)dev_info_serial_num);
    if(status) {
        FURI_LOG_E(TAG, "Failed to update serial number char: %d", status);
    }
    status = aci_gatt_update_char_value(
        dev_info_svc->service_handle,
        dev_info_svc->firmware_rev_char_handle,
        0,
        strlen(dev_info_firmware_rev_num),
        (uint8_t*)dev_info_firmware_rev_num);
    if(status) {
        FURI_LOG_E(TAG, "Failed to update firmware revision char: %d", status);
    }
    status = aci_gatt_update_char_value(
        dev_info_svc->service_handle,
        dev_info_svc->software_rev_char_handle,
        0,
        strlen(dev_info_software_rev_num),
        (uint8_t*)dev_info_software_rev_num);
    if(status) {
        FURI_LOG_E(TAG, "Failed to update software revision char: %d", status);
    }
}

void dev_info_svc_stop() {
    tBleStatus status;
    if(dev_info_svc) {
        // Delete service characteristics
        status =
            aci_gatt_del_char(dev_info_svc->service_handle, dev_info_svc->man_name_char_handle);
        if(status) {
            FURI_LOG_E(TAG, "Failed to delete manufacturer name char: %d", status);
        }
        status =
            aci_gatt_del_char(dev_info_svc->service_handle, dev_info_svc->serial_num_char_handle);
        if(status) {
            FURI_LOG_E(TAG, "Failed to delete serial number char: %d", status);
        }
        status = aci_gatt_del_char(
            dev_info_svc->service_handle, dev_info_svc->firmware_rev_char_handle);
        if(status) {
            FURI_LOG_E(TAG, "Failed to delete firmware revision char: %d", status);
        }
        status = aci_gatt_del_char(
            dev_info_svc->service_handle, dev_info_svc->software_rev_char_handle);
        if(status) {
            FURI_LOG_E(TAG, "Failed to delete software revision char: %d", status);
        }
        // Delete service
        status = aci_gatt_del_service(dev_info_svc->service_handle);
        if(status) {
            FURI_LOG_E(TAG, "Failed to delete device info service: %d", status);
        }
        free(dev_info_svc);
        dev_info_svc = NULL;
    }
}

bool dev_info_svc_is_started() {
    return dev_info_svc != NULL;
}