commit | 367373ba8bcfb1d9db41b1904de372483991fc10 | [log] [tgz] |
---|---|---|
author | Ivan Podogov <ginkage@google.com> | Thu Jan 19 17:19:37 2017 +0000 |
committer | Andre Eisenbach <eisenbach@google.com> | Wed Jan 25 00:07:45 2017 +0000 |
tree | 32e527139e154734d7ddf3e7053574b0875945fc | |
parent | 6d75adcc03975cf6c9cae95349233aa6c3a19da2 [diff] |
HID: Fix forced disconnection flow. In some cases, we end up in a state where we can neither connect nor forcefully end connection, and will require disabling the Bluetooth adapter to fix this state. When a device is taking too long to connect (or out of range), the user may want to cancel the connection by calling disconnect method, which will be ignored in any state other than BTA_HD_CONN_ST. It is a lot better to immediately cease the connection process at this point, so: - BTA_HD_API_DISCONNECT_EVT is now not ignored in BTA_HD_IDLE_ST; - bta_hd_disconnect_act now reports a correct MAC address during disconnection (it used to send 00:00:00:00:00:00 before); - HidDevDisconnect now allows to forcefully end the connection, and does it in exactly the same way we handle the errors. When L2CAP connection fails, both hidd_l2cif_config_ind and hidd_l2cif_config_cfm set conn_state to HID_CONN_STATE_UNUSED, which is immediately overwritten by the hidd_conn_disconnect call (it will set conn_state to HID_CONN_STATE_DISCONNECTING, because ctrl_cid != 0 in both cases), thus making any subsequent calls to connect failing with "already connecting" error. More than that, all functions send the HID_DHOST_EVT_CLOSE event when failing, which is, again, ignored in the BTA_HD_IDLE_ST state. So: - BTA_HD_INT_CLOSE_EVT is now not ignored in BTA_HD_IDLE_ST; - conn_state is set to HID_CONN_STATE_UNUSED after the call to hidd_conn_disconnect, but before sending the close event. Test: Build, run, connect/disconnect multiple times. Change-Id: I85bb03f760bb9a6fd4c1b944d515232c1be12300
Just build AOSP - Fluoride is there by default.
Instructions for Ubuntu, tested on 14.04 with Clang 3.5.0 and 16.10 with Clang 3.8.0
mkdir ~/fluoride cd ~/fluoride git clone https://android.googlesource.com/platform/system/bt
Install dependencies (require sudo access):
cd ~/fluoride/bt build/install_deps.sh
Then fetch third party dependencies:
cd ~/fluoride/bt mkdir third_party cd third_party git clone https://github.com/google/googletest.git git clone https://android.googlesource.com/platform/external/libchrome git clone https://android.googlesource.com/platform/external/modp_b64 git clone https://android.googlesource.com/platform/external/tinyxml2 git clone https://android.googlesource.com/platform/hardware/libhardware
And third party dependencies of third party dependencies:
cd fluoride/bt/third_party/libchrome/base/third_party mkdir valgrind cd valgrind curl https://chromium.googlesource.com/chromium/src/base/+/master/third_party/valgrind/valgrind.h?format=TEXT | base64 -d > valgrind.h curl https://chromium.googlesource.com/chromium/src/base/+/master/third_party/valgrind/memcheck.h?format=TEXT | base64 -d > memcheck.h
NOTE: If system/bt is checked out under AOSP, then create symbolic links instead of downloading sources
cd system/bt mkdir third_party cd third_party ln -s ../../../external/libchrome libchrome ln -s ../../../external/modp_b64 modp_b64 ln -s ../../../external/tinyxml2 tinyxml2 ln -s ../../../hardware/libhardware libhardware ln -s ../../../external/googletest googletest
cd ~/fluoride/bt gn gen out/Default
cd ~/fluoride/bt ninja -C out/Default all
This will build all targets (the shared library, executables, tests, etc) and put them in out/Default. To build an individual target, replace "all" with the target of your choice, e.g. ninja -C out/Default net_test_osi
.
cd ~/fluoride/bt/out/Default LD_LIBRARY_PATH=./ ./bluetoothtbd -create-ipc-socket=fluoride
Follows the Chromium project Eclipse Setup Instructions until "Optional: Building inside Eclipse" section (don't do that section, we will set it up differently)
Generate Eclipse settings:
cd system/bt gn gen --ide=eclipse out/Default
In Eclipse, do File->Import->C/C++->C/C++ Project Settings, choose the XML location under system/bt/out/Default
Right click on the project. Go to Preferences->C/C++ Build->Builder Settings. Uncheck "Use default build command", but instead using "ninja -C out/Default"
Goto Behaviour tab, change clean command to "-t clean"