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
\r
- ThunderBirdMainView *thunderBirdMainView = ThunderBirdMainView::GetInstance();\r
- if (thunderBirdMainView == nullptr) {\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "thunderBirdMainView nullptr");\r
- return;\r
- }\r
- int currentView = thunderBirdMainView->GetCurrentView();\r
tag = GetScanStatus();\r
if (tag) { \r
- // 跳转\r
- SetScanStatus(false);\r
- thunderBirdMainView->ChangeView(\r
- currentView, \r
- THUNDERBIRD_BLUEVIEW, \r
- ThunderBirdBlueView::THUNDERBIRD_BULEVIEW_DEVICE_LIST);\r
+ // 扫描状态下不立即跳转,等待定时器触发(至少10秒后)\r
+ // 只记录设备,由定时器控制跳转时机\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "扫描中,已发现 %d 个设备", btScansDevicesList_.size());\r
} else {\r
+ // 已在设备列表界面,刷新列表\r
ThunderBirdBlueView *thunderBirdBlueView = ThunderBirdBlueView::GetInstance();\r
if (thunderBirdBlueView == nullptr) {\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "thunderBirdBlueView nullptr");\r
{
GraphicTimer *g_stopScanHandle_ln = nullptr;
- static constexpr uint64_t MS_SCAN_TIME = 25 * 1000;
+ static constexpr uint64_t MS_SCAN_TIME = 25 * 1000; // 最大扫描时间25秒
+ static constexpr uint64_t MS_SCAN_INTERVAL = 1 * 1000; // 每秒检查一次
+ static constexpr uint32_t MIN_SCAN_SECONDS = 10; // 最少扫描10秒
+ static uint32_t g_scanElapsedSeconds = 0; // 已扫描秒数
+ static bool g_hasJumpedToList = false; // 是否已跳转到列表
// 取消蓝牙扫描
void LN_CancelBrScanHandle(void)
g_stopScanHandle_ln->Stop();
delete g_stopScanHandle_ln;
g_stopScanHandle_ln = nullptr;
+ BluetoothModel::GetInstance()->SetScanStatus(false);
bool results = gap_br_cancel_discovery();
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "取消扫描 results %d", results);
}
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "扫描结果为空");
if (BluetoothModel::GetInstance()->GetScanStatus() == true) // 如果是扫描状态
{
- BluetoothModel::GetInstance()->SetScanStatus(false);
+
ThunderBirdMainView *thunderBirdMainView = ThunderBirdMainView::GetInstance();
if (thunderBirdMainView == nullptr)
{
return;
}
- // 定时器回调函数
+ // 定时器回调函数(每秒触发)
static void LnBluetoothScanTimerCallbackProc(void *data)
{
(void)data;
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "扫描结束");
- LN_CancelBrScanHandle();
- LN_EndScanHandle();
+ g_scanElapsedSeconds++;
+
+ size_t deviceCount = BluetoothModel::GetInstance()->GetCase().size();
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "扫描中... 已扫描 %d 秒, 发现设备 %d 个",
+ g_scanElapsedSeconds, deviceCount);
+
+ // 检查是否满足跳转条件:已扫描至少10秒 且 有设备 且 还未跳转
+ if (g_scanElapsedSeconds >= MIN_SCAN_SECONDS && deviceCount > 0 && !g_hasJumpedToList) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "满足跳转条件,跳转到设备列表");
+ g_hasJumpedToList = true;
+
+ // 跳转到设备列表界面
+ BluetoothModel::GetInstance()->SetScanStatus(false);
+ ThunderBirdMainView *thunderBirdMainView = ThunderBirdMainView::GetInstance();
+ if (thunderBirdMainView != nullptr) {
+ int currentView = thunderBirdMainView->GetCurrentView();
+ thunderBirdMainView->ChangeView(
+ currentView,
+ THUNDERBIRD_BLUEVIEW,
+ ThunderBirdBlueView::THUNDERBIRD_BULEVIEW_DEVICE_LIST);
+ }
+
+ // 停止扫描定时器
+ LN_CancelBrScanHandle();
+ return;
+ }
+
+ // 检查是否达到最大扫描时间
+ if (g_scanElapsedSeconds >= (MS_SCAN_TIME / 1000)) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "达到最大扫描时间,扫描结束");
+ LN_CancelBrScanHandle();
+ LN_EndScanHandle();
+ }
}
+
void LN_BluetoothScanTimerCallback(void *data)
{
GraphicService::GetInstance()->PostGraphicEvent(std::bind(LnBluetoothScanTimerCallbackProc, data));
void LN_BluetoothScanStart(void)
{
+ if (g_stopScanHandle_ln != nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "g_stopScanHandle_ln != nullptr");
+ return;
+ }
+
bool ret;
bool results;
// 经典蓝牙扫描
results = gap_br_start_discovery();
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "启动扫描 results %d", results);
}
- if (g_stopScanHandle_ln != nullptr)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "g_stopScanHandle_ln != nullptr");
- return;
- }
+ // 重置扫描状态
+ g_scanElapsedSeconds = 0;
+ g_hasJumpedToList = false;
+
// 扫描的时候保持屏幕常亮
/* -------------------------------------------------------------------------- */
ScreenAlwaysOnCtr(OPEN_SCREEN_ALWAYS_ON);
/* -------------------------------------------------------------------------- */
- uint32_t tick = GetOSTick(MS_SCAN_TIME);
+ // 改为每秒触发一次定时器(false表示重复触发)
+ uint32_t tick = GetOSTick(MS_SCAN_INTERVAL);
g_stopScanHandle_ln = new GraphicTimer(tick, LN_BluetoothScanTimerCallback, nullptr, true);
if (g_stopScanHandle_ln == nullptr)
{
headerItem.isSelected = false;
displayList_.push_back(headerItem);
- // 添加已连接的设备
- for (auto& device : scanDevices) {
- if (connectedCount >= MAX_CONNECTED_DEVICES) {
- break;
- }
-
- // 检查设备是否已连接
- if (bt_is_acl_connected((const bd_addr_t*)&device.addr)) {
- DeviceListItem item;
- item.type = DeviceItemType::DEVICE_CONNECTED;
- item.deviceInfo = device;
- item.isSelected = false;
- displayList_.push_back(item);
- connectedCount++;
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Added connected device: %s", device.deviceName);
+ // 直接添加已连接的设备(从 lastConnedAddr 获取,而不是从扫描列表)
+ DeviceListItem connectedItem;
+ connectedItem.type = DeviceItemType::DEVICE_CONNECTED;
+ connectedItem.isSelected = false;
+
+ // 复制已连接设备地址
+ (void)memcpy_s(connectedItem.deviceInfo.addr, BD_ADDR_LEN,
+ lastConnedAddr->addr, BD_ADDR_LEN);
+
+ // 获取已连接设备名称
+ char* connectedName = btModel->GetLastConnedDeviceName();
+ if (connectedName != nullptr && strlen(connectedName) > 0) {
+ (void)strcpy_s((char*)connectedItem.deviceInfo.deviceName, BD_NAME_LEN, connectedName);
+ } else {
+ // 如果没有名称,尝试从扫描列表或配对列表中查找
+ bool foundName = btModel->FindNameFromList(&connectedItem.deviceInfo);
+ if (!foundName) {
+ // 使用 MAC 地址作为名称
+ snprintf((char*)connectedItem.deviceInfo.deviceName, BD_NAME_LEN,
+ "%02X:%02X:%02X:%02X:%02X:%02X",
+ lastConnedAddr->addr[5], lastConnedAddr->addr[4],
+ lastConnedAddr->addr[3], lastConnedAddr->addr[2],
+ lastConnedAddr->addr[1], lastConnedAddr->addr[0]);
}
}
+
+ displayList_.push_back(connectedItem);
+ connectedCount = 1;
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Added connected device: %s", connectedItem.deviceInfo.deviceName);
}
// 2. 添加附近设备分组