diff --git a/include/simple_gatt_value_server.h b/include/simple_gatt_value_server.h index e50c319..817022a 100644 --- a/include/simple_gatt_value_server.h +++ b/include/simple_gatt_value_server.h @@ -6,17 +6,9 @@ #include "BLEh.h" #include -struct serve_conf { - uint8_t* value; - size_t value_size; - struct char_pres_format* format; - uint16_t svc_ind; - uint16_t chr_ind; -}; +typedef uint16_t gatt_value_server_handle_t; -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); void simple_gatt_value_server_deinit(); diff --git a/simple_gatt_value_server.c b/simple_gatt_value_server.c index 00c06b5..c7130a1 100644 --- a/simple_gatt_value_server.c +++ b/simple_gatt_value_server.c @@ -15,6 +15,14 @@ #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 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); -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)); 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++){ serve_confs = realloc(serve_confs, (serve_num + 1) * 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_size = value_size; 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)); struct ble_gatt_chr_def chr = { - .uuid = char_uuid, + .uuid = char_uuid[i], .access_cb = read_handler, .arg = serve_confs[serve_num], .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; 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){ struct char_pres_format* formats[values_num]; 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(){ @@ -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){ 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); }