Home | History | Annotate | Download | only in bluetooth
      1 //
      2 //  Copyright (C) 2015 Google, Inc.
      3 //
      4 //  Licensed under the Apache License, Version 2.0 (the "License");
      5 //  you may not use this file except in compliance with the License.
      6 //  You may obtain a copy of the License at:
      7 //
      8 //  http://www.apache.org/licenses/LICENSE-2.0
      9 //
     10 //  Unless required by applicable law or agreed to in writing, software
     11 //  distributed under the License is distributed on an "AS IS" BASIS,
     12 //  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 //  See the License for the specific language governing permissions and
     14 //  limitations under the License.
     15 //
     16 
     17 #include <base.h>
     18 #include <base/at_exit.h>
     19 #include <base/command_line.h>
     20 #include <base/logging.h>
     21 #include <base/macros.h>
     22 #include <base/strings/string_split.h>
     23 #include <base/strings/string_util.h>
     24 #include <binder/IPCThreadState.h>
     25 #include <binder/ProcessState.h>
     26 
     27 #include "bluetooth_binder_facade.h"
     28 #include <service/common/bluetooth/binder/IBluetooth.h>
     29 #include <service/common/bluetooth/binder/IBluetoothCallback.h>
     30 #include <service/common/bluetooth/binder/IBluetoothLowEnergy.h>
     31 #include <service/common/bluetooth/low_energy_constants.h>
     32 #include <tuple>
     33 
     34 using android::sp;
     35 using ipc::binder::IBluetooth;
     36 using ipc::binder::IBluetoothLowEnergy;
     37 
     38 std::atomic_bool ble_registering(false);
     39 std::atomic_int ble_client_id(0);
     40 
     41 bool BluetoothBinderFacade::SharedValidator() {
     42   if (bt_iface == NULL) {
     43     LOG(ERROR) << sl4n::kTagStr << " IBluetooth interface not initialized";
     44     return false;
     45   }
     46   if (!bt_iface->IsEnabled()) {
     47     LOG(ERROR) << sl4n::kTagStr << " IBluetooth interface not enabled";
     48     return false;
     49   }
     50   return true;
     51 }
     52 
     53 std::tuple<bool, int> BluetoothBinderFacade::BluetoothBinderEnable() {
     54   if (bt_iface == NULL) {
     55     LOG(ERROR) << sl4n::kTagStr << ": IBluetooth interface not enabled";
     56     return std::make_tuple(false, sl4n_error_codes::kFailInt);
     57   }
     58   bool result = bt_iface->Enable(false);
     59   if (!result) {
     60     LOG(ERROR) << sl4n::kTagStr << ": Failed to enable the Bluetooth service";
     61     return std::make_tuple(false, sl4n_error_codes::kPassInt);
     62   } else {
     63     return std::make_tuple(true, sl4n_error_codes::kPassInt);
     64   }
     65 }
     66 
     67 std::tuple<std::string, int> BluetoothBinderFacade::BluetoothBinderGetAddress() {
     68   if (!SharedValidator()) {
     69     return std::make_tuple(sl4n::kFailStr, sl4n_error_codes::kFailInt);
     70   }
     71   return std::make_tuple(bt_iface->GetAddress(), sl4n_error_codes::kPassInt);
     72 }
     73 
     74 std::tuple<std::string, int> BluetoothBinderFacade::BluetoothBinderGetName() {
     75   if (!SharedValidator()) {
     76     return std::make_tuple(sl4n::kFailStr,sl4n_error_codes::kFailInt);
     77   }
     78   std::string name = bt_iface->GetName();
     79   if (name.empty()) {
     80     LOG(ERROR) << sl4n::kTagStr << ": Failed to get device name";
     81     return std::make_tuple(sl4n::kFailStr, sl4n_error_codes::kFailInt);
     82   } else {
     83     return std::make_tuple(name, sl4n_error_codes::kPassInt);
     84   }
     85 }
     86 
     87 std::tuple<bool, int> BluetoothBinderFacade::BluetoothBinderSetName(
     88   std::string name) {
     89 
     90   if (!SharedValidator()) {
     91     return std::make_tuple(false, sl4n_error_codes::kFailInt);
     92   }
     93   bool result = bt_iface->SetName(name);
     94   if (!result) {
     95     LOG(ERROR) << sl4n::kTagStr << ": Failed to set device name";
     96     return std::make_tuple(false, sl4n_error_codes::kFailInt);
     97   }
     98   return std::make_tuple(true, sl4n_error_codes::kPassInt);
     99 }
    100 
    101 std::tuple<bool, int> BluetoothBinderFacade::BluetoothBinderInitInterface() {
    102   bt_iface = IBluetooth::getClientInterface();
    103   if(!bt_iface.get()) {
    104     LOG(ERROR) << sl4n::kTagStr <<
    105       ": Failed to initialize IBluetooth interface";
    106     return std::make_tuple(false, sl4n_error_codes::kFailInt);
    107   }
    108   return std::make_tuple(true, sl4n_error_codes::kPassInt);
    109 }
    110 
    111 std::tuple<bool, int> BluetoothBinderFacade::BluetoothBinderRegisterBLE() {
    112   // TODO (tturney): verify bt_iface initialized everywhere
    113   if (!SharedValidator()) {
    114     return std::make_tuple(false, sl4n_error_codes::kFailInt);
    115   }
    116   ble_iface = bt_iface->GetLowEnergyInterface();
    117   if(!ble_iface.get()) {
    118     LOG(ERROR) << sl4n::kTagStr << ": Failed to register BLE";
    119     return std::make_tuple(false, sl4n_error_codes::kFailInt);
    120   }
    121   return std::make_tuple(true, sl4n_error_codes::kPassInt);
    122 }
    123 
    124 std::tuple<int, int> BluetoothBinderFacade::BluetoothBinderSetAdvSettings(
    125   int mode, int timeout_seconds, int tx_power_level, bool is_connectable) {
    126   if (!SharedValidator()) {
    127     return std::make_tuple(false,sl4n_error_codes::kFailInt);
    128   }
    129   bluetooth::AdvertiseSettings::Mode adv_mode;
    130   switch (mode) {
    131     case sl4n_ble::kAdvSettingsModeLowPowerInt :
    132       adv_mode = bluetooth::AdvertiseSettings::Mode::MODE_LOW_POWER;
    133     case sl4n_ble::kAdvSettingsModeBalancedInt :
    134       adv_mode = bluetooth::AdvertiseSettings::Mode::MODE_BALANCED;
    135     case sl4n_ble::kAdvSettingsModeLowLatencyInt :
    136       adv_mode = bluetooth::AdvertiseSettings::Mode::MODE_LOW_LATENCY;
    137     default :
    138       LOG(ERROR) << sl4n::kTagStr <<
    139         ": Input mode is outside the accepted values";
    140       return std::make_tuple(
    141         sl4n::kFailedCounterInt, sl4n_error_codes::kFailInt);
    142   }
    143 
    144   base::TimeDelta adv_timeout = base::TimeDelta::FromSeconds(
    145     timeout_seconds);
    146 
    147   bluetooth::AdvertiseSettings::TxPowerLevel adv_tx_power_level;
    148   switch (tx_power_level) {
    149     case sl4n_ble::kAdvSettingsTxPowerLevelUltraLowInt: tx_power_level =
    150       bluetooth::AdvertiseSettings::TxPowerLevel::TX_POWER_LEVEL_ULTRA_LOW;
    151     case sl4n_ble::kAdvSettingsTxPowerLevelLowInt: tx_power_level =
    152       bluetooth::AdvertiseSettings::TxPowerLevel::TX_POWER_LEVEL_LOW;
    153     case sl4n_ble::kAdvSettingsTxPowerLevelMediumInt: tx_power_level =
    154       bluetooth::AdvertiseSettings::TxPowerLevel::TX_POWER_LEVEL_MEDIUM;
    155     case sl4n_ble::kAdvSettingsTxPowerLevelHighInt: tx_power_level =
    156       bluetooth::AdvertiseSettings::TxPowerLevel::TX_POWER_LEVEL_HIGH;
    157     default :
    158       LOG(ERROR) << sl4n::kTagStr <<
    159         ": Input tx power level is outside the accepted values";
    160       return std::make_tuple(
    161         sl4n::kFailedCounterInt, sl4n_error_codes::kFailInt);
    162   }
    163 
    164   bluetooth::AdvertiseSettings adv_settings = bluetooth::AdvertiseSettings(
    165     adv_mode, adv_timeout, adv_tx_power_level, is_connectable);
    166   adv_settings_map[adv_settings_count] = adv_settings;
    167   int adv_settings_id = adv_settings_count;
    168   adv_settings_count++;
    169   return std::make_tuple(adv_settings_id, sl4n_error_codes::kPassInt);
    170 }
    171 
    172 BluetoothBinderFacade::BluetoothBinderFacade() {
    173   adv_settings_count = 0;
    174   manu_data_count = 0;
    175 }
    176