From: Caisking <3449750381@qq.com> Date: Thu, 11 Apr 2024 10:10:44 +0000 (+0800) Subject: 订阅训练消息 X-Git-Tag: release_V1.2.70_20241020_135402~1210^2~3 X-Git-Url: http://git.snicker.com.cn/?a=commitdiff_plain;h=73d3b09d2632666a0bff7a2de2f2edbb7cd6de94;p=mirrors%2FFD230.git 订阅训练消息 --- diff --git a/code/sdk/application/wearable/fd230app/nativelauncher/src/NativeLauncher.cpp b/code/sdk/application/wearable/fd230app/nativelauncher/src/NativeLauncher.cpp index 9ef81e80f..00b23109d 100644 --- a/code/sdk/application/wearable/fd230app/nativelauncher/src/NativeLauncher.cpp +++ b/code/sdk/application/wearable/fd230app/nativelauncher/src/NativeLauncher.cpp @@ -405,6 +405,7 @@ namespace OHOS VocassistModel::GetInstance()->Init(); HeartModel::GetInstance()->Init(); BluetoothModel::GetInstance()->Init(); + TraingModel::GetInstance()->Init();//训练消息订阅 // 初始化默认首页 ScreenModels::GetInstance()->PreLoadAppimages(); NativeAbility::GetInstance().SetDefaultSliceId(VIEW_MAIN); diff --git a/code/sdk/application/wearable/fd230app/nativeui/traing/include/TraingModel.h b/code/sdk/application/wearable/fd230app/nativeui/traing/include/TraingModel.h index f2c656957..5e8b65ff1 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/traing/include/TraingModel.h +++ b/code/sdk/application/wearable/fd230app/nativeui/traing/include/TraingModel.h @@ -161,6 +161,9 @@ namespace OHOS TraingModel(); ~TraingModel(); static TraingModel *GetInstance(void); + void Init(); + + /*训练组件初始化*/ bool InitLabel(UILabelExt *&label, int left, int top, int width, int height, const char *viewId, const char *text, const char *fontName, int fontSize); bool InitLabelExt(UILabelExt *&label, int left, int top, int width, int height, const char *viewId, UIResourceTextId id, const char *fontName, int fontSize); bool InitButton(UIButton *&button, int left, int top, int width, int height, const char *viewId); diff --git a/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingModel.cpp index 1d267d0f9..13e680e26 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingModel.cpp @@ -21,10 +21,143 @@ #define CHECK 0 #define HARD_OFF 1 #define TRAINING_PATH "user/userdata/sportdata/" + +#ifdef __cplusplus extern "C" { +#endif static void Notify(void *args, const Topic topic, Request *request); + + using namespace OHOS; + + Subscriber TraingSubscirber = { + .identity = NULL, + .args = NULL, + .Notify = Notify, + }; + + void TraingSubscribeTopic(Topic topic) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "stepsubscribeTopic, topic=%u", topic); + BroadcastApi *broadcastApi = NULL; + IUnknown *api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME, BROADCAST_FEATURE_NAME); + if (api == NULL) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "stepsubscribeTopic, GetFeatureApi failed"); + return; + } + int result = api->QueryInterface(api, DEFAULT_VERSION, (void **)&broadcastApi); + if (result != 0 || broadcastApi == NULL) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "stepsubscribeTopic, QueryInterface failed"); + return; + } + broadcastApi->SubscribeTopic((IUnknown *)broadcastApi, topic, &TraingSubscirber); + broadcastApi->Release((IUnknown *)broadcastApi); + } + + void TraingUnsubscribeTopic(Topic topic) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TraingUnsubscribeTopic, topic=%u", topic); + BroadcastApi *broadcastApi = NULL; + IUnknown *api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME, BROADCAST_FEATURE_NAME); + if (api == NULL) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TraingUnsubscribeTopic, GetFeatureApi failed"); + return; + } + int result = api->QueryInterface(api, DEFAULT_VERSION, (void **)&broadcastApi); + if (result != 0 || broadcastApi == NULL) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TraingUnsubscribeTopic, QueryInterface failed"); + return; + } + broadcastApi->UnsubscribeTopic((IUnknown *)broadcastApi, topic, &TraingSubscirber); + broadcastApi->Release((IUnknown *)broadcastApi); + } + static void Notify(void *args, const Topic topic, Request *request) + { + UNUSED(args); + UNUSED(topic); + if (request == NULL) + { + return; + } + cywee_activity_result_t *cyweeInfo = nullptr; // 在switch语句外部定义变量 + int rets; + PRINT("request %d\r\n", request->msgId); + switch (request->msgId) + { + case TOPIC_EVENT_TREADMILL_UPDATE: + cyweeInfo = new cywee_activity_result_t(); // 在case块内分配内存 + rets = memcpy_s(cyweeInfo, sizeof(cywee_activity_result_t), (cywee_activity_result_t *)request->data, request->len); + if (rets != EOK) + { + delete cyweeInfo; // 处理内存分配失败的情况 + cyweeInfo = NULL; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "memcpy_s cywee_activity_result_t fail! ret = %d", rets); + return; + } + TraingModel::GetInstance()->AnalysisData(cyweeInfo); + break; + case TOPIC_EVENT_OUTDOOR_RUNNING_UPDATE: + cyweeInfo = new cywee_activity_result_t(); // 在case块内分配内存 + rets = memcpy_s(cyweeInfo, sizeof(cywee_activity_result_t), (cywee_activity_result_t *)request->data, request->len); + if (rets != EOK) + { + delete cyweeInfo; // 处理内存分配失败的情况 + cyweeInfo = NULL; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "memcpy_s cywee_activity_result_t fail! ret = %d", rets); + return; + } + TraingModel::GetInstance()->AnalysisData(cyweeInfo); + break; + case TOPIC_EVENT_INDOOR_RUNNING_UPDATE: + cyweeInfo = new cywee_activity_result_t(); // 在case块内分配内存 + rets = memcpy_s(cyweeInfo, sizeof(cywee_activity_result_t), (cywee_activity_result_t *)request->data, request->len); + if (rets != EOK) + { + delete cyweeInfo; // 处理内存分配失败的情况 + cyweeInfo = NULL; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "memcpy_s cywee_activity_result_t fail! ret = %d", rets); + return; + } + TraingModel::GetInstance()->AnalysisData(cyweeInfo); + break; + case TOPIC_EVENT_FITNESS_PEDOMETERR_UPDATE: + cyweeInfo = new cywee_activity_result_t(); // 在case块内分配内存 + rets = memcpy_s(cyweeInfo, sizeof(cywee_activity_result_t), (cywee_activity_result_t *)request->data, request->len); + if (rets != EOK) + { + delete cyweeInfo; // 处理内存分配失败的情况 + cyweeInfo = NULL; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "memcpy_s cywee_activity_result_t fail! ret = %d", rets); + return; + } + TraingModel::GetInstance()->AnalysisData(cyweeInfo); + break; + case TOPIC_EVENT_FREE_TRAINING_UPDATE: + cyweeInfo = new cywee_activity_result_t(); // 在case块内分配内存 + rets = memcpy_s(cyweeInfo, sizeof(cywee_activity_result_t), (cywee_activity_result_t *)request->data, request->len); + if (rets != EOK) + { + delete cyweeInfo; // 处理内存分配失败的情况 + cyweeInfo = NULL; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "memcpy_s cywee_result_t fail! ret = %d", rets); + return; + } + TraingModel::GetInstance()->AnalysisData(cyweeInfo); + break; + default: + // 处理未知msgId的情况 + break; + } + delete cyweeInfo; // 释放内存 + } +#ifdef __cplusplus } +#endif + namespace OHOS { #if TIMER @@ -58,12 +191,30 @@ namespace OHOS TraingModel ::~TraingModel() { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TraingModel::~TraingModel()"); + // 取消订阅 + TraingUnsubscribeTopic(TOPIC_EVENT_TREADMILL_UPDATE); + TraingUnsubscribeTopic(TOPIC_EVENT_OUTDOOR_RUNNING_UPDATE); + TraingUnsubscribeTopic(TOPIC_EVENT_INDOOR_RUNNING_UPDATE); + TraingUnsubscribeTopic(TOPIC_EVENT_FITNESS_PEDOMETERR_UPDATE); + TraingUnsubscribeTopic(TOPIC_EVENT_FREE_TRAINING_UPDATE); } TraingModel *TraingModel::GetInstance(void) { static TraingModel instance; return &instance; } + + void TraingModel ::Init() + { + // 进行消息订阅 + TraingSubscribeTopic(TOPIC_EVENT_TREADMILL_UPDATE); + TraingSubscribeTopic(TOPIC_EVENT_OUTDOOR_RUNNING_UPDATE); + TraingSubscribeTopic(TOPIC_EVENT_INDOOR_RUNNING_UPDATE); + TraingSubscribeTopic(TOPIC_EVENT_FITNESS_PEDOMETERR_UPDATE); + TraingSubscribeTopic(TOPIC_EVENT_FREE_TRAINING_UPDATE); + } + + /* -------------------------------------------------------------------------- */ /*** * @description: * @param {QuickTraining} *quickTraining @@ -317,14 +468,14 @@ namespace OHOS // 通用数据 sportdata->calories = cyweeInfo->calories; sportdata->duration = cyweeInfo->duration; - PRINT("normal sportdata->calories[%d],sportdata->duration[%d] \r\n",sportdata->calories,sportdata->duration); + PRINT("normal sportdata->calories[%d],sportdata->duration[%d] \r\n", sportdata->calories, sportdata->duration); switch (type) { case ExerciseClass::OUTDOOR: case ExerciseClass::INDOOR: sportdata->distance = cyweeInfo->distance; sportdata->steps = cyweeInfo->steps; - PRINT("indoor sportdata->distance[%d],sportdata->steps[%d] \r\n",sportdata->distance,sportdata->steps); + PRINT("indoor sportdata->distance[%d],sportdata->steps[%d] \r\n", sportdata->distance, sportdata->steps); break; case ExerciseClass::FREE_TRAINING: break; @@ -336,84 +487,7 @@ namespace OHOS { return sportdata; } - static void Notify(void *args, const Topic topic, Request *request) - { - UNUSED(args); - UNUSED(topic); - if (request == NULL) - { - return; - } - cywee_activity_result_t *cyweeInfo = nullptr; // 在switch语句外部定义变量 - int rets; - switch (request->msgId) - { - case TOPIC_EVENT_TREADMILL_UPDATE: - cyweeInfo = new cywee_activity_result_t(); // 在case块内分配内存 - rets = memcpy_s(cyweeInfo, sizeof(cywee_activity_result_t), (cywee_activity_result_t *)request->data, request->len); - if (rets != EOK) - { - delete cyweeInfo; // 处理内存分配失败的情况 - cyweeInfo = NULL; - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "memcpy_s cywee_activity_result_t fail! ret = %d", rets); - return; - } - TraingModel::GetInstance()->AnalysisData(cyweeInfo); - break; - case TOPIC_EVENT_OUTDOOR_RUNNING_UPDATE: - cyweeInfo = new cywee_activity_result_t(); // 在case块内分配内存 - rets = memcpy_s(cyweeInfo, sizeof(cywee_activity_result_t), (cywee_activity_result_t *)request->data, request->len); - if (rets != EOK) - { - delete cyweeInfo; // 处理内存分配失败的情况 - cyweeInfo = NULL; - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "memcpy_s cywee_activity_result_t fail! ret = %d", rets); - return; - } - TraingModel::GetInstance()->AnalysisData(cyweeInfo); - break; - case TOPIC_EVENT_INDOOR_RUNNING_UPDATE: - cyweeInfo = new cywee_activity_result_t(); // 在case块内分配内存 - rets = memcpy_s(cyweeInfo, sizeof(cywee_activity_result_t), (cywee_activity_result_t *)request->data, request->len); - if (rets != EOK) - { - delete cyweeInfo; // 处理内存分配失败的情况 - cyweeInfo = NULL; - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "memcpy_s cywee_activity_result_t fail! ret = %d", rets); - return; - } - TraingModel::GetInstance()->AnalysisData(cyweeInfo); - break; - case TOPIC_EVENT_FITNESS_PEDOMETERR_UPDATE: - cyweeInfo = new cywee_activity_result_t(); // 在case块内分配内存 - rets = memcpy_s(cyweeInfo, sizeof(cywee_activity_result_t), (cywee_activity_result_t *)request->data, request->len); - if (rets != EOK) - { - delete cyweeInfo; // 处理内存分配失败的情况 - cyweeInfo = NULL; - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "memcpy_s cywee_activity_result_t fail! ret = %d", rets); - return; - } - TraingModel::GetInstance()->AnalysisData(cyweeInfo); - break; - case TOPIC_EVENT_FREE_TRAINING_UPDATE: - cyweeInfo = new cywee_activity_result_t(); // 在case块内分配内存 - rets = memcpy_s(cyweeInfo, sizeof(cywee_activity_result_t), (cywee_activity_result_t *)request->data, request->len); - if (rets != EOK) - { - delete cyweeInfo; // 处理内存分配失败的情况 - cyweeInfo = NULL; - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "memcpy_s cywee_result_t fail! ret = %d", rets); - return; - } - TraingModel::GetInstance()->AnalysisData(cyweeInfo); - break; - default: - // 处理未知msgId的情况 - break; - } - delete cyweeInfo; // 释放内存 - } + /* -------------------------------------------------------------------------- */ #if TIMER /* 时间显示 */ diff --git a/code/sdk/application/wearable/fd230app/nativeui/traing/training_card/src/TraingCardPresenter.cpp b/code/sdk/application/wearable/fd230app/nativeui/traing/training_card/src/TraingCardPresenter.cpp index 934e7dc31..ece849813 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/traing/training_card/src/TraingCardPresenter.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/traing/training_card/src/TraingCardPresenter.cpp @@ -11,6 +11,8 @@ #include "traing/training_card/include/TraingCardPresenter.h" #include "traing/include/TraingModel.h" #include "custom_utils.h" +#include +#include extern "C" void do_cywee_service_check_msg(int cmd); @@ -155,6 +157,7 @@ namespace OHOS WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ControlSensor--%d!!", state); return true; } + void TraingCardPresenter::RefreshData() { SportData *sportdata = TraingModel::GetInstance()->GetSportdata(); @@ -165,10 +168,14 @@ namespace OHOS return; } - std::string calorieStr = std::to_string(sportdata->calories); + double distance_km = sportdata->distance / 1000.0; // 转换为公里 + std::stringstream stream; + stream << std::fixed << std::setprecision(2) << distance_km; + std::string distanceStr = stream.str(); + + std::string calorieStr = (sportdata->calories != 0) ? std::to_string(sportdata->calories) : "--"; std::string durationStr = std::to_string(sportdata->duration); - std::string stepsStr = std::to_string(sportdata->steps); - std::string distanceStr = std::to_string(sportdata->distance); + std::string stepsStr = (sportdata->steps != 0) ? std::to_string(sportdata->steps) : "--"; TrainingDetailView::GetInstance()->GetHeartLabel()->SetText("0"); TrainingDetailView::GetInstance()->GetCalorieLabel()->SetText(calorieStr.c_str());