mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
109 lines
2.9 KiB
C
109 lines
2.9 KiB
C
/*
|
|
* SPDX-FileCopyrightText: 2021-2023 Espressif Systems (Shanghai) CO LTD
|
|
*
|
|
* SPDX-License-Identifier: Unlicense OR CC0-1.0
|
|
*/
|
|
|
|
#ifndef H_ESP_CENTRAL_
|
|
#define H_ESP_CENTRAL_
|
|
|
|
#include "modlog/modlog.h"
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#define PEER_ADDR_VAL_SIZE 6
|
|
|
|
/** Misc. */
|
|
void print_bytes(const uint8_t *bytes, int len);
|
|
void print_mbuf(const struct os_mbuf *om);
|
|
void print_mbuf_data(const struct os_mbuf *om);
|
|
char *addr_str(const void *addr);
|
|
void print_uuid(const ble_uuid_t *uuid);
|
|
void print_conn_desc(const struct ble_gap_conn_desc *desc);
|
|
void print_adv_fields(const struct ble_hs_adv_fields *fields);
|
|
void ext_print_adv_report(const void *param);
|
|
|
|
/** Peer. */
|
|
struct peer_dsc {
|
|
SLIST_ENTRY(peer_dsc) next;
|
|
struct ble_gatt_dsc dsc;
|
|
};
|
|
SLIST_HEAD(peer_dsc_list, peer_dsc);
|
|
|
|
struct peer_chr {
|
|
SLIST_ENTRY(peer_chr) next;
|
|
struct ble_gatt_chr chr;
|
|
|
|
struct peer_dsc_list dscs;
|
|
};
|
|
SLIST_HEAD(peer_chr_list, peer_chr);
|
|
|
|
struct peer_svc {
|
|
SLIST_ENTRY(peer_svc) next;
|
|
struct ble_gatt_svc svc;
|
|
|
|
struct peer_chr_list chrs;
|
|
};
|
|
SLIST_HEAD(peer_svc_list, peer_svc);
|
|
|
|
struct peer;
|
|
typedef void peer_disc_fn(const struct peer *peer, int status, void *arg);
|
|
|
|
/**
|
|
* @brief The callback function for the devices traversal.
|
|
*
|
|
* @param peer
|
|
* @param arg
|
|
* @return int 0, continue; Others, stop the traversal.
|
|
*
|
|
*/
|
|
typedef int peer_traverse_fn(const struct peer *peer, void *arg);
|
|
|
|
struct peer {
|
|
SLIST_ENTRY(peer) next;
|
|
uint16_t conn_handle;
|
|
|
|
uint8_t peer_addr[PEER_ADDR_VAL_SIZE];
|
|
|
|
/** List of discovered GATT services. */
|
|
struct peer_svc_list svcs;
|
|
|
|
/** Keeps track of where we are in the service discovery process. */
|
|
uint16_t disc_prev_chr_val;
|
|
struct peer_svc *cur_svc;
|
|
|
|
/** Callback that gets executed when service discovery completes. */
|
|
peer_disc_fn *disc_cb;
|
|
void *disc_cb_arg;
|
|
};
|
|
|
|
void peer_traverse_all(peer_traverse_fn *trav_cb, void *arg);
|
|
|
|
int peer_disc_svc_by_uuid(uint16_t conn_handle, const ble_uuid_t *uuid, peer_disc_fn *disc_cb,
|
|
void *disc_cb_arg);
|
|
|
|
int peer_disc_all(uint16_t conn_handle, peer_disc_fn *disc_cb,
|
|
void *disc_cb_arg);
|
|
const struct peer_dsc *
|
|
peer_dsc_find_uuid(const struct peer *peer, const ble_uuid_t *svc_uuid,
|
|
const ble_uuid_t *chr_uuid, const ble_uuid_t *dsc_uuid);
|
|
const struct peer_chr *
|
|
peer_chr_find_uuid(const struct peer *peer, const ble_uuid_t *svc_uuid,
|
|
const ble_uuid_t *chr_uuid);
|
|
const struct peer_svc *
|
|
peer_svc_find_uuid(const struct peer *peer, const ble_uuid_t *uuid);
|
|
int peer_delete(uint16_t conn_handle);
|
|
int peer_add(uint16_t conn_handle);
|
|
int peer_init(int max_peers, int max_svcs, int max_chrs, int max_dscs);
|
|
struct peer *
|
|
peer_find(uint16_t conn_handle);
|
|
#if MYNEWT_VAL(ENC_ADV_DATA)
|
|
int peer_set_addr(uint16_t conn_handle, uint8_t *peer_addr);
|
|
#endif
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|