12a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati/****************************************************************************** 22a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati * 32a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati * Copyright (C) 2014 Google, Inc. 42a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati * 52a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati * Licensed under the Apache License, Version 2.0 (the "License"); 62a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati * you may not use this file except in compliance with the License. 72a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati * You may obtain a copy of the License at: 82a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati * 92a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati * http://www.apache.org/licenses/LICENSE-2.0 102a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati * 112a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati * Unless required by applicable law or agreed to in writing, software 122a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati * distributed under the License is distributed on an "AS IS" BASIS, 132a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 142a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati * See the License for the specific language governing permissions and 152a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati * limitations under the License. 162a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati * 172a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati ******************************************************************************/ 182a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati 192a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati#include "base.h" 202a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati#include "support/callbacks.h" 212a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati 222a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavativoid adapter_state_changed(bt_state_t state); 232a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavativoid adapter_properties(bt_status_t status, 242a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati int num_properties, 252a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati bt_property_t *properties); 262a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavativoid discovery_state_changed(bt_discovery_state_t state); 272a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati 2828def5731130541d394fafec631462627052c5dcMatthew Xievoid pan_control_state_changed(btpan_control_state_t state, int local_role, bt_status_t error, const char *ifname); 292a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavativoid pan_connection_state_changed(btpan_connection_state_t state, bt_status_t error, const bt_bdaddr_t *bd_addr, int local_role, int remote_role); 302a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati 312a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavatistatic void remote_device_properties(bt_status_t status, 322a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati bt_bdaddr_t *bd_addr, 332a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati int num_properties, 342a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati bt_property_t *properties) { 352a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati CALLBACK_RET(); 362a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati} 372a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati 382a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavatistatic void thread_evt(bt_cb_thread_evt evt) { 392a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati CALLBACK_RET(); 402a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati} 412a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati 422a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavatistatic struct { 432a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati const char *name; 442a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati sem_t semaphore; 452a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati} callback_data[] = { 462a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati // Adapter callbacks 472a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati { "adapter_state_changed" }, 482a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati { "adapter_properties" }, 492a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati { "remote_device_properties" }, 502a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati {}, 512a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati { "discovery_state_changed" }, 522a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati {}, 532a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati {}, 542a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati {}, 552a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati {}, 562a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati { "thread_evt" }, 572a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati {}, 582a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati {}, 592a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati 602a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati // PAN callbacks 612a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati { "pan_control_state_changed" }, 622a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati { "pan_connection_state_changed" }, 632a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati}; 642a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati 652a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavatistatic bt_callbacks_t bt_callbacks = { 662a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati sizeof(bt_callbacks_t), 672a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati adapter_state_changed, // adapter_state_changed_callback 682a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati adapter_properties, // adapter_properties_callback 692a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati remote_device_properties, // remote_device_properties_callback 702a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati NULL, // device_found_callback 712a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati discovery_state_changed, // discovery_state_changed_callback 722a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati NULL, // pin_request_callback 732a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati NULL, // ssp_request_callback 742a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati NULL, // bond_state_changed_callback 752a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati NULL, // acl_state_changed_callback 762a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati thread_evt, // callback_thread_event 772a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati NULL, // dut_mode_recv_callback 782a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati NULL, // le_test_mode_callback 79e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji NULL, 802a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati}; 812a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati 822a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavatistatic btpan_callbacks_t pan_callbacks = { 832a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati sizeof(btpan_callbacks_t), 842a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati pan_control_state_changed, // btpan_control_state_callback 852a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati pan_connection_state_changed, // btpan_connection_state_callback 862a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati}; 872a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati 882a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavativoid callbacks_init() { 892a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati for (size_t i = 0; i < ARRAY_SIZE(callback_data); ++i) { 902a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati sem_init(&callback_data[i].semaphore, 0, 0); 912a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati } 922a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati} 932a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati 942a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavativoid callbacks_cleanup() { 952a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati for (size_t i = 0; i < ARRAY_SIZE(callback_data); ++i) { 962a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati sem_destroy(&callback_data[i].semaphore); 972a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati } 982a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati} 992a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati 1002a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavatibt_callbacks_t *callbacks_get_adapter_struct() { 1012a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati return &bt_callbacks; 1022a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati} 1032a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati 1042a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavatibtpan_callbacks_t *callbacks_get_pan_struct() { 1052a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati return &pan_callbacks; 1062a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati} 1072a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati 1082a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavatisem_t *callbacks_get_semaphore(const char *name) { 1092a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati for (size_t i = 0; i < ARRAY_SIZE(callback_data); ++i) { 1102a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati if (callback_data[i].name && !strcmp(name, callback_data[i].name)) { 1112a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati return &callback_data[i].semaphore; 1122a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati } 1132a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati } 1142a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati return NULL; 1152a73b6deaaf2c12dec215ddeab1e0223c9f28446Sharvil Nanavati} 116