handle bugfix + value server different charact uuid

This commit is contained in:
leo 2023-06-26 13:54:24 +02:00
parent 3a8c03a7d3
commit cb5fe57c53
Signed by: leo
GPG Key ID: 0DD993BFB2B307DB
2 changed files with 20 additions and 15 deletions

View File

@ -6,17 +6,9 @@
#include "BLEh.h" #include "BLEh.h"
#include <stdint.h> #include <stdint.h>
struct serve_conf { typedef uint16_t gatt_value_server_handle_t;
uint8_t* value;
size_t value_size;
struct char_pres_format* format;
uint16_t svc_ind;
uint16_t chr_ind;
};
typedef struct serve_conf** gatt_value_server_handle_t; gatt_value_server_handle_t simple_gatt_value_server(void* values, size_t values_size, int values_num, struct char_pres_format* format[], struct ble_gatt_svc_def* svc, uint16_t svc_ind, ble_uuid_t** uuid);
gatt_value_server_handle_t simple_gatt_value_server(void* values, size_t values_size, int values_num, struct char_pres_format* format[], struct ble_gatt_svc_def* svc, uint16_t svc_ind, ble_uuid_t* uuid);
gatt_value_server_handle_t simple_gatt_identical_values_server(void* values, size_t values_size, int values_num, struct char_pres_format* format, struct ble_gatt_svc_def* svc, uint16_t svc_ind, ble_uuid_t* uuid); gatt_value_server_handle_t simple_gatt_identical_values_server(void* values, size_t values_size, int values_num, struct char_pres_format* format, struct ble_gatt_svc_def* svc, uint16_t svc_ind, ble_uuid_t* uuid);
void simple_gatt_value_server_deinit(); void simple_gatt_value_server_deinit();

View File

@ -15,6 +15,14 @@
#define TAG "GATT value server" #define TAG "GATT value server"
struct serve_conf {
uint8_t* value;
size_t value_size;
struct char_pres_format* format;
uint16_t svc_ind;
uint16_t chr_ind;
};
static struct serve_conf** serve_confs; static struct serve_conf** serve_confs;
static uint16_t svcs_num = 0; static uint16_t svcs_num = 0;
@ -44,7 +52,7 @@ int read_handler(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_acc
ble_uuid_t* char_pres_format = BLE_UUID16_DECLARE(CHAR_PRES_FORMAT); ble_uuid_t* char_pres_format = BLE_UUID16_DECLARE(CHAR_PRES_FORMAT);
gatt_value_server_handle_t simple_gatt_value_server(void* values, size_t value_size, int values_num, struct char_pres_format* format[], struct ble_gatt_svc_def* svc, uint16_t svc_ind, ble_uuid_t* char_uuid){ gatt_value_server_handle_t simple_gatt_value_server(void* values, size_t value_size, int values_num, struct char_pres_format* format[], struct ble_gatt_svc_def* svc, uint16_t svc_ind, ble_uuid_t* char_uuid[]){
struct ble_gatt_chr_def* chrs = malloc((values_num + 1) * sizeof(struct ble_gatt_chr_def)); struct ble_gatt_chr_def* chrs = malloc((values_num + 1) * sizeof(struct ble_gatt_chr_def));
chars = realloc(chars, (svcs_num + 1) * sizeof(struct ble_gatt_chr_def*)); chars = realloc(chars, (svcs_num + 1) * sizeof(struct ble_gatt_chr_def*));
@ -53,6 +61,7 @@ gatt_value_server_handle_t simple_gatt_value_server(void* values, size_t value_s
for(int i = 0; i < values_num; i++){ for(int i = 0; i < values_num; i++){
serve_confs = realloc(serve_confs, (serve_num + 1) * sizeof(struct serve_conf*)); serve_confs = realloc(serve_confs, (serve_num + 1) * sizeof(struct serve_conf*));
serve_confs[serve_num] = malloc(sizeof(struct serve_conf)); serve_confs[serve_num] = malloc(sizeof(struct serve_conf));
ESP_LOGI(TAG, "Creating conf %d %d %p", svcs_num, serve_num, serve_confs[serve_num]);
serve_confs[serve_num]->value = values+(i*value_size); serve_confs[serve_num]->value = values+(i*value_size);
serve_confs[serve_num]->value_size = value_size; serve_confs[serve_num]->value_size = value_size;
serve_confs[serve_num]->format = format[i]; serve_confs[serve_num]->format = format[i];
@ -73,7 +82,7 @@ gatt_value_server_handle_t simple_gatt_value_server(void* values, size_t value_s
memset(&descrs[serve_num][1], 0, sizeof(struct ble_gatt_dsc_def)); memset(&descrs[serve_num][1], 0, sizeof(struct ble_gatt_dsc_def));
struct ble_gatt_chr_def chr = { struct ble_gatt_chr_def chr = {
.uuid = char_uuid, .uuid = char_uuid[i],
.access_cb = read_handler, .access_cb = read_handler,
.arg = serve_confs[serve_num], .arg = serve_confs[serve_num],
.flags = BLE_GATT_CHR_F_READ | BLE_GATT_CHR_F_NOTIFY, .flags = BLE_GATT_CHR_F_READ | BLE_GATT_CHR_F_NOTIFY,
@ -88,14 +97,17 @@ gatt_value_server_handle_t simple_gatt_value_server(void* values, size_t value_s
svc->characteristics = chrs; svc->characteristics = chrs;
svcs_num++; svcs_num++;
return &serve_confs[serve_num - values_num]; return serve_num - values_num;
} }
gatt_value_server_handle_t simple_gatt_identical_values_server(void* values, size_t values_size, int values_num, struct char_pres_format* format, struct ble_gatt_svc_def* svc, uint16_t svc_ind, ble_uuid_t* uuid){ gatt_value_server_handle_t simple_gatt_identical_values_server(void* values, size_t values_size, int values_num, struct char_pres_format* format, struct ble_gatt_svc_def* svc, uint16_t svc_ind, ble_uuid_t* uuid){
struct char_pres_format* formats[values_num]; struct char_pres_format* formats[values_num];
for(int i = 0; i < values_num; i++) formats[i] = format; for(int i = 0; i < values_num; i++) formats[i] = format;
return simple_gatt_value_server(values, values_size, values_num, formats, svc, svc_ind, uuid); ble_uuid_t* uuids[values_num];
for(int i = 0; i < values_num; i++) uuids[i] = uuid;
return simple_gatt_value_server(values, values_size, values_num, formats, svc, svc_ind, uuids);
} }
void simple_gatt_value_server_deinit(){ void simple_gatt_value_server_deinit(){
@ -110,7 +122,8 @@ void simple_gatt_value_server_deinit(){
void simple_gatt_value_server_notify(gatt_value_server_handle_t handle, int values_num){ void simple_gatt_value_server_notify(gatt_value_server_handle_t handle, int values_num){
for(int i = 0; i < values_num; i++){ for(int i = 0; i < values_num; i++){
struct serve_conf* conf = ((struct serve_conf**)handle)[i]; struct serve_conf* conf = serve_confs[handle + i];
ESP_LOGI(TAG, "notify %d %d", conf->svc_ind, conf->chr_ind);
notify(conf->svc_ind, conf->chr_ind, conf->value, conf->value_size); notify(conf->svc_ind, conf->chr_ind, conf->value, conf->value_size);
} }