| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| #include "console/console.h" |
| #include "host/ble_uuid.h" |
| #include "host/ble_gap.h" |
| |
| #include "btshell.h" |
| |
| /** |
| * Utility function to log an array of bytes. |
| */ |
| void |
| print_bytes(const uint8_t *bytes, int len) |
| { |
| int i; |
| |
| for (i = 0; i < len; i++) { |
| console_printf("%s0x%02x", i != 0 ? ":" : "", bytes[i]); |
| } |
| } |
| |
| void |
| print_mbuf(const struct os_mbuf *om) |
| { |
| int colon; |
| |
| colon = 0; |
| while (om != NULL) { |
| if (colon) { |
| console_printf(":"); |
| } else { |
| colon = 1; |
| } |
| print_bytes(om->om_data, om->om_len); |
| om = SLIST_NEXT(om, om_next); |
| } |
| } |
| |
| void |
| print_addr(const void *addr) |
| { |
| const uint8_t *u8p; |
| |
| u8p = addr; |
| console_printf("%02x:%02x:%02x:%02x:%02x:%02x", |
| u8p[5], u8p[4], u8p[3], u8p[2], u8p[1], u8p[0]); |
| } |
| |
| void |
| print_uuid(const ble_uuid_t *uuid) |
| { |
| char buf[BLE_UUID_STR_LEN]; |
| |
| ble_uuid_to_str(uuid, buf); |
| |
| console_printf("%s", buf); |
| } |
| |
| int |
| svc_is_empty(const struct btshell_svc *svc) |
| { |
| return svc->svc.end_handle <= svc->svc.start_handle; |
| } |
| |
| uint16_t |
| chr_end_handle(const struct btshell_svc *svc, const struct btshell_chr *chr) |
| { |
| const struct btshell_chr *next_chr; |
| |
| next_chr = SLIST_NEXT(chr, next); |
| if (next_chr != NULL) { |
| return next_chr->chr.def_handle - 1; |
| } else { |
| return svc->svc.end_handle; |
| } |
| } |
| |
| int |
| chr_is_empty(const struct btshell_svc *svc, const struct btshell_chr *chr) |
| { |
| return chr_end_handle(svc, chr) <= chr->chr.val_handle; |
| } |
| |
| void |
| print_conn_desc(const struct ble_gap_conn_desc *desc) |
| { |
| console_printf("handle=%d our_ota_addr_type=%d our_ota_addr=", |
| desc->conn_handle, desc->our_ota_addr.type); |
| print_addr(desc->our_ota_addr.val); |
| console_printf(" our_id_addr_type=%d our_id_addr=", |
| desc->our_id_addr.type); |
| print_addr(desc->our_id_addr.val); |
| console_printf(" peer_ota_addr_type=%d peer_ota_addr=", |
| desc->peer_ota_addr.type); |
| print_addr(desc->peer_ota_addr.val); |
| console_printf(" peer_id_addr_type=%d peer_id_addr=", |
| desc->peer_id_addr.type); |
| print_addr(desc->peer_id_addr.val); |
| console_printf(" conn_itvl=%d conn_latency=%d supervision_timeout=%d " |
| "encrypted=%d authenticated=%d bonded=%d\n", |
| desc->conn_itvl, desc->conn_latency, |
| desc->supervision_timeout, |
| desc->sec_state.encrypted, |
| desc->sec_state.authenticated, |
| desc->sec_state.bonded); |
| } |
| |
| static void |
| print_dsc(struct btshell_dsc *dsc) |
| { |
| console_printf(" dsc_handle=%d uuid=", dsc->dsc.handle); |
| print_uuid(&dsc->dsc.uuid.u); |
| console_printf("\n"); |
| } |
| |
| static void |
| print_chr(struct btshell_chr *chr) |
| { |
| struct btshell_dsc *dsc; |
| |
| console_printf(" def_handle=%d val_handle=%d properties=0x%02x " |
| "uuid=", chr->chr.def_handle, chr->chr.val_handle, |
| chr->chr.properties); |
| print_uuid(&chr->chr.uuid.u); |
| console_printf("\n"); |
| |
| SLIST_FOREACH(dsc, &chr->dscs, next) { |
| print_dsc(dsc); |
| } |
| } |
| |
| void |
| print_svc(struct btshell_svc *svc) |
| { |
| struct btshell_chr *chr; |
| |
| console_printf(" start=%d end=%d uuid=", svc->svc.start_handle, |
| svc->svc.end_handle); |
| print_uuid(&svc->svc.uuid.u); |
| console_printf("\n"); |
| |
| SLIST_FOREACH(chr, &svc->chrs, next) { |
| print_chr(chr); |
| } |
| } |