1 /****************************************************************************** 2 * 3 * Copyright (C) 2014 Google, Inc. 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at: 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 ******************************************************************************/ 18 19 #include "base.h" 20 #include "support/callbacks.h" 21 22 void adapter_state_changed(bt_state_t state); 23 void adapter_properties(bt_status_t status, 24 int num_properties, 25 bt_property_t *properties); 26 void discovery_state_changed(bt_discovery_state_t state); 27 28 void pan_control_state_changed(btpan_control_state_t state, int local_role, bt_status_t error, const char *ifname); 29 void 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); 30 31 static void remote_device_properties(bt_status_t status, 32 bt_bdaddr_t *bd_addr, 33 int num_properties, 34 bt_property_t *properties) { 35 CALLBACK_RET(); 36 } 37 38 static void thread_evt(bt_cb_thread_evt evt) { 39 CALLBACK_RET(); 40 } 41 42 static struct { 43 const char *name; 44 sem_t semaphore; 45 } callback_data[] = { 46 // Adapter callbacks 47 { "adapter_state_changed" }, 48 { "adapter_properties" }, 49 { "remote_device_properties" }, 50 {}, 51 { "discovery_state_changed" }, 52 {}, 53 {}, 54 {}, 55 {}, 56 { "thread_evt" }, 57 {}, 58 {}, 59 60 // PAN callbacks 61 { "pan_control_state_changed" }, 62 { "pan_connection_state_changed" }, 63 }; 64 65 static bt_callbacks_t bt_callbacks = { 66 sizeof(bt_callbacks_t), 67 adapter_state_changed, // adapter_state_changed_callback 68 adapter_properties, // adapter_properties_callback 69 remote_device_properties, // remote_device_properties_callback 70 NULL, // device_found_callback 71 discovery_state_changed, // discovery_state_changed_callback 72 NULL, // pin_request_callback 73 NULL, // ssp_request_callback 74 NULL, // bond_state_changed_callback 75 NULL, // acl_state_changed_callback 76 thread_evt, // callback_thread_event 77 NULL, // dut_mode_recv_callback 78 NULL, // le_test_mode_callback 79 NULL, 80 }; 81 82 static btpan_callbacks_t pan_callbacks = { 83 sizeof(btpan_callbacks_t), 84 pan_control_state_changed, // btpan_control_state_callback 85 pan_connection_state_changed, // btpan_connection_state_callback 86 }; 87 88 void callbacks_init() { 89 for (size_t i = 0; i < ARRAY_SIZE(callback_data); ++i) { 90 sem_init(&callback_data[i].semaphore, 0, 0); 91 } 92 } 93 94 void callbacks_cleanup() { 95 for (size_t i = 0; i < ARRAY_SIZE(callback_data); ++i) { 96 sem_destroy(&callback_data[i].semaphore); 97 } 98 } 99 100 bt_callbacks_t *callbacks_get_adapter_struct() { 101 return &bt_callbacks; 102 } 103 104 btpan_callbacks_t *callbacks_get_pan_struct() { 105 return &pan_callbacks; 106 } 107 108 sem_t *callbacks_get_semaphore(const char *name) { 109 for (size_t i = 0; i < ARRAY_SIZE(callback_data); ++i) { 110 if (callback_data[i].name && !strcmp(name, callback_data[i].name)) { 111 return &callback_data[i].semaphore; 112 } 113 } 114 return NULL; 115 } 116