1*042d53a7SEvalZero /* 2*042d53a7SEvalZero * Licensed to the Apache Software Foundation (ASF) under one 3*042d53a7SEvalZero * or more contributor license agreements. See the NOTICE file 4*042d53a7SEvalZero * distributed with this work for additional information 5*042d53a7SEvalZero * regarding copyright ownership. The ASF licenses this file 6*042d53a7SEvalZero * to you under the Apache License, Version 2.0 (the 7*042d53a7SEvalZero * "License"); you may not use this file except in compliance 8*042d53a7SEvalZero * with the License. You may obtain a copy of the License at 9*042d53a7SEvalZero * 10*042d53a7SEvalZero * http://www.apache.org/licenses/LICENSE-2.0 11*042d53a7SEvalZero * 12*042d53a7SEvalZero * Unless required by applicable law or agreed to in writing, 13*042d53a7SEvalZero * software distributed under the License is distributed on an 14*042d53a7SEvalZero * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15*042d53a7SEvalZero * KIND, either express or implied. See the License for the 16*042d53a7SEvalZero * specific language governing permissions and limitations 17*042d53a7SEvalZero * under the License. 18*042d53a7SEvalZero */ 19*042d53a7SEvalZero 20*042d53a7SEvalZero #ifndef H_BLECENT_ 21*042d53a7SEvalZero #define H_BLECENT_ 22*042d53a7SEvalZero 23*042d53a7SEvalZero #include "nimble/ble.h" 24*042d53a7SEvalZero #include "modlog/modlog.h" 25*042d53a7SEvalZero #ifdef __cplusplus 26*042d53a7SEvalZero extern "C" { 27*042d53a7SEvalZero #endif 28*042d53a7SEvalZero 29*042d53a7SEvalZero struct ble_hs_adv_fields; 30*042d53a7SEvalZero struct ble_gap_conn_desc; 31*042d53a7SEvalZero struct ble_hs_cfg; 32*042d53a7SEvalZero union ble_store_value; 33*042d53a7SEvalZero union ble_store_key; 34*042d53a7SEvalZero 35*042d53a7SEvalZero #define BLECENT_SVC_ALERT_UUID 0x1811 36*042d53a7SEvalZero #define BLECENT_CHR_SUP_NEW_ALERT_CAT_UUID 0x2A47 37*042d53a7SEvalZero #define BLECENT_CHR_NEW_ALERT 0x2A46 38*042d53a7SEvalZero #define BLECENT_CHR_SUP_UNR_ALERT_CAT_UUID 0x2A48 39*042d53a7SEvalZero #define BLECENT_CHR_UNR_ALERT_STAT_UUID 0x2A45 40*042d53a7SEvalZero #define BLECENT_CHR_ALERT_NOT_CTRL_PT 0x2A44 41*042d53a7SEvalZero 42*042d53a7SEvalZero /** Misc. */ 43*042d53a7SEvalZero void print_bytes(const uint8_t *bytes, int len); 44*042d53a7SEvalZero void print_mbuf(const struct os_mbuf *om); 45*042d53a7SEvalZero char *addr_str(const void *addr); 46*042d53a7SEvalZero void print_uuid(const ble_uuid_t *uuid); 47*042d53a7SEvalZero void print_conn_desc(const struct ble_gap_conn_desc *desc); 48*042d53a7SEvalZero void print_adv_fields(const struct ble_hs_adv_fields *fields); 49*042d53a7SEvalZero 50*042d53a7SEvalZero /** Peer. */ 51*042d53a7SEvalZero struct peer_dsc { 52*042d53a7SEvalZero SLIST_ENTRY(peer_dsc) next; 53*042d53a7SEvalZero struct ble_gatt_dsc dsc; 54*042d53a7SEvalZero }; 55*042d53a7SEvalZero SLIST_HEAD(peer_dsc_list, peer_dsc); 56*042d53a7SEvalZero 57*042d53a7SEvalZero struct peer_chr { 58*042d53a7SEvalZero SLIST_ENTRY(peer_chr) next; 59*042d53a7SEvalZero struct ble_gatt_chr chr; 60*042d53a7SEvalZero 61*042d53a7SEvalZero struct peer_dsc_list dscs; 62*042d53a7SEvalZero }; 63*042d53a7SEvalZero SLIST_HEAD(peer_chr_list, peer_chr); 64*042d53a7SEvalZero 65*042d53a7SEvalZero struct peer_svc { 66*042d53a7SEvalZero SLIST_ENTRY(peer_svc) next; 67*042d53a7SEvalZero struct ble_gatt_svc svc; 68*042d53a7SEvalZero 69*042d53a7SEvalZero struct peer_chr_list chrs; 70*042d53a7SEvalZero }; 71*042d53a7SEvalZero SLIST_HEAD(peer_svc_list, peer_svc); 72*042d53a7SEvalZero 73*042d53a7SEvalZero struct peer; 74*042d53a7SEvalZero typedef void peer_disc_fn(const struct peer *peer, int status, void *arg); 75*042d53a7SEvalZero 76*042d53a7SEvalZero struct peer { 77*042d53a7SEvalZero SLIST_ENTRY(peer) next; 78*042d53a7SEvalZero 79*042d53a7SEvalZero uint16_t conn_handle; 80*042d53a7SEvalZero 81*042d53a7SEvalZero /** List of discovered GATT services. */ 82*042d53a7SEvalZero struct peer_svc_list svcs; 83*042d53a7SEvalZero 84*042d53a7SEvalZero /** Keeps track of where we are in the service discovery process. */ 85*042d53a7SEvalZero uint16_t disc_prev_chr_val; 86*042d53a7SEvalZero struct peer_svc *cur_svc; 87*042d53a7SEvalZero 88*042d53a7SEvalZero /** Callback that gets executed when service discovery completes. */ 89*042d53a7SEvalZero peer_disc_fn *disc_cb; 90*042d53a7SEvalZero void *disc_cb_arg; 91*042d53a7SEvalZero }; 92*042d53a7SEvalZero 93*042d53a7SEvalZero int peer_disc_all(uint16_t conn_handle, peer_disc_fn *disc_cb, 94*042d53a7SEvalZero void *disc_cb_arg); 95*042d53a7SEvalZero const struct peer_dsc * 96*042d53a7SEvalZero peer_dsc_find_uuid(const struct peer *peer, const ble_uuid_t *svc_uuid, 97*042d53a7SEvalZero const ble_uuid_t *chr_uuid, const ble_uuid_t *dsc_uuid); 98*042d53a7SEvalZero const struct peer_chr * 99*042d53a7SEvalZero peer_chr_find_uuid(const struct peer *peer, const ble_uuid_t *svc_uuid, 100*042d53a7SEvalZero const ble_uuid_t *chr_uuid); 101*042d53a7SEvalZero const struct peer_svc * 102*042d53a7SEvalZero peer_svc_find_uuid(const struct peer *peer, const ble_uuid_t *uuid); 103*042d53a7SEvalZero int peer_delete(uint16_t conn_handle); 104*042d53a7SEvalZero int peer_add(uint16_t conn_handle); 105*042d53a7SEvalZero int peer_init(int max_peers, int max_svcs, int max_chrs, int max_dscs); 106*042d53a7SEvalZero 107*042d53a7SEvalZero #ifdef __cplusplus 108*042d53a7SEvalZero } 109*042d53a7SEvalZero #endif 110*042d53a7SEvalZero 111*042d53a7SEvalZero #endif 112