订阅训练消息
authorCaisking <3449750381@qq.com>
Thu, 11 Apr 2024 10:10:44 +0000 (18:10 +0800)
committerCaisking <3449750381@qq.com>
Thu, 11 Apr 2024 10:10:44 +0000 (18:10 +0800)
code/sdk/application/wearable/fd230app/nativelauncher/src/NativeLauncher.cpp
code/sdk/application/wearable/fd230app/nativeui/traing/include/TraingModel.h
code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingModel.cpp
code/sdk/application/wearable/fd230app/nativeui/traing/training_card/src/TraingCardPresenter.cpp

index 9ef81e8..00b2310 100644 (file)
@@ -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);
index f2c6569..5e8b65f 100644 (file)
@@ -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);
index 1d267d0..13e680e 100644 (file)
 #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
     /* 时间显示 */
index 934e7dc..ece8498 100644 (file)
@@ -11,6 +11,8 @@
 #include "traing/training_card/include/TraingCardPresenter.h"\r
 #include "traing/include/TraingModel.h"\r
 #include "custom_utils.h"\r
+#include <iomanip>\r
+#include <sstream>\r
 \r
 extern "C" void do_cywee_service_check_msg(int cmd);\r
 \r
@@ -155,6 +157,7 @@ namespace OHOS
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ControlSensor--%d!!", state);\r
         return true;\r
     }\r
+\r
     void TraingCardPresenter::RefreshData()\r
     {\r
         SportData *sportdata = TraingModel::GetInstance()->GetSportdata();\r
@@ -165,10 +168,14 @@ namespace OHOS
             return;\r
         }\r
 \r
-        std::string calorieStr = std::to_string(sportdata->calories);\r
+        double distance_km = sportdata->distance / 1000.0; // 转换为公里\r
+        std::stringstream stream;\r
+        stream << std::fixed << std::setprecision(2) << distance_km;\r
+        std::string distanceStr = stream.str();\r
+\r
+        std::string calorieStr = (sportdata->calories != 0) ? std::to_string(sportdata->calories) : "--";\r
         std::string durationStr = std::to_string(sportdata->duration);\r
-        std::string stepsStr = std::to_string(sportdata->steps);\r
-        std::string distanceStr = std::to_string(sportdata->distance);\r
+        std::string stepsStr = (sportdata->steps != 0) ? std::to_string(sportdata->steps) : "--";\r
 \r
         TrainingDetailView::GetInstance()->GetHeartLabel()->SetText("0");\r
         TrainingDetailView::GetInstance()->GetCalorieLabel()->SetText(calorieStr.c_str());\r