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