1094332d3Sopenharmony_ci/* 2094332d3Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License. 5094332d3Sopenharmony_ci * You may obtain a copy of the License at 6094332d3Sopenharmony_ci * 7094332d3Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8094332d3Sopenharmony_ci * 9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and 13094332d3Sopenharmony_ci * limitations under the License. 14094332d3Sopenharmony_ci */ 15094332d3Sopenharmony_ci 16094332d3Sopenharmony_ci#include "hci_interface_impl.h" 17094332d3Sopenharmony_ci#include <hdf_base.h> 18094332d3Sopenharmony_ci#include <hdf_log.h> 19094332d3Sopenharmony_ci#include <iproxy_broker.h> 20094332d3Sopenharmony_ci#include "vendor_interface.h" 21094332d3Sopenharmony_ci 22094332d3Sopenharmony_ci#ifdef LOG_DOMAIN 23094332d3Sopenharmony_ci#undef LOG_DOMAIN 24094332d3Sopenharmony_ci#endif 25094332d3Sopenharmony_ci#define LOG_DOMAIN 0xD000105 26094332d3Sopenharmony_ci 27094332d3Sopenharmony_cinamespace OHOS { 28094332d3Sopenharmony_cinamespace HDI { 29094332d3Sopenharmony_cinamespace Bluetooth { 30094332d3Sopenharmony_cinamespace Hci { 31094332d3Sopenharmony_cinamespace V1_0 { 32094332d3Sopenharmony_ciusing VendorInterface = OHOS::HDI::Bluetooth::Hci::V1_0::VendorInterface; 33094332d3Sopenharmony_ciusing HciPacketType = OHOS::HDI::Bluetooth::Hci::HciPacketType; 34094332d3Sopenharmony_ci 35094332d3Sopenharmony_ciextern "C" IHciInterface *HciInterfaceImplGetInstance(void) 36094332d3Sopenharmony_ci{ 37094332d3Sopenharmony_ci return new (std::nothrow) HciInterfaceImpl(); 38094332d3Sopenharmony_ci} 39094332d3Sopenharmony_ci 40094332d3Sopenharmony_ciHciInterfaceImpl::HciInterfaceImpl() 41094332d3Sopenharmony_ci{ 42094332d3Sopenharmony_ci remoteDeathRecipient_ = 43094332d3Sopenharmony_ci new RemoteDeathRecipient(std::bind(&HciInterfaceImpl::OnRemoteDied, this, std::placeholders::_1)); 44094332d3Sopenharmony_ci} 45094332d3Sopenharmony_ci 46094332d3Sopenharmony_ciHciInterfaceImpl::~HciInterfaceImpl() 47094332d3Sopenharmony_ci{ 48094332d3Sopenharmony_ci if (callbacks_ != nullptr) { 49094332d3Sopenharmony_ci RemoveHciDeathRecipient(callbacks_); 50094332d3Sopenharmony_ci callbacks_ = nullptr; 51094332d3Sopenharmony_ci } 52094332d3Sopenharmony_ci} 53094332d3Sopenharmony_ci 54094332d3Sopenharmony_ciint32_t HciInterfaceImpl::Init(const sptr<IHciCallback>& callbackObj) 55094332d3Sopenharmony_ci{ 56094332d3Sopenharmony_ci HDF_LOGI("HciInterfaceImpl %{public}s", __func__); 57094332d3Sopenharmony_ci if (callbackObj == nullptr) { 58094332d3Sopenharmony_ci HDF_LOGE("HciInterfaceImpl %{public}s callbackObj null", __func__); 59094332d3Sopenharmony_ci return HDF_FAILURE; 60094332d3Sopenharmony_ci } 61094332d3Sopenharmony_ci 62094332d3Sopenharmony_ci AddHciDeathRecipient(callbackObj); 63094332d3Sopenharmony_ci callbacks_ = callbackObj; 64094332d3Sopenharmony_ci 65094332d3Sopenharmony_ci VendorInterface::ReceiveCallback callback = { 66094332d3Sopenharmony_ci .onAclReceive = 67094332d3Sopenharmony_ci [callbackObj]( 68094332d3Sopenharmony_ci const std::vector<uint8_t> &packet) { callbackObj->OnReceivedHciPacket(BtType::ACL_DATA, packet); }, 69094332d3Sopenharmony_ci .onScoReceive = 70094332d3Sopenharmony_ci [callbackObj]( 71094332d3Sopenharmony_ci const std::vector<uint8_t> &packet) { callbackObj->OnReceivedHciPacket(BtType::SCO_DATA, packet); }, 72094332d3Sopenharmony_ci .onEventReceive = 73094332d3Sopenharmony_ci [callbackObj]( 74094332d3Sopenharmony_ci const std::vector<uint8_t> &packet) { callbackObj->OnReceivedHciPacket(BtType::HCI_EVENT, packet); }, 75094332d3Sopenharmony_ci }; 76094332d3Sopenharmony_ci 77094332d3Sopenharmony_ci bool result = VendorInterface::GetInstance()->Initialize( 78094332d3Sopenharmony_ci [callbackObj](bool status) { callbackObj->OnInited(status ? BtStatus::SUCCESS : BtStatus::INITIAL_ERROR); }, 79094332d3Sopenharmony_ci callback); 80094332d3Sopenharmony_ci if (!result) { 81094332d3Sopenharmony_ci RemoveHciDeathRecipient(callbackObj); 82094332d3Sopenharmony_ci callbacks_ = nullptr; 83094332d3Sopenharmony_ci } 84094332d3Sopenharmony_ci return result ? HDF_SUCCESS : HDF_FAILURE; 85094332d3Sopenharmony_ci} 86094332d3Sopenharmony_ci 87094332d3Sopenharmony_ciint32_t HciInterfaceImpl::SendHciPacket(BtType type, const std::vector<uint8_t>& data) 88094332d3Sopenharmony_ci{ 89094332d3Sopenharmony_ci HDF_LOGD("HciInterfaceImpl %{public}s, %{public}d", __func__, type); 90094332d3Sopenharmony_ci if (data.empty()) { 91094332d3Sopenharmony_ci return HDF_FAILURE; 92094332d3Sopenharmony_ci } 93094332d3Sopenharmony_ci 94094332d3Sopenharmony_ci size_t result = VendorInterface::GetInstance()->SendPacket(static_cast<HciPacketType>(type), data); 95094332d3Sopenharmony_ci return result ? HDF_SUCCESS : HDF_FAILURE; 96094332d3Sopenharmony_ci} 97094332d3Sopenharmony_ci 98094332d3Sopenharmony_ciint32_t HciInterfaceImpl::Close() 99094332d3Sopenharmony_ci{ 100094332d3Sopenharmony_ci HDF_LOGI("HciInterfaceImpl %{public}s", __func__); 101094332d3Sopenharmony_ci if (callbacks_ != nullptr) { 102094332d3Sopenharmony_ci RemoveHciDeathRecipient(callbacks_); 103094332d3Sopenharmony_ci callbacks_ = nullptr; 104094332d3Sopenharmony_ci } 105094332d3Sopenharmony_ci VendorInterface::GetInstance()->CleanUp(); 106094332d3Sopenharmony_ci VendorInterface::DestroyInstance(); 107094332d3Sopenharmony_ci return HDF_SUCCESS; 108094332d3Sopenharmony_ci} 109094332d3Sopenharmony_ci 110094332d3Sopenharmony_civoid HciInterfaceImpl::OnRemoteDied(const wptr<IRemoteObject> &object) 111094332d3Sopenharmony_ci{ 112094332d3Sopenharmony_ci HDF_LOGI("HciInterfaceImpl %{public}s", __func__); 113094332d3Sopenharmony_ci callbacks_ = nullptr; 114094332d3Sopenharmony_ci VendorInterface::GetInstance()->CleanUp(); 115094332d3Sopenharmony_ci VendorInterface::DestroyInstance(); 116094332d3Sopenharmony_ci} 117094332d3Sopenharmony_ci 118094332d3Sopenharmony_ciint32_t HciInterfaceImpl::AddHciDeathRecipient(const sptr<IHciCallback>& callbackObj) 119094332d3Sopenharmony_ci{ 120094332d3Sopenharmony_ci HDF_LOGI("HciInterfaceImpl %{public}s", __func__); 121094332d3Sopenharmony_ci const sptr<IRemoteObject>& remote = OHOS::HDI::hdi_objcast<IHciCallback>(callbackObj); 122094332d3Sopenharmony_ci bool result = remote->AddDeathRecipient(remoteDeathRecipient_); 123094332d3Sopenharmony_ci if (!result) { 124094332d3Sopenharmony_ci HDF_LOGE("HciInterfaceImpl AddDeathRecipient fail"); 125094332d3Sopenharmony_ci return HDF_FAILURE; 126094332d3Sopenharmony_ci } 127094332d3Sopenharmony_ci return HDF_SUCCESS; 128094332d3Sopenharmony_ci} 129094332d3Sopenharmony_ci 130094332d3Sopenharmony_ciint32_t HciInterfaceImpl::RemoveHciDeathRecipient(const sptr<IHciCallback>& callbackObj) 131094332d3Sopenharmony_ci{ 132094332d3Sopenharmony_ci HDF_LOGI("HciInterfaceImpl %{public}s", __func__); 133094332d3Sopenharmony_ci const sptr<IRemoteObject>& remote = OHOS::HDI::hdi_objcast<IHciCallback>(callbackObj); 134094332d3Sopenharmony_ci bool result = remote->RemoveDeathRecipient(remoteDeathRecipient_); 135094332d3Sopenharmony_ci if (!result) { 136094332d3Sopenharmony_ci HDF_LOGE("HciInterfaceImpl RemoveDeathRecipient fail"); 137094332d3Sopenharmony_ci return HDF_FAILURE; 138094332d3Sopenharmony_ci } 139094332d3Sopenharmony_ci return HDF_SUCCESS; 140094332d3Sopenharmony_ci} 141094332d3Sopenharmony_ci} // V1_0 142094332d3Sopenharmony_ci} // Hci 143094332d3Sopenharmony_ci} // Bluetooth 144094332d3Sopenharmony_ci} // HDI 145094332d3Sopenharmony_ci} // OHOS 146