优化表盘下载 3274/2 3274/head 3278/target/1
authorCaisking <Casiking@zhihuishixun.com>
Mon, 16 Mar 2026 03:49:45 +0000 (11:49 +0800)
committerCaisking <Casiking@zhihuishixun.com>
Mon, 16 Mar 2026 03:50:31 +0000 (11:50 +0800)
code/sdk/application/wearable/n9/nativeapp/nativeui/set_dial/src/SetDialModel.cpp

index eab6997..d25a1b9 100644 (file)
@@ -39,9 +39,9 @@ std::unordered_map<uint16_t, std::string> registeredDials{
   {DEFAULT_DIAL_ID_0, "N9"},
   {DEFAULT_DIAL_ID_1, "eagle"},
   {DEFAULT_DIAL_ID, "lake"},
-  {DEFAULT_DIAL_ID_2, "vibrant_number"},
+  {DEFAULT_DIAL_ID_2, "vibrantnumber"},
   {DEFAULT_DIAL_ID_3, "distortion"},
-  {DEFAULT_DIAL_ID_MAX, "science"},
+  {MAX_DEFAULT_DIAL_ID, "science"},
 };
 // 表盘市场UID 对应表盘name
 // 存储表盘到文件
@@ -401,12 +401,19 @@ void SetDialModel::UpdateDialSetting(uint16_t ID) {
     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
                   "UpdateDialSetting: Found dial in registeredDials: ID=%d -> Name=%s",
                   ID, dialname.c_str());
-    
+
+    // 若 dialInfoList 为空(如 BLE 切表盘早于/晚于列表加载),先重载再查找,避免 registeredDials 有数据但 dialInfoList 未同步
+    if (dialInfoList.empty()) {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                    "UpdateDialSetting: dialInfoList is empty, calling LoadAllDial() before lookup");
+      LoadAllDial();
+    }
+
     // 在dialInfoList中查找同名表盘
     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
                   "UpdateDialSetting: Searching for dial name '%s' in dialInfoList (size=%zu)",
                   dialname.c_str(), dialInfoList.size());
-    
+
     bool foundInList = false;
     for (size_t i = 0; i < dialInfoList.size(); i++) {
       WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
@@ -597,7 +604,7 @@ void SetDialModel::LoadAllDialFromFs() {
   加载默认表盘
 */
 const std::vector<std::string> defaultDials = {
-  "lake", "eagle", "vibrant_number", "distortion", "science",
+  "lake", "eagle", "vibrantnumber", "distortion", "science",
 };
 
 void SetDialModel::LoadAllDialFromDefult(void) {
@@ -763,19 +770,23 @@ void SetDialModel::SaveDialSetting(uint8_t pageIndex) {
   MainModel::GetInstance().AddDialSetting(diagSetting, currentDialID);
 }
 
-/*获取表盘的总数*/
+/*获取表盘的总数
+ * 注意:BLE 侧用此值分配缓冲区并调用 GetAllDialIDs 写入 ID 列表,
+ * 因此必须与 GetAllDialIDs 使用同一数据源(registeredDials),
+ * 否则会出现 dial_num 与实际写入字节数不一致的 err。*/
 size_t SetDialModel::GetDialCount(void) {
-  size_t count = dialInfoList.size();
-  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetDialCount: dialInfoList.size() = %d", count);
-  
-  // 如果表盘列表为空,尝试重新加载
+  size_t count = registeredDials.size();
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetDialCount: registeredDials.size() = %zu (dialInfoList.size() = %zu)",
+                count, dialInfoList.size());
+
+  // 若持久化表盘列表为空,尝试从文件恢复后再取数量
   if (count == 0) {
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetDialCount: dialInfoList is empty, try to reload");
-    LoadAllDial();
-    count = dialInfoList.size();
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetDialCount: After reload, dialInfoList.size() = %d", count);
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetDialCount: registeredDials is empty, try readDialfile");
+    readDialfile();
+    count = registeredDials.size();
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetDialCount: After readDialfile, registeredDials.size() = %zu", count);
   }
-  
+
   return count;
 }
 
@@ -1200,7 +1211,6 @@ bool ble_delete_dial_(uint16_t id) {
     case OHOS::DEFAULT_DIAL_ID_1:
     case OHOS::DEFAULT_DIAL_ID_2:
     case OHOS::DEFAULT_DIAL_ID_3:
-    case OHOS::DEFAULT_DIAL_ID_MAX:
       WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
                     "UninstallDial: Default dial %d cannot be uninstalled", id);
       return false;