+/***
+ * @Date: 2024-05-30 15:59:37
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-06-12 10:26:15
+ * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/set_dial/src/SetDialModel.cpp
+ */
/*
* Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
* Description: SetDialModel.cpp
#include "securec.h"
#include "dirent.h"
#include "DialBinParser.h"
+#include "custom_utils.h"
#include "wearable_log.h"
-namespace OHOS {
+namespace OHOS
+{
+ // 在头文件中定义常量
+ constexpr uint16_t MAX_DEFAULT_DIAL_ID = 103;
+ constexpr uint16_t DEFAULT_DIAL_ID_1 = 1028;
+ constexpr uint16_t DEFAULT_DIAL_ID_2 = 1052;
+
+ // 表盘map[Id--dialname] 前5个ID固定
+ std::unordered_map<uint16_t, std::string> registeredDials{
+ {DEFAULT_DIAL_ID_1, "KUMI"},
+ {DEFAULT_DIAL_ID_2, "classic"}, // 经典表盘
+ {101, "motiondial"}, // 运动表盘
+ {102, "kaleidoscope"}, // 万花筒表盘
+ {MAX_DEFAULT_DIAL_ID, "jellyfish"}, // 水母表盘
+ };
+
SetDialModel::SetDialModel() {}
SetDialModel::~SetDialModel() {}
static SetDialModel instance;
return instance;
}
+
+ /* 注册表盘map */
+ void SetDialModel::RegisterDial(uint16_t ID, const char *dialname)
+ {
+ registeredDials[ID] = dialname; // 唯一性
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RegisterDial %s is ok!", dialname);
+ }
+ /* 打印map */
+ void SetDialModel::PrintRegisteredDials(const std::unordered_map<uint16_t, std::string> &dials)
+ {
+ printf("Registered Dials:\n");
+ for (const auto &entry : dials)
+ {
+ printf("ID: %u | Name: %s\n", entry.first, entry.second.c_str());
+ }
+ }
+ /* 通过名字查询Id */
+ uint16_t SetDialModel::GetDialIdFromName(const std::string &dialName)
+ {
+ for (const auto &entry : registeredDials)
+ {
+ if (entry.second == dialName)
+ {
+ return entry.first; // 找到对应的表盘名称,返回对应ID
+ }
+ }
+ return 0; // 如果未找到对应的表盘名称,返回0或者其他适当的默认值
+ }
+ /* 获取当前表盘Id */
+ uint16_t SetDialModel::GetCurrentDialID()
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "currentDialID is %d,name is %s", currentDialID, registeredDials[currentDialID].c_str());
+ return currentDialID;
+ }
+ /* 判断表盘是否存在*/
+ bool SetDialModel::IsDialInstalled(uint16_t ID)
+ {
+ if (registeredDials.find(ID) != registeredDials.end())
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "dial %d is install!", ID);
+ return true;
+ }
+ else
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "dial %d is not install!", ID);
+ return false;
+ }
+ }
+ /* 删除表盘 */
+ bool SetDialModel::UninstallDial(uint16_t ID)
+ {
+ if (registeredDials.find(ID) != registeredDials.end())
+ {
+ // 默认表盘不删除
+ if (ID <= MAX_DEFAULT_DIAL_ID || ID == DEFAULT_DIAL_ID_1 || ID == DEFAULT_DIAL_ID_2)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UninstallDial default dial %d fail", ID);
+ return false;
+ }
+ registeredDials.erase(ID);
+ /*删除文件操作*/
+ std::string dialFullName = APP_DIAL_PATH;
+ dialFullName += "/";
+ dialFullName += registeredDials[ID];
+ dialFullName += ".bin";
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UninstallDial %s", dialFullName.c_str());
+ if (uapi_delete_files(dialFullName))
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UninstallDial the dial %d is ok", ID);
+ return true;
+ }
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "uapi_delete_files the dial %d is false", ID);
+ return false;
+ }
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Couldn't find the dial %d", ID);
+ return false;
+ }
+ /*更新表盘*/
+ void SetDialModel::UpdateDialSetting(uint16_t ID)
+ {
+ std::string dialname = registeredDials[ID]; // 根据ID找到对应的表盘名称
+ // 在dialInfoList中查找同名表盘
+ for (size_t i = 0; i < dialInfoList.size(); i++)
+ {
+ if (dialInfoList[i].dialName == dialname)
+ {
+ DialSetting diagSetting;
+ SetDialInfo &info = dialInfoList[i];
+ diagSetting.dialFlag = info.dialFlag;
+ diagSetting.dialId = info.id;
+ diagSetting.dialFullName = info.dialFullName;
+ MainModel::GetInstance().AddDialSetting(diagSetting); // 更新表盘设置
+ currentDialID = ID; // 更新当前表盘Id
+ return; // 更新成功后直接返回
+ }
+ }
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetDialModel UpdateDialSetting: Cannot find dial with name %s", dialname.c_str());
+ }
+
+ /*加载所有表盘*/
void SetDialModel::LoadAllDial()
{
dialInfoList.clear();
size_t dialSize = dialInfoList.size();
LoadAllDialFromFs();
/* 只排序离线表盘 */
- std::sort(dialInfoList.begin() + dialSize, dialInfoList.end(), [](const SetDialInfo& f, const SetDialInfo& n) {
- return f.dialName < n.dialName;
- });
+ std::sort(dialInfoList.begin() + dialSize, dialInfoList.end(), [](const SetDialInfo &f, const SetDialInfo &n)
+ { return f.dialName < n.dialName; });
+ PrintRegisteredDials(registeredDials);
}
-
+ /*加载自定义表盘*/
void SetDialModel::LoadAllDialFromRam()
{
- for (uint8_t i = DIAL_CLOCK; i < DIAL_MAX; i++) {
+ for (uint8_t i = DIAL_CLOCK; i < DIAL_MAX; i++)
+ {
const DialInfo *info = MainModel::GetInstance().GetDialInfo((DialId)i);
- if (info != nullptr) {
+ if (info != nullptr)
+ {
SetDialInfo dialInfo{0};
dialInfo.dialFlag = 0;
dialInfo.id = i;
dialInfo.dialName = info->dialName;
dialInfo.imageFullName = info->dialImg;
- ImageInfo* imageInfo = ImageCacheManager::GetInstance().LoadSingleRes(info->dialImg, false);
- if (info == nullptr) {
+ ImageInfo *imageInfo = ImageCacheManager::GetInstance().LoadSingleRes(info->dialImg, false);
+ if (info == nullptr)
+ {
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LoadAllDialFromRam loadimage %s fail",
info->dialImg);
continue;
}
}
}
-
+ /*加载离线表盘*/
void SetDialModel::LoadAllDialFromFs()
{
int ret;
// 打开目录
DIR *dirp = opendir(APP_DIAL_PATH);
// 遍历文件
- if (dirp != nullptr) {
- while ((direntp = readdir(dirp)) != nullptr) {
+ if (dirp != nullptr)
+ {
+ while ((direntp = readdir(dirp)) != nullptr)
+ {
SetDialInfo dialInfo{0};
int ret = ParseDialHeader(direntp->d_name, dialInfo);
- if (ret == 0) {
+ if (ret == 0)
+ {
dialInfoList.push_back(dialInfo);
}
}
closedir(dirp);
return;
}
-
+ /*通过表盘名称解析表盘*/
int32_t SetDialModel::ParseDialHeader(const std::string &dialFileName, SetDialInfo &dialInfo)
{
std::string dialFullName = APP_DIAL_PATH;
dialFullName += "/";
dialFullName += dialFileName;
FILE *fp = fopen(dialFullName.c_str(), "rb");
- if (fp == nullptr) {
+ if (fp == nullptr)
+ {
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ParseDialHeader cannot open file: %s",
dialFullName.c_str());
return -1;
}
DialPreviewInfo preInfo{0};
bool ret = DialBinParser::GetInstance()->GetDialPreviewInfo(fp, &preInfo);
- if (!ret) {
+ if (!ret)
+ {
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GetDialPreviewInfo %s fail",
dialFullName.c_str());
return -1;
}
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ParseDialHeader dialFullName: %s",
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ParseDialHeader dialFullName: %s",
dialFullName.c_str());
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ParseDialHeader dialName: %s",
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ParseDialHeader dialName: %s",
preInfo.dialName);
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ParseDialHeader description: %s",
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ParseDialHeader description: %s",
preInfo.description);
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ParseDialHeader previewImgId: %u",
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ParseDialHeader previewImgId: %u",
preInfo.imgId);
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ParseDialHeader imageOffset: %u",
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ParseDialHeader imageOffset: %u",
preInfo.offset);
ImageInfo *info = ImageCacheManager::GetInstance().LoadOneInMultiRes(
preInfo.imgId, dialFullName, fp, false, preInfo.offset);
- if (info == nullptr) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ParseDialHeader loadimage fail");
+ if (info == nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ParseDialHeader loadimage fail");
return -1;
}
dialInfo.description = preInfo.description;
dialInfo.preImageInfo = info;
+ // 需要判断表盘是否存在 不存在->新表盘注册
+ if (GetDialIdFromName(dialInfo.dialName) == 0)
+ {
+ // 找到已注册表盘中最大的ID
+ uint16_t maxDialId = 103;
+ for (auto it = registeredDials.begin(); it != registeredDials.end(); ++it)
+ {
+ if (it->first >= maxDialId && it->first != DEFAULT_DIAL_ID_1 && it->first != DEFAULT_DIAL_ID_2)
+ {
+ maxDialId = it->first;
+ }
+ }
+ // 分配新的表盘ID为最大ID加1
+ uint16_t newDialId = maxDialId + 1;
+ // 注册表盘,将表盘ID和表盘文件名添加到 registeredDials 中
+ RegisterDial(newDialId, (dialInfo.dialName).c_str());
+ }
+
fclose(fp);
return 0;
}
+ /*设置表盘*/
void SetDialModel::SaveDialSetting(uint8_t pageIndex)
{
- if (pageIndex >= dialInfoList.size()) {
+ if (pageIndex >= dialInfoList.size())
+ {
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetDialModel SaveDialSetting [%u %u]",
pageIndex, dialInfoList.size());
return;
diagSetting.dialId = info.id;
diagSetting.dialFullName = info.dialFullName;
MainModel::GetInstance().AddDialSetting(diagSetting);
+ currentDialID = GetDialIdFromName(info.dialName); // 更新表盘Id
}
+ /*获取表盘的总数*/
size_t SetDialModel::GetDialCount(void)
{
return dialInfoList.size();
}
- std::vector<SetDialInfo>& SetDialModel::GetDialInfo(void)
+ /*获取表盘列表*/
+ std::vector<SetDialInfo> &SetDialModel::GetDialInfo(void)
{
return dialInfoList;
}
{
uint8_t index = 0;
DialSetting dialSetting = MainModel::GetInstance().GetDialSetting();
- for (auto iter : dialInfoList) {
- if (dialSetting.dialFlag) {
- if (strcmp(iter.dialFullName.c_str(), dialSetting.dialFullName.c_str()) == 0) {
+ for (auto iter : dialInfoList)
+ {
+ if (dialSetting.dialFlag)
+ {
+ if (strcmp(iter.dialFullName.c_str(), dialSetting.dialFullName.c_str()) == 0)
+ {
return index;
}
- } else {
- if ((!iter.dialFlag) && (iter.id == dialSetting.dialId)) {
+ }
+ else
+ {
+ if ((!iter.dialFlag) && (iter.id == dialSetting.dialId))
+ {
return index;
}
}