1b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng// 2b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng// Copyright 2015 The Android Open Source Project 3b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng// 4b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng// Licensed under the Apache License, Version 2.0 (the "License"); 5b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng// you may not use this file except in compliance with the License. 6b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng// You may obtain a copy of the License at 7b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng// 8b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng// http://www.apache.org/licenses/LICENSE-2.0 9b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng// 10b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng// Unless required by applicable law or agreed to in writing, software 11b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng// distributed under the License is distributed on an "AS IS" BASIS, 12b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng// See the License for the specific language governing permissions and 14b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng// limitations under the License. 15b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng// 16b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng 17b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng#include "base/macros.h" 182fc0eba951081bddd15a3482f2189a9125dac48aDennis Cheng#include "base/memory/weak_ptr.h" 19b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng#include "base/threading/thread.h" 20bf7db3143fda4dc8391c92ec25dc93b9725ec225Dennis Cheng#include "base/time/time.h" 21b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng#include "hci/include/bt_vendor_lib.h" 22b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng#include "vendor_libs/test_vendor_lib/include/dual_mode_controller.h" 23bf7db3143fda4dc8391c92ec25dc93b9725ec225Dennis Cheng#include "vendor_libs/test_vendor_lib/include/event_packet.h" 24b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng#include "vendor_libs/test_vendor_lib/include/hci_transport.h" 258bb61fe28ac339276acf1b5b1616a6e56e2cccacDennis Cheng#include "vendor_libs/test_vendor_lib/include/test_channel_transport.h" 26b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng 27b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng#include <memory> 28b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng 29b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Chengnamespace test_vendor_lib { 30b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng 312fc0eba951081bddd15a3482f2189a9125dac48aDennis Cheng// Contains the three core objects that make up the test vendor library: the 322fc0eba951081bddd15a3482f2189a9125dac48aDennis Cheng// HciTransport for communication, the HciHandler for processing commands, and 332fc0eba951081bddd15a3482f2189a9125dac48aDennis Cheng// the Controller for actual command implementations. The VendorManager shall 342fc0eba951081bddd15a3482f2189a9125dac48aDennis Cheng// operate as a global singleton and be used in bt_vendor.cc to perform vendor 352fc0eba951081bddd15a3482f2189a9125dac48aDennis Cheng// specific operations, via |vendor_callbacks_|, and to provide access to the 362fc0eba951081bddd15a3482f2189a9125dac48aDennis Cheng// test controller by setting up a message loop (on another thread) that the HCI 372fc0eba951081bddd15a3482f2189a9125dac48aDennis Cheng// will talk to and controller methods will execute on. 38b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Chengclass VendorManager { 39b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng public: 40b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng // Functions that operate on the global manager instance. Initialize() 41b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng // is called by the vendor library's TestVendorInitialize() function to create 42b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng // the global manager and must be called before Get() and CleanUp(). 43b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng // CleanUp() should be called when a call to TestVendorCleanUp() is made 44b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng // since the global manager should live throughout the entire time the test 45b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng // vendor library is in use. 46b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng static void CleanUp(); 47b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng 48b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng static VendorManager* Get(); 49b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng 50b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng static void Initialize(); 51b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng 522fc0eba951081bddd15a3482f2189a9125dac48aDennis Cheng void CloseHciFd(); 532fc0eba951081bddd15a3482f2189a9125dac48aDennis Cheng 542fc0eba951081bddd15a3482f2189a9125dac48aDennis Cheng int GetHciFd() const; 55b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng 56b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng const bt_vendor_callbacks_t& GetVendorCallbacks() const; 57b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng 582fc0eba951081bddd15a3482f2189a9125dac48aDennis Cheng // Stores a copy of the vendor specific configuration callbacks passed into 592fc0eba951081bddd15a3482f2189a9125dac48aDennis Cheng // the vendor library from the HCI in TestVendorInit(). 602fc0eba951081bddd15a3482f2189a9125dac48aDennis Cheng void SetVendorCallbacks(const bt_vendor_callbacks_t& callbacks); 61b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng 62b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng // Returns true if |thread_| is able to be started and the 63b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng // StartingWatchingOnThread() task has been posted to the task runner. 64b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng bool Run(); 65b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng 66b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng private: 67b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng VendorManager(); 68b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng 69b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng ~VendorManager() = default; 70b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng 71bf7db3143fda4dc8391c92ec25dc93b9725ec225Dennis Cheng // Posts a callback to |thread_|'s task runner. Equivalent to calling 72bf7db3143fda4dc8391c92ec25dc93b9725ec225Dennis Cheng // |PostDelayedTask| with a delay of 0. 73bf7db3143fda4dc8391c92ec25dc93b9725ec225Dennis Cheng bool PostTask(const base::Closure& task); 74bf7db3143fda4dc8391c92ec25dc93b9725ec225Dennis Cheng 75bf7db3143fda4dc8391c92ec25dc93b9725ec225Dennis Cheng // Posts a callback to be run after |delay| ms (or longer) have passed. 76bf7db3143fda4dc8391c92ec25dc93b9725ec225Dennis Cheng bool PostDelayedTask(const base::Closure& task, base::TimeDelta delay); 77bf7db3143fda4dc8391c92ec25dc93b9725ec225Dennis Cheng 78b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng // Starts watching for incoming data from the HCI and the test hook. 79b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng void StartWatchingOnThread(); 80b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng 81b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng // Creates the HCI's communication channel and overrides IO callbacks to 82b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng // receive and send packets. 83b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng HciTransport transport_; 84b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng 85b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng // The controller object that provides implementations of Bluetooth commands. 86b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng DualModeController controller_; 87b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng 888bb61fe28ac339276acf1b5b1616a6e56e2cccacDennis Cheng // The two test channel objects that perform functions corresponding to the 898bb61fe28ac339276acf1b5b1616a6e56e2cccacDennis Cheng // HciTransport and HciHandler. 908bb61fe28ac339276acf1b5b1616a6e56e2cccacDennis Cheng TestChannelTransport test_channel_transport_; 918bb61fe28ac339276acf1b5b1616a6e56e2cccacDennis Cheng 92b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng // Configuration callbacks provided by the HCI for use in TestVendorOp(). 93b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng bt_vendor_callbacks_t vendor_callbacks_; 94b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng 95b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng // True if the underlying message loop (in |thread_|) is running. 96b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng bool running_; 97b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng 98b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng // Dedicated thread for managing the message loop to receive and send packets 99b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng // from the HCI and to receive additional parameters from the test hook file 100b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng // descriptor. 101b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng base::Thread thread_; 102b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng 1032d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng // Used to handle further watching of the vendor's/test channel's file 1042d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng // descriptor after WatchFileDescriptor() is called. 1052d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng base::MessageLoopForIO::FileDescriptorWatcher hci_watcher_; 1062d96c88025c80d4d7e0e341cfdbf278596340b66Dennis Cheng 1078bb61fe28ac339276acf1b5b1616a6e56e2cccacDennis Cheng // Used to handle further watching of the test channel's file descriptor after 1088bb61fe28ac339276acf1b5b1616a6e56e2cccacDennis Cheng // WatchFileDescriptor() is called. 1098bb61fe28ac339276acf1b5b1616a6e56e2cccacDennis Cheng base::MessageLoopForIO::FileDescriptorWatcher test_channel_watcher_; 110b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng 1112fc0eba951081bddd15a3482f2189a9125dac48aDennis Cheng // This should remain the last member so it'll be destroyed and invalidate 1122fc0eba951081bddd15a3482f2189a9125dac48aDennis Cheng // its weak pointers before any other members are destroyed. 1132fc0eba951081bddd15a3482f2189a9125dac48aDennis Cheng base::WeakPtrFactory<VendorManager> weak_ptr_factory_; 1142fc0eba951081bddd15a3482f2189a9125dac48aDennis Cheng 115b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng DISALLOW_COPY_AND_ASSIGN(VendorManager); 116b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng}; 117b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng 118b2d45eb7cbd4f2de5f0101915981a87392ccf625Dennis Cheng} // namespace test_vendor_lib 119