- /*
- * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
- * Description: BluetoothModel view
- * Author:
- * Create: 2021-10-13
- */
- #include "stdint.h"
- #include "BluetoothModel.h"
- #include "BluetoothPresenter.h"
- #include "ConnectPhonePresenter.h"
- #include "BluetoothView.h"
- #include "BluetoothItemView.h"
- #include "PlayersModel.h"
- #include "PhoneAudio.h"
- #include "graphic_service.h"
- #include "ui_service.h"
-
- #include "msg_center.h"
-
- #include "bts_def.h"
- #include "bts_gatt_stru.h"
- #include "bts_a2dp_source.h"
- #include "bts_gatt_server.h"
- #include "bts_le_gap.h"
- #include "bts_spp.h"
- #include "osal_task.h"
-
- namespace OHOS {
-
- #define BT_SPP_TASK_STACK_SIZE 2048
- #define BT_SPP_TASK_PRI 20
- #define TEN 10
-
- constexpr uint16_t BLUETOOTH_MAX_NUM = 20;
-
- void BluetoothModel::SetBluetoothCalleridStatus(int16_t value)
- {
- callerid = value;
- }
-
- int BluetoothModel::GetBluetoothCalleridStatus(void)
- {
- return callerid;
- }
-
- BluetoothModel::BluetoothModel()
- {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BluetoothModel::BluetoothModel");
- }
-
- BluetoothModel *BluetoothModel::GetInstance(void)
- {
- static BluetoothModel instance;
- return &instance;
- }
-
- void BluetoothModel::Init()
- {
- bool ret = enable_bt_stack();
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "bt enable_bt_stack ret = %d", ret);
-
- // BtInitCallBacks();
- // BtInitGatts();
- BtInitSpp();
-
- SetUpListCase();
- SetUpConnedDevicesList();
- }
-
- void BluetoothModel::SetCaseListClear()
- {
- btScansDevicesList_.clear();
- }
-
- bool BluetoothModel::CheckExistScanList(BluetoothCaseInfo caseInfo)
- {
- std::list<BluetoothCaseInfo>::iterator node = btScansDevicesList_.begin();
- if (btScansDevicesList_.empty()) {
- return false;
- }
- while (node != btScansDevicesList_.end()) {
- if ((caseInfo.addr[0] == node->addr[0]) && (caseInfo.addr[1] == node->addr[1])
- && (caseInfo.addr[2] == node->addr[2]) && (caseInfo.addr[3] == node->addr[3])
- && (caseInfo.addr[4] == node->addr[4]) && (caseInfo.addr[5] == node->addr[5])) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "true");
- return true;
- }
- node++;
- }
- return false;
- }
-
- void BluetoothModel::SetUpListCase()
- {
- SetCaseListClear();
- }
-
- std::list<BluetoothCaseInfo>& BluetoothModel::GetCase()
- {
- return btScansDevicesList_;
- }
-
- void BluetoothModel::AddCase(BluetoothCaseInfo caseInfo)
- {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AddCase::caseInfo addr: %02x%02x%02x%02x%02x%02x",
- caseInfo.addr[5], caseInfo.addr[4], caseInfo.addr[3], /* mac下标 0 1 2 3 4 5 */
- caseInfo.addr[2], caseInfo.addr[1], caseInfo.addr[0]);
- if (btScansDevicesList_.size() >= BLUETOOTH_MAX_NUM) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "btScansDevicesList_.size is BLUETOOTH_MAX_NUM");
- return;
- } else {
- btScansDevicesList_.push_back(caseInfo);
- }
- }
-
- void BluetoothModel::SetScansCaseRssi(const bd_addr_t *bdAddr, int rssi)
- {
- for (auto it = btScansDevicesList_.begin(); it != btScansDevicesList_.end(); it++) {
- if ((it->addr[0] == bdAddr->addr[0]) && (it->addr[1] == bdAddr->addr[1])
- && (it->addr[2] == bdAddr->addr[2]) && (it->addr[3] == bdAddr->addr[3])
- && (it->addr[4] == bdAddr->addr[4]) && (it->addr[5] == bdAddr->addr[5])) {
- it->temp = rssi;
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "btScansDevicesList_ rssi:%d deviceName:%s", it->temp, it->deviceName);
- }
- }
- }
-
-
- bool CompBuletoothInfo(const BluetoothCaseInfo& a, const BluetoothCaseInfo& b)
- {
- if (a.temp > b.temp) {
- return true;
- }
- return false;
- }
-
- void BluetoothModel::SortScansCaseRssi()
- {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BluetoothModel::SortScansCaseRssi");
- btScansDevicesList_.sort(CompBuletoothInfo);
- }
-
- void BluetoothModel::ResetScanDevicesCase(const BluetoothCaseInfo& caseInfo)
- {
- for (auto it = btScansDevicesList_.begin(); it != btScansDevicesList_.end(); it++) {
- if ((it->addr[0] == caseInfo.addr[0]) && (it->addr[1] == caseInfo.addr[1])
- && (it->addr[2] == caseInfo.addr[2]) && (it->addr[3] == caseInfo.addr[3])
- && (it->addr[4] == caseInfo.addr[4]) && (it->addr[5] == caseInfo.addr[5])) {
- (void)memcpy_s(it->deviceName, BD_NAME_LEN,
- caseInfo.deviceName, BD_NAME_LEN);
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ResetConnedDevicesCase deviceName:%s", it->deviceName);
- }
- }
- }
-
- /* 已配对设备队列 */
- void BluetoothModel::SetConnedDevicesListClear()
- {
- btConnedDevicesList_->Clear();
- }
-
- void BluetoothModel::SetUpConnedDevicesList()
- {
- if (btConnedDevicesList_ == nullptr) {
- btConnedDevicesList_ = new List<BluetoothCaseInfo>();
- if (btConnedDevicesList_ == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BluetoothModel btConnedDevicesList_ new fail");
- return;
- }
- SetConnedDevicesListClear();
- unsigned int connedDevicesNum = 0;
- bool ret = gap_get_paired_devices_num(&connedDevicesNum);
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Setup GetPariedDevicesNum ret = %d, num = %d", ret, connedDevicesNum);
-
- gap_paired_device_info_t *devInfo = (gap_paired_device_info_t*)malloc(sizeof(gap_paired_device_info_t) *connedDevicesNum);
- if (devInfo == NULL) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DevInfo malloc failed %u", sizeof(gap_paired_device_info_t) *connedDevicesNum);
- return;
- }
- ret = gap_get_paired_devices_list(devInfo, (int *)&connedDevicesNum);
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetUpConnedDevicesList gap_get_paired_devices_list ret = %d", ret);
-
- BluetoothCaseInfo caseInfo{};
- for (int i = 0; i < static_cast<int>(connedDevicesNum); ++i) {
- if ((gap_get_device_class((const bd_addr_t *)devInfo[i].addr.addr) & 0x200) != 0) {
- continue;
- }
- (void)memcpy_s(caseInfo.addr, BD_ADDR_LEN,
- devInfo[i].addr.addr, BD_ADDR_LEN);
- (void)memcpy_s(caseInfo.deviceName, BD_NAME_LEN,
- devInfo[i].device_name, BD_NAME_LEN);
- AddConnedDevicesCase(caseInfo);
- }
- free(devInfo);
- }
- }
-
- void BluetoothModel::AddConnedDevicesCase(BluetoothCaseInfo caseInfo)
- {
- if (btConnedDevicesList_ == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "btConnedDevicesList_ nullptr");
- return;
- }
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AddConnedDevicesCase::caseInfo addr: %02x%02x%02x%02x%02x%02x",
- caseInfo.addr[5], caseInfo.addr[4], caseInfo.addr[3], /* mac下标 0 1 2 3 4 5 */
- caseInfo.addr[2], caseInfo.addr[1], caseInfo.addr[0]);
- if (btConnedDevicesList_->Size() >= BLUETOOTH_MAX_NUM) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "btConnedDevicesList_->Size is BLUETOOTH_MAX_NUM");
- return;
- } else {
- btConnedDevicesList_->PushBack(caseInfo);
- }
- }
-
- List<BluetoothCaseInfo>& BluetoothModel::GetConnedDevicesCase()
- {
- return *btConnedDevicesList_;
- }
-
- void BluetoothModel::SetBtStatus(void)
- {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetBtStatus tempMacValue: %02x%02x%02x%02x%02x%02x",
- tempMacValue.addr[5], tempMacValue.addr[4], tempMacValue.addr[3], /* mac챐 0 1 2 3 4 5 */
- tempMacValue.addr[2], tempMacValue.addr[1], tempMacValue.addr[0]); /* mac챐 0 1 2 3 4 5 */
- aclConnected = bt_is_acl_connected((const bd_addr_t*)&tempMacValue.addr);
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "aclConnected %d", aclConnected);
- }
-
- bool BluetoothModel::GetAclConnected(void)
- {
- return aclConnected;
- }
-
- void BluetoothModel::SetTempMacValue(BluetoothCaseInfo *caseInfo)
- {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetTempMacValue: %02x%02x%02x%02x%02x%02x",
- caseInfo->addr[5], caseInfo->addr[4], caseInfo->addr[3], /* mac챐 0 1 2 3 4 5 */
- caseInfo->addr[2], caseInfo->addr[1], caseInfo->addr[0]); /* mac챐 0 1 2 3 4 5 */
- (void)memcpy_s(tempMacValue.addr, BD_ADDR_LEN,
- caseInfo->addr, BD_ADDR_LEN);
- (void)memcpy_s(tempMacValue.deviceName, BD_NAME_LEN,
- caseInfo->deviceName, BD_NAME_LEN);
- }
-
- BluetoothCaseInfo *BluetoothModel::GetTempMacValue(void)
- {
- return &tempMacValue;
- }
-
- void BluetoothModel::SetLastConnedAddr(const bd_addr_t *addr)
- {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetLastConnedAddr: %02x%02x%02x%02x%02x%02x",
- addr->addr[5], addr->addr[4], addr->addr[3], /* mac챐 0 1 2 3 4 5 */
- addr->addr[2], addr->addr[1], addr->addr[0]); /* mac챐 0 1 2 3 4 5 */
- (void)memcpy_s(lastConnedAddr.addr, BD_ADDR_LEN, addr->addr, BD_ADDR_LEN);
- }
-
- bd_addr_t *BluetoothModel::GetLastConnedAddr(void)
- {
- return &lastConnedAddr;
- }
-
- void BluetoothModel::SetConnectionView(BluetoothItemView *item)
- {
- selectItemView = item;
- }
-
- BluetoothItemView *BluetoothModel::GetConnectionView()
- {
- return selectItemView;
- }
-
-
- void BluetoothModel::SetTagReconnectJump(bool tag)
- {
- tagReconnectJump = tag;
- }
-
- bool BluetoothModel::GetTagReconnectJump(void)
- {
- return tagReconnectJump;
- }
-
- void BluetoothModel::SetCurView(int16_t viewNum)
- {
- curView = viewNum;
- }
-
- int BluetoothModel::GetCurView(void)
- {
- return curView;
- }
-
- void BluetoothModel::SetTagConnectView(bool tag)
- {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BluetoothModel::SetTagConnectView:%d", tag);
- tagConnectView = tag;
- }
-
- // 判断是否需要跳转连接成功\失败界面(已退出蓝牙模块)
- bool BluetoothModel::IsTagConnectView(void)
- {
- return tagConnectView;
- }
-
- void BluetoothModel::SetTagDisconnectView(bool tag)
- {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BluetoothModel::SetTagDisconnectView:%d", tag);
- tagDisconnectView = tag;
- }
-
- // 判断是否需要跳转连接失败界面
- bool BluetoothModel::IsTagDisconnectView(void)
- {
- return tagDisconnectView;
- }
-
- void BluetoothModel::SetTagConnectNew(bool tag)
- {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BluetoothModel::SetTagConnectNew:%d", tag);
- tagConnectNew = tag;
- }
-
- void BluetoothModel::SetTagReturnToDeviceListView(bool tag)
- {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BluetoothModel::SetTagReturnToDeviceListView:%d", tag);
- tagReturnToDeviceListView = tag;
- }
-
- bool BluetoothModel::IsTagReturnToDeviceListView(void)
- {
- return tagReturnToDeviceListView;
- }
-
- // 判断断开连接时是否需要马上连接新设备
- bool BluetoothModel::IsTagConnectNew(void)
- {
- return tagConnectNew;
- }
-
- void BluetoothModel::SetTagScanDeviceClicked(bool tag)
- {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BluetoothModel::SetTagScanDeviceClicked:%d", tag);
- tagScanDeviceClicked = tag;
- }
-
- // 判断是否已点击设备请求连接
- bool BluetoothModel::IsTagScanDeviceClicked(void)
- {
- return tagScanDeviceClicked;
- }
-
- bool BluetoothModel::CheckExistConnedList(BluetoothCaseInfo caseInfo)
- {
- ListNode<BluetoothCaseInfo> *node = btConnedDevicesList_ ->Begin();
- if (node == nullptr) {
- return false;
- } else if ((caseInfo.addr[0] == 0) && (caseInfo.addr[1] == 0)
- && (caseInfo.addr[2] == 0) && (caseInfo.addr[3] == 0)
- && (caseInfo.addr[4] == 0) && (caseInfo.addr[5] == 0)) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CheckExistConnedList false addr: 000000000000");
- return true;
- }
- while (node != btConnedDevicesList_ ->End()) {
- if ((caseInfo.addr[0] == node->data_.addr[0]) && (caseInfo.addr[1] == node->data_.addr[1])
- && (caseInfo.addr[2] == node->data_.addr[2]) && (caseInfo.addr[3] == node->data_.addr[3])
- && (caseInfo.addr[4] == node->data_.addr[4]) && (caseInfo.addr[5] == node->data_.addr[5])) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CheckExistConnedList true");
- return true;
- }
- node = node->next_;
- }
- return false;
- }
-
- bool BluetoothModel::FindNameByAddr(BluetoothCaseInfo &listInfo, BluetoothCaseInfo *caseInfo)
- {
- if ((listInfo.addr[0] == caseInfo->addr[0]) && (listInfo.addr[1] == caseInfo->addr[1]) &&
- (listInfo.addr[2] == caseInfo->addr[2]) && (listInfo.addr[3] == caseInfo->addr[3]) &&
- (listInfo.addr[4] == caseInfo->addr[4]) && (listInfo.addr[5] == caseInfo->addr[5])) {
- (void)memcpy_s(caseInfo->deviceName, BD_NAME_LEN, listInfo.deviceName, BD_NAME_LEN);
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FindNameFromList success, deviceName:%s", listInfo.deviceName);
- return true;
- } else {
- return false;
- }
- }
-
- bool BluetoothModel::FindNameFromList(BluetoothCaseInfo *caseInfo)
- {
- ListNode<BluetoothCaseInfo> *node = btConnedDevicesList_->Begin();
- if (!btScansDevicesList_.empty()) {
- for (auto it = btScansDevicesList_.begin(); it != btScansDevicesList_.end(); it++) {
- if (FindNameByAddr(*it, caseInfo)) {
- return true;
- }
- }
- }
- if (node != nullptr) {
- while (node != btConnedDevicesList_->End()) {
- if (FindNameByAddr(node->data_, caseInfo)) {
- return true;
- }
- node = node->next_;
- }
- }
- return false;
- }
-
- bool BluetoothModel::GetBluetoothAclState(void)
- {
- if ((lastConnedAddr.addr[0] == 0) && (lastConnedAddr.addr[1] == 0) &&
- (lastConnedAddr.addr[2] == 0) && (lastConnedAddr.addr[3] == 0) &&
- (lastConnedAddr.addr[4] == 0) && (lastConnedAddr.addr[5] == 0)) {
- return false;
- } else {
- return bt_is_acl_connected(&lastConnedAddr);
- }
- }
-
- bool BluetoothModel::GetAdvStartState(void)
- {
- return advStartState;
- }
- void BluetoothModel::SetAdvStartState(bool state)
- {
- advStartState = state;
- }
-
- #ifdef __cplusplus
- extern "C" {
- #endif
-
- // 回调: gap_read_remote_rssi_value 接口的数据上报
- void BtGapReadRemoteRssiEventCallback(const bd_addr_t *bdAddr, int rssi, int status)
- {
- UNUSED(status);
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BtGapReadRemoteRssiEventCallback addr: %02x%02x%02x%02x%02x%02x",
- bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* mac下标 0 1 2 3 4 5 */
- bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0]); /* mac下标 0 1 2 3 4 5 */
- BluetoothModel::GetInstance()->SetScansCaseRssi(bdAddr, rssi);
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "bt BtGapReadRemoteRssiEventCallback SetSortCaseRssi: %d status: %d", rssi, status);
- }
-
- // 回调:发现状态变化上报/扫描结束
- void BtGapDiscoveryStateChangedCallback(int status)
- {
- UNUSED(status);
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "bt BtGapDiscoveryStateChangedCallback %d", status);
- }
-
- static void ChangeScanView()
- {
- BluetoothEarPhoneView *bluetoothEarPhoneView = BluetoothEarPhoneView::GetInstance();
- if (bluetoothEarPhoneView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetoothEarPhoneView nullptr");
- return;
- }
- bluetoothEarPhoneView->setScanStatus(false);
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Bt scan one jumpView");
- if (BluetoothModel::GetInstance()->GetBluetoothCalleridStatus() == CALLERPLAYERS) {
- JumpView *jumpView = JumpView::GetInstance();
- if (jumpView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jumpView GetInstance fail");
- return;
- }
- jumpView->ChangeView(JumpView::BluetoothJumpViewNum::BLUETOOTHEARPHONEVIEW,
- JumpView::BluetoothJumpViewNum::BLUETOOTHEARLISTVIEW);
- } else if (BluetoothModel::GetInstance()->GetBluetoothCalleridStatus() == CALLERSETTING) {
- MainBluetoothView *mainBluetoothView = MainBluetoothView::GetInstance();
- if (mainBluetoothView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "mainBluetoothView GetInstance fail");
- return;
- }
- mainBluetoothView->ChangeView(BLUETOOTHEARPHONEVIEW, BLUETOOTHEARLISTVIEW);
- }
- // 暂停动画
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BtAnimatorStop bk");
- bluetoothEarPhoneView->BtAnimatorStop();
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BtAnimatorStop");
- }
-
- void BluetoothModel::BtGapDiscoveryResultCallbakHandle(const bd_addr_t &bdAddr)
- {
- BluetoothCaseInfo caseInfo{};
- (void)memcpy_s(caseInfo.addr, BD_ADDR_LEN, bdAddr.addr, BD_ADDR_LEN);
-
- unsigned char nameLen = BD_NAME_LEN;
- bool getNameRet = gap_get_device_name(&bdAddr, caseInfo.deviceName, &nameLen);
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "gap_discovery_result_callback getNameRet(bool): %d nameLen: %d name:%s",
- getNameRet, nameLen, caseInfo.deviceName);
-
- if (nameLen == 0) { // 过滤未扫描到名字的设备
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "nameLen == 0 return");
- return;
- }
- // 去重操作
- bool tag = BluetoothModel::GetInstance()->CheckExistScanList(caseInfo);
- if (!tag) {
- BluetoothModel::GetInstance()->AddCase(caseInfo); // 增加扫描设备信息
- }
- bool ret = gap_read_remote_rssi_value(&bdAddr); // 获取rssi
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "gap_read_remote_rssi_value ret = %d", ret);
- BluetoothEarPhoneView *bluetoothEarPhoneView = BluetoothEarPhoneView::GetInstance();
- if (bluetoothEarPhoneView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetoothEarPhoneView nullptr");
- return;
- }
- tag = bluetoothEarPhoneView->getScanStatus();
- if (tag == true) { // 跳转
- ChangeScanView();
- } else {
- BluetoothEarListView *bluetoothEarListView = BluetoothEarListView::GetInstance();
- if (bluetoothEarListView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetoothEarListView nullptr");
- return;
- }
- if (bluetoothEarListView->GetScanUIList() == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetScanUIList nullptr");
- return;
- } // 刷新
- bluetoothEarListView->GetScanUIList()->RefreshList();
- }
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "bt BtGapDiscoveryResultCallback end");
- }
-
- void BtGapPairStatusChangedCallback(const bd_addr_t *bdAddr, int status)
- {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BtGapPairStatusChangedCallback addr: ****%02x%02x%02x%02x status: %d\n",
- bdAddr->addr[3], bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0], status); /* addr下标 0 1 2 3 */
- if (status == GAP_PAIR_PAIRED) {
- if (ConnectPhonePresenter::GetInstance() != nullptr) {
- NativeAbility::GetInstance().ChangeSlice(VIEW_SETTING);
- }
- }
- }
-
- void BtGapPairRequestedCallback(const bd_addr_t *bdAddr)
- {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BtGapPairRequestedCallback addr: ****%02x%02x%02x%02x\n",
- bdAddr->addr[3], bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0]); /* addr下标 0 1 2 3 */
- }
-
- void BtGapPairConfirmedCallback(const bd_addr_t *bdAddr, int req_type, int number)
- {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BtGapPairConfirmedCallback addr: ****%02x%02x%02x%02x req_type: %d number: %d\n",
- bdAddr->addr[3], bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0], /* addr下标 0 1 2 3 */
- req_type, number);
- }
-
- // 回调:扫描结果处理/发现结果上报
- void BtGapDiscoveryResultCallback(const bd_addr_t *bdAddr)
- {
- if ((gap_get_device_class(bdAddr) & 0x200) != 0) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BtGapDiscoveryResultCallback: Mobile Phone Device");
- return;
- }
-
- if (bdAddr == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "addr nullptr");
- return;
- }
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "gap_discovery_result_callback addr: %02x%02x%02x%02x%02x%02x",
- bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* mac下标 0 1 2 3 4 5 */
- bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0]); /* mac下标 0 1 2 3 4 5 */
- GraphicService::GetInstance()->PostGraphicEvent(std::bind(&BluetoothModel::BtGapDiscoveryResultCallbakHandle,
- BluetoothModel::GetInstance(), *bdAddr));
- }
-
-
-
- void HandleBeforeChangeView()
- {
- int curView = BluetoothModel::GetInstance()->GetCurView();
- if (curView == BLUETOOTHEARPHONEVIEW) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HandleBeforeChangeView curView == BLUETOOTHEARPHONEVIEW");
- BluetoothEarPhoneView *bluetoothEarPhoneView = BluetoothEarPhoneView::GetInstance();
- if (bluetoothEarPhoneView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HandleBeforeChangeView bluetoothEarPhoneView == nullptr");
- return;
- }
- bluetoothEarPhoneView->BtAnimatorStop();
- bluetoothEarPhoneView->StopBtDiscovery();
- } else if (curView == BLUETOOTHEARLISTVIEW) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HandleBeforeChangeView curView == BLUETOOTHEARLISTVIEW");
- BluetoothEarPhoneView *bluetoothEarPhone = BluetoothEarPhoneView::GetInstance();
- if (bluetoothEarPhone == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HandleBeforeChangeView bluetoothEarPhoneView == nullptr");
- return;
- }
- bluetoothEarPhone->StopBtDiscovery();
- BluetoothItemView *pbItermView = BluetoothModel::GetInstance()->GetConnectionView();
- if (pbItermView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HandleBeforeChangeView The GetConnectionView get failed.");
- return;
- }
- pbItermView->ConnectAnimatorStop();
- BluetoothModel::GetInstance()->SetConnectionView(nullptr);
- } else if (curView == BLUETOOTHRECONNECTVIEW) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HandleBeforeChangeView curView == BLUETOOTHRECONNECTVIEW");
- BluetoothReconnectView *bluetoothReconnectView = BluetoothReconnectView::GetInstance();
- if (bluetoothReconnectView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HandleBeforeChangeView bluetoothReconnectView == nullptr");
- return;
- }
- bluetoothReconnectView->BtReconnectStop();
- }
- }
-
- static void ACLConnectionSuss(const bd_addr_t &bdAddr)
- {
- // 判断是否已退出蓝牙模块(无需跳转)
- bool tagConnectView = BluetoothModel::GetInstance()->IsTagConnectView();
- if (tagConnectView == false) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GapAclStateChangedCallback tagConnectView == false");
- return;
- }
- // 成功提示
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GAP_ACL_STATE_CONNECTED");
- HandleBeforeChangeView();
- if (BluetoothModel::GetInstance()->GetBluetoothCalleridStatus() == CALLERPLAYERS) {
- JumpView *jumpView = JumpView::GetInstance();
- if (jumpView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jumpView GetInstance fail");
- return;
- }
- jumpView->ChangeView(BluetoothModel::GetInstance()->GetCurView(),
- JumpView::BluetoothJumpViewNum::TIPSSUCCMESSAGEVIEW);
- } else if (BluetoothModel::GetInstance()->GetBluetoothCalleridStatus() == CALLERSETTING) {
- MainBluetoothView *mainBluetoothView = MainBluetoothView::GetInstance();
- if (mainBluetoothView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "mainBluetoothView GetInstance fail");
- return;
- }
- mainBluetoothView->ChangeView(BluetoothModel::GetInstance()->GetCurView(), TIPSSUCCMESSAGEVIEW);
- }
- TipsSuccMessageView *tipsSuccMessageView = TipsSuccMessageView::GetInstance();
- if (tipsSuccMessageView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ACLConnectionSuss tipsSuccMessageView GetInstance fail");
- return;
- }
- tipsSuccMessageView->RefreshNameLabel(bdAddr);
- }
-
- static void ACLConnectionFail(const bd_addr_t &bdAddr)
- {
- // 判断是否已退出蓝牙模块(无需跳转)
- bool tagConnectView = BluetoothModel::GetInstance()->IsTagConnectView();
- // 判断是否无需跳转到失败界面
- bool tagDisconnectView = BluetoothModel::GetInstance()->IsTagDisconnectView();
- if (tagConnectView == false || tagDisconnectView == false) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GapAclStateChangedCallback tagDisconnectView == false");
- return;
- }
- // 失败提示页
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "conn fail");
- HandleBeforeChangeView();
- if (BluetoothModel::GetInstance()->GetBluetoothCalleridStatus() == CALLERPLAYERS) {
- JumpView *jumpView = JumpView::GetInstance();
- if (jumpView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jumpView GetInstance fail");
- return;
- }
- jumpView->ChangeView(BluetoothModel::GetInstance()->GetCurView(),
- JumpView::BluetoothJumpViewNum::TIPSCONNFAILMESSAGEVIEW);
- } else if (BluetoothModel::GetInstance()->GetBluetoothCalleridStatus() == CALLERSETTING) {
- MainBluetoothView *mainBluetoothView = MainBluetoothView::GetInstance();
- if (mainBluetoothView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "mainBluetoothView GetInstance fail");
- return;
- }
- mainBluetoothView->ChangeView(BluetoothModel::GetInstance()->GetCurView(), TIPSCONNFAILMESSAGEVIEW);
- }
- TipsConnFailMessageView *tipsConnFailMessageView = TipsConnFailMessageView::GetInstance();
- if (tipsConnFailMessageView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ACLConnectionFail tipsConnFailMessageView GetInstance fail");
- return;
- }
- tipsConnFailMessageView->RefreshNameLabel(bdAddr);
- }
-
- static void DisconnectBluetoothPause()
- {
- int64_t playerCurrentTime;
- int64_t playerMusicDuration;
- int64_t playerProgressVlaue;
- if (PlayersModel::GetInstance()->GetPlayerCtr() == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AclStateChangedCallback GetPlayerCtr() == nullptr");
- return;
- }
- PlayersModel::GetInstance()->GetPlayerCtr()->Pause();
- PlayersModel::GetInstance()->SetPlayButtonState(false);
- PlayersModel::GetInstance()->GetPlayerCtr()->GetCurrentTime(playerCurrentTime);
- PlayersModel::GetInstance()->GetPlayerCtr()->GetDuration(playerMusicDuration);
- if (playerMusicDuration == 0) { // 0:除数保护
- playerProgressVlaue = 100; // 100:进度条系数
- } else {
- playerProgressVlaue = (playerCurrentTime * 100) / playerMusicDuration; // 100:百分比系数
- }
- PlayersModel::GetInstance()->SetCircleProgress(playerProgressVlaue);
- PlayersView *playersView = PlayersView::GetInstance();
- if (playersView != nullptr) {
- playersView->SetPlayerButtonState(UICheckBox::UICheckBoxState::UNSELECTED);
- if (playersView->GetPlaybackProgress() == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AclStateChangedCallback playersView->GetPlaybackProgress() == nullptr");
- return;
- }
- playersView->GetPlaybackProgress()->SetValue(playerProgressVlaue);
- }
- }
-
- static void DisconnectedHandle()
- {
- DisconnectBluetoothPause();
- BluetoothModel::GetInstance()->SetTagDisconnectView(false);
- BluetoothDeviceListView *bluetoothDeviceListView = BluetoothDeviceListView::GetInstance();
- if (bluetoothDeviceListView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AclStateChangedCallback bluetoothDeviceListView == nullptr");
- return;
- }
- UIList *deviceList = bluetoothDeviceListView->GetDeviceUIList();
- if (deviceList == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DisconnectedHandle deviceList nullptr");
- return;
- }
- deviceList->RefreshList();
- BluetoothOptionsView *bluetoothOptionsView = BluetoothOptionsView::GetInstance();
- if (bluetoothOptionsView == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AclStateChangedCallback bluetoothOptionsView == nullptr");
- return;
- }
- bluetoothOptionsView->RefreshText();
- }
-
- void BluetoothModel::BtGapAclStateChangedHandle(gap_acl_state_t state, unsigned int reason, const bd_addr_t &bdAddr)
- {
- if ((state == GAP_ACL_STATE_CONNECTED) || (state == GAP_ACL_STATE_LE_CONNECTED)) {
- SendMsgToUIService(BT_CONNECTED_TO_UI, 0, NULL, 0);
- } else {
- SendMsgToUIService(BT_DISCONNECTED_TO_UI, 0, NULL, 0);
- }
-
- bool tag = BluetoothModel::GetInstance()->IsTagScanDeviceClicked();
- if ((reason == 0x13) || (reason == 0x14) || (reason == 0x15) || (reason == 0x3D) || (reason == 0x08 && tag == false)) { // 连接断开
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "The peer end is disconnected.");
- DisconnectedHandle();
- } else if (reason == 0x16) { // 主动断开连接
- DisconnectedHandle();
- BluetoothCaseInfo *onClickBtCaseInfo = BluetoothModel::GetInstance()->GetTempMacValue();
- bool ret = BluetoothModel::GetInstance()->IsTagConnectNew();
- if (ret == true) {
- ret = gap_connect_remote_device((const bd_addr_t *)&onClickBtCaseInfo->addr);
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "gap_connect_remote_device ret = %d", ret);
- }
- } else if ((reason == 0xb) || (reason > 0x45)) { // 0xb:重复点击连接按钮 0x45:acl状态最大参数
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "reason is false.");
- SetTagDisconnectView(false);
- }
-
- BluetoothCaseInfo *onClickBtCaseInfo = GetTempMacValue();
-
- if ((state == GAP_ACL_STATE_CONNECTED) || (state == GAP_ACL_STATE_LE_CONNECTED)) {
- SetLastConnedAddr(&bdAddr);
- // 将数据存入设备列表
- bool tag = CheckExistConnedList(*onClickBtCaseInfo);
- if (!tag) {
- AddConnedDevicesCase(*onClickBtCaseInfo);
- }
- ACLConnectionSuss(bdAddr);
- bool retA2dp = a2dp_src_connect(&bdAddr);
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "a2dp_src_connect result %d", retA2dp);
- } else {
- ACLConnectionFail(bdAddr);
- }
- }
-
- // 回调:ACL连接状态上报
- void GapAclStateChangedCallback(const bd_addr_t *bdAddr, gap_acl_state_t state, unsigned int reason)
- {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "bt GapAclStateChangedCallback state %d, reason %x succ or err", state, reason);
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "addr: %02x%02x%02x%02x%02x%02x",
- bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* mac下标 0 1 2 3 4 5 */
- bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0]); /* mac下标 0 1 2 3 4 5 */
- if ((gap_get_device_class(bdAddr) & 0x200) != 0) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GapAclStateChangedCallback: Mobile Phone Device");
- return;
- }
- GraphicService::GetInstance()->PostGraphicEvent(std::bind(&BluetoothModel::BtGapAclStateChangedHandle,
- BluetoothModel::GetInstance(), state, reason, *bdAddr));
- }
-
- // 回调:远端设备名称变化
- void BtRemoteNameChangedCallback(const bd_addr_t *bdAddr, const unsigned char *deviceName, unsigned char length)
- {
- if ((gap_get_device_class(bdAddr) & 0x200) != 0) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BtRemoteNameChangedCallback: Mobile Phone Device");
- return;
- }
- BluetoothCaseInfo caseInfo{};
- if (bdAddr == nullptr) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BtRemoteNameChangedCallback addr nullptr");
- return;
- }
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BtRemoteNameChangedCallback addr: %02x%02x%02x%02x%02x%02x",
- bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* mac下标 0 1 2 3 4 5 */
- bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0]); /* mac下标 0 1 2 3 4 5 */
-
- (void)memcpy_s(caseInfo.addr, BD_ADDR_LEN, bdAddr->addr, BD_ADDR_LEN);
- int ret = memcpy_s(caseInfo.deviceName, BD_NAME_LEN, deviceName, length);
- if (ret != EOK) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BtRemoteNameChangedCallback memcpy fail!");
- return;
- }
- BluetoothModel::GetInstance()->ResetScanDevicesCase(caseInfo);
- }
-
- void BtIsAcceptConnOnSafeModeCallback(const bd_addr_t *bdAddr, bool *res)
- {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BtIsAcceptConnOnSafeModeCallback addr: %02x%02x%02x%02x%02x%02x set *res true",
- bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* addr下标 3 4 5 */
- bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0]); /* addr下标 0 1 2 */
- *res = true;
- }
-
- static void A2dpSrcConnectstateChanged(bd_addr_t *bdAddr, int connState)
- {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "a2dp_src_connectStateChangedCallback addr: %02x%02x%02x%02x%02x%02x connState: %x",
- bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* 5 4 3 idx */
- bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0], connState); /* 2 1 0 idx */
- if ((gap_get_device_class(bdAddr) & 0x200) != 0) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "a2dp_src_connectstateChangedCb: Mobile Phone Device");
- return;
- }
- if (connState == PROFILE_STATE_CONNECTED) {
- avrcp_ct_connect(bdAddr);
- PhoneAudioManagerSetDeviceConnState(OUT_BLUETOOTH_A2DP, AUDIO_DEVICE_CONNECTED);
- }
-
- if (connState == PROFILE_STATE_DISCONNECTED) {
- PhoneAudioManagerSetDeviceConnState(OUT_BLUETOOTH_A2DP, AUDIO_DEVICE_DISCONNECTED);
- }
- }
-
- static void A2dpSrcPlayingStateChanged(bd_addr_t *bdAddr, int playState)
- {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "A2dpSrcPlayingStateChangedCallback addr: %02x%02x%02x%02x%02x%02x playState: %x",
- bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* 5 4 3 idx */
- bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0], playState); /* 2 1 0 idx */
- }
-
- static void A2dpSrcConfigureChanged(bd_addr_t *bdAddr, a2dp_codec_info_t *info)
- {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "A2dpSrcConfigurationChangedCallback addr: %02x%02x%02x%02x%02x%02x ",
- bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* 5 4 3 idx */
- bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0]); /* 2 1 0 idx */
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "codec_priority: %04x codec_type: %04x sample_rate: %02x bits_per_sample: %02x channel_mode: %02x ",
- info->codec_priority, info->codec_type, info->sample_rate, info->bits_per_sample, info->channel_mode);
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "codec_specific1: %04x codec_specific2: %04x codec_specific3: %04x codec_specific4: %04x",
- info->codec_specific1, info->codec_specific2, info->codec_specific3, info->codec_specific4);
- }
-
- static void BleConnStateChangeCallback(unsigned short connId, bd_addr_t *addr, gap_ble_conn_state_t connState,
- gap_ble_pair_state_t pairState, gap_ble_disc_reason_t discReason)
- {
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BleConnStateChangeCallback connId 0x%x, connState 0x%x, pairState 0x%x",
- connId, connState, pairState);
- if (GAP_BLE_STATE_DISCONNECTED == connState) { // restart ble adv when disconnected
- BleAdvStart();
- } else {
- BluetoothModel::GetInstance()->SetAdvStartState(false);
- }
- }
-
- static void BleAdvStartCallback(uint8_t advId, adv_status_t status)
- {
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BleAdvStartCallback advId: %d, status:%d\n", advId, status);
- BluetoothModel::GetInstance()->SetAdvStartState(true);
- }
-
- static void BleAdvStopCallback(uint8_t advId, adv_status_t status)
- {
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BleAdvStopCallback advId: %d, status:%d\n", advId, status);
- }
-
- static void BtGattsServiceAddCallback(uint8_t serverId, bt_uuid_t *uuid, uint16_t srvcHandle, errcode_t status)
- {
- int ret;
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BtGattsServiceAddCallback 0x%x 0x%x 0x%x",
- status, serverId, srvcHandle);
-
- if ((uuid->uuid_len == sizeof(uint16_t)) && (*((uint16_t*)uuid->uuid) == 0x1FF0)) {
- uint16_t id = 0x1FF1;
- gatts_add_chara_info_t character;
- uint16_t value = 0;
-
- memset_s(&character, sizeof(gatts_add_chara_info_t), 0, sizeof(gatts_add_chara_info_t));
- character.chara_uuid.uuid_len = sizeof(id);
- memcpy_s(character.chara_uuid.uuid, sizeof(character.chara_uuid.uuid), (char *)&id, sizeof(id));
- character.permissions = GATT_ATTRIBUTE_PERMISSION_WRITE;
- character.properties = GATT_CHARACTER_PROPERTY_BIT_WRITE;
- character.value_len = (uint16_t)sizeof(value);
- character.value = (uint8_t *)(&value);
-
- ret = gatts_add_characteristic(serverId, srvcHandle, &character);
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gatts_add_characteristic ret 0x%x", ret);
- }
-
- }
-
- static void BtGattsCharacteristicAddCallback(uint8_t serverId, bt_uuid_t *uuid, uint16_t srvcHandle, gatts_add_character_result_t *result, errcode_t status)
- {
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BtGattsCharacteristicAddCallback 0x%x 0x%x 0x%x",
- status, serverId, srvcHandle);
-
- if ((uuid->uuid_len == sizeof(uint16_t)) && (*((uint16_t*)uuid->uuid) == 0x1FF1)) {
- int ret = gatts_start_service(serverId, srvcHandle);
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gatts_start_service ret 0x%x", ret);
- }
- }
-
- static void BtGattsDescriptorAddCallback(uint8_t serverId, bt_uuid_t *uuid, uint16_t srvcHandle, uint16_t descriptorHandle, errcode_t status)
- {
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BtGattsDescriptorAddCallback 0x%x 0x%x 0x%x 0x%x",
- status, serverId, srvcHandle, descriptorHandle);
- }
-
- static void BtGattsServiceStartCallback(uint8_t serverId, uint16_t srvcHandle, errcode_t status)
- {
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BtGattsServiceStartCallback 0x%x 0x%x 0x%x", status, serverId, srvcHandle);
- }
-
- static void BtGattsServiceStopCallback(uint8_t serverId, uint16_t srvcHandle, errcode_t status)
- {
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BtGattsServiceStopCallback 0x%x 0x%x 0x%x", status, serverId, srvcHandle);
- }
-
- static void BtGattsServiceDeleteCallback(uint8_t serverId, errcode_t status)
- {
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BtGattsServiceDeleteCallback 0x%x 0x%x", status, serverId);
- }
-
- static void BtGattsRequestReadCallback(uint8_t serverId, uint16_t connId, gatts_req_read_cb_t *readCbPara, errcode_t status)
- {
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BtGattsRequestReadCallback");
- }
-
- static void BtGattsRequestWriteCallback(uint8_t serverId, uint16_t connId, gatts_req_write_cb_t *writeCbPara, errcode_t status)
- {
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BtGattsRequestWriteCallback333 %s %d",writeCbPara->value,writeCbPara->length);
- }
-
- // 注册回调函数
- static gap_call_backs_t g_btGapCallBacks{};
- static a2dp_src_callbacks_t g_a2dpSrcCallbacks{};
- static gap_ble_callbacks_t g_gapBleCallbacks{};
- static gatts_callbacks_t g_btGattsCallbacks{};
- void BtInitCallBacks()
- {
- // g_btGapCallBacks.discovery_result_callback = BtGapDiscoveryResultCallback;
- // g_btGapCallBacks.discovery_state_changed_callback = BtGapDiscoveryStateChangedCallback;
- // g_btGapCallBacks.acl_state_changed_callbak = GapAclStateChangedCallback;
- // g_btGapCallBacks.read_remote_rssi_event_callback = BtGapReadRemoteRssiEventCallback;
- // g_btGapCallBacks.remote_name_changed_callback = BtRemoteNameChangedCallback;
- // g_btGapCallBacks.is_accept_conn_on_safe_mode_callback = BtIsAcceptConnOnSafeModeCallback;
- // g_btGapCallBacks.pair_status_changed_callback = BtGapPairStatusChangedCallback;
- // g_btGapCallBacks.pair_requested_callback = BtGapPairRequestedCallback;
- // g_btGapCallBacks.pair_confiremed_callback = BtGapPairConfirmedCallback;
-
- // gap_register_callbacks(&g_btGapCallBacks);
-
- // g_a2dpSrcCallbacks.connectstate_changed_cb = A2dpSrcConnectstateChanged;
- // g_a2dpSrcCallbacks.configuration_changed_cb = A2dpSrcConfigureChanged;
- // g_a2dpSrcCallbacks.playing_state_changed_cb = A2dpSrcPlayingStateChanged;
- // a2dp_src_register_callbacks(&g_a2dpSrcCallbacks);
-
- // g_gapBleCallbacks.conn_state_change_cb = BleConnStateChangeCallback;
- // g_gapBleCallbacks.start_adv_cb = BleAdvStartCallback;
- // g_gapBleCallbacks.stop_adv_cb = BleAdvStopCallback;
- // gap_ble_register_callbacks(&g_gapBleCallbacks);
-
- // g_btGattsCallbacks.add_service_cb = BtGattsServiceAddCallback;
- // g_btGattsCallbacks.add_characteristic_cb = BtGattsCharacteristicAddCallback;
- // g_btGattsCallbacks.add_descriptor_cb = BtGattsDescriptorAddCallback;
- // g_btGattsCallbacks.start_service_cb = BtGattsServiceStartCallback;
- // g_btGattsCallbacks.stop_service_cb = BtGattsServiceStopCallback;
- // g_btGattsCallbacks.delete_service_cb = BtGattsServiceDeleteCallback;
- // g_btGattsCallbacks.read_request_cb = BtGattsRequestReadCallback;
- // g_btGattsCallbacks.write_request_cb = BtGattsRequestWriteCallback;
- // g_btGattsCallbacks.mtu_changed_cb = NULL;
- // gatts_register_callbacks(&g_btGattsCallbacks);
- }
-
- void BtInitGatts(void)
- {
- return;
- uint16_t id = 0x1FF0;
- uint16_t ser_id = 0x1FFF;
- uint8_t serverId = 0;
- bt_uuid_t uuid;
- int ret;
-
- uuid.uuid_len = sizeof(ser_id);
- memcpy_s(uuid.uuid, sizeof(uuid.uuid), (char *)&ser_id, sizeof(ser_id));
- ret = gatts_register_server(&uuid, &serverId); /* 注册gatt server */
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gatts_register_server ret: 0x%x serverId = 0x%x", ret, serverId);
-
- uuid.uuid_len = sizeof(id);
- memcpy_s(uuid.uuid, sizeof(uuid.uuid), (char *)&id, sizeof(id));
- ret = gatts_add_service(serverId, &uuid, true);
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gatts_add_service ret: 0x%x", ret);
- }
-
- static uint8_t Char2Num(int8_t c)
- {
- if (c >= '0' && c <= '9') {
- return (uint8_t)(c - '0');
- } else if (c >= 'A' && c <= 'F') {
- return (uint8_t)(c - 'A' + TEN);
- } else if (c >= 'a' && c <= 'f') {
- return (uint8_t)(c - 'a' + TEN);
- } else {
- return 0xFF;
- }
- }
-
- static uint32_t GenerateUuidFromString(const char *str, uint8_t len, bt_uuid_t *uuid_out)
- {
- int slen = (int)strnlen(str, len);
- bool new_uuid = false;
- if (uuid_out == NULL) {
- return ERRCODE_INVALID_PARAM;
- }
-
- uuid_out->uuid_len = (uint8_t)slen / 2; /* 2: 2个字符组成一个字节,因此只取偶数个字符 */
- for (int i = 0; i + 1 < slen; i += 2) { /* 2: 同上 */
- uint8_t num1 = Char2Num(str[i]);
- uint8_t num2 = Char2Num(str[i + 1]);
- if (num1 == UINT8_MAX || num2 == UINT8_MAX) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "invalid input %c%c\n", str[i], str[i + 1]);
- return ERRCODE_INVALID_PARAM;
- }
-
- uuid_out->uuid[i / 2] = (uint8_t)((num1 << BIT4) | num2); /* 2: 同上 */
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "%02x ", (uint8_t)(uuid_out->uuid[i / 2])); /* 2: 同上 */
- }
-
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "\n");
- return ERRCODE_SUCC;
- }
-
- void BtSppServerCreate(const char *spp_uuid, const char *name, uint8_t name_len)
- {
- spp_create_socket_para_t param;
- if (GenerateUuidFromString((const char *)spp_uuid, (uint8_t)strlen(spp_uuid), ¶m.uuid) != ERRCODE_SUCC) {
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "get uuid fail\n");
- return;
- }
-
- param.socket_type = SPP_SOCKET_RFCOMM;
- param.is_encrypt = true;
-
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "uuid: %s uuid_len: %u\n", spp_uuid, param.uuid.uuid_len);
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "socket_type: %x is_encrypt: %d name: %s nameLen: %u\n", param.socket_type,
- param.is_encrypt, name, name_len);
-
- int ret = spp_server_create(¶m, name, name_len);
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "spp_server_create ret: %x\n", ret);
- }
-
- static int BtSppServerAcceptTaskBody(void *data)
- {
- int server_id = (int)(intptr_t)data;
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "server_id: %x\n", server_id);
-
- int ret = spp_server_accept(server_id);
-
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "spp_server_accept ret: %x\n", ret);
-
- return OSAL_SUCCESS;
- }
-
- /* 等待client连接 */
- void BtSppServerAccept(uint8_t server_id)
- {
- osal_task *task = osal_kthread_create(BtSppServerAcceptTaskBody, (void *)(uintptr_t)server_id,
- "spp_server_accept_task", BT_SPP_TASK_STACK_SIZE);
- if (task == NULL) {
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "create task fail\n");
- return;
- }
-
- int ret = osal_kthread_set_priority(task, BT_SPP_TASK_PRI);
- if (ret != OSAL_SUCCESS) {
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "set pri error: %08x\n", ret);
- }
-
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "create task success.\n");
- }
-
- void BtInitSpp(void)
- {
- char uuid[] = "1101";
- char name[] = "COM1";
- uint8_t name_len = strlen(name) + 1;
- uint8_t server_id = 0;
-
- /* 创建spp */
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "create spp server uuid=%s name=%s name_len=%d\n", uuid, name, name_len);
- BtSppServerCreate(uuid, name, name_len);
- BtSppServerAccept(server_id);
- }
-
- void BleAdvStart(void)
- {
- int advId = 1;
- if (BluetoothModel::GetInstance()->GetAdvStartState()) {
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BleAdvStart already started");
- gap_ble_stop_adv(advId);
- osDelay(50);
- }
- gap_ble_adv_params_t adv_para;
- memset_s(&adv_para, sizeof(gap_ble_adv_params_t), 0, sizeof(gap_ble_adv_params_t));
- adv_para.min_interval = 0x30;
- adv_para.max_interval = 0x60;
- adv_para.adv_type = GAP_BLE_ADV_CONN_SCAN_UNDIR;
- adv_para.channel_map = 0x7;
- adv_para.duration = 0;
- gap_ble_set_adv_param(advId, &adv_para);
- gap_ble_set_local_appearance(GAP_BLE_APPEARANCE_TYPE_GENERIC_WATCH);
- bool ret = gap_ble_start_adv(advId);
- if (ret) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BleAdvStart bt gap_ble_start_adv ret = 0x%x", ret);
- }
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BleAdvStart bt gap_ble_start_adv ret = 0x%x", ret);
- }
-
- #ifdef __cplusplus
- }
- #endif
- }
+ /*\r
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.\r
+ * Description: BluetoothModel view\r
+ * Author:\r
+ * Create: 2021-10-13\r
+ */\r
+ #include "stdint.h"\r
+ #include "BluetoothModel.h"\r
+ #include "BluetoothPresenter.h"\r
+ #include "ConnectPhonePresenter.h"\r
+ #include "BluetoothView.h"\r
+ #include "BluetoothItemView.h"\r
+ #include "PlayersModel.h"\r
+ #include "PhoneAudio.h"\r
+ #include "graphic_service.h"\r
+ #include "ui_service.h"\r
+ \r
+ #include "msg_center.h"\r
+ \r
+ #include "bts_def.h"\r
+ #include "bts_gatt_stru.h"\r
+ #include "bts_a2dp_source.h"\r
+ #include "bts_gatt_server.h"\r
+ #include "bts_le_gap.h"\r
+ #include "bts_spp.h"\r
+ #include "osal_task.h"\r
-#ifdef SUPPORT_ALIPAY_SEC\r
-#include "alipay_feature.h"\r
-#endif\r
-#include "bts_a2dp_sink.h"\r
-#include "bt_audio_hal_interface.h"\r
-#include "audio_manager_c_wrapper.h"\r
-#include "bts_avrcp_target.h"\r
+ \r
+ namespace OHOS {\r
+ \r
+ #define BT_SPP_TASK_STACK_SIZE 2048\r
+ #define BT_SPP_TASK_PRI 20\r
+ #define TEN 10\r
+ \r
+ constexpr uint16_t BLUETOOTH_MAX_NUM = 20;\r
+ \r
-#define MEDIA_A2DP_SNK_INTERFACE 1\r
-osal_timer g_a2dp_stream_accept_timer = {NULL, NULL, 0, 0};\r
-#define A2DP_STREAM_ACCEPT_TIMER_PERIOD 500\r
-AudioFormatConfig g_audio_format_config = {AUDIO_DEFAULT, 0, 0};\r
-BtAvrcpTgInftrerface g_avrcp_srv_infterface;\r
-\r
-\r
+ void BluetoothModel::SetBluetoothCalleridStatus(int16_t value)\r
+ {\r
+ callerid = value;\r
+ }\r
+ \r
+ int BluetoothModel::GetBluetoothCalleridStatus(void)\r
+ {\r
+ return callerid;\r
+ }\r
+ \r
+ BluetoothModel::BluetoothModel()\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BluetoothModel::BluetoothModel");\r
+ }\r
+ \r
+ BluetoothModel *BluetoothModel::GetInstance(void)\r
+ {\r
+ static BluetoothModel instance;\r
+ return &instance;\r
+ }\r
+ \r
+ void BluetoothModel::Init()\r
+ {\r
+ bool ret = enable_bt_stack();\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "bt enable_bt_stack ret = %d", ret);\r
+ \r
- BtInitCallBacks();\r
-#ifdef SUPPORT_ALIPAY_SEC\r
- svr_alipay_bluetooth_init();\r
-#else\r
- BtInitCallBacksEx();\r
- BtInitGatts();\r
-#endif\r
++ // BtInitCallBacks();\r
++ // BtInitGatts();\r
+ BtInitSpp();\r
+ \r
+ SetUpListCase();\r
+ SetUpConnedDevicesList();\r
+ }\r
+ \r
+ void BluetoothModel::SetCaseListClear()\r
+ {\r
+ btScansDevicesList_.clear();\r
+ }\r
+ \r
+ bool BluetoothModel::CheckExistScanList(BluetoothCaseInfo caseInfo)\r
+ {\r
+ std::list<BluetoothCaseInfo>::iterator node = btScansDevicesList_.begin();\r
+ if (btScansDevicesList_.empty()) {\r
+ return false;\r
+ }\r
+ while (node != btScansDevicesList_.end()) {\r
+ if ((caseInfo.addr[0] == node->addr[0]) && (caseInfo.addr[1] == node->addr[1])\r
+ && (caseInfo.addr[2] == node->addr[2]) && (caseInfo.addr[3] == node->addr[3])\r
+ && (caseInfo.addr[4] == node->addr[4]) && (caseInfo.addr[5] == node->addr[5])) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "true");\r
+ return true;\r
+ }\r
+ node++;\r
+ }\r
+ return false;\r
+ }\r
+ \r
+ void BluetoothModel::SetUpListCase()\r
+ {\r
+ SetCaseListClear();\r
+ }\r
+ \r
+ std::list<BluetoothCaseInfo>& BluetoothModel::GetCase()\r
+ {\r
+ return btScansDevicesList_;\r
+ }\r
+ \r
+ void BluetoothModel::AddCase(BluetoothCaseInfo caseInfo)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AddCase::caseInfo addr: %02x%02x%02x%02x%02x%02x",\r
+ caseInfo.addr[5], caseInfo.addr[4], caseInfo.addr[3], /* mac下标 0 1 2 3 4 5 */\r
+ caseInfo.addr[2], caseInfo.addr[1], caseInfo.addr[0]);\r
+ if (btScansDevicesList_.size() >= BLUETOOTH_MAX_NUM) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "btScansDevicesList_.size is BLUETOOTH_MAX_NUM");\r
+ return;\r
+ } else {\r
+ btScansDevicesList_.push_back(caseInfo);\r
+ }\r
+ }\r
+ \r
+ void BluetoothModel::SetScansCaseRssi(const bd_addr_t *bdAddr, int rssi)\r
+ {\r
+ for (auto it = btScansDevicesList_.begin(); it != btScansDevicesList_.end(); it++) {\r
+ if ((it->addr[0] == bdAddr->addr[0]) && (it->addr[1] == bdAddr->addr[1])\r
+ && (it->addr[2] == bdAddr->addr[2]) && (it->addr[3] == bdAddr->addr[3])\r
+ && (it->addr[4] == bdAddr->addr[4]) && (it->addr[5] == bdAddr->addr[5])) {\r
+ it->temp = rssi;\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "btScansDevicesList_ rssi:%d deviceName:%s", it->temp, it->deviceName);\r
+ }\r
+ }\r
+ }\r
+ \r
+ \r
+ bool CompBuletoothInfo(const BluetoothCaseInfo& a, const BluetoothCaseInfo& b)\r
+ {\r
+ if (a.temp > b.temp) {\r
+ return true;\r
+ }\r
+ return false;\r
+ }\r
+ \r
+ void BluetoothModel::SortScansCaseRssi()\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BluetoothModel::SortScansCaseRssi");\r
+ btScansDevicesList_.sort(CompBuletoothInfo);\r
+ }\r
+ \r
+ void BluetoothModel::ResetScanDevicesCase(const BluetoothCaseInfo& caseInfo)\r
+ {\r
+ for (auto it = btScansDevicesList_.begin(); it != btScansDevicesList_.end(); it++) {\r
+ if ((it->addr[0] == caseInfo.addr[0]) && (it->addr[1] == caseInfo.addr[1])\r
+ && (it->addr[2] == caseInfo.addr[2]) && (it->addr[3] == caseInfo.addr[3])\r
+ && (it->addr[4] == caseInfo.addr[4]) && (it->addr[5] == caseInfo.addr[5])) {\r
+ (void)memcpy_s(it->deviceName, BD_NAME_LEN,\r
+ caseInfo.deviceName, BD_NAME_LEN);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ResetConnedDevicesCase deviceName:%s", it->deviceName);\r
+ }\r
+ }\r
+ }\r
+ \r
+ /* 已配对设备队列 */\r
+ void BluetoothModel::SetConnedDevicesListClear()\r
+ {\r
+ btConnedDevicesList_->Clear();\r
+ }\r
+ \r
+ void BluetoothModel::SetUpConnedDevicesList()\r
+ {\r
+ if (btConnedDevicesList_ == nullptr) {\r
+ btConnedDevicesList_ = new List<BluetoothCaseInfo>();\r
+ if (btConnedDevicesList_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BluetoothModel btConnedDevicesList_ new fail");\r
+ return;\r
+ }\r
+ SetConnedDevicesListClear();\r
+ unsigned int connedDevicesNum = 0;\r
+ bool ret = gap_get_paired_devices_num(&connedDevicesNum);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Setup GetPariedDevicesNum ret = %d, num = %d", ret, connedDevicesNum);\r
+ \r
+ gap_paired_device_info_t *devInfo = (gap_paired_device_info_t*)malloc(sizeof(gap_paired_device_info_t) *connedDevicesNum);\r
+ if (devInfo == NULL) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DevInfo malloc failed %u", sizeof(gap_paired_device_info_t) *connedDevicesNum);\r
+ return;\r
+ }\r
+ ret = gap_get_paired_devices_list(devInfo, (int *)&connedDevicesNum);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetUpConnedDevicesList gap_get_paired_devices_list ret = %d", ret);\r
+ \r
+ BluetoothCaseInfo caseInfo{};\r
+ for (int i = 0; i < static_cast<int>(connedDevicesNum); ++i) {\r
+ if ((gap_get_device_class((const bd_addr_t *)devInfo[i].addr.addr) & 0x200) != 0) {\r
+ continue;\r
+ }\r
+ (void)memcpy_s(caseInfo.addr, BD_ADDR_LEN,\r
+ devInfo[i].addr.addr, BD_ADDR_LEN);\r
+ (void)memcpy_s(caseInfo.deviceName, BD_NAME_LEN,\r
+ devInfo[i].device_name, BD_NAME_LEN);\r
+ AddConnedDevicesCase(caseInfo);\r
+ }\r
+ free(devInfo);\r
+ }\r
+ }\r
+ \r
+ void BluetoothModel::AddConnedDevicesCase(BluetoothCaseInfo caseInfo)\r
+ {\r
+ if (btConnedDevicesList_ == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "btConnedDevicesList_ nullptr");\r
+ return;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AddConnedDevicesCase::caseInfo addr: %02x%02x%02x%02x%02x%02x",\r
+ caseInfo.addr[5], caseInfo.addr[4], caseInfo.addr[3], /* mac下标 0 1 2 3 4 5 */\r
+ caseInfo.addr[2], caseInfo.addr[1], caseInfo.addr[0]);\r
+ if (btConnedDevicesList_->Size() >= BLUETOOTH_MAX_NUM) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "btConnedDevicesList_->Size is BLUETOOTH_MAX_NUM");\r
+ return;\r
+ } else {\r
+ btConnedDevicesList_->PushBack(caseInfo);\r
+ }\r
+ }\r
+ \r
+ List<BluetoothCaseInfo>& BluetoothModel::GetConnedDevicesCase()\r
+ {\r
+ return *btConnedDevicesList_;\r
+ }\r
+ \r
+ void BluetoothModel::SetBtStatus(void)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetBtStatus tempMacValue: %02x%02x%02x%02x%02x%02x",\r
+ tempMacValue.addr[5], tempMacValue.addr[4], tempMacValue.addr[3], /* mac챐 0 1 2 3 4 5 */\r
+ tempMacValue.addr[2], tempMacValue.addr[1], tempMacValue.addr[0]); /* mac챐 0 1 2 3 4 5 */\r
+ aclConnected = bt_is_acl_connected((const bd_addr_t*)&tempMacValue.addr);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "aclConnected %d", aclConnected);\r
+ }\r
+ \r
+ bool BluetoothModel::GetAclConnected(void)\r
+ {\r
+ return aclConnected;\r
+ }\r
+ \r
+ void BluetoothModel::SetTempMacValue(BluetoothCaseInfo *caseInfo)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetTempMacValue: %02x%02x%02x%02x%02x%02x",\r
- caseInfo->addr[5], caseInfo->addr[4], caseInfo->addr[3], /* mac챐 0 1 2 3 4 5 */\r
- caseInfo->addr[2], caseInfo->addr[1], caseInfo->addr[0]); /* mac챐 0 1 2 3 4 5 */\r
++ caseInfo->addr[5], caseInfo->addr[4], caseInfo->addr[3], /* mac챐 0 1 2 3 4 5 */\r
++ caseInfo->addr[2], caseInfo->addr[1], caseInfo->addr[0]); /* mac챐 0 1 2 3 4 5 */\r
+ (void)memcpy_s(tempMacValue.addr, BD_ADDR_LEN,\r
+ caseInfo->addr, BD_ADDR_LEN);\r
+ (void)memcpy_s(tempMacValue.deviceName, BD_NAME_LEN,\r
+ caseInfo->deviceName, BD_NAME_LEN);\r
+ }\r
+ \r
+ BluetoothCaseInfo *BluetoothModel::GetTempMacValue(void)\r
+ {\r
+ return &tempMacValue;\r
+ }\r
+ \r
+ void BluetoothModel::SetLastConnedAddr(const bd_addr_t *addr)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetLastConnedAddr: %02x%02x%02x%02x%02x%02x",\r
- addr->addr[5], addr->addr[4], addr->addr[3], /* mac챐 0 1 2 3 4 5 */\r
- addr->addr[2], addr->addr[1], addr->addr[0]); /* mac챐 0 1 2 3 4 5 */\r
++ addr->addr[5], addr->addr[4], addr->addr[3], /* mac챐 0 1 2 3 4 5 */\r
++ addr->addr[2], addr->addr[1], addr->addr[0]); /* mac챐 0 1 2 3 4 5 */\r
+ (void)memcpy_s(lastConnedAddr.addr, BD_ADDR_LEN, addr->addr, BD_ADDR_LEN);\r
+ }\r
+ \r
+ bd_addr_t *BluetoothModel::GetLastConnedAddr(void)\r
+ {\r
+ return &lastConnedAddr;\r
+ }\r
+ \r
+ void BluetoothModel::SetConnectionView(BluetoothItemView *item)\r
+ {\r
+ selectItemView = item;\r
+ }\r
+ \r
+ BluetoothItemView *BluetoothModel::GetConnectionView()\r
+ {\r
+ return selectItemView;\r
+ }\r
+ \r
+ \r
+ void BluetoothModel::SetTagReconnectJump(bool tag)\r
+ {\r
+ tagReconnectJump = tag;\r
+ }\r
+ \r
+ bool BluetoothModel::GetTagReconnectJump(void)\r
+ {\r
+ return tagReconnectJump;\r
+ }\r
+ \r
+ void BluetoothModel::SetCurView(int16_t viewNum)\r
+ {\r
+ curView = viewNum;\r
+ }\r
+ \r
+ int BluetoothModel::GetCurView(void)\r
+ {\r
+ return curView;\r
+ }\r
+ \r
+ void BluetoothModel::SetTagConnectView(bool tag)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BluetoothModel::SetTagConnectView:%d", tag);\r
+ tagConnectView = tag;\r
+ }\r
+ \r
+ // 判断是否需要跳转连接成功\失败界面(已退出蓝牙模块)\r
+ bool BluetoothModel::IsTagConnectView(void)\r
+ {\r
+ return tagConnectView;\r
+ }\r
+ \r
+ void BluetoothModel::SetTagDisconnectView(bool tag)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BluetoothModel::SetTagDisconnectView:%d", tag);\r
+ tagDisconnectView = tag;\r
+ }\r
+ \r
+ // 判断是否需要跳转连接失败界面\r
+ bool BluetoothModel::IsTagDisconnectView(void)\r
+ {\r
+ return tagDisconnectView;\r
+ }\r
+ \r
+ void BluetoothModel::SetTagConnectNew(bool tag)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BluetoothModel::SetTagConnectNew:%d", tag);\r
+ tagConnectNew = tag;\r
+ }\r
+ \r
+ void BluetoothModel::SetTagReturnToDeviceListView(bool tag)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BluetoothModel::SetTagReturnToDeviceListView:%d", tag);\r
+ tagReturnToDeviceListView = tag;\r
+ }\r
+ \r
+ bool BluetoothModel::IsTagReturnToDeviceListView(void)\r
+ {\r
+ return tagReturnToDeviceListView;\r
+ }\r
+ \r
+ // 判断断开连接时是否需要马上连接新设备\r
+ bool BluetoothModel::IsTagConnectNew(void)\r
+ {\r
+ return tagConnectNew;\r
+ }\r
+ \r
+ void BluetoothModel::SetTagScanDeviceClicked(bool tag)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BluetoothModel::SetTagScanDeviceClicked:%d", tag);\r
+ tagScanDeviceClicked = tag;\r
+ }\r
+ \r
+ // 判断是否已点击设备请求连接\r
+ bool BluetoothModel::IsTagScanDeviceClicked(void)\r
+ {\r
+ return tagScanDeviceClicked;\r
+ }\r
+ \r
+ bool BluetoothModel::CheckExistConnedList(BluetoothCaseInfo caseInfo)\r
+ {\r
+ ListNode<BluetoothCaseInfo> *node = btConnedDevicesList_ ->Begin();\r
+ if (node == nullptr) {\r
+ return false;\r
+ } else if ((caseInfo.addr[0] == 0) && (caseInfo.addr[1] == 0)\r
+ && (caseInfo.addr[2] == 0) && (caseInfo.addr[3] == 0)\r
+ && (caseInfo.addr[4] == 0) && (caseInfo.addr[5] == 0)) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CheckExistConnedList false addr: 000000000000");\r
+ return true;\r
+ }\r
+ while (node != btConnedDevicesList_ ->End()) {\r
+ if ((caseInfo.addr[0] == node->data_.addr[0]) && (caseInfo.addr[1] == node->data_.addr[1])\r
+ && (caseInfo.addr[2] == node->data_.addr[2]) && (caseInfo.addr[3] == node->data_.addr[3])\r
+ && (caseInfo.addr[4] == node->data_.addr[4]) && (caseInfo.addr[5] == node->data_.addr[5])) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CheckExistConnedList true");\r
+ return true;\r
+ }\r
+ node = node->next_;\r
+ }\r
+ return false;\r
+ }\r
+ \r
+ bool BluetoothModel::FindNameByAddr(BluetoothCaseInfo &listInfo, BluetoothCaseInfo *caseInfo)\r
+ {\r
+ if ((listInfo.addr[0] == caseInfo->addr[0]) && (listInfo.addr[1] == caseInfo->addr[1]) &&\r
+ (listInfo.addr[2] == caseInfo->addr[2]) && (listInfo.addr[3] == caseInfo->addr[3]) &&\r
+ (listInfo.addr[4] == caseInfo->addr[4]) && (listInfo.addr[5] == caseInfo->addr[5])) {\r
+ (void)memcpy_s(caseInfo->deviceName, BD_NAME_LEN, listInfo.deviceName, BD_NAME_LEN);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FindNameFromList success, deviceName:%s", listInfo.deviceName);\r
+ return true;\r
+ } else {\r
+ return false;\r
+ }\r
+ }\r
+ \r
+ bool BluetoothModel::FindNameFromList(BluetoothCaseInfo *caseInfo)\r
+ {\r
+ ListNode<BluetoothCaseInfo> *node = btConnedDevicesList_->Begin();\r
+ if (!btScansDevicesList_.empty()) {\r
+ for (auto it = btScansDevicesList_.begin(); it != btScansDevicesList_.end(); it++) {\r
+ if (FindNameByAddr(*it, caseInfo)) {\r
+ return true;\r
+ }\r
+ }\r
+ }\r
+ if (node != nullptr) {\r
+ while (node != btConnedDevicesList_->End()) {\r
+ if (FindNameByAddr(node->data_, caseInfo)) {\r
+ return true;\r
+ }\r
+ node = node->next_;\r
+ }\r
+ }\r
+ return false;\r
+ }\r
+ \r
+ bool BluetoothModel::GetBluetoothAclState(void)\r
+ {\r
+ if ((lastConnedAddr.addr[0] == 0) && (lastConnedAddr.addr[1] == 0) &&\r
+ (lastConnedAddr.addr[2] == 0) && (lastConnedAddr.addr[3] == 0) &&\r
+ (lastConnedAddr.addr[4] == 0) && (lastConnedAddr.addr[5] == 0)) {\r
+ return false;\r
+ } else {\r
+ return bt_is_acl_connected(&lastConnedAddr);\r
+ }\r
+ }\r
+ \r
+ bool BluetoothModel::GetAdvStartState(void)\r
+ {\r
+ return advStartState;\r
+ }\r
+ void BluetoothModel::SetAdvStartState(bool state)\r
+ {\r
+ advStartState = state;\r
+ }\r
+ \r
-int BluetoothModel::ConnectRemoteDevice(const bd_addr_t *addr)\r
-{\r
- errcode_t retVal = gap_connect_remote_device(addr);\r
- (void)memcpy_s(&remoteConnectAddr, sizeof(bd_addr_t), addr, sizeof(bd_addr_t));\r
- return retVal;\r
-}\r
-\r
-bool BluetoothModel::ConnectRemoteCheck(const bd_addr_t *addr)\r
-{\r
- bool ret;\r
- if ((remoteConnectAddr.addr[0] == addr->addr[0]) && (remoteConnectAddr.addr[1] == addr->addr[1]) &&\r
- (remoteConnectAddr.addr[2] == addr->addr[2]) && (remoteConnectAddr.addr[3] == addr->addr[3]) &&\r
- (remoteConnectAddr.addr[4] == addr->addr[4]) && (remoteConnectAddr.addr[5] == addr->addr[5])) {\r
- ret = true;\r
- (void)memset_s(&remoteConnectAddr, sizeof(bd_addr_t), 0, sizeof(bd_addr_t));\r
- } else {\r
- ret = false;\r
- }\r
- return ret;\r
-}\r
-\r
+ #ifdef __cplusplus\r
+ extern "C" {\r
+ #endif\r
+ \r
+ // 回调: gap_read_remote_rssi_value 接口的数据上报\r
+ void BtGapReadRemoteRssiEventCallback(const bd_addr_t *bdAddr, int rssi, int status)\r
+ {\r
+ UNUSED(status);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BtGapReadRemoteRssiEventCallback addr: %02x%02x%02x%02x%02x%02x",\r
+ bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* mac下标 0 1 2 3 4 5 */\r
+ bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0]); /* mac下标 0 1 2 3 4 5 */\r
+ BluetoothModel::GetInstance()->SetScansCaseRssi(bdAddr, rssi);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "bt BtGapReadRemoteRssiEventCallback SetSortCaseRssi: %d status: %d", rssi, status);\r
+ }\r
+ \r
+ // 回调:发现状态变化上报/扫描结束\r
+ void BtGapDiscoveryStateChangedCallback(int status)\r
+ {\r
+ UNUSED(status);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "bt BtGapDiscoveryStateChangedCallback %d", status);\r
+ }\r
+ \r
+ static void ChangeScanView()\r
+ {\r
+ BluetoothEarPhoneView *bluetoothEarPhoneView = BluetoothEarPhoneView::GetInstance();\r
+ if (bluetoothEarPhoneView == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetoothEarPhoneView nullptr");\r
+ return;\r
+ }\r
+ bluetoothEarPhoneView->setScanStatus(false);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Bt scan one jumpView");\r
+ if (BluetoothModel::GetInstance()->GetBluetoothCalleridStatus() == CALLERPLAYERS) {\r
+ JumpView *jumpView = JumpView::GetInstance();\r
+ if (jumpView == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jumpView GetInstance fail");\r
+ return;\r
+ }\r
+ jumpView->ChangeView(JumpView::BluetoothJumpViewNum::BLUETOOTHEARPHONEVIEW,\r
+ JumpView::BluetoothJumpViewNum::BLUETOOTHEARLISTVIEW);\r
+ } else if (BluetoothModel::GetInstance()->GetBluetoothCalleridStatus() == CALLERSETTING) {\r
+ MainBluetoothView *mainBluetoothView = MainBluetoothView::GetInstance();\r
+ if (mainBluetoothView == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "mainBluetoothView GetInstance fail");\r
+ return;\r
+ }\r
+ mainBluetoothView->ChangeView(BLUETOOTHEARPHONEVIEW, BLUETOOTHEARLISTVIEW);\r
+ }\r
+ // 暂停动画\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BtAnimatorStop bk");\r
+ bluetoothEarPhoneView->BtAnimatorStop();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BtAnimatorStop");\r
+ }\r
+ \r
+ void BluetoothModel::BtGapDiscoveryResultCallbakHandle(const bd_addr_t &bdAddr)\r
+ {\r
+ BluetoothCaseInfo caseInfo{};\r
+ (void)memcpy_s(caseInfo.addr, BD_ADDR_LEN, bdAddr.addr, BD_ADDR_LEN);\r
+ \r
+ unsigned char nameLen = BD_NAME_LEN;\r
+ bool getNameRet = gap_get_device_name(&bdAddr, caseInfo.deviceName, &nameLen);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "gap_discovery_result_callback getNameRet(bool): %d nameLen: %d name:%s",\r
- getNameRet, nameLen, caseInfo.deviceName);\r
++ getNameRet, nameLen, caseInfo.deviceName);\r
+ \r
+ if (nameLen == 0) { // 过滤未扫描到名字的设备\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "nameLen == 0 return");\r
+ return;\r
+ }\r
+ // 去重操作\r
+ bool tag = BluetoothModel::GetInstance()->CheckExistScanList(caseInfo);\r
+ if (!tag) {\r
+ BluetoothModel::GetInstance()->AddCase(caseInfo); // 增加扫描设备信息\r
+ }\r
+ bool ret = gap_read_remote_rssi_value(&bdAddr); // 获取rssi\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "gap_read_remote_rssi_value ret = %d", ret);\r
+ BluetoothEarPhoneView *bluetoothEarPhoneView = BluetoothEarPhoneView::GetInstance();\r
+ if (bluetoothEarPhoneView == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetoothEarPhoneView nullptr");\r
+ return;\r
+ }\r
+ tag = bluetoothEarPhoneView->getScanStatus();\r
- if (tag) { // 跳转\r
++ if (tag == true) { // 跳转\r
+ ChangeScanView();\r
+ } else {\r
+ BluetoothEarListView *bluetoothEarListView = BluetoothEarListView::GetInstance();\r
+ if (bluetoothEarListView == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bluetoothEarListView nullptr");\r
+ return;\r
+ }\r
+ if (bluetoothEarListView->GetScanUIList() == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetScanUIList nullptr");\r
+ return;\r
+ } // 刷新\r
+ bluetoothEarListView->GetScanUIList()->RefreshList();\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "bt BtGapDiscoveryResultCallback end");\r
+ }\r
+ \r
+ void BtGapPairStatusChangedCallback(const bd_addr_t *bdAddr, int status)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BtGapPairStatusChangedCallback addr: ****%02x%02x%02x%02x status: %d\n",\r
+ bdAddr->addr[3], bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0], status); /* addr下标 0 1 2 3 */\r
+ if (status == GAP_PAIR_PAIRED) {\r
+ if (ConnectPhonePresenter::GetInstance() != nullptr) {\r
+ NativeAbility::GetInstance().ChangeSlice(VIEW_SETTING);\r
+ }\r
+ }\r
+ }\r
+ \r
+ void BtGapPairRequestedCallback(const bd_addr_t *bdAddr)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BtGapPairRequestedCallback addr: ****%02x%02x%02x%02x\n",\r
+ bdAddr->addr[3], bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0]); /* addr下标 0 1 2 3 */\r
+ }\r
+ \r
+ void BtGapPairConfirmedCallback(const bd_addr_t *bdAddr, int req_type, int number)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BtGapPairConfirmedCallback addr: ****%02x%02x%02x%02x req_type: %d number: %d\n",\r
+ bdAddr->addr[3], bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0], /* addr下标 0 1 2 3 */\r
+ req_type, number);\r
+ }\r
+ \r
+ // 回调:扫描结果处理/发现结果上报\r
+ void BtGapDiscoveryResultCallback(const bd_addr_t *bdAddr)\r
+ {\r
+ if ((gap_get_device_class(bdAddr) & 0x200) != 0) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BtGapDiscoveryResultCallback: Mobile Phone Device");\r
+ return;\r
+ }\r
+ \r
+ if (bdAddr == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "addr nullptr");\r
+ return;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "gap_discovery_result_callback addr: %02x%02x%02x%02x%02x%02x",\r
+ bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* mac下标 0 1 2 3 4 5 */\r
+ bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0]); /* mac下标 0 1 2 3 4 5 */\r
+ GraphicService::GetInstance()->PostGraphicEvent(std::bind(&BluetoothModel::BtGapDiscoveryResultCallbakHandle,\r
+ BluetoothModel::GetInstance(), *bdAddr));\r
+ }\r
+ \r
++\r
++\r
+ void HandleBeforeChangeView()\r
+ {\r
+ int curView = BluetoothModel::GetInstance()->GetCurView();\r
+ if (curView == BLUETOOTHEARPHONEVIEW) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HandleBeforeChangeView curView == BLUETOOTHEARPHONEVIEW");\r
+ BluetoothEarPhoneView *bluetoothEarPhoneView = BluetoothEarPhoneView::GetInstance();\r
+ if (bluetoothEarPhoneView == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HandleBeforeChangeView bluetoothEarPhoneView == nullptr");\r
+ return;\r
+ }\r
+ bluetoothEarPhoneView->BtAnimatorStop();\r
+ bluetoothEarPhoneView->StopBtDiscovery();\r
+ } else if (curView == BLUETOOTHEARLISTVIEW) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HandleBeforeChangeView curView == BLUETOOTHEARLISTVIEW");\r
+ BluetoothEarPhoneView *bluetoothEarPhone = BluetoothEarPhoneView::GetInstance();\r
+ if (bluetoothEarPhone == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HandleBeforeChangeView bluetoothEarPhoneView == nullptr");\r
+ return;\r
+ }\r
+ bluetoothEarPhone->StopBtDiscovery();\r
+ BluetoothItemView *pbItermView = BluetoothModel::GetInstance()->GetConnectionView();\r
+ if (pbItermView == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HandleBeforeChangeView The GetConnectionView get failed.");\r
+ return;\r
+ }\r
+ pbItermView->ConnectAnimatorStop();\r
+ BluetoothModel::GetInstance()->SetConnectionView(nullptr);\r
+ } else if (curView == BLUETOOTHRECONNECTVIEW) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HandleBeforeChangeView curView == BLUETOOTHRECONNECTVIEW");\r
+ BluetoothReconnectView *bluetoothReconnectView = BluetoothReconnectView::GetInstance();\r
+ if (bluetoothReconnectView == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HandleBeforeChangeView bluetoothReconnectView == nullptr");\r
+ return;\r
+ }\r
+ bluetoothReconnectView->BtReconnectStop();\r
+ }\r
+ }\r
+ \r
+ static void ACLConnectionSuss(const bd_addr_t &bdAddr)\r
+ {\r
+ // 判断是否已退出蓝牙模块(无需跳转)\r
+ bool tagConnectView = BluetoothModel::GetInstance()->IsTagConnectView();\r
+ if (tagConnectView == false) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GapAclStateChangedCallback tagConnectView == false");\r
+ return;\r
+ }\r
+ // 成功提示\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GAP_ACL_STATE_CONNECTED");\r
+ HandleBeforeChangeView();\r
+ if (BluetoothModel::GetInstance()->GetBluetoothCalleridStatus() == CALLERPLAYERS) {\r
+ JumpView *jumpView = JumpView::GetInstance();\r
+ if (jumpView == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jumpView GetInstance fail");\r
+ return;\r
+ }\r
+ jumpView->ChangeView(BluetoothModel::GetInstance()->GetCurView(),\r
+ JumpView::BluetoothJumpViewNum::TIPSSUCCMESSAGEVIEW);\r
+ } else if (BluetoothModel::GetInstance()->GetBluetoothCalleridStatus() == CALLERSETTING) {\r
+ MainBluetoothView *mainBluetoothView = MainBluetoothView::GetInstance();\r
+ if (mainBluetoothView == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "mainBluetoothView GetInstance fail");\r
+ return;\r
+ }\r
+ mainBluetoothView->ChangeView(BluetoothModel::GetInstance()->GetCurView(), TIPSSUCCMESSAGEVIEW);\r
+ }\r
+ TipsSuccMessageView *tipsSuccMessageView = TipsSuccMessageView::GetInstance();\r
+ if (tipsSuccMessageView == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ACLConnectionSuss tipsSuccMessageView GetInstance fail");\r
+ return;\r
+ }\r
+ tipsSuccMessageView->RefreshNameLabel(bdAddr);\r
+ }\r
+ \r
+ static void ACLConnectionFail(const bd_addr_t &bdAddr)\r
+ {\r
+ // 判断是否已退出蓝牙模块(无需跳转)\r
+ bool tagConnectView = BluetoothModel::GetInstance()->IsTagConnectView();\r
+ // 判断是否无需跳转到失败界面\r
+ bool tagDisconnectView = BluetoothModel::GetInstance()->IsTagDisconnectView();\r
+ if (tagConnectView == false || tagDisconnectView == false) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GapAclStateChangedCallback tagDisconnectView == false");\r
+ return;\r
+ }\r
+ // 失败提示页\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "conn fail");\r
+ HandleBeforeChangeView();\r
+ if (BluetoothModel::GetInstance()->GetBluetoothCalleridStatus() == CALLERPLAYERS) {\r
+ JumpView *jumpView = JumpView::GetInstance();\r
+ if (jumpView == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jumpView GetInstance fail");\r
+ return;\r
+ }\r
+ jumpView->ChangeView(BluetoothModel::GetInstance()->GetCurView(),\r
+ JumpView::BluetoothJumpViewNum::TIPSCONNFAILMESSAGEVIEW);\r
+ } else if (BluetoothModel::GetInstance()->GetBluetoothCalleridStatus() == CALLERSETTING) {\r
+ MainBluetoothView *mainBluetoothView = MainBluetoothView::GetInstance();\r
+ if (mainBluetoothView == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "mainBluetoothView GetInstance fail");\r
+ return;\r
+ }\r
+ mainBluetoothView->ChangeView(BluetoothModel::GetInstance()->GetCurView(), TIPSCONNFAILMESSAGEVIEW);\r
+ }\r
+ TipsConnFailMessageView *tipsConnFailMessageView = TipsConnFailMessageView::GetInstance();\r
+ if (tipsConnFailMessageView == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ACLConnectionFail tipsConnFailMessageView GetInstance fail");\r
+ return;\r
+ }\r
+ tipsConnFailMessageView->RefreshNameLabel(bdAddr);\r
+ }\r
+ \r
+ static void DisconnectBluetoothPause()\r
+ {\r
+ int64_t playerCurrentTime;\r
+ int64_t playerMusicDuration;\r
+ int64_t playerProgressVlaue;\r
+ if (PlayersModel::GetInstance()->GetPlayerCtr() == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AclStateChangedCallback GetPlayerCtr() == nullptr");\r
+ return;\r
+ }\r
+ PlayersModel::GetInstance()->GetPlayerCtr()->Pause();\r
+ PlayersModel::GetInstance()->SetPlayButtonState(false);\r
+ PlayersModel::GetInstance()->GetPlayerCtr()->GetCurrentTime(playerCurrentTime);\r
+ PlayersModel::GetInstance()->GetPlayerCtr()->GetDuration(playerMusicDuration);\r
+ if (playerMusicDuration == 0) { // 0:除数保护\r
+ playerProgressVlaue = 100; // 100:进度条系数\r
+ } else {\r
+ playerProgressVlaue = (playerCurrentTime * 100) / playerMusicDuration; // 100:百分比系数\r
+ }\r
+ PlayersModel::GetInstance()->SetCircleProgress(playerProgressVlaue);\r
+ PlayersView *playersView = PlayersView::GetInstance();\r
+ if (playersView != nullptr) {\r
+ playersView->SetPlayerButtonState(UICheckBox::UICheckBoxState::UNSELECTED);\r
+ if (playersView->GetPlaybackProgress() == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AclStateChangedCallback playersView->GetPlaybackProgress() == nullptr");\r
+ return;\r
+ }\r
+ playersView->GetPlaybackProgress()->SetValue(playerProgressVlaue);\r
+ }\r
+ }\r
+ \r
+ static void DisconnectedHandle()\r
+ {\r
+ DisconnectBluetoothPause();\r
+ BluetoothModel::GetInstance()->SetTagDisconnectView(false);\r
+ BluetoothDeviceListView *bluetoothDeviceListView = BluetoothDeviceListView::GetInstance();\r
+ if (bluetoothDeviceListView == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AclStateChangedCallback bluetoothDeviceListView == nullptr");\r
+ return;\r
+ }\r
+ UIList *deviceList = bluetoothDeviceListView->GetDeviceUIList();\r
+ if (deviceList == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DisconnectedHandle deviceList nullptr");\r
+ return;\r
+ }\r
+ deviceList->RefreshList();\r
+ BluetoothOptionsView *bluetoothOptionsView = BluetoothOptionsView::GetInstance();\r
+ if (bluetoothOptionsView == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AclStateChangedCallback bluetoothOptionsView == nullptr");\r
+ return;\r
+ }\r
+ bluetoothOptionsView->RefreshText();\r
+ }\r
+ \r
+ void BluetoothModel::BtGapAclStateChangedHandle(gap_acl_state_t state, unsigned int reason, const bd_addr_t &bdAddr)\r
+ {\r
+ if ((state == GAP_ACL_STATE_CONNECTED) || (state == GAP_ACL_STATE_LE_CONNECTED)) {\r
+ SendMsgToUIService(BT_CONNECTED_TO_UI, 0, NULL, 0);\r
+ } else {\r
+ SendMsgToUIService(BT_DISCONNECTED_TO_UI, 0, NULL, 0);\r
+ }\r
+ \r
+ bool tag = BluetoothModel::GetInstance()->IsTagScanDeviceClicked();\r
+ if ((reason == 0x13) || (reason == 0x14) || (reason == 0x15) || (reason == 0x3D) || (reason == 0x08 && tag == false)) { // 连接断开\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "The peer end is disconnected.");\r
+ DisconnectedHandle();\r
+ } else if (reason == 0x16) { // 主动断开连接\r
+ DisconnectedHandle();\r
+ BluetoothCaseInfo *onClickBtCaseInfo = BluetoothModel::GetInstance()->GetTempMacValue();\r
- if (BluetoothModel::GetInstance()->IsTagConnectNew()) {\r
- errcode_t retVal = ConnectRemoteDevice((const bd_addr_t *)&onClickBtCaseInfo->addr);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ConnectRemoteDevice retVal = %d", retVal);\r
++ bool ret = BluetoothModel::GetInstance()->IsTagConnectNew();\r
++ if (ret == true) {\r
++ ret = gap_connect_remote_device((const bd_addr_t *)&onClickBtCaseInfo->addr);\r
++ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "gap_connect_remote_device ret = %d", ret);\r
+ }\r
+ } else if ((reason == 0xb) || (reason > 0x45)) { // 0xb:重复点击连接按钮 0x45:acl状态最大参数\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "reason is false.");\r
+ SetTagDisconnectView(false);\r
+ }\r
+ \r
+ BluetoothCaseInfo *onClickBtCaseInfo = GetTempMacValue();\r
+ \r
+ if ((state == GAP_ACL_STATE_CONNECTED) || (state == GAP_ACL_STATE_LE_CONNECTED)) {\r
+ SetLastConnedAddr(&bdAddr);\r
+ // 将数据存入设备列表\r
+ bool tag = CheckExistConnedList(*onClickBtCaseInfo);\r
+ if (!tag) {\r
+ AddConnedDevicesCase(*onClickBtCaseInfo);\r
+ }\r
+ ACLConnectionSuss(bdAddr);\r
++ bool retA2dp = a2dp_src_connect(&bdAddr);\r
++ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "a2dp_src_connect result %d", retA2dp);\r
+ } else {\r
+ ACLConnectionFail(bdAddr);\r
+ }\r
-\r
- if ((state == GAP_ACL_STATE_CONNECTED) || (state == GAP_ACL_STATE_LE_CONNECTED)) {\r
- if (BluetoothModel::GetInstance()->ConnectRemoteCheck(&bdAddr)) {\r
- bool retA2dp = a2dp_src_connect(&bdAddr);\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "a2dp_src_connect result %d", retA2dp);\r
- } else {\r
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ingore a2dp_src_connect");\r
- }\r
- }\r
+ }\r
+ \r
+ // 回调:ACL连接状态上报\r
+ void GapAclStateChangedCallback(const bd_addr_t *bdAddr, gap_acl_state_t state, unsigned int reason)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "bt GapAclStateChangedCallback state %d, reason %x succ or err", state, reason);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "addr: %02x%02x%02x%02x%02x%02x",\r
+ bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* mac下标 0 1 2 3 4 5 */\r
+ bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0]); /* mac下标 0 1 2 3 4 5 */\r
+ if ((gap_get_device_class(bdAddr) & 0x200) != 0) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GapAclStateChangedCallback: Mobile Phone Device");\r
+ return;\r
+ }\r
+ GraphicService::GetInstance()->PostGraphicEvent(std::bind(&BluetoothModel::BtGapAclStateChangedHandle,\r
- BluetoothModel::GetInstance(), state, reason, *bdAddr));\r
++ BluetoothModel::GetInstance(), state, reason, *bdAddr));\r
+ }\r
+ \r
+ // 回调:远端设备名称变化\r
+ void BtRemoteNameChangedCallback(const bd_addr_t *bdAddr, const unsigned char *deviceName, unsigned char length)\r
+ {\r
+ if ((gap_get_device_class(bdAddr) & 0x200) != 0) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BtRemoteNameChangedCallback: Mobile Phone Device");\r
+ return;\r
+ }\r
+ BluetoothCaseInfo caseInfo{};\r
+ if (bdAddr == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BtRemoteNameChangedCallback addr nullptr");\r
+ return;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BtRemoteNameChangedCallback addr: %02x%02x%02x%02x%02x%02x",\r
- bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* mac下标 0 1 2 3 4 5 */\r
- bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0]); /* mac下标 0 1 2 3 4 5 */\r
++ bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* mac下标 0 1 2 3 4 5 */\r
++ bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0]); /* mac下标 0 1 2 3 4 5 */\r
+ \r
+ (void)memcpy_s(caseInfo.addr, BD_ADDR_LEN, bdAddr->addr, BD_ADDR_LEN);\r
+ int ret = memcpy_s(caseInfo.deviceName, BD_NAME_LEN, deviceName, length);\r
+ if (ret != EOK) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BtRemoteNameChangedCallback memcpy fail!");\r
+ return;\r
+ }\r
+ BluetoothModel::GetInstance()->ResetScanDevicesCase(caseInfo);\r
+ }\r
+ \r
+ void BtIsAcceptConnOnSafeModeCallback(const bd_addr_t *bdAddr, bool *res)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BtIsAcceptConnOnSafeModeCallback addr: %02x%02x%02x%02x%02x%02x set *res true",\r
+ bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* addr下标 3 4 5 */\r
+ bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0]); /* addr下标 0 1 2 */\r
+ *res = true;\r
+ }\r
+ \r
+ static void A2dpSrcConnectstateChanged(bd_addr_t *bdAddr, int connState)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "a2dp_src_connectStateChangedCallback addr: %02x%02x%02x%02x%02x%02x connState: %x",\r
+ bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* 5 4 3 idx */\r
+ bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0], connState); /* 2 1 0 idx */\r
+ if ((gap_get_device_class(bdAddr) & 0x200) != 0) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "a2dp_src_connectstateChangedCb: Mobile Phone Device");\r
+ return;\r
+ }\r
+ if (connState == PROFILE_STATE_CONNECTED) {\r
+ avrcp_ct_connect(bdAddr);\r
+ PhoneAudioManagerSetDeviceConnState(OUT_BLUETOOTH_A2DP, AUDIO_DEVICE_CONNECTED);\r
+ }\r
+ \r
+ if (connState == PROFILE_STATE_DISCONNECTED) {\r
+ PhoneAudioManagerSetDeviceConnState(OUT_BLUETOOTH_A2DP, AUDIO_DEVICE_DISCONNECTED);\r
+ }\r
+ }\r
+ \r
+ static void A2dpSrcPlayingStateChanged(bd_addr_t *bdAddr, int playState)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "A2dpSrcPlayingStateChangedCallback addr: %02x%02x%02x%02x%02x%02x playState: %x",\r
+ bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* 5 4 3 idx */\r
+ bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0], playState); /* 2 1 0 idx */\r
+ }\r
+ \r
+ static void A2dpSrcConfigureChanged(bd_addr_t *bdAddr, a2dp_codec_info_t *info)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "A2dpSrcConfigurationChangedCallback addr: %02x%02x%02x%02x%02x%02x ",\r
+ bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* 5 4 3 idx */\r
+ bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0]); /* 2 1 0 idx */\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "codec_priority: %04x codec_type: %04x sample_rate: %02x bits_per_sample: %02x channel_mode: %02x ",\r
+ info->codec_priority, info->codec_type, info->sample_rate, info->bits_per_sample, info->channel_mode);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "codec_specific1: %04x codec_specific2: %04x codec_specific3: %04x codec_specific4: %04x",\r
+ info->codec_specific1, info->codec_specific2, info->codec_specific3, info->codec_specific4);\r
+ }\r
+ \r
+ static void BleConnStateChangeCallback(unsigned short connId, bd_addr_t *addr, gap_ble_conn_state_t connState,\r
- gap_ble_pair_state_t pairState, gap_ble_disc_reason_t discReason)\r
++ gap_ble_pair_state_t pairState, gap_ble_disc_reason_t discReason)\r
+ {\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BleConnStateChangeCallback connId 0x%x, connState 0x%x, pairState 0x%x",\r
- connId, connState, pairState);\r
- if (GAP_BLE_STATE_DISCONNECTED == connState) { // restart ble adv when disconnected\r
++ connId, connState, pairState);\r
++ if (GAP_BLE_STATE_DISCONNECTED == connState) { // restart ble adv when disconnected \r
+ BleAdvStart();\r
+ } else {\r
+ BluetoothModel::GetInstance()->SetAdvStartState(false);\r
+ }\r
+ }\r
+ \r
+ static void BleAdvStartCallback(uint8_t advId, adv_status_t status)\r
+ {\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BleAdvStartCallback advId: %d, status:%d\n", advId, status);\r
+ BluetoothModel::GetInstance()->SetAdvStartState(true);\r
+ }\r
+ \r
+ static void BleAdvStopCallback(uint8_t advId, adv_status_t status)\r
+ {\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BleAdvStopCallback advId: %d, status:%d\n", advId, status);\r
+ }\r
+ \r
+ static void BtGattsServiceAddCallback(uint8_t serverId, bt_uuid_t *uuid, uint16_t srvcHandle, errcode_t status)\r
+ {\r
+ int ret;\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BtGattsServiceAddCallback 0x%x 0x%x 0x%x",\r
+ status, serverId, srvcHandle);\r
+ \r
+ if ((uuid->uuid_len == sizeof(uint16_t)) && (*((uint16_t*)uuid->uuid) == 0x1FF0)) {\r
+ uint16_t id = 0x1FF1;\r
+ gatts_add_chara_info_t character;\r
+ uint16_t value = 0;\r
+ \r
+ memset_s(&character, sizeof(gatts_add_chara_info_t), 0, sizeof(gatts_add_chara_info_t));\r
+ character.chara_uuid.uuid_len = sizeof(id);\r
+ memcpy_s(character.chara_uuid.uuid, sizeof(character.chara_uuid.uuid), (char *)&id, sizeof(id));\r
+ character.permissions = GATT_ATTRIBUTE_PERMISSION_WRITE;\r
+ character.properties = GATT_CHARACTER_PROPERTY_BIT_WRITE;\r
+ character.value_len = (uint16_t)sizeof(value);\r
+ character.value = (uint8_t *)(&value);\r
+ \r
+ ret = gatts_add_characteristic(serverId, srvcHandle, &character);\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gatts_add_characteristic ret 0x%x", ret);\r
+ }\r
++\r
+ }\r
+ \r
+ static void BtGattsCharacteristicAddCallback(uint8_t serverId, bt_uuid_t *uuid, uint16_t srvcHandle, gatts_add_character_result_t *result, errcode_t status)\r
+ {\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BtGattsCharacteristicAddCallback 0x%x 0x%x 0x%x",\r
+ status, serverId, srvcHandle);\r
+ \r
+ if ((uuid->uuid_len == sizeof(uint16_t)) && (*((uint16_t*)uuid->uuid) == 0x1FF1)) {\r
+ int ret = gatts_start_service(serverId, srvcHandle);\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gatts_start_service ret 0x%x", ret);\r
+ }\r
+ }\r
+ \r
+ static void BtGattsDescriptorAddCallback(uint8_t serverId, bt_uuid_t *uuid, uint16_t srvcHandle, uint16_t descriptorHandle, errcode_t status)\r
+ {\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BtGattsDescriptorAddCallback 0x%x 0x%x 0x%x 0x%x",\r
+ status, serverId, srvcHandle, descriptorHandle);\r
+ }\r
+ \r
+ static void BtGattsServiceStartCallback(uint8_t serverId, uint16_t srvcHandle, errcode_t status)\r
+ {\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BtGattsServiceStartCallback 0x%x 0x%x 0x%x", status, serverId, srvcHandle);\r
+ }\r
+ \r
+ static void BtGattsServiceStopCallback(uint8_t serverId, uint16_t srvcHandle, errcode_t status)\r
+ {\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BtGattsServiceStopCallback 0x%x 0x%x 0x%x", status, serverId, srvcHandle);\r
+ }\r
+ \r
+ static void BtGattsServiceDeleteCallback(uint8_t serverId, errcode_t status)\r
+ {\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BtGattsServiceDeleteCallback 0x%x 0x%x", status, serverId);\r
+ }\r
+ \r
+ static void BtGattsRequestReadCallback(uint8_t serverId, uint16_t connId, gatts_req_read_cb_t *readCbPara, errcode_t status)\r
+ {\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BtGattsRequestReadCallback");\r
+ }\r
+ \r
+ static void BtGattsRequestWriteCallback(uint8_t serverId, uint16_t connId, gatts_req_write_cb_t *writeCbPara, errcode_t status)\r
+ {\r
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BtGattsRequestWriteCallback");\r
-}\r
-\r
-static void BtA2dpSnkAcceptTimerStop(void)\r
-{\r
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "stop timer\n");\r
- if (g_a2dp_stream_accept_timer.timer != NULL) {\r
- (void)osal_timer_stop(&g_a2dp_stream_accept_timer);\r
- (void)osal_timer_destroy(&g_a2dp_stream_accept_timer);\r
- g_a2dp_stream_accept_timer.timer = NULL;\r
- }\r
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "stop timer success!\n");\r
-}\r
-\r
-static void BtA2dpSnStartAcceptHandler(unsigned long data)\r
-{\r
- UNUSED(data);\r
- bd_addr_t active_bd_addr = a2dp_snk_get_active_device();\r
- a2dp_snk_start_accept(&active_bd_addr);\r
- BtA2dpSnkAcceptTimerStop();\r
-}\r
-\r
-static errcode_t BtA2dpSnkStartAcceptTimer(void)\r
-{\r
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "start timer\n");\r
- if (g_a2dp_stream_accept_timer.timer != NULL) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "timer is running");\r
- return ERRCODE_SUCC;\r
- }\r
-\r
- g_a2dp_stream_accept_timer.handler = BtA2dpSnStartAcceptHandler;\r
- g_a2dp_stream_accept_timer.interval = A2DP_STREAM_ACCEPT_TIMER_PERIOD;\r
-\r
- int32_t timer_ret = osal_timer_init(&g_a2dp_stream_accept_timer);\r
- if (timer_ret != EOK) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "create timer error! ret: %x\n", timer_ret);\r
- BtA2dpSnkAcceptTimerStop();\r
- return ERRCODE_FAIL;\r
- }\r
- timer_ret = osal_timer_start(&g_a2dp_stream_accept_timer);\r
- if (timer_ret != EOK) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "start timer error! ret: %x\n", timer_ret);\r
- BtA2dpSnkAcceptTimerStop();\r
- return ERRCODE_FAIL;\r
- }\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-static int32_t BtA2dpSnkAudioCreate()\r
-{\r
-#if MEDIA_A2DP_SNK_INTERFACE\r
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "audioFormat %d channelCount %d sampleRate %d \n",\r
- g_audio_format_config.audioFormat, g_audio_format_config.channelCount, g_audio_format_config.sampleRate);\r
-\r
- int32_t ret = AudioManagerA2dpSinkSetParam(g_audio_format_config);\r
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "AudioManagerA2dpSinkSetParam ret %x\n", ret);\r
- ret = AudioManagerA2dpSinkCreate();\r
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "AudioManagerA2dpSinkCreate ret %x\n", ret);\r
-#endif\r
- /* 起定时器接受音乐开始请求 */\r
- (void)BtA2dpSnkStartAcceptTimer();\r
- return 0;\r
-}\r
-\r
-static int32_t BtA2dpSnkAudioDestroy()\r
-{\r
-#if MEDIA_A2DP_SNK_INTERFACE\r
- int32_t ret = AudioManagerA2dpSinkDestroy();\r
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "AudioManagerA2dpSinkDestroy ret %x\n", ret);\r
-#endif\r
- return 0;\r
-}\r
-\r
-static void BtA2dpSnkConnectStateChangedCb(bd_addr_t *bd_addr, int conn_state)\r
-{\r
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "addr: ****%02x%02x%02x%02x conn_state: %x\n",\r
- bd_addr->addr[3], bd_addr->addr[2], bd_addr->addr[1], bd_addr->addr[0], conn_state); /* 3 2 1 0 idx */\r
-}\r
-\r
-static void BtA2dpSnkStartStreamReqCb(bd_addr_t *bd_addr)\r
-{\r
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "addr: ****%02x%02x%02x%02x \n",\r
- bd_addr->addr[3], bd_addr->addr[2], bd_addr->addr[1], bd_addr->addr[0]); /* 3 2 1 0 idx */\r
- BtA2dpSnkAudioCreate();\r
-}\r
-\r
-static void BtA2dpSnkPlayingStateChangedCb(bd_addr_t *bd_addr, int playing_state)\r
-{\r
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "addr: ****%02x%02x%02x%02x playing_state: %x\n",\r
- bd_addr->addr[3], bd_addr->addr[2], bd_addr->addr[1], bd_addr->addr[0], playing_state); /* 3 2 1 0 idx */\r
- if (playing_state == A2DP_NOT_PLAYING) {\r
- BtA2dpSnkAudioDestroy();\r
- }\r
-}\r
-\r
-static void BtA2dpSnkConfigChangedCb(bd_addr_t *bd_addr, a2dp_snk_codec_info_t *info)\r
-{\r
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "addr: ****%02x%02x%02x%02x ",\r
- bd_addr->addr[3], bd_addr->addr[2], bd_addr->addr[1], bd_addr->addr[0]); /* 3 2 1 0 idx */\r
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP,\r
- "codec_priority: %04x codec_type: %04x sample_rate: %02x bits_per_sample: %02x channel_mode: %02x",\r
- info->codec_priority, info->codec_type, info->sample_rate, info->bits_per_sample, info->channel_mode);\r
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP,\r
- "codec_specific1: %04x codec_specific2: %04x codec_specific3: %04x codec_specific4: %04x\n",\r
- (unsigned int)info->codec_specific1,\r
- (unsigned int)info->codec_specific2,\r
- (unsigned int)info->codec_specific3,\r
- (unsigned int)info->codec_specific4);\r
-#if MEDIA_A2DP_SNK_INTERFACE\r
- if (info->codec_type == A2DP_SNK_CODEC_TYPE_AAC) {\r
- g_audio_format_config.audioFormat = AAC_LC;\r
- } else {\r
- g_audio_format_config.audioFormat = SBC;\r
- }\r
- /* channel count 1 or 2 */\r
- g_audio_format_config.channelCount = (info->channel_mode == A2DP_SNK_CODEC_CHANNEL_MODE_NONE ? 1 : 2);\r
-\r
- switch (info->sample_rate) {\r
- case A2DP_SNK_CODEC_SAMPLE_RATE_48000:\r
- g_audio_format_config.sampleRate = BT_AUDIO_A2DP_SMAPLE_RATE48000;\r
- break;\r
- case A2DP_SNK_CODEC_SAMPLE_RATE_88200:\r
- g_audio_format_config.sampleRate = BT_AUDIO_A2DP_SMAPLE_RATE88200;\r
- break;\r
- case A2DP_SNK_CODEC_SAMPLE_RATE_96000:\r
- g_audio_format_config.sampleRate = BT_AUDIO_A2DP_SMAPLE_RATE96000;\r
- break;\r
- default:\r
- g_audio_format_config.sampleRate = BT_AUDIO_A2DP_SMAPLE_RATE44100;\r
- break;\r
- }\r
- WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "audioFormat %d channelCount %d sampleRate %d \n",\r
- g_audio_format_config.audioFormat, g_audio_format_config.channelCount, g_audio_format_config.sampleRate);\r
-#endif\r
++ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BtGattsRequestWriteCallback333 %s %d",writeCbPara->value,writeCbPara->length);\r
+ }\r
+ \r
+ // 注册回调函数\r
+ static gap_call_backs_t g_btGapCallBacks{};\r
+ static a2dp_src_callbacks_t g_a2dpSrcCallbacks{};\r
+ static gap_ble_callbacks_t g_gapBleCallbacks{};\r
+ static gatts_callbacks_t g_btGattsCallbacks{};\r
-\r
-static a2dp_snk_callbacks_t g_a2dp_snk_callbacks = {\r
- BtA2dpSnkConnectStateChangedCb,\r
- BtA2dpSnkStartStreamReqCb,\r
- BtA2dpSnkPlayingStateChangedCb,\r
- BtA2dpSnkConfigChangedCb\r
-};\r
-\r
+ void BtInitCallBacks()\r
+ {\r
- g_btGapCallBacks.discovery_result_callback = BtGapDiscoveryResultCallback;\r
- g_btGapCallBacks.discovery_state_changed_callback = BtGapDiscoveryStateChangedCallback;\r
- g_btGapCallBacks.acl_state_changed_callbak = GapAclStateChangedCallback;\r
- g_btGapCallBacks.read_remote_rssi_event_callback = BtGapReadRemoteRssiEventCallback;\r
- g_btGapCallBacks.remote_name_changed_callback = BtRemoteNameChangedCallback;\r
- g_btGapCallBacks.is_accept_conn_on_safe_mode_callback = BtIsAcceptConnOnSafeModeCallback;\r
- g_btGapCallBacks.pair_status_changed_callback = BtGapPairStatusChangedCallback;\r
- g_btGapCallBacks.pair_requested_callback = BtGapPairRequestedCallback;\r
- g_btGapCallBacks.pair_confiremed_callback = BtGapPairConfirmedCallback;\r
- gap_register_callbacks(&g_btGapCallBacks);\r
-\r
- g_a2dpSrcCallbacks.connectstate_changed_cb = A2dpSrcConnectstateChanged;\r
- g_a2dpSrcCallbacks.configuration_changed_cb = A2dpSrcConfigureChanged;\r
- g_a2dpSrcCallbacks.playing_state_changed_cb = A2dpSrcPlayingStateChanged;\r
- a2dp_src_register_callbacks(&g_a2dpSrcCallbacks);\r
-\r
- /* a2dp sink */\r
- a2dp_snk_register_callbacks(&g_a2dp_snk_callbacks);\r
-}\r
-\r
-void BtInitCallBacksEx()\r
-{\r
- g_gapBleCallbacks.conn_state_change_cb = BleConnStateChangeCallback;\r
- g_gapBleCallbacks.start_adv_cb = BleAdvStartCallback;\r
- g_gapBleCallbacks.stop_adv_cb = BleAdvStopCallback;\r
- gap_ble_register_callbacks(&g_gapBleCallbacks);\r
-\r
- g_btGattsCallbacks.add_service_cb = BtGattsServiceAddCallback;\r
- g_btGattsCallbacks.add_characteristic_cb = BtGattsCharacteristicAddCallback;\r
- g_btGattsCallbacks.add_descriptor_cb = BtGattsDescriptorAddCallback;\r
- g_btGattsCallbacks.start_service_cb = BtGattsServiceStartCallback;\r
- g_btGattsCallbacks.stop_service_cb = BtGattsServiceStopCallback;\r
- g_btGattsCallbacks.delete_service_cb = BtGattsServiceDeleteCallback;\r
- g_btGattsCallbacks.read_request_cb = BtGattsRequestReadCallback;\r
- g_btGattsCallbacks.write_request_cb = BtGattsRequestWriteCallback;\r
- g_btGattsCallbacks.mtu_changed_cb = NULL;\r
- gatts_register_callbacks(&g_btGattsCallbacks);\r
++ // g_btGapCallBacks.discovery_result_callback = BtGapDiscoveryResultCallback;\r
++ // g_btGapCallBacks.discovery_state_changed_callback = BtGapDiscoveryStateChangedCallback;\r
++ // g_btGapCallBacks.acl_state_changed_callbak = GapAclStateChangedCallback;\r
++ // g_btGapCallBacks.read_remote_rssi_event_callback = BtGapReadRemoteRssiEventCallback;\r
++ // g_btGapCallBacks.remote_name_changed_callback = BtRemoteNameChangedCallback;\r
++ // g_btGapCallBacks.is_accept_conn_on_safe_mode_callback = BtIsAcceptConnOnSafeModeCallback;\r
++ // g_btGapCallBacks.pair_status_changed_callback = BtGapPairStatusChangedCallback;\r
++ // g_btGapCallBacks.pair_requested_callback = BtGapPairRequestedCallback;\r
++ // g_btGapCallBacks.pair_confiremed_callback = BtGapPairConfirmedCallback; \r
++ \r
++ // gap_register_callbacks(&g_btGapCallBacks);\r
++\r
++ // g_a2dpSrcCallbacks.connectstate_changed_cb = A2dpSrcConnectstateChanged;\r
++ // g_a2dpSrcCallbacks.configuration_changed_cb = A2dpSrcConfigureChanged;\r
++ // g_a2dpSrcCallbacks.playing_state_changed_cb = A2dpSrcPlayingStateChanged;\r
++ // a2dp_src_register_callbacks(&g_a2dpSrcCallbacks);\r
++\r
++ // g_gapBleCallbacks.conn_state_change_cb = BleConnStateChangeCallback;\r
++ // g_gapBleCallbacks.start_adv_cb = BleAdvStartCallback;\r
++ // g_gapBleCallbacks.stop_adv_cb = BleAdvStopCallback;\r
++ // gap_ble_register_callbacks(&g_gapBleCallbacks);\r
++\r
++ // g_btGattsCallbacks.add_service_cb = BtGattsServiceAddCallback;\r
++ // g_btGattsCallbacks.add_characteristic_cb = BtGattsCharacteristicAddCallback;\r
++ // g_btGattsCallbacks.add_descriptor_cb = BtGattsDescriptorAddCallback;\r
++ // g_btGattsCallbacks.start_service_cb = BtGattsServiceStartCallback;\r
++ // g_btGattsCallbacks.stop_service_cb = BtGattsServiceStopCallback;\r
++ // g_btGattsCallbacks.delete_service_cb = BtGattsServiceDeleteCallback;\r
++ // g_btGattsCallbacks.read_request_cb = BtGattsRequestReadCallback;\r
++ // g_btGattsCallbacks.write_request_cb = BtGattsRequestWriteCallback;\r
++ // g_btGattsCallbacks.mtu_changed_cb = NULL;\r
++ // gatts_register_callbacks(&g_btGattsCallbacks);\r
+ }\r
+ \r
+ void BtInitGatts(void)\r
+ {\r
++ return;\r
+ uint16_t id = 0x1FF0;\r
+ uint16_t ser_id = 0x1FFF;\r
+ uint8_t serverId = 0;\r
+ bt_uuid_t uuid;\r
+ int ret;\r
+ \r
+ uuid.uuid_len = sizeof(ser_id);\r
+ memcpy_s(uuid.uuid, sizeof(uuid.uuid), (char *)&ser_id, sizeof(ser_id));\r
+ ret = gatts_register_server(&uuid, &serverId); /* 注册gatt server */\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gatts_register_server ret: 0x%x serverId = 0x%x", ret, serverId);\r
+ \r
+ uuid.uuid_len = sizeof(id);\r
+ memcpy_s(uuid.uuid, sizeof(uuid.uuid), (char *)&id, sizeof(id));\r
+ ret = gatts_add_service(serverId, &uuid, true);\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gatts_add_service ret: 0x%x", ret);\r
+ }\r
+ \r
+ static uint8_t Char2Num(int8_t c)\r
+ {\r
+ if (c >= '0' && c <= '9') {\r
+ return (uint8_t)(c - '0');\r
+ } else if (c >= 'A' && c <= 'F') {\r
+ return (uint8_t)(c - 'A' + TEN);\r
+ } else if (c >= 'a' && c <= 'f') {\r
+ return (uint8_t)(c - 'a' + TEN);\r
+ } else {\r
+ return 0xFF;\r
+ }\r
+ }\r
+ \r
+ static uint32_t GenerateUuidFromString(const char *str, uint8_t len, bt_uuid_t *uuid_out)\r
+ {\r
+ int slen = (int)strnlen(str, len);\r
+ bool new_uuid = false;\r
+ if (uuid_out == NULL) {\r
+ return ERRCODE_INVALID_PARAM;\r
+ }\r
+ \r
+ uuid_out->uuid_len = (uint8_t)slen / 2; /* 2: 2个字符组成一个字节,因此只取偶数个字符 */\r
+ for (int i = 0; i + 1 < slen; i += 2) { /* 2: 同上 */\r
+ uint8_t num1 = Char2Num(str[i]);\r
+ uint8_t num2 = Char2Num(str[i + 1]);\r
+ if (num1 == UINT8_MAX || num2 == UINT8_MAX) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "invalid input %c%c\n", str[i], str[i + 1]);\r
+ return ERRCODE_INVALID_PARAM;\r
+ }\r
+ \r
+ uuid_out->uuid[i / 2] = (uint8_t)((num1 << BIT4) | num2); /* 2: 同上 */\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "%02x ", (uint8_t)(uuid_out->uuid[i / 2])); /* 2: 同上 */\r
+ }\r
+ \r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "\n");\r
+ return ERRCODE_SUCC;\r
+ }\r
+ \r
+ void BtSppServerCreate(const char *spp_uuid, const char *name, uint8_t name_len)\r
+ {\r
+ spp_create_socket_para_t param;\r
+ if (GenerateUuidFromString((const char *)spp_uuid, (uint8_t)strlen(spp_uuid), ¶m.uuid) != ERRCODE_SUCC) {\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "get uuid fail\n");\r
+ return;\r
+ }\r
+ \r
+ param.socket_type = SPP_SOCKET_RFCOMM;\r
+ param.is_encrypt = true;\r
+ \r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "uuid: %s uuid_len: %u\n", spp_uuid, param.uuid.uuid_len);\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "socket_type: %x is_encrypt: %d name: %s nameLen: %u\n", param.socket_type,\r
+ param.is_encrypt, name, name_len);\r
+ \r
+ int ret = spp_server_create(¶m, name, name_len);\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "spp_server_create ret: %x\n", ret);\r
+ }\r
+ \r
+ static int BtSppServerAcceptTaskBody(void *data)\r
+ {\r
+ int server_id = (int)(intptr_t)data;\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "server_id: %x\n", server_id);\r
+ \r
+ int ret = spp_server_accept(server_id);\r
+ \r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "spp_server_accept ret: %x\n", ret);\r
+ \r
+ return OSAL_SUCCESS;\r
+ }\r
+ \r
+ /* 等待client连接 */\r
+ void BtSppServerAccept(uint8_t server_id)\r
+ {\r
+ osal_task *task = osal_kthread_create(BtSppServerAcceptTaskBody, (void *)(uintptr_t)server_id,\r
+ "spp_server_accept_task", BT_SPP_TASK_STACK_SIZE);\r
+ if (task == NULL) {\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "create task fail\n");\r
+ return;\r
+ }\r
+ \r
+ int ret = osal_kthread_set_priority(task, BT_SPP_TASK_PRI);\r
+ if (ret != OSAL_SUCCESS) {\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "set pri error: %08x\n", ret);\r
+ }\r
+ \r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "create task success.\n");\r
+ }\r
+ \r
+ void BtInitSpp(void)\r
+ {\r
+ char uuid[] = "1101";\r
+ char name[] = "COM1";\r
+ uint8_t name_len = strlen(name) + 1;\r
+ uint8_t server_id = 0;\r
+ \r
+ /* 创建spp */\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "create spp server uuid=%s name=%s name_len=%d\n", uuid, name, name_len);\r
+ BtSppServerCreate(uuid, name, name_len);\r
+ BtSppServerAccept(server_id);\r
+ }\r
+ \r
+ void BleAdvStart(void)\r
+ {\r
+ int advId = 1;\r
+ if (BluetoothModel::GetInstance()->GetAdvStartState()) {\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BleAdvStart already started");\r
+ gap_ble_stop_adv(advId);\r
+ osDelay(50);\r
+ }\r
+ gap_ble_adv_params_t adv_para;\r
+ memset_s(&adv_para, sizeof(gap_ble_adv_params_t), 0, sizeof(gap_ble_adv_params_t));\r
+ adv_para.min_interval = 0x30;\r
+ adv_para.max_interval = 0x60;\r
+ adv_para.adv_type = GAP_BLE_ADV_CONN_SCAN_UNDIR;\r
+ adv_para.channel_map = 0x7;\r
+ adv_para.duration = 0;\r
+ gap_ble_set_adv_param(advId, &adv_para);\r
+ gap_ble_set_local_appearance(GAP_BLE_APPEARANCE_TYPE_GENERIC_WATCH);\r
- errcode_t ret = gap_ble_start_adv(advId);\r
++ bool ret = gap_ble_start_adv(advId);\r
++ if (ret) {\r
++ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BleAdvStart bt gap_ble_start_adv ret = 0x%x", ret);\r
++ }\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BleAdvStart bt gap_ble_start_adv ret = 0x%x", ret);\r
+ }\r
+ \r
+ #ifdef __cplusplus\r
+ }\r
+ #endif\r
+ }\r