From b8a9fb1a31472652ad04abea3412d19b4de92e32 Mon Sep 17 00:00:00 2001 From: Caisking Date: Sat, 14 Mar 2026 16:03:01 +0800 Subject: [PATCH] =?utf8?q?=E4=BC=98=E5=8C=96=E8=A1=A8=E7=9B=98=E5=88=87?= =?utf8?q?=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../nativeui/set_dial/src/SetDialModel.cpp | 214 +++++++++++++++--- 1 file changed, 181 insertions(+), 33 deletions(-) diff --git a/code/sdk/application/wearable/n9/nativeapp/nativeui/set_dial/src/SetDialModel.cpp b/code/sdk/application/wearable/n9/nativeapp/nativeui/set_dial/src/SetDialModel.cpp index d2f559543..eab6997d6 100644 --- a/code/sdk/application/wearable/n9/nativeapp/nativeui/set_dial/src/SetDialModel.cpp +++ b/code/sdk/application/wearable/n9/nativeapp/nativeui/set_dial/src/SetDialModel.cpp @@ -36,9 +36,12 @@ namespace OHOS { // 表盘map[Id--dialname] 前5个ID固定 std::unordered_map registeredDials{ - {DEFAULT_DIAL_ID_0, "N9"}, {DEFAULT_DIAL_ID, "lake"}, - {DEFAULT_DIAL_ID_1, "eagle"}, {DEFAULT_DIAL_ID_2, "vibrantnumber"}, - {DEFAULT_DIAL_ID_3, "distortion"}, {MAX_DEFAULT_DIAL_ID, "science"}, + {DEFAULT_DIAL_ID_0, "N9"}, + {DEFAULT_DIAL_ID_1, "eagle"}, + {DEFAULT_DIAL_ID, "lake"}, + {DEFAULT_DIAL_ID_2, "vibrant_number"}, + {DEFAULT_DIAL_ID_3, "distortion"}, + {DEFAULT_DIAL_ID_MAX, "science"}, }; // 表盘市场UID 对应表盘name // 存储表盘到文件 @@ -347,79 +350,199 @@ bool SetDialModel::UninstallDial(uint16_t ID) { } /*更新表盘*/ void SetDialModel::UpdateDialSetting(uint16_t ID) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "UpdateDialSetting: ========== Start =========="); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "UpdateDialSetting: Input ID = %d, currentDialID = %d", + ID, currentDialID); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "UpdateDialSetting: registeredDials.size() = %zu, dialInfoList.size() = %zu", + registeredDials.size(), dialInfoList.size()); + + uint16_t originalID = ID; if (ID <= 4) { ID++; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "UpdateDialSetting: ID adjusted from %d to %d (ID <= 4)", + originalID, ID); + } else { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "UpdateDialSetting: ID unchanged = %d (ID > 4)", ID); } /*判断是否为当前表盘 如果是自定义表盘 需要更新*/ if (currentDialID == ID && ID >= 5) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, - "UpdateDialSetting: Current dial %d cannot be updated %d", + "UpdateDialSetting: FAILED - Current dial %d cannot be updated (same as target %d, ID >= 5)", currentDialID, ID); #ifdef SUPPORT_BLE_SERVICE reply_app_send_switchDialCmd(false); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "UpdateDialSetting: Sent switchDialCmd(false) to app"); #endif + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "UpdateDialSetting: ========== End (Same dial) =========="); return; } - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpdateDialSetting: ID %d", ID); + + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "UpdateDialSetting: Searching for ID %d in registeredDials", ID); + + // 打印 registeredDials 的内容用于调试 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "UpdateDialSetting: registeredDials contents:"); + for (const auto &pair : registeredDials) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + " ID=%d -> Name=%s", pair.first, pair.second.c_str()); + } + if (registeredDials.find(ID) != registeredDials.end()) { std::string dialname = registeredDials[ID]; // 根据ID找到对应的表盘名称 - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, - "UpdateDialSetting: Dial %s is already registered", - dialname.c_str()); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "UpdateDialSetting: Found dial in registeredDials: ID=%d -> Name=%s", + ID, dialname.c_str()); + // 在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, - "dialInfoList name %s is already registered", - (dialInfoList[i].dialName).c_str()); + "UpdateDialSetting: Checking dialInfoList[%zu]: name='%s', id=%d, flag=%d", + i, dialInfoList[i].dialName.c_str(), dialInfoList[i].id, dialInfoList[i].dialFlag); + + // 匹配逻辑:完全匹配 或 dialName 以 dialname 开头(处理文件头中的名称包含额外描述的情况) + // 例如:registeredDials 中是 "classic_elegance",dialInfoList 中是 "classic_elegance鎏金简约" + bool nameMatches = false; if (dialInfoList[i].dialName == dialname) { + nameMatches = true; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, + "UpdateDialSetting: Exact match found"); + } else if (dialInfoList[i].dialName.length() >= dialname.length() && + dialInfoList[i].dialName.substr(0, dialname.length()) == dialname) { + nameMatches = true; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "UpdateDialSetting: Prefix match found: dialName='%s' starts with '%s'", + dialInfoList[i].dialName.c_str(), dialname.c_str()); + } + + if (nameMatches) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "UpdateDialSetting: MATCH FOUND at index %zu: name='%s', id=%d, flag=%d", + i, dialInfoList[i].dialName.c_str(), dialInfoList[i].id, dialInfoList[i].dialFlag); + foundInList = true; + DialSetting diagSetting; SetDialInfo &info = dialInfoList[i]; diagSetting.dialFlag = info.dialFlag; diagSetting.dialId = info.id; diagSetting.dialFullName = info.dialFullName; + + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "UpdateDialSetting: Setting dial - dialFlag=%d, dialId=%d, dialFullName=%s", + diagSetting.dialFlag, diagSetting.dialId, diagSetting.dialFullName.c_str()); + + uint16_t oldDialID = currentDialID; currentDialID = ID; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "UpdateDialSetting: Updated currentDialID from %d to %d", + oldDialID, currentDialID); + uapi_set_screen_on_api(); // 更新当前表盘Id - MainModel::GetInstance().AddDialSetting(diagSetting, - currentDialID); // 更新表盘设置 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "UpdateDialSetting: Called uapi_set_screen_on_api()"); + + MainModel::GetInstance().AddDialSetting(diagSetting, currentDialID); // 更新表盘设置 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "UpdateDialSetting: Called AddDialSetting(dialId=%d, currentDialID=%d)", + diagSetting.dialId, currentDialID); + //运动状态下不进行页面切换 - if (uapi_dev_runtime_get_train_status() != 1) { - NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN); + int trainStatus = uapi_dev_runtime_get_train_status(); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "UpdateDialSetting: Train status = %d", trainStatus); + if (trainStatus != 1) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "UpdateDialSetting: Changing slice to VIEW_MAIN"); + NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN);// 目前切换到主界面,按键监听有问题 + } else { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "UpdateDialSetting: Skipping slice change (training in progress)"); } + #ifdef SUPPORT_BLE_SERVICE svr_ble_read_data_value_updata_noyify(); // app切换表盘增加id更新 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "UpdateDialSetting: Called svr_ble_read_data_value_updata_noyify()"); reply_app_send_switchDialCmd(true); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "UpdateDialSetting: Sent switchDialCmd(true) to app - SUCCESS"); #endif + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "UpdateDialSetting: ========== End (SUCCESS) =========="); return; // 更新成功后直接返回 } } -//没有在列表找到名称 + + //没有在列表找到名称 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "UpdateDialSetting: FAILED - Dial name '%s' found in registeredDials but NOT in dialInfoList", + dialname.c_str()); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "UpdateDialSetting: dialInfoList contents:"); + for (size_t i = 0; i < dialInfoList.size(); i++) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + " [%zu] name='%s', id=%d, flag=%d", + i, dialInfoList[i].dialName.c_str(), dialInfoList[i].id, dialInfoList[i].dialFlag); + } #ifdef SUPPORT_BLE_SERVICE reply_app_send_switchDialCmd(false); -#endif WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, - "dialInfoList name %s is already registered", - dialname.c_str()); + "UpdateDialSetting: Sent switchDialCmd(false) to app"); +#endif } else { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "UpdateDialSetting: FAILED - Cannot find dial ID %d in registeredDials", + ID); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "UpdateDialSetting: Available IDs in registeredDials:"); + for (const auto &pair : registeredDials) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " ID=%d", pair.first); + } #ifdef SUPPORT_BLE_SERVICE reply_app_send_switchDialCmd(false); -#endif WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, - "SetDialModel UpdateDialSetting: Cannot find dial %d", ID); + "UpdateDialSetting: Sent switchDialCmd(false) to app"); +#endif } + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "UpdateDialSetting: ========== End (FAILED) =========="); } /*加载所有表盘*/ void SetDialModel::LoadAllDial() { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadAllDial: Start loading dials"); dialInfoList.clear(); size_t dialSize = dialInfoList.size(); size_t aodSize = aodDialInfoList.size(); + // 加载默认表盘 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadAllDial: Loading default dials"); LoadAllDialFromDefult(); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadAllDial: After default dials, count = %d", dialInfoList.size()); + // 加载自定义表盘 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadAllDial: Loading RAM dials"); LoadAllDialFromRam(); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadAllDial: After RAM dials, count = %d", dialInfoList.size()); + // 加载离线表盘 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadAllDial: Loading FS dials"); LoadAllDialFromFs(); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadAllDial: After FS dials, count = %d", dialInfoList.size()); + /* 排序离线表盘 std::sort(dialInfoList.begin() + dialSize, dialInfoList.end(), [](const SetDialInfo &f, const SetDialInfo &n) { @@ -435,6 +558,8 @@ void SetDialModel::LoadAllDial() { [](const SetDialInfo &f, const SetDialInfo &n) { return f.dialName < n.dialName; }); + + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadAllDial: Finished loading, total dial count = %d", dialInfoList.size()); } /*加载离线表盘*/ void SetDialModel::LoadAllDialFromFs() { @@ -472,15 +597,11 @@ void SetDialModel::LoadAllDialFromFs() { 加载默认表盘 */ const std::vector defaultDials = { - "lake", "eagle", "vibrantnumber", "distortion", "science", + "lake", "eagle", "vibrant_number", "distortion", "science", }; void SetDialModel::LoadAllDialFromDefult(void) { -#ifdef BOARD_W9 - return; // w9暂时没有默认表盘 -#endif - DIR *dirp = opendir(APP_DEFAULT_DIAL_PATH); if (dirp == nullptr) { perror("Failed to open directory"); @@ -583,8 +704,23 @@ int32_t SetDialModel::ParseDialHeader(int type, const std::string &dialFileName, dialInfo.id = 0; dialInfo.resId = preInfo.imgId; dialInfo.dialFullName = dialFullName; - dialInfo.dialName = preInfo.dialName; - dialInfo.description = preInfo.description; + + // 使用文件名(去掉 .bin 后缀)作为 dialName,而不是文件头中的 dialName + // 这样可以保证与 registeredDials 中的名称一致(registeredDials 使用文件名) + // 文件头中的 dialName 可能包含额外描述(如 "classic_elegance鎏金简约"), + // 而文件名是 "classic_elegance.bin",去掉后缀后是 "classic_elegance" + std::string fileName = dialFileName; + size_t dotPos = fileName.find_last_of('.'); + if (dotPos != std::string::npos) { + fileName = fileName.substr(0, dotPos); // 去掉 .bin 后缀 + } + dialInfo.dialName = fileName; // 使用文件名作为 dialName,确保与 registeredDials 一致 + dialInfo.description = preInfo.description; // 保留文件头中的 description 用于显示 + + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "ParseDialHeader: Using filename as dialName: '%s' (file header dialName was '%s')", + dialInfo.dialName.c_str(), preInfo.dialName); + dialInfo.preImageInfo = info; dialInfo.capability = preInfo.capability; @@ -629,8 +765,18 @@ void SetDialModel::SaveDialSetting(uint8_t pageIndex) { /*获取表盘的总数*/ size_t SetDialModel::GetDialCount(void) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " %d ", dialInfoList.size()); - return dialInfoList.size(); + size_t count = dialInfoList.size(); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetDialCount: dialInfoList.size() = %d", count); + + // 如果表盘列表为空,尝试重新加载 + 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); + } + + return count; } /*获取表盘列表*/ @@ -990,8 +1136,7 @@ bool check_dial_freespace_(uint16_t id, uint32_t dial_size) { } void ble_get_dial_path_(char *buf, uint16_t id) { - char *path = - (char *)OHOS::SetDialModel::GetInstance().GetSaveDir(id, 0).c_str(); + char *path =(char *)OHOS::SetDialModel::GetInstance().GetSaveDir(id, 0).c_str(); memcpy(buf, path, strlen(path) + 1); // printf("ble_get_dial_path_ %s\n", path); return; @@ -1007,13 +1152,15 @@ void ble_save_dial_custom_(msg_recv_custom_dial_info_t *data) { } void ble_set_dial_by_id__(uint16_t id) { - printf("ble_set_dial_by_id_ %d\n", id); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ble_set_dial_by_id__: Called with id=%d", id); OHOS::SetDialModel::GetInstance().UpdateDialSetting(id); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ble_set_dial_by_id__: UpdateDialSetting returned"); } void ble_set_dial_by_id_(uint16_t id) { - printf("ble_set_dial_by_id %d\n", id); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ble_set_dial_by_id_: Called with id=%d, posting to graphic event", id); GraphicService::GetInstance()->PostGraphicEvent( std::bind(ble_set_dial_by_id__, id)); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ble_set_dial_by_id_: Graphic event posted"); } void ble_get_custom_dial_(uint16_t id, char *buf) { @@ -1053,6 +1200,7 @@ 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; -- 2.17.1