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