272:添加定时器相关代码逻辑,添加压力值持久化保存逻辑
authorluozheng <1732036298@qq.com>
Wed, 22 Oct 2025 08:15:17 +0000 (16:15 +0800)
committerluozheng <1732036298@qq.com>
Wed, 22 Oct 2025 08:15:17 +0000 (16:15 +0800)
code/sdk/application/wearable/fd272/nativeapp/nativelauncher/src/NativeLauncher.cpp
code/sdk/application/wearable/fd272/nativeapp/nativeui/stress/include/stressTestModel.h
code/sdk/application/wearable/fd272/nativeapp/nativeui/stress/include/stressTestPresenter.h
code/sdk/application/wearable/fd272/nativeapp/nativeui/stress/include/stressTestUIConfig.h
code/sdk/application/wearable/fd272/nativeapp/nativeui/stress/src/stressTestMainView.cpp
code/sdk/application/wearable/fd272/nativeapp/nativeui/stress/src/stressTestModel.cpp
code/sdk/application/wearable/fd272/nativeapp/nativeui/stress/src/stressTestPresenter.cpp

index b2cb985..7db3159 100644 (file)
@@ -55,7 +55,7 @@
 #include "schedule/include/ScheduleModel.h"
 #include "sleep/include/SleepModel.h"
 #include "main/include/MainModel.h"
-
+#include "stress/include/stressTestModel.h"
 #ifdef SUPPORT_BATTERY_SERVICE
 #include "battery_hal.h"
 #endif
@@ -174,11 +174,8 @@ void NativeLauncher::InitNativeLauncher(LaunchMode mode)
         // 开机增加震动 页面启动震动一次
         // custom_VibratorFunc_int(0);
 
-        // 如果是雷鸟项目
-        #ifdef LEINIAO
-            NativeAbility::GetInstance().SetDefaultSliceId(VIEW_THUNDER_BIRD);
-            return;
-        #endif
+        // 初始化压力测试
+        StressTestModel::GetInstance().LoadResultFromFile();
     }
     // 注册开机时间  
     SystemLogData systemlog;  
index cdb0a20..d61adef 100644 (file)
@@ -35,6 +35,12 @@ namespace OHOS
         uint16_t GetCurrentResultValue(void);
         std::string GetCurrentResultValueStr(void);
         void HandleResultValue(uint16_t value);
+        void SaveResultToFile(void);
+        void LoadResultFromFile(void);
+
+        // 定时器相关
+        void StressTest_StartTimer(uint32_t interval = 60 * 1000, int type = 0);
+        void StressTest_StopTimer(void);
 
     private:
         StressTestModel();
@@ -42,9 +48,9 @@ namespace OHOS
         StressTestModel(const StressTestModel &) = delete;
         StressTestModel &operator=(const StressTestModel &) = delete;
         uint8_t currentView{0};
-        uint8_t currentFailType{FAIL_TYPE_NOT_WORN};       // 当前错误类型
-        uint8_t currentResultType{RESULT_TYPE_EXCELLENT};  // 当前结果类型
-        uint16_t currentResultValue{30};                   // 当前压力测试结果值
+        uint8_t currentFailType{FAIL_TYPE_NOT_WORN};   // 当前错误类型
+        uint8_t currentResultType{RESULT_TYPE_NORMAL}; // 当前结果类型
+        uint16_t currentResultValue{35};               // 当前压力测试结果值
     };
 }
 
index 84e2595..b5e9464 100644 (file)
@@ -7,6 +7,7 @@
 #include "wearable_log.h"
 #include "stress/include/stressTestUIConfig.h"
 #include "iostream"
+#include <cstdint>
 namespace OHOS
 {
     class StressTestMainView;
@@ -22,7 +23,9 @@ namespace OHOS
 
         void OnStart() override;
         void OnResume() override;
+        void OnStop() override;
 
+        void ChangeViewOperation(uint8_t hideView,uint8_t showView);
         uint8_t GetCurrentFailType(void);
         uint8_t GetCurrentResultType(void);
         std::string GetCurrentResultValueStr(void);
index 4b68a1a..4b7d0ba 100644 (file)
@@ -1,8 +1,20 @@
 #ifndef STRESS_TEST_UI_CONFIG_H
 #define STRESS_TEST_UI_CONFIG_H
 
+#include <stdint.h>
 namespace OHOS
 {
+    // 压力测试结果文件路径
+    static constexpr const char *STRESS_TEST_RESULT_FILE_PATH = "/user/userdata/stresstest_result.bin";
+    // 结果阈值(单位:ms),可按需要调参:
+    // EXCELLENT:   [0, STRESS_THRESHOLD_EXCELLENT_MAX]
+    // NORMAL:      (STRESS_THRESHOLD_EXCELLENT_MAX, STRESS_THRESHOLD_NORMAL_MAX]
+    // WARNING:     (STRESS_THRESHOLD_NORMAL_MAX, STRESS_THRESHOLD_WARNING_MAX]
+    // OVERLOAD:    > STRESS_THRESHOLD_WARNING_MAX
+    static constexpr uint16_t STRESS_THRESHOLD_EXCELLENT_MAX = 30;  // 优秀上限
+    static constexpr uint16_t STRESS_THRESHOLD_NORMAL_MAX    = 50;  // 正常上限
+    static constexpr uint16_t STRESS_THRESHOLD_WARNING_MAX   = 70;  // 注意上限
+
     // 压力测试结果视图背景图片:
     //  压力过载
     static constexpr const char *STRESS_TEST_RESULT_VIEW_BACKGROUND_IMAGE_1 = "/user/res/stress/stress_test_result_view_background_1.bin";
index c34b4eb..0d0a418 100644 (file)
@@ -62,7 +62,7 @@ namespace OHOS
 
     void StressTestMainView::OnStart()
     {
-        ChangeView(MAX_STRESSTESTMAINVIEW, STRESSTESTRESULTVIEW);
+        ChangeView(MAX_STRESSTESTMAINVIEW, STRESSTESTIDLEVIEW);
     }
 
     bool StressTestMainView::ChangeStressTestIdleView(int16_t thisView)
index 4e60522..7b35e40 100644 (file)
@@ -1,5 +1,12 @@
 #include "stress/include/stressTestModel.h"
+#include "stress/include/stressTestUIConfig.h"
 #include "wearable_log.h"
+#include "graphic_timer.h"
+#include "ohos_timer.h"
+#include "graphic_service.h"
+#include "custom_utils.h"
+#include <vibrator_service.h>
+#include <stdio.h>
 
 namespace OHOS
 {
@@ -11,6 +18,50 @@ namespace OHOS
         return instance;
     }
 
+    void StressTestModel::SaveResultToFile(void)
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StressTestModel::SaveResultToFile: 保存压力测试结果到文件");
+        FILE *fp = fopen(STRESS_TEST_RESULT_FILE_PATH, "w+");
+        if (fp == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SaveResultToFile open fail: %s", STRESS_TEST_RESULT_FILE_PATH);
+            return;
+        }
+        // 以纯文本写入一个整数值,便于排查
+        fprintf(fp, "%u\n", static_cast<unsigned>(currentResultValue));
+        fclose(fp);
+    }
+
+    void StressTestModel::LoadResultFromFile(void)
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StressTestModel::LoadResultFromFile: 加载压力测试结果到文件");
+        FILE *fp = fopen(STRESS_TEST_RESULT_FILE_PATH, "r");
+        if (fp == nullptr)
+        {
+            // 文件不存在则写入默认值并返回
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StressTestModel::LoadResultFromFile: 压力测试结果文件不存在,写入默认值");
+            SetCurrentResultValue(35);
+            SetCurrentResultType(RESULT_TYPE_NORMAL);
+            SaveResultToFile();
+            return;
+        }
+        unsigned value = 35;
+        if (fscanf(fp, "%u", &value) != 1)
+        {
+            // 读失败/格式不对,回退默认
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StressTestModel::LoadResultFromFile: 读取压力测试结果失败,回退默认值");
+            value = 35;
+        }
+        fclose(fp);
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StressTestModel::LoadResultFromFile: 读取压力测试结果成功,值为: %u", value);
+        if (value > 1000) // 简单有效性约束,防止脏数据
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StressTestModel::LoadResultFromFile: 值大于1000,回退默认值");
+            value = 35;
+        }
+        HandleResultValue(static_cast<uint16_t>(value));
+    }
+
     uint8_t StressTestModel::GetCurrentView(void)
     {
         return currentView;
@@ -83,27 +134,88 @@ namespace OHOS
     void StressTestModel::HandleResultValue(uint16_t value)
     {
         currentResultValue = value;
-        if (value >= 71 ) //压力过载
+        // 使用可配置阈值进行分档
+        if (value > STRESS_THRESHOLD_WARNING_MAX)
         {
-            currentResultType = RESULT_TYPE_OVERLOAD;
+            currentResultType = RESULT_TYPE_OVERLOAD; // > 70
         }
-        else if (value >= 51 && value < 71) //注意压力
+        else if (value > STRESS_THRESHOLD_NORMAL_MAX)
         {
-            currentResultType = RESULT_TYPE_WARNING;
+            currentResultType = RESULT_TYPE_WARNING; // 51-70
         }
-        else if (value >= 31 && value < 51) //状态正常
+        else if (value > STRESS_THRESHOLD_EXCELLENT_MAX)
         {
-            currentResultType = RESULT_TYPE_NORMAL;
-        }
-        else if (value >= 0 && value < 31) //状态优秀
-        {
-            currentResultType = RESULT_TYPE_EXCELLENT;
+            currentResultType = RESULT_TYPE_NORMAL; // 31-50
         }
         else
         {
-            currentResultType = RESULT_TYPE_OTHER;
+            currentResultType = RESULT_TYPE_EXCELLENT; // 0-30
         }
+        SaveResultToFile();
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StressTestModel::HandleResultValue: %d", currentResultType);
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StressTestModel::HandleResultValue: %dms", currentResultValue);
     }
+
+    static void StressTestTimerCallbackProc(void *data)
+    {
+        (void)data;
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StressTestModel::StressTestTimerCallbackProc:60s压力测试结束");
+        StressTestModel::GetInstance().StressTest_StopTimer();
+        // 震动提醒
+        custom_VibratorFunc_int(0);
+    }
+
+    static void StressTestTimerCallback(void *data)
+    {
+        GraphicService::GetInstance()->PostGraphicEvent(std::bind(StressTestTimerCallbackProc, data));
+    }
+
+    GraphicTimer *g_stressTestTimer = nullptr;
+    // 开启压力测试定时器
+    void StressTestModel::StressTest_StartTimer(uint32_t interval, int type)
+    {
+        uint32_t tick = GetOSTick(interval);
+        if (g_stressTestTimer == nullptr)
+        {
+            g_stressTestTimer = new GraphicTimer(tick, StressTestTimerCallback, nullptr, true);
+            if (g_stressTestTimer == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StressTestModel::StressTest_StartTimer new GraphicTime failed!!");
+                return;
+            }
+        }
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StressTestModel::StressTest_StartTimer: 压力测试定时器启动");
+        bool retTimer = g_stressTestTimer->Start();
+        if (!retTimer)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StressTestModel::StressTest_StartTimer Start failed!!");
+            if (g_stressTestTimer != nullptr)
+            {
+                delete g_stressTestTimer;
+                g_stressTestTimer = nullptr;
+            }
+            return;
+        }
+        else
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StressTestModel::StressTest_StartTimer Start success!!");
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StressTestModel::StressTest_StartTimer: 压力测试定时器启动成功");
+            // 常亮屏幕
+            ScreenAlwaysOnCtr(OPEN_SCREEN_ALWAYS_ON);
+        }
+    }
+
+    // 停止压力测试定时器
+    void StressTestModel::StressTest_StopTimer(void)
+    {
+        if (g_stressTestTimer != nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StressTestModel::StressTest_StopTimer: 停止压力测试定时器");
+            g_stressTestTimer->Stop();
+            delete g_stressTestTimer;
+            g_stressTestTimer = nullptr;
+            // 取消常亮屏
+            ScreenAlwaysOnCtr(CANCEL_SCREEN_ALWAYS_ON);
+        }
+    }
 }
index 9af94fb..6a008a8 100644 (file)
@@ -45,38 +45,43 @@ namespace OHOS
         RootView::GetInstance()->SetOnKeyActListener(this);
     }
 
+    void StressTestPresenter::OnStop(void)
+    {
+        StressTestModel::GetInstance().StressTest_StopTimer();
+    }
+
     bool StressTestPresenter::OnClick(UIView &view, const ClickEvent &event)
     {
         UNUSED(event);
         if (view.GetViewId() == START_TEST_BUTTON_ID) // 点击开始测试按钮
         {
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StressTestPresenter::OnClick start test");
-            view_->ChangeView(StressTestModel::GetInstance().GetCurrentView(), STRESSTESTVIEW);
+            ChangeViewOperation(StressTestModel::GetInstance().GetCurrentView(), STRESSTESTVIEW);
         }
         else if (view.GetViewId() == CANCEL_BUTTON_ID) // 点击取消按钮
         {
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StressTestPresenter::OnClick cancel test");
-            view_->ChangeView(StressTestModel::GetInstance().GetCurrentView(), STRESSTESTIDLEVIEW);
+            ChangeViewOperation(StressTestModel::GetInstance().GetCurrentView(), STRESSTESTIDLEVIEW);
         }
         else if (view.GetViewId() == STOP_TEST_BUTTON_ID) // 点击停止测试按钮
         {
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StressTestPresenter::OnClick stop test");
-            view_->ChangeView(StressTestModel::GetInstance().GetCurrentView(), STRESSTESTIDLEVIEW);
+            ChangeViewOperation(StressTestModel::GetInstance().GetCurrentView(), STRESSTESTIDLEVIEW);
         }
         else if (view.GetViewId() == RETRY_TEST_BUTTON_ID) // 点击重新测试按钮
         {
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StressTestPresenter::OnClick retry test");
-            view_->ChangeView(StressTestModel::GetInstance().GetCurrentView(), STRESSTESTVIEW);
+            ChangeViewOperation(StressTestModel::GetInstance().GetCurrentView(), STRESSTESTVIEW);
         }
         else if (view.GetViewId() == STOP_BUTTON_ID) // 点击停止按钮
         {
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StressTestPresenter::OnClick stop");
-            view_->ChangeView(StressTestModel::GetInstance().GetCurrentView(), STRESSTESTIDLEVIEW);
+            ChangeViewOperation(StressTestModel::GetInstance().GetCurrentView(), STRESSTESTIDLEVIEW);
         }
         else if (view.GetViewId() == RETRY_BUTTON_ID) // 点击重新开始按钮
         {
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StressTestPresenter::OnClick retry");
-            view_->ChangeView(StressTestModel::GetInstance().GetCurrentView(), STRESSTESTVIEW);
+            ChangeViewOperation(StressTestModel::GetInstance().GetCurrentView(), STRESSTESTVIEW);
         }
         return true;
     }
@@ -104,11 +109,11 @@ namespace OHOS
             }
             else if (view.GetViewId() == STRESSTESTINGVIEW_ID)
             {
-                view_->ChangeView(StressTestModel::GetInstance().GetCurrentView(), STRESSTESTIDLEVIEW);
+                ChangeViewOperation(StressTestModel::GetInstance().GetCurrentView(), STRESSTESTIDLEVIEW);
             }
             else if (view.GetViewId() == STRESS_TEST_RESULT_VIEW_ID)
             {
-                view_->ChangeView(StressTestModel::GetInstance().GetCurrentView(), STRESSTESTIDLEVIEW);
+                ChangeViewOperation(StressTestModel::GetInstance().GetCurrentView(), STRESSTESTIDLEVIEW);
             }
         }
         return true;
@@ -128,6 +133,32 @@ namespace OHOS
         return true;
     }
 
+    void StressTestPresenter::ChangeViewOperation(uint8_t hideView,uint8_t showView)
+    {
+        switch (hideView)
+        {
+        case STRESSTESTVIEW: //压力测试中页面
+            StressTestModel::GetInstance().StressTest_StopTimer();
+            break;
+        case STRESSTESTIDLEVIEW:
+            break;
+        case STRESSTESTRESULTVIEW:
+            break;
+        }
+        switch (showView)
+        {
+        case STRESSTESTVIEW: //压力测试中页面
+            StressTestModel::GetInstance().StressTest_StartTimer(); // 3s后停止压力测试
+            break;
+        case STRESSTESTIDLEVIEW://压力测试待机页面
+            break;
+        case STRESSTESTRESULTVIEW:
+            break;
+        }
+        view_->ChangeView(hideView, showView);
+    }
+
+
     uint8_t StressTestPresenter::GetCurrentFailType(void)
     {
         return StressTestModel::GetInstance().GetCurrentFailType();