/* * Copyright 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include <functional> #include <iterator> #include <memory> #include <string> #include <unordered_map> #include <vector> #include <base/logging.h> #include "mca_api.h" #include "mcap_test_mcl.h" #include "mcap_test_mdep.h" namespace SYSTEM_BT_TOOLS_MCAP_TOOL { extern const tMCA_CHNL_CFG MCAP_TEST_CHANNEL_CONFIG; class McapTestApp { public: /** * McapTestApp is the root node for an MCAP application * * @param mcap_test_interface interface to MCAP APIs on Bluetooth stack * from get_test_interface() */ McapTestApp(btmcap_test_interface_t* mcap_test_interface); btmcap_test_interface_t* GetInterface(); /** * Register an application with the Bluetooth stack * @param ctrl_psm Control channel L2CAP PSM * @param data_psm Data channel L2CAP PSM * @param sec_mask Security Mask * @param callback Control channel callback * @return */ bool Register(uint16_t ctrl_psm, uint16_t data_psm, uint16_t sec_mask, tMCA_CTRL_CBACK* callback); /** * De-register the current application */ void Deregister(); /** * Check if current application is registered * @return True if registered */ bool Registered(); /** * Create MCAP Communication Link * @param bd_addr Peer Bluetooth Address * @param ctrl_psm Control channel L2CAP PSM, should be the same as registered * value for most cases * @param sec_mask Security mask * @return True on success */ bool ConnectMcl(const RawAddress& bd_addr, uint16_t ctrl_psm, uint16_t sec_mask); /** * Create MCAP Data End Point * @param type 0 - MCA_TDEP_ECHO, 1 - MCA_TDEP_DATA * @param max_mdl Maximum number of data channels for this end point * @param data_callback Data callback * @return True on success */ bool CreateMdep(uint8_t type, uint8_t max_mdl, tMCA_DATA_CBACK* data_callback); // Simple methods that are self-explanatory uint8_t GetHandle(); McapMcl* FindMclByPeerAddress(const RawAddress& bd_addr); McapMcl* FindMclByHandle(tMCA_CL mcl_handle); McapMdep* FindMdepByHandle(tMCA_DEP mdep_handle); void RemoveMclByHandle(tMCA_CL mcl_handle); bool IsRegistered(); /** * Callback function for control channel, need to be called by an external * function registered during McapTestApp::Register() * @param handle MCAP application handle, should be the same as GetHandle() * @param mcl MCL handle, FindMclByHandle(mcl) should return non-null value * @param event Control event * @param p_data Control data */ void ControlCallback(tMCA_HANDLE handle, tMCA_CL mcl, uint8_t event, tMCA_CTRL* p_data); private: // Initialized during start up tMCA_REG _mca_reg; btmcap_test_interface_t* _mcap_test_interface = nullptr; std::vector<McapMcl> _mcl_list; std::vector<McapMdep> _mdep_list; // Initialized later tMCA_HANDLE _mcap_handle = 0; }; } // namespace SYSTEM_BT_TOOLS_MCAP_TOOL