From 454c22bd4ac57912f95d4877e695f7aa3d31bf16 Mon Sep 17 00:00:00 2001 From: SnickerSun Date: Fri, 11 Oct 2024 07:05:00 +0800 Subject: [PATCH] =?utf8?q?=E5=90=8C=E6=AD=A5=E6=B6=88=E6=81=AF=E6=8E=A5?= =?utf8?q?=E6=94=B6=E8=BF=87=E6=BB=A4=E6=9C=BA=E5=88=B60.5=E7=A7=92?= =?utf8?q?=E4=B8=BA=E9=99=90=E5=88=B6=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../nativeui/message/src/MessageModel.cpp | 155 ++++++++++-------- 1 file changed, 85 insertions(+), 70 deletions(-) diff --git a/code/sdk/application/wearable/fd230app/nativeui/message/src/MessageModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/message/src/MessageModel.cpp index b70e889fc..89281d197 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/message/src/MessageModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/message/src/MessageModel.cpp @@ -110,7 +110,7 @@ void MessageUnsubscribeTopic(Topic topic) { } // 存储消息更新的定时器 -static std::chrono::milliseconds updateDelay(1000); // 设置更新延迟,1s +static std::chrono::milliseconds updateDelay(500); // 设置更新延迟,0.5s static std::chrono::steady_clock::time_point lastUpdateTime; static bool shouldDisplayMessage = false; static ancs_data_info_t *lastMessageInfo = NULL; @@ -120,75 +120,90 @@ static void Notify(void *args, const Topic topic, Request *request) { UNUSED(args); UNUSED(topic); - if (request == NULL) { - return; - } - - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "request %d\r\n", request->msgId); - - if (request->msgId == TOPIC_EVENT_MESSAGE_UPDATA) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TOPIC_EVENT_MESSAGE_UPDATA"); - - // 创建新的消息信息 - ancs_data_info_t *messageInfo = new ancs_data_info_t(); - if (messageInfo == NULL) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new ancs_data_info_t fail"); - return; - } - - // 复制请求数据到新的消息信息 - int rets = memcpy_s(messageInfo, sizeof(ancs_data_info_t), - (ancs_data_info_t *)request->data, request->len); - if (rets != EOK) { - delete messageInfo; - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, - "memcpy_s ancs_data_info_t fail ret = %d", rets); - return; - } - - // 更新到模型里面的数组 - MessageModel::GetInstance().AddMessageData(messageInfo); - - // 加锁以保护共享变量 - std::lock_guard lock(messageMutex); - - // 更新最后一条消息信息 - if (lastMessageInfo != NULL) { - delete lastMessageInfo; // 释放之前保存的消息信息 - } - lastMessageInfo = messageInfo; // 保存新的消息信息 - shouldDisplayMessage = true; // 标记需要显示新消息 - - // 设置最后更新时间 - lastUpdateTime = std::chrono::steady_clock::now(); - } - - // 检查是否需要显示新消息 - { - std::lock_guard lock(messageMutex); // 加锁以保护共享变量 - - if (shouldDisplayMessage) { - // 检查是否达到延迟时间 - auto now = std::chrono::steady_clock::now(); - if (now - lastUpdateTime >= updateDelay) { - // 发送信息进行弹窗 - if (uapi_dev_runtime_get_train_status() || - uapi_dev_runtime_get_saveele_status() || - uapi_dev_runtime_get_respiratory_training_status()) { - // 增加训练模式下,不弹窗 - // 省电模式,不弹窗 - // 呼吸训练,不弹窗 - return; - } - - // 发送弹窗通知 会自动查询到数组的最新一个 - CustomEventPublish(TOPIC_EVENT_MESSAGENOTE, NULL, 0); - - // 发送完毕,重置标志 - shouldDisplayMessage = false; // 重置状态 - } - } - } + if (request == NULL) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Received NULL request"); + return; + } + + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Received request %d", request->msgId); + + if (request->msgId == TOPIC_EVENT_MESSAGE_UPDATA) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "Processing TOPIC_EVENT_MESSAGE_UPDATA"); + + // 创建新的消息信息 + ancs_data_info_t *messageInfo = new ancs_data_info_t(); + if (messageInfo == NULL) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "Failed to allocate memory for ancs_data_info_t"); + return; + } + + // 复制请求数据到新的消息信息 + int rets = memcpy_s(messageInfo, sizeof(ancs_data_info_t), + (ancs_data_info_t *)request->data, request->len); + if (rets != EOK) { + delete messageInfo; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "memcpy_s ancs_data_info_t failed, ret = %d", rets); + return; + } + + // 更新到模型里面的数组 + MessageModel::GetInstance().AddMessageData(messageInfo); + + // 加锁以保护共享变量 + { + std::lock_guard lock(messageMutex); + shouldDisplayMessage = true; // 标记需要显示新消息 + + // 设置最后更新时间 + lastUpdateTime = std::chrono::steady_clock::now(); + } + + // 直接尝试显示消息(用于单条消息的情况) + { + std::lock_guard lock(messageMutex); // 加锁以保护共享变量 + + // 检查是否达到延迟时间 + auto now = std::chrono::steady_clock::now(); + auto timeDiff = now - lastUpdateTime; + WEARABLE_LOGD( + WEARABLE_LOG_MODULE_APP, "Time since last update: %lld milliseconds", + std::chrono::duration_cast(timeDiff) + .count()); + + if (timeDiff >= updateDelay) { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, + "Displaying new message after time delay"); + + // 发送信息进行弹窗 + if (uapi_dev_runtime_get_train_status() || + uapi_dev_runtime_get_saveele_status() || + uapi_dev_runtime_get_respiratory_training_status()) { + // 增加训练模式下,不弹窗 + // 省电模式,不弹窗 + // 呼吸训练,不弹窗 + return; + } + + // 发送弹窗通知 会自动查询到数组的最新一个 + CustomEventPublish(TOPIC_EVENT_MESSAGENOTE, NULL, 0); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Message popup sent"); + + // 发送完毕,重置标志 + shouldDisplayMessage = false; // 重置状态 + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, + "Reset shouldDisplayMessage to false"); + } else { + WEARABLE_LOGE( WEARABLE_LOG_MODULE_APP, "Message display delayed, waiting for next opportunity %lld ms %lld ms", + std::chrono::duration_cast(timeDiff).count(), + std::chrono::duration_cast(updateDelay).count()); + } + } + } else { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "No new message to display"); + } } void saveancsdata() { -- 2.17.1