uint16_t *GetArrayData();\r
void SetArrayData();\r
\r
+ void handleHeartResult();\r
+ void logAndChangeSlice(HeartResult result);\r
+ void handleLowHeartRate();\r
+ void handleHighHeartRate();\r
+\r
private:\r
HealthAllDatas healthDatas;\r
uint16_t pretime{0};\r
bool wearStatus{true};\r
uint16_t index_ = 0;\r
\r
- uint16_t displayheart; // 显示心率\r
- uint16_t currentheart; // 保存心率\r
+ uint16_t displayheart = 0; // 显示心率\r
+ uint16_t currentheart = 0; // 保存心率\r
uint16_t displayheart_max = 0; // 显示最大心率\r
uint16_t displayheart_min = 0; // 显示最小心率\r
\r
HeartCheck checkstate = HeartCheck::RESTSTSTE; // 目前检测状态\r
\r
uint16_t dynamic_heartrate[5]; //动态心率配置项\r
+\r
+ uint8_t heartRemindState{0};\r
+ uint16_t thresholdValue{160};\r
+ uint16_t thresholdState{1};\r
};\r
} // namespace OHOS\r
\r
#endif\r
\r
#define MAX_UNWEAR_COUNT 2\r
-#define MAX_VALID_HRS_COUNT 60\r
-#define MAX_DISVALID_HRS_COUNT 70\r
-#define MIN_DISPLAY_HEART 60\r
+#define MAX_VALID_HRS_COUNT 10 //最大有效数\r
+#define MAX_DISVALID_HRS_COUNT 10 //最大无效数\r
+#define MIN_DISPLAY_HEART 50 //最新心率\r
#define DISPLAY_COUNT 0\r
#define HEARTTEST 1 //[0 开启测试 1 关闭]\r
\r
checkstate = HeartCheck::RESTSTSTE;\r
LOS_Msleep(500);\r
uapi_dev_runtime_set_hrs_passivity(0);\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "uapi_dev_runtime_set_hrs_passivity(0)");\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
+ "uapi_dev_runtime_set_hrs_passivity(0)");\r
} else if (state == HeartState::Start && heartstate == false) {\r
/*充电状态下不进行检测*/\r
bool isCharging = get_charge_stat(); // 获取充电状态\r
heartstate = true;\r
checkstate = check;\r
//被动\r
- if(checkstate==HeartCheck::PASSIVITY)\r
- {\r
- uapi_dev_runtime_set_hrs_passivity(1);\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "uapi_dev_runtime_set_hrs_passivity(1)");\r
+ if (checkstate == HeartCheck::PASSIVITY) {\r
+ uapi_dev_runtime_set_hrs_passivity(1);\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
+ "uapi_dev_runtime_set_hrs_passivity(1)");\r
}\r
- \r
}\r
}\r
// 开始检测\r
void HeartModel::Heart_Start() {\r
- displayheart = 0;\r
- // displayheart_max=0;// 显示最大心率 [每次检测进行清除]\r
- // displayheart_min=0;// 显示最小心率 [每次检测进行清除]\r
-\r
- SetResult(HeartResult::NOT_TESTED); // 重置检测\r
- // 进行初始化操作\r
if (!sensorstate) {\r
+ displayheart = 0;\r
+ SetResult(HeartResult::NOT_TESTED); // 重置检测\r
Heart_Control(HeartState::Start, HeartCheck::INITIATIVE);\r
+ // ScreenTurnOn(60 * 1000); // 亮屏操作 600000ms 60秒关闭\r
sensorstate = true;\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "开始心率检测");\r
}\r
}\r
\r
valid_counter_ = 0;\r
disvalid_counter_ = 0;\r
unwear_counter_ = 0;\r
- display_counter_ = 0;\r
- displayheart = 0;\r
+ // display_counter_ = 0; 取消再次检测的--操作\r
+ // displayheart = 0;\r
+\r
+ // ScreenTurnOff(); //恢复正常亮屏\r
\r
/*主界面卡片检测 或者 被动检测*/\r
- if ( checkstate == HeartCheck::PASSIVITY) {\r
+ if (checkstate == HeartCheck::PASSIVITY) {\r
if (heartresult_ == HeartResult::SUCCESS) {\r
Heart_Save();\r
/*更新曲线*/\r
return;\r
}\r
\r
- if (sensorstate) {\r
- // Heart_Control(HeartState::End,HeartCheck::INITIATIVE);主动检测心率\r
- // 不需要关闭\r
- sensorstate = false;\r
- Heart_Result(); // 处理结果\r
- }\r
+ sensorstate = false;\r
+ Heart_Result(); // 处理结果\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "本次心率检测结束");\r
}\r
// 保存检测数据\r
void HeartModel::Heart_Save() {\r
data.timestamp);\r
}\r
\r
-// 显示检测结果// 显示检测结果\r
void HeartModel::Heart_Result() {\r
- // 心率提醒(0开 1关)\r
- uint8_t HeartRemindState = ConfigModel::GetInstance()->get_configData_int(\r
+ // 获取心率提醒状态和阈值\r
+ heartRemindState = ConfigModel::GetInstance()->get_configData_int(\r
ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_REMIND);\r
- uint16_t ThresholdValue = ConfigModel::GetInstance()->get_configData_int(\r
+ thresholdValue = ConfigModel::GetInstance()->get_configData_int(\r
ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_THRESHOLD_VALUE);\r
\r
- if (HeartRemindState) {\r
- // 检查当前心率是否高于或低于阈值\r
- uint16_t ThresholdState = ConfigModel::GetInstance()->get_configData_int(\r
+ if (heartRemindState) {\r
+ // 获取当前心率状态\r
+ thresholdState = ConfigModel::GetInstance()->get_configData_int(\r
ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_MAX_MIN);\r
\r
- if (ThresholdState == 0 && currentheart < ThresholdValue &&\r
- currentheart != 0) {\r
- // 当前心率低于阈值\r
- heartresult_ = HeartResult::LOW_RESULT;\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
- "检测结果:低结果情况,currentheart=%d,ThresholdValue=%d",\r
- currentheart, ThresholdValue);\r
- } else if (ThresholdState == 1 && currentheart > ThresholdValue) {\r
- // 当前心率高于阈值\r
- heartresult_ = HeartResult::HIGH_RESULT;\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
- "检测结果:高结果情况,currentheart=%d,ThresholdValue=%d",\r
- currentheart, ThresholdValue);\r
+ if (currentheart != 0) {\r
+ if (thresholdState == 0 && currentheart < thresholdValue) {\r
+ // 当前心率低于阈值\r
+ heartresult_ = HeartResult::LOW_RESULT;\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
+ "检测结果:低结果情况,currentheart=%d,ThresholdValue=%d",\r
+ currentheart, thresholdValue);\r
+ } else if (thresholdState == 1 && currentheart > thresholdValue) {\r
+ // 当前心率高于阈值\r
+ heartresult_ = HeartResult::HIGH_RESULT;\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
+ "检测结果:高结果情况,currentheart=%d,ThresholdValue=%d",\r
+ currentheart, thresholdValue);\r
+ }\r
}\r
}\r
\r
// 根据结果进行处理\r
+ handleHeartResult();\r
+}\r
+// 处理检测结果\r
+void HeartModel::handleHeartResult() {\r
switch (heartresult_) {\r
case HeartResult::SUCCESS:\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:成功");\r
Heart_Save();\r
- /*更新曲线*/\r
+ // 更新曲线\r
GraphicService::GetInstance()->PostGraphicEvent(\r
std::bind(&HeartModel::Heart_Update_View, HeartModel::GetInstance()));\r
break;\r
\r
- case HeartResult::NOT_WORN: // 未佩戴状态\r
- case HeartResult::TIMEOUT: // 超时情况\r
- case HeartResult::INVALID_DATA: // 无效数据情况\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:%s情况",\r
- heartresult_ == HeartResult::NOT_WORN\r
- ? "未佩戴状态"\r
- : heartresult_ == HeartResult::TIMEOUT ? "超时"\r
- : "无效数据");\r
- NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_ABNORMAL);\r
+ case HeartResult::NOT_WORN:\r
+ case HeartResult::TIMEOUT:\r
+ case HeartResult::INVALID_DATA:\r
+ logAndChangeSlice(heartresult_);\r
break;\r
\r
case HeartResult::LOW_RESULT:\r
- // 低心率结果处理\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:低结果情况");\r
- HealthState lowHealthState;\r
- lowHealthState.checkType = BLOOD_CHECK;\r
- lowHealthState.resultStatus = LOW;\r
- lowHealthState.checkResult = ThresholdValue;\r
- HealthService::GetInstance()->SetHealthCurrent(lowHealthState);\r
- NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID);\r
+ handleLowHeartRate();\r
break;\r
\r
case HeartResult::HIGH_RESULT:\r
- // 高心率结果处理\r
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:高结果情况");\r
- HealthState highHealthState;\r
- highHealthState.checkType = BLOOD_CHECK;\r
- highHealthState.resultStatus = HIGH;\r
- highHealthState.checkResult = ThresholdValue;\r
- HealthService::GetInstance()->SetHealthCurrent(highHealthState);\r
- NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID);\r
+ handleHighHeartRate();\r
break;\r
\r
default:\r
break;\r
}\r
}\r
- void HeartModel::SetWearStatus()\r
- {\r
- // 如果处于训练模式,提前返回\r
- if (uapi_dev_runtime_get_train_status() == 1)\r
- return;\r
- // 设置佩戴状态\r
- SetResult(HeartResult::NOT_WORN);\r
- Heart_Stop();\r
- } \r
+//进行日志打印与界面切换\r
+void HeartModel::logAndChangeSlice(HeartResult result) {\r
+ const char *resultMsg =\r
+ (result == HeartResult::NOT_WORN)\r
+ ? "未佩戴状态"\r
+ : (result == HeartResult::TIMEOUT) ? "超时" : "无效数据";\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:%s情况", resultMsg);\r
+ NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_ABNORMAL);\r
+}\r
+// 处理低心率情况\r
+void HeartModel::handleLowHeartRate() {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:低结果情况");\r
+ HealthState lowHealthState = {BLOOD_CHECK, LOW, thresholdValue};\r
+ HealthService::GetInstance()->SetHealthCurrent(lowHealthState);\r
+ NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID);\r
+}\r
+// 处理高心率情况\r
+void HeartModel::handleHighHeartRate() {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:高结果情况");\r
+ HealthState highHealthState = {BLOOD_CHECK, HIGH, thresholdValue};\r
+ HealthService::GetInstance()->SetHealthCurrent(highHealthState);\r
+ NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID);\r
+}\r
+// 设置佩戴状态\r
+void HeartModel::SetWearStatus() {\r
+ // 如果处于训练模式,提前返回\r
+ if (uapi_dev_runtime_get_train_status() == 1)\r
+ return;\r
+ // 设置佩戴状态\r
+ SetResult(HeartResult::NOT_WORN);\r
+ Heart_Stop();\r
+}\r
\r
void HeartModel::UpHeartdata(uint16_t heart) {\r
// 如果处于训练模式,提前返回\r
displayheart = 0;\r
}\r
display_counter_++;\r
- }\r
- else\r
- {\r
+ } else {\r
displayheart = 0;\r
}\r
\r
-\r
// 更新心率和计数器\r
if (displayheart != 0) {\r
currentheart = displayheart; // 更新当前心率\r
-/***
- * @Date: 2024-05-30 15:59:37
- * @LastEditors: Caisking 3449750381@qq.com
- * @LastEditTime: 2024-07-19 11:44:23
- * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/main/include/dial/DialModelPower.h
- */
-/***
- * @Date: 2024-04-15 10:55:58
- * @LastEditors: Caisking 3449750381@qq.com
- * @LastEditTime: 2024-04-27 10:01:25
- * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/main/include/dial/DialModelPower.h
- */
-/*
- * Copyright (c) CompanyNameMagicTag 2023. All rights reserved.
- * Description: DialModelPower
- * Author:
- * Create: 2023-12
- */
#ifndef DIAL_MODEL_POWER_H
#define DIAL_MODEL_POWER_H
-/***
- * @Date: 2024-04-27 11:55:14
- * @LastEditors: Caisking 3449750381@qq.com
- * @LastEditTime: 2024-07-24 18:34:02
- * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/main/include/dial/DialModelPowerStandby.h
- */
-/***
- * @Date: 2024-04-27 11:55:14
- * @LastEditors: Caisking 3449750381@qq.com
- * @LastEditTime: 2024-04-27 11:56:11
- * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/main/include/dial/DialModelPowerStanbyStandby.h
- */
-/***
- * @Date: 2024-04-15 10:55:58
- * @LastEditors: Caisking 3449750381@qq.com
- * @LastEditTime: 2024-04-27 10:01:25
- * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/main/include/dial/DialModelPowerStanby.h
- */
-/*
- * Copyright (c) CompanyNameMagicTag 2023. All rights reserved.
- * Description: DialModelPowerStanby
- * Author:
- * Create: 2023-12
- */
+
#ifndef DIAL_MODEL_POWER_STANDBY_H
#define DIAL_MODEL_POWER_STANDBY_H
#include "ui_service.h"
#include "time.h"
#define TESTCHECK 0
+//心率弹窗
+#define HEART_RATE_CHECK_TIMEOUT 0
namespace OHOS
{
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "~MainPresenterSample");
g_pMainPresenterSample = nullptr;
/*从主界面退出,关闭心率检测*/
- HeartModel::GetInstance()->Heart_Control(HeartState::End, HeartCheck::INITIATIVE);
+#if HEART_RATE_CHECK_TIMEOUT
+ HeartModel::GetInstance()->Heart_Control(HeartState::End,
+ HeartCheck::CARDCHECK);
+#else
+ HeartModel::GetInstance()->Heart_Control(HeartState::End,
+ HeartCheck::INITIATIVE);
+#endif
}
MainPresenterSample *MainPresenterSample::GetInstance(void)
{
// HeartModel::GetInstance()->Heart_Control(HeartState::End,
// HeartCheck::PASSIVITY);
- // HeartModel::GetInstance()->Heart_Control(HeartState::Start,
- // HeartCheck::CARDCHECK);
- HeartModel::GetInstance()->Heart_Start();
+#if HEART_RATE_CHECK_TIMEOUT
+ HeartModel::GetInstance()->Heart_Control(HeartState::Start,HeartCheck::CARDCHECK);
+#else
+ HeartModel::GetInstance()->Heart_Start();
+#endif
}
/*主表盘*/
void MainPresenterSample::UpdateWatchFace()
bool DialModelPower::GetDialFloatData(DialDataType &type, float &out)
{
(void)type;
- if (!powerUpdated_)
- {
- UpdatePower();
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpdatePower %d", power_);
- return true;
- }
+ // if (!powerUpdated_)
+ // {
+ // UpdatePower();
+ // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpdatePower %d", power_);
+ // return true;
+ // }
float voltage = 0.0F;
power_ = battery_get_voltage(&voltage);
out = static_cast<float>(power_);
-/***
- * @Date: 2024-07-06 16:27:31
- * @LastEditors: Caisking 3449750381@qq.com
- * @LastEditTime: 2024-07-24 18:31:39
- * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/main/src/dial/DialModelPowerStandby.cpp
- */
+
#include "RegisterDialModel.h"
#include "DialModelPowerStandby.h"
bool DialModelPowerStanby::GetDialFloatData(DialDataType &type, float &out)
{
(void)type;
- if (!PowerStanbyUpdated_)
- {
- UpdatePowerStanby();
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpdatePower %d", PowerStanby_);
- return true;
- }
+ // if (!PowerStanbyUpdated_)
+ // {
+ // UpdatePowerStanby();
+ // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpdatePower %d", PowerStanby_);
+ // return true;
+ // }
float voltage = 0.0F;
PowerStanby_ = battery_get_voltage(&voltage);
-/**
- * Copyright (c) CompanyNameMagicTag 2023-2023. All rights reserved.
- * Description: Power display action header file.
- * Author:
- * Create:
- */
+
#ifndef OHOS_UI_SCREENNOTIFY_H
#define OHOS_UI_SCREENNOTIFY_H
#include "ohos_types.h"
/**
* @brief 获取灭屏后slice的存活期,需要在slice对应的Presentor的OnStart方法中调用
- * 默认存活期是5秒,灭屏超过5秒后再次亮屏会跳回主界面
+ * 默认存活期是5秒,灭屏超过10秒后再次亮屏会跳回主界面
* @param time_sec 获取的slice灭屏后的存活期时间
*/
uint32_t get_back_to_home_interval(void);
+void handleLockEnabled(uint16_t current_slice_id);
+void handleLockDisabled(uint16_t current_slice_id);
+
#ifdef __cplusplus
}
#endif
-#include <list>
-#include <cstdio>
-#include "ability_state.h"
-#include "cmsis_os2.h"
-#include "common_def.h"
-#include "Ability.h"
-#include "wearable_log.h"
-#include "graphic_service.h"
-#include "power_display_service.h"
-#include "NativeAbility.h"
-#include "AppViewIDs.h"
-#include "MainViewSample.h"
-#include "ui_screennotify.h"
-#include "components/root_view.h"
-#include "ConfigModel.h"
-
-#include "ui_service.h"
-extern "C" void uapi_dev_runtime_set_lock_status(uint8_t status);
-extern "C" uint8_t uapi_dev_runtime_get_lock_status(void);
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
- static uint32_t g_back_to_home_interval = 3; // 超时时间 秒
- uint16_t ignore_slice_ids[] = {
- VIEW_INVALID,
- VIEW_SAVEBAT, // 省电模式
- VIEW_TRAININGCRAD, // 训练卡片
- };
- static std::list<ScreenStatusNotifyCallback> g_callback;
-
- static void ChangeToHomeView(void)
- {
- screen_context_t *sc = power_display_get_screen_context();
- uint16_t current_slice_id = OHOS::NativeAbility::GetInstance().GetCurSliceId();
-
- for (uint16_t i = 0; i < sizeof(ignore_slice_ids) / sizeof(uint16_t); i++)
- {
- if (ignore_slice_ids[i] == current_slice_id)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Current slice ID %u is ignored.", current_slice_id);
- return; // 如果当前slice在忽略列表中,返回
- }
- }
-
- // 打印屏幕关机时间
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Screen off time interval = %u", sc->screen_off_time_interval);
-
- if (sc->screen_off_time_interval > g_back_to_home_interval)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Screen off timeout exceeded g_back_to_home_interval.");
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetNativeAbilityState = %u", OHOS::NativeAbility::GetInstance().GetNativeAbilityState());
-
- int lockstate = OHOS::ConfigModel::GetInstance()->get_configData_int(OHOS::ConfigModel::CONFIGMODEL_ITEM_PASSWORD_SWITCH);
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "lockstate = %d", lockstate);
-
- // 打印锁定状态判断
- if (lockstate == 1)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Lock state is enabled (lockstate == 1).");
-
- if (OHOS::NativeAbility::GetInstance().GetNativeAbilityState() == STATE_ACTIVE)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Native ability state is active.");
-
- if (uapi_dev_runtime_get_lock_status() == 0)
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Device is unlocked (lock status == 0).");
- OHOS::NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN);
- uapi_dev_runtime_set_lock_status(1); // 上锁
- OHOS::MainModel::GetInstance().setDialState(OHOS::DialState::LOCK, true);
- }
- else if (uapi_dev_runtime_get_lock_status() == 1 && (current_slice_id == VIEW_CODED_LOCK))
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Device is locked (lock status == 1) and current slice is VIEW_CODED_LOCK.");
- OHOS::NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN);
- }
- else
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Device is in an inactive lock state or current slice is not VIEW_CODED_LOCK.");
- }
- }
- else
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Native ability state is not active.");
- }
- }
- else
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Lock state is not enabled (lockstate != 1).");
- }
- }
- else
- {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Screen off time interval is within limits.");
- }
- }
-
- void notify_screen_on_event(void)
- {
- for (auto callback : g_callback)
- {
- callback(SCREEN_STATUS_ON);
- }
- ChangeToHomeView();
- }
-
- void notify_screen_off_event(void)
- {
- for (auto callback : g_callback)
- {
- callback(SCREEN_STATUS_OFF);
- }
- }
-
- void set_back_to_home_interval(uint32_t time_sec)
- {
- g_back_to_home_interval = time_sec;
- }
-
- uint32_t get_back_to_home_interval(void)
- {
- return g_back_to_home_interval;
- }
-
- void registerNotifyScreenStatus(ScreenStatusNotifyCallback callback)
- {
- if (callback != nullptr)
- {
- g_callback.push_back(callback);
- }
- }
-
- void deregisterNotifyScreenStatus(ScreenStatusNotifyCallback callback)
- {
- if (callback != nullptr)
- {
- g_callback.remove(callback);
- }
- }
-
-#ifdef __cplusplus
-}
+#include "ui_screennotify.h"
+#include "Ability.h"
+#include "AppViewIDs.h"
+#include "ConfigModel.h"
+#include "MainViewSample.h"
+#include "NativeAbility.h"
+#include "ability_state.h"
+#include "cmsis_os2.h"
+#include "common_def.h"
+#include "components/root_view.h"
+#include "graphic_service.h"
+#include "power_display_service.h"
+#include "wearable_log.h"
+#include <cstdio>
+#include <unordered_set>
+
+extern "C" void uapi_dev_runtime_set_lock_status(uint8_t status);
+extern "C" uint8_t uapi_dev_runtime_get_lock_status(void);
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+static uint32_t g_back_to_home_interval = 3; // 超时时间 3秒
+static const uint32_t screen_off_time_interval = 10; // 超时时间 10秒
+//息屏不上锁
+const uint16_t ignore_slice_ids[] = {
+ VIEW_INVALID,
+ VIEW_SAVEBAT, // 省电模式
+ VIEW_TRAININGCRAD, // 训练卡片
+};
+//息屏10秒回到主界面
+const uint16_t special_slice_ids[] = {
+ VIEW_ADD_CARD, //卡片管理
+ VIEW_SET_DIAL, //表盘管理
+ VIEW_HEART_CHART //心率检测
+};
+
+static std::unordered_set<ScreenStatusNotifyCallback> g_callbacks;
+
+static bool isSliceIgnored(uint16_t slice_id) {
+ for (uint16_t id : ignore_slice_ids) {
+ if (id == slice_id) {
+ return true;
+ }
+ }
+ return false;
+}
+
+static void ChangeToHomeView(void) {
+ screen_context_t *sc = power_display_get_screen_context();
+ uint16_t current_slice_id =
+ OHOS::NativeAbility::GetInstance().GetCurSliceId();
+
+ if (isSliceIgnored(current_slice_id)) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Current slice ID %u is ignored.",
+ current_slice_id);
+ return;
+ }
+
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Screen off time interval = %u",
+ sc->screen_off_time_interval);
+
+ if (sc->screen_off_time_interval > g_back_to_home_interval) {
+ int lockstate = OHOS::ConfigModel::GetInstance()->get_configData_int(
+ OHOS::ConfigModel::CONFIGMODEL_ITEM_PASSWORD_SWITCH);
+
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "lockstate = %d", lockstate);
+
+ if (lockstate == 1) {
+ handleLockEnabled(current_slice_id);
+ } else {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+ "Lock state is not enabled (lockstate != 1).");
+ }
+ }
+ if (sc->screen_off_time_interval > g_back_to_home_interval) {
+ handleLockDisabled(current_slice_id);
+ }
+}
+
+void handleLockEnabled(uint16_t current_slice_id) {
+ if (OHOS::NativeAbility::GetInstance().GetNativeAbilityState() ==
+ STATE_ACTIVE) {
+ if (uapi_dev_runtime_get_lock_status() == 0) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+ "Device is unlocked (lock status == 0).");
+ OHOS::NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN);
+ uapi_dev_runtime_set_lock_status(1); // 上锁
+ OHOS::MainModel::GetInstance().setDialState(OHOS::DialState::LOCK, true);
+ } else if (current_slice_id == VIEW_CODED_LOCK) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+ "Device is locked (lock status == 1) and current slice is "
+ "VIEW_CODED_LOCK.");
+ OHOS::NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN);
+ } else {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+ "Device is in an inactive lock state or current slice is "
+ "not VIEW_CODED_LOCK.");
+ }
+ } else {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+ "Native ability state is not active.");
+ }
+}
+
+void handleLockDisabled(uint16_t current_slice_id) {
+ int lockstate = OHOS::ConfigModel::GetInstance()->get_configData_int(
+ OHOS::ConfigModel::CONFIGMODEL_ITEM_PASSWORD_SWITCH);
+
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "lockstate = %d", lockstate);
+
+ if (lockstate == 0) {
+ for (uint16_t id : special_slice_ids) {
+ if (id == current_slice_id) {
+ OHOS::NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN);
+ return;
+ }
+ }
+ }
+}
+
+void notify_screen_on_event(void) {
+ for (auto callback : g_callbacks) {
+ callback(SCREEN_STATUS_ON);
+ }
+ ChangeToHomeView();
+}
+
+void notify_screen_off_event(void) {
+ for (auto callback : g_callbacks) {
+ callback(SCREEN_STATUS_OFF);
+ }
+}
+
+void set_back_to_home_interval(uint32_t time_sec) {
+ g_back_to_home_interval = time_sec;
+}
+
+uint32_t get_back_to_home_interval(void) { return g_back_to_home_interval; }
+
+void registerNotifyScreenStatus(ScreenStatusNotifyCallback callback) {
+ if (callback != nullptr) {
+ g_callbacks.insert(callback);
+ }
+}
+
+void deregisterNotifyScreenStatus(ScreenStatusNotifyCallback callback) {
+ if (callback != nullptr) {
+ g_callbacks.erase(callback);
+ }
+}
+
+#ifdef __cplusplus
+}
#endif
\ No newline at end of file
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " 遥控拍照 \r\n");
uapi_set_screen_on_api(); // 亮屏
TakephotosModel::GetInstance()->SetPopStaust(PopupPhoto::TakePopup);
- NativeAbility::GetInstance().EnterSlice(VIEW_TAKEPHOTOS);
+ //获取当前界面Id
+ int16_t curviewid = OHOS::NativeAbility::GetInstance().GetCurSliceId();
+ //已经处于遥控拍照界面
+ if (curviewid == VIEW_TAKEPHOTOS) {
+ NativeAbility::GetInstance().ChangeSlice(VIEW_TAKEPHOTOS);
+ }
+ else {
+ NativeAbility::GetInstance().EnterSlice(VIEW_TAKEPHOTOS);
+ }
}
// 退出拍照
if (request->msgId == TOPIC_EVENT_CANCEL_CMAERA)
}
//增加训练runtime控制
if (uapi_dev_runtime_get_train_status() == 0) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
- "uapi_dev_runtime_get_train_status %d",
- uapi_dev_runtime_get_train_status());
return;
}
//训练基本信息更新
data.std = static_cast<uint32_t>(sportdata->std);
data.cdc = static_cast<uint32_t>(sportdata->cdc);
+ // 创建sport文件夹
+ CreateDirectoryIfNotExists(TRAINING_DATA_DIRECTORY);
+
// 保存数据到 bin
if (write_Trainingdata_data(data) != 1) {
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "write_Trainingdata_data is error!");
#ifdef __cplusplus
extern "C" {
#endif
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+
// 获得数据个数
static int get_Trainingdata_data_num(FILE *fp) {
- long size = 0;
- if (fp != NULL) {
- fseek(fp, 0, SEEK_END); // 将文件指针移动到文件末尾
- size = ftell(fp); // 获取当前文件指针位置,即文件大小
- fseek(fp, 0, SEEK_SET); // 将文件指针移回文件开头
+ if (fp == NULL) {
+ return 0; // 如果文件指针为空,返回0
}
- int num = size / sizeof(Trainingdata);
- return num;
+
+ fseek(fp, 0, SEEK_END); // 将文件指针移动到文件末尾
+ long size = ftell(fp); // 获取当前文件指针位置,即文件大小
+ fseek(fp, 0, SEEK_SET); // 将文件指针移回文件开头
+
+ return (size / sizeof(Trainingdata));
}
+
+// 写训练bin文件
int write_Trainingdata_data(Trainingdata data) {
char file_path[MAX_FILE_PATH_LENGTH] = {0};
char timeday[12] = {0};
uapi_get_YYMMDD_Time(timeday, '_');
- sprintf_s(file_path, sizeof(file_path), "%s%s.bin", TRAINING_PATH,
- timeday); // 防止越界
+ snprintf(file_path, sizeof(file_path), "%s%s.bin", TRAINING_PATH, timeday);
- // Check if the directory exists, if not, create it
+ // 检查目录是否存在,如果不存在则创建
struct stat st = {0};
if (stat(TRAINING_PATH, &st) == -1) {
- mkdir(TRAINING_PATH, 0700);
+ if (mkdir(TRAINING_PATH, 0700) != 0) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to create directory: %s",
+ strerror(errno));
+ return -1; // 返回错误码
+ }
}
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "%s", file_path);
FILE *fp = fopen(file_path, "ab+");
if (fp == NULL) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open file for append");
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open file for append: %s",
+ strerror(errno));
fp = fopen(file_path, "wb+");
if (fp == NULL) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open file for write");
- return -1; // Return an error code to indicate file open failure
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+ "Failed to open file for write: %s", strerror(errno));
+ return -1; // 返回错误码
}
}
if (ret != 1) {
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "fwrite_data error! %d", ret);
fclose(fp);
- return -1; // Return an error code on write failure
+ return -1; // 返回错误码
}
- fclose(fp); // Close the file after writing data
- return 1; // Return success code
+ fclose(fp); // 关闭文件
+ return 1; // 返回成功码
}
+
// 读数据
Trainingdata *read_Trainingdata_data(char *timedata, uint16_t offset) {
char file_path[128] = {0};
- sprintf_s(file_path, sizeof(file_path), "%s%s.bin", TRAINING_PATH,
- timedata); // 防止越界
+ snprintf(file_path, sizeof(file_path), "%s%s.bin", TRAINING_PATH, timedata);
- FILE *fp = fopen(file_path, "rb+");
+ FILE *fp = fopen(file_path, "rb");
if (fp == NULL) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "file is NULL");
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open file for read: %s",
+ strerror(errno));
return NULL;
}
+
Trainingdata *data = (Trainingdata *)malloc(sizeof(Trainingdata));
if (data == NULL) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Trainingdata malloc is error");
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+ "Failed to allocate memory for Trainingdata");
fclose(fp);
return NULL;
}
- if (get_Trainingdata_data_num(fp) <= offset) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "file is NULL %d",
- get_Trainingdata_data_num(fp));
- free(data); // 修复内存泄漏
+
+ int num_data = get_Trainingdata_data_num(fp);
+ if (num_data <= offset) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+ "Offset %d exceeds number of data %d", offset, num_data);
+ free(data); // 释放内存
fclose(fp);
return NULL;
}
+
fseek(fp, sizeof(Trainingdata) * offset, SEEK_SET);
- fread((void *)data, sizeof(Trainingdata), 1, fp);
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "%d", data->src);
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "%d %d ", offset,
+ fread(data, sizeof(Trainingdata), 1, fp);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Data src: %d", data->src);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Offset: %d, Size: %zu", offset,
sizeof(Trainingdata));
- fseek(fp, 0, SEEK_SET);
- fclose(fp);
- return data;
+ fclose(fp); // 关闭文件
+ return data; // 返回读取的数据
}
+
#ifdef __cplusplus
}
#endif
bool TraingModel::SaveDataToJson(SportData *data) {
FILE *fp;
char *jsonStr = NULL;
- // 创建sport文件夹
- CreateDirectoryIfNotExists(TRAINING_DATA_DIRECTORY);
// 读取现有的 JSON 数据
fp = fopen(TRAINING_RECORD_FILE, "r");