Merge branch 'xts_origin' of https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230...
authordxy <1731678236@qq.com>
Wed, 28 Feb 2024 03:23:34 +0000 (11:23 +0800)
committerdxy <1731678236@qq.com>
Wed, 28 Feb 2024 03:23:34 +0000 (11:23 +0800)
1  2 
code/sdk/application/brandy/brandy_standard/thread_pri_init.c
code/sdk/application/wearable/fd230app/nativeui/bluetooth/src/BluetoothModel.cpp
code/sdk/build/config/target_config/brandy/config.py

@@@ -331,8 -338,16 +339,18 @@@ static void thread_main(const void *unu
      uapi_alipay_svr_init();\r
  #endif\r
  \r
 +    svr_bluetooth_init();\r
 +\r
+ #ifdef SUPPORT_PPG_SERVICE\r
+     uapi_ppg_service_init();\r
+ #endif\r
+ \r
+ #ifdef ENABLE_SLIP\r
+     slip_uart_init();\r
+ #endif\r
+ #ifdef SUPPORT_CAT1_SERVICE\r
+     cat1_server_init();\r
+ #endif\r
      set_startup_finish_flag();\r
  }\r
  \r
- /*
-  * 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), &param.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(&param, 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), &param.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(&param, 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
@@@ -155,8 -161,8 +161,9 @@@ target = 
                            "rotary_encoder",
                            #"nativelauncher",
                             "fd230launcher",
-                           "batterry_service",
+                            "ppg_service",
+                           "batterry_service"
 +                          "ble_service"
                                                  ],
          'ram_component_set': ['bgh', 'media', 'gpu', 'graphic_uikit', 'bgh_audio', 'dfx_set', 'ohos_set', 'wearable_set', 'alipay_set'],
          'dsp_version': 'max',