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
remote_device_properties(bt_status_t status,bt_bdaddr_t * bd_addr,int num_properties,bt_property_t * properties)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
thread_evt(bt_cb_thread_evt evt)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
callbacks_init()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
callbacks_cleanup()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
callbacks_get_adapter_struct()100 bt_callbacks_t *callbacks_get_adapter_struct() {
101 return &bt_callbacks;
102 }
103
callbacks_get_pan_struct()104 btpan_callbacks_t *callbacks_get_pan_struct() {
105 return &pan_callbacks;
106 }
107
callbacks_get_semaphore(const char * name)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