1b29fae56cebbc749f14e568db4fd0da6e054f469Jack He/*
2b29fae56cebbc749f14e568db4fd0da6e054f469Jack He * Copyright (C) 2017 The Android Open Source Project
3b29fae56cebbc749f14e568db4fd0da6e054f469Jack He *
4b29fae56cebbc749f14e568db4fd0da6e054f469Jack He * Licensed under the Apache License, Version 2.0 (the "License");
5b29fae56cebbc749f14e568db4fd0da6e054f469Jack He * you may not use this file except in compliance with the License.
6b29fae56cebbc749f14e568db4fd0da6e054f469Jack He * You may obtain a copy of the License at
7b29fae56cebbc749f14e568db4fd0da6e054f469Jack He *
8b29fae56cebbc749f14e568db4fd0da6e054f469Jack He *      http://www.apache.org/licenses/LICENSE-2.0
9b29fae56cebbc749f14e568db4fd0da6e054f469Jack He *
10b29fae56cebbc749f14e568db4fd0da6e054f469Jack He * Unless required by applicable law or agreed to in writing, software
11b29fae56cebbc749f14e568db4fd0da6e054f469Jack He * distributed under the License is distributed on an "AS IS" BASIS,
12b29fae56cebbc749f14e568db4fd0da6e054f469Jack He * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b29fae56cebbc749f14e568db4fd0da6e054f469Jack He * See the License for the specific language governing permissions and
14b29fae56cebbc749f14e568db4fd0da6e054f469Jack He * limitations under the License.
15b29fae56cebbc749f14e568db4fd0da6e054f469Jack He */
16b29fae56cebbc749f14e568db4fd0da6e054f469Jack He#pragma once
17b29fae56cebbc749f14e568db4fd0da6e054f469Jack He
18b29fae56cebbc749f14e568db4fd0da6e054f469Jack He#include <functional>
19b29fae56cebbc749f14e568db4fd0da6e054f469Jack He#include <iterator>
20b29fae56cebbc749f14e568db4fd0da6e054f469Jack He#include <memory>
21b29fae56cebbc749f14e568db4fd0da6e054f469Jack He#include <string>
22b29fae56cebbc749f14e568db4fd0da6e054f469Jack He#include <unordered_map>
23b29fae56cebbc749f14e568db4fd0da6e054f469Jack He#include <vector>
24b29fae56cebbc749f14e568db4fd0da6e054f469Jack He
25b29fae56cebbc749f14e568db4fd0da6e054f469Jack He#include <base/logging.h>
26b29fae56cebbc749f14e568db4fd0da6e054f469Jack He
27b29fae56cebbc749f14e568db4fd0da6e054f469Jack He#include "mca_api.h"
28b29fae56cebbc749f14e568db4fd0da6e054f469Jack He
29b29fae56cebbc749f14e568db4fd0da6e054f469Jack He#include "mcap_test_mcl.h"
30b29fae56cebbc749f14e568db4fd0da6e054f469Jack He#include "mcap_test_mdep.h"
31b29fae56cebbc749f14e568db4fd0da6e054f469Jack He
32b29fae56cebbc749f14e568db4fd0da6e054f469Jack Henamespace SYSTEM_BT_TOOLS_MCAP_TOOL {
33b29fae56cebbc749f14e568db4fd0da6e054f469Jack He
34b29fae56cebbc749f14e568db4fd0da6e054f469Jack Heextern const tMCA_CHNL_CFG MCAP_TEST_CHANNEL_CONFIG;
35b29fae56cebbc749f14e568db4fd0da6e054f469Jack He
36b29fae56cebbc749f14e568db4fd0da6e054f469Jack Heclass McapTestApp {
37b29fae56cebbc749f14e568db4fd0da6e054f469Jack He public:
38b29fae56cebbc749f14e568db4fd0da6e054f469Jack He  /**
39b29fae56cebbc749f14e568db4fd0da6e054f469Jack He   * McapTestApp is the root node for an MCAP application
40b29fae56cebbc749f14e568db4fd0da6e054f469Jack He   *
41b29fae56cebbc749f14e568db4fd0da6e054f469Jack He   * @param mcap_test_interface interface to MCAP APIs on Bluetooth stack
42b29fae56cebbc749f14e568db4fd0da6e054f469Jack He   *                            from get_test_interface()
43b29fae56cebbc749f14e568db4fd0da6e054f469Jack He   */
44b29fae56cebbc749f14e568db4fd0da6e054f469Jack He  McapTestApp(btmcap_test_interface_t* mcap_test_interface);
45b29fae56cebbc749f14e568db4fd0da6e054f469Jack He  btmcap_test_interface_t* GetInterface();
46b29fae56cebbc749f14e568db4fd0da6e054f469Jack He  /**
47b29fae56cebbc749f14e568db4fd0da6e054f469Jack He   * Register an application with the Bluetooth stack
48b29fae56cebbc749f14e568db4fd0da6e054f469Jack He   * @param ctrl_psm Control channel L2CAP PSM
49b29fae56cebbc749f14e568db4fd0da6e054f469Jack He   * @param data_psm Data channel L2CAP PSM
50b29fae56cebbc749f14e568db4fd0da6e054f469Jack He   * @param sec_mask Security Mask
51b29fae56cebbc749f14e568db4fd0da6e054f469Jack He   * @param callback Control channel callback
52b29fae56cebbc749f14e568db4fd0da6e054f469Jack He   * @return
53b29fae56cebbc749f14e568db4fd0da6e054f469Jack He   */
54b29fae56cebbc749f14e568db4fd0da6e054f469Jack He  bool Register(uint16_t ctrl_psm, uint16_t data_psm, uint16_t sec_mask,
55b29fae56cebbc749f14e568db4fd0da6e054f469Jack He                tMCA_CTRL_CBACK* callback);
56b29fae56cebbc749f14e568db4fd0da6e054f469Jack He  /**
57b29fae56cebbc749f14e568db4fd0da6e054f469Jack He   * De-register the current application
58b29fae56cebbc749f14e568db4fd0da6e054f469Jack He   */
59b29fae56cebbc749f14e568db4fd0da6e054f469Jack He  void Deregister();
60b29fae56cebbc749f14e568db4fd0da6e054f469Jack He  /**
61b29fae56cebbc749f14e568db4fd0da6e054f469Jack He   * Check if current application is registered
62b29fae56cebbc749f14e568db4fd0da6e054f469Jack He   * @return True if registered
63b29fae56cebbc749f14e568db4fd0da6e054f469Jack He   */
64b29fae56cebbc749f14e568db4fd0da6e054f469Jack He  bool Registered();
65b29fae56cebbc749f14e568db4fd0da6e054f469Jack He  /**
66b29fae56cebbc749f14e568db4fd0da6e054f469Jack He   * Create MCAP Communication Link
67b29fae56cebbc749f14e568db4fd0da6e054f469Jack He   * @param bd_addr Peer Bluetooth Address
68b29fae56cebbc749f14e568db4fd0da6e054f469Jack He   * @param ctrl_psm Control channel L2CAP PSM, should be the same as registered
69b29fae56cebbc749f14e568db4fd0da6e054f469Jack He   *                 value for most cases
70b29fae56cebbc749f14e568db4fd0da6e054f469Jack He   * @param sec_mask Security mask
71b29fae56cebbc749f14e568db4fd0da6e054f469Jack He   * @return True on success
72b29fae56cebbc749f14e568db4fd0da6e054f469Jack He   */
739e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowski  bool ConnectMcl(const RawAddress& bd_addr, uint16_t ctrl_psm,
74b29fae56cebbc749f14e568db4fd0da6e054f469Jack He                  uint16_t sec_mask);
75b29fae56cebbc749f14e568db4fd0da6e054f469Jack He  /**
76b29fae56cebbc749f14e568db4fd0da6e054f469Jack He   * Create MCAP Data End Point
77b29fae56cebbc749f14e568db4fd0da6e054f469Jack He   * @param type 0 - MCA_TDEP_ECHO, 1 - MCA_TDEP_DATA
78b29fae56cebbc749f14e568db4fd0da6e054f469Jack He   * @param max_mdl Maximum number of data channels for this end point
79b29fae56cebbc749f14e568db4fd0da6e054f469Jack He   * @param data_callback Data callback
80b29fae56cebbc749f14e568db4fd0da6e054f469Jack He   * @return True on success
81b29fae56cebbc749f14e568db4fd0da6e054f469Jack He   */
82b29fae56cebbc749f14e568db4fd0da6e054f469Jack He  bool CreateMdep(uint8_t type, uint8_t max_mdl,
83b29fae56cebbc749f14e568db4fd0da6e054f469Jack He                  tMCA_DATA_CBACK* data_callback);
84b29fae56cebbc749f14e568db4fd0da6e054f469Jack He  // Simple methods that are self-explanatory
85b29fae56cebbc749f14e568db4fd0da6e054f469Jack He  uint8_t GetHandle();
869e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowski  McapMcl* FindMclByPeerAddress(const RawAddress& bd_addr);
87b29fae56cebbc749f14e568db4fd0da6e054f469Jack He  McapMcl* FindMclByHandle(tMCA_CL mcl_handle);
88b29fae56cebbc749f14e568db4fd0da6e054f469Jack He  McapMdep* FindMdepByHandle(tMCA_DEP mdep_handle);
89b29fae56cebbc749f14e568db4fd0da6e054f469Jack He  void RemoveMclByHandle(tMCA_CL mcl_handle);
90b29fae56cebbc749f14e568db4fd0da6e054f469Jack He  bool IsRegistered();
91b29fae56cebbc749f14e568db4fd0da6e054f469Jack He  /**
92b29fae56cebbc749f14e568db4fd0da6e054f469Jack He   * Callback function for control channel, need to be called by an external
93b29fae56cebbc749f14e568db4fd0da6e054f469Jack He   * function registered during McapTestApp::Register()
94b29fae56cebbc749f14e568db4fd0da6e054f469Jack He   * @param handle MCAP application handle, should be the same as GetHandle()
95b29fae56cebbc749f14e568db4fd0da6e054f469Jack He   * @param mcl MCL handle, FindMclByHandle(mcl) should return non-null value
96b29fae56cebbc749f14e568db4fd0da6e054f469Jack He   * @param event Control event
97b29fae56cebbc749f14e568db4fd0da6e054f469Jack He   * @param p_data Control data
98b29fae56cebbc749f14e568db4fd0da6e054f469Jack He   */
99b29fae56cebbc749f14e568db4fd0da6e054f469Jack He  void ControlCallback(tMCA_HANDLE handle, tMCA_CL mcl, uint8_t event,
100b29fae56cebbc749f14e568db4fd0da6e054f469Jack He                       tMCA_CTRL* p_data);
101b29fae56cebbc749f14e568db4fd0da6e054f469Jack He
102b29fae56cebbc749f14e568db4fd0da6e054f469Jack He private:
103b29fae56cebbc749f14e568db4fd0da6e054f469Jack He  // Initialized during start up
104b29fae56cebbc749f14e568db4fd0da6e054f469Jack He  tMCA_REG _mca_reg;
105b29fae56cebbc749f14e568db4fd0da6e054f469Jack He  btmcap_test_interface_t* _mcap_test_interface = nullptr;
106b29fae56cebbc749f14e568db4fd0da6e054f469Jack He  std::vector<McapMcl> _mcl_list;
107b29fae56cebbc749f14e568db4fd0da6e054f469Jack He  std::vector<McapMdep> _mdep_list;
108b29fae56cebbc749f14e568db4fd0da6e054f469Jack He
109b29fae56cebbc749f14e568db4fd0da6e054f469Jack He  // Initialized later
110b29fae56cebbc749f14e568db4fd0da6e054f469Jack He  tMCA_HANDLE _mcap_handle = 0;
111b29fae56cebbc749f14e568db4fd0da6e054f469Jack He};
112b29fae56cebbc749f14e568db4fd0da6e054f469Jack He
113b29fae56cebbc749f14e568db4fd0da6e054f469Jack He}  // namespace SYSTEM_BT_TOOLS_MCAP_TOOL
114