#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
// 开机增加震动 页面启动震动一次
// custom_VibratorFunc_int(0);
- // 如果是雷鸟项目
- #ifdef LEINIAO
- NativeAbility::GetInstance().SetDefaultSliceId(VIEW_THUNDER_BIRD);
- return;
- #endif
+ // 初始化压力测试
+ StressTestModel::GetInstance().LoadResultFromFile();
}
// 注册开机时间
SystemLogData systemlog;
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();
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}; // 当前压力测试结果值
};
}
#include "wearable_log.h"
#include "stress/include/stressTestUIConfig.h"
#include "iostream"
+#include <cstdint>
namespace OHOS
{
class StressTestMainView;
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);
#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";
void StressTestMainView::OnStart()
{
- ChangeView(MAX_STRESSTESTMAINVIEW, STRESSTESTRESULTVIEW);
+ ChangeView(MAX_STRESSTESTMAINVIEW, STRESSTESTIDLEVIEW);
}
bool StressTestMainView::ChangeStressTestIdleView(int16_t thisView)
#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
{
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;
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);
+ }
+ }
}
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;
}
}
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;
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();