From 39d8889b3f26db3929692cf9c679fb8f7ea798b5 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E8=A2=81=E6=B8=85=E6=A2=A6?= <3449750381@qq.com> Date: Sat, 12 Oct 2024 13:34:28 +0000 Subject: [PATCH] Merge #1173 into sdk602patch0911 from refs/changes/1173/head MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Code review from 袁清梦 * refs/changes/1173/head: (8 commits squashed) - 优化训练文件存储。增加错误存储提醒 - #986 手表在点击拍照界面,APP端退出相机界面时手表端不会同步退出 - #799长按表盘,进入表盘预览界面,手表息屏后不管多久亮屏,手表还是表盘预览界面。 - #942 心率出值后,过一会又会显示-- - #840 卡片界面心率也需要有活体检测弹窗提醒 - Merge branch 'sdk602patch0911' of https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230 into sdk602patch0911 - 表盘:取消开机对电量获取的注册 - 心率:优化心率数据的存储以及更新 Signed-off-by: Caisking <3449750381@qq.com> Reviewed-by: snickersun@163.com Merged-by: snickersun@163.com CR-link: https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230/change/1173 --- .../nativeui/heartrate/include/HeartModel.h | 13 +- .../nativeui/heartrate/src/HeartModel.cpp | 168 +++++----- .../main/include/dial/DialModelPower.h | 18 -- .../main/include/dial/DialModelPowerStandby.h | 25 +- .../nativeui/main/src/MainPresenterSample.cpp | 18 +- .../nativeui/main/src/dial/DialModelPower.cpp | 12 +- .../main/src/dial/DialModelPowerStandby.cpp | 19 +- .../screennotify/include/ui_screennotify.h | 12 +- .../screennotify/src/ui_screennotify.cpp | 299 +++++++++--------- .../takephotos/src/TakephotosModel.cpp | 10 +- .../nativeui/traing/src/TraingModel.cpp | 93 +++--- 11 files changed, 349 insertions(+), 338 deletions(-) diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h index f6bb63b87..ea1cf6354 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h @@ -150,6 +150,11 @@ public: uint16_t *GetArrayData(); void SetArrayData(); + void handleHeartResult(); + void logAndChangeSlice(HeartResult result); + void handleLowHeartRate(); + void handleHighHeartRate(); + private: HealthAllDatas healthDatas; uint16_t pretime{0}; @@ -164,8 +169,8 @@ private: bool wearStatus{true}; uint16_t index_ = 0; - uint16_t displayheart; // 显示心率 - uint16_t currentheart; // 保存心率 + uint16_t displayheart = 0; // 显示心率 + uint16_t currentheart = 0; // 保存心率 uint16_t displayheart_max = 0; // 显示最大心率 uint16_t displayheart_min = 0; // 显示最小心率 @@ -186,6 +191,10 @@ private: HeartCheck checkstate = HeartCheck::RESTSTSTE; // 目前检测状态 uint16_t dynamic_heartrate[5]; //动态心率配置项 + + uint8_t heartRemindState{0}; + uint16_t thresholdValue{160}; + uint16_t thresholdState{1}; }; } // namespace OHOS diff --git a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp index 7f0f08779..73d443ae6 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp @@ -29,9 +29,9 @@ extern "C" { #endif #define MAX_UNWEAR_COUNT 2 -#define MAX_VALID_HRS_COUNT 60 -#define MAX_DISVALID_HRS_COUNT 70 -#define MIN_DISPLAY_HEART 60 +#define MAX_VALID_HRS_COUNT 10 //最大有效数 +#define MAX_DISVALID_HRS_COUNT 10 //最大无效数 +#define MIN_DISPLAY_HEART 50 //最新心率 #define DISPLAY_COUNT 0 #define HEARTTEST 1 //[0 开启测试 1 关闭] @@ -401,7 +401,8 @@ void HeartModel::Heart_Control(HeartState state, HeartCheck check) { checkstate = HeartCheck::RESTSTSTE; LOS_Msleep(500); uapi_dev_runtime_set_hrs_passivity(0); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "uapi_dev_runtime_set_hrs_passivity(0)"); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "uapi_dev_runtime_set_hrs_passivity(0)"); } else if (state == HeartState::Start && heartstate == false) { /*充电状态下不进行检测*/ bool isCharging = get_charge_stat(); // 获取充电状态 @@ -415,25 +416,22 @@ void HeartModel::Heart_Control(HeartState state, HeartCheck check) { heartstate = true; checkstate = check; //被动 - if(checkstate==HeartCheck::PASSIVITY) - { - uapi_dev_runtime_set_hrs_passivity(1); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "uapi_dev_runtime_set_hrs_passivity(1)"); + if (checkstate == HeartCheck::PASSIVITY) { + uapi_dev_runtime_set_hrs_passivity(1); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "uapi_dev_runtime_set_hrs_passivity(1)"); } - } } // 开始检测 void HeartModel::Heart_Start() { - displayheart = 0; - // displayheart_max=0;// 显示最大心率 [每次检测进行清除] - // displayheart_min=0;// 显示最小心率 [每次检测进行清除] - - SetResult(HeartResult::NOT_TESTED); // 重置检测 - // 进行初始化操作 if (!sensorstate) { + displayheart = 0; + SetResult(HeartResult::NOT_TESTED); // 重置检测 Heart_Control(HeartState::Start, HeartCheck::INITIATIVE); + // ScreenTurnOn(60 * 1000); // 亮屏操作 600000ms 60秒关闭 sensorstate = true; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "开始心率检测"); } } @@ -442,11 +440,13 @@ void HeartModel::Heart_Stop() { valid_counter_ = 0; disvalid_counter_ = 0; unwear_counter_ = 0; - display_counter_ = 0; - displayheart = 0; + // display_counter_ = 0; 取消再次检测的--操作 + // displayheart = 0; + + // ScreenTurnOff(); //恢复正常亮屏 /*主界面卡片检测 或者 被动检测*/ - if ( checkstate == HeartCheck::PASSIVITY) { + if (checkstate == HeartCheck::PASSIVITY) { if (heartresult_ == HeartResult::SUCCESS) { Heart_Save(); /*更新曲线*/ @@ -458,12 +458,9 @@ void HeartModel::Heart_Stop() { return; } - if (sensorstate) { - // Heart_Control(HeartState::End,HeartCheck::INITIATIVE);主动检测心率 - // 不需要关闭 - sensorstate = false; - Heart_Result(); // 处理结果 - } + sensorstate = false; + Heart_Result(); // 处理结果 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "本次心率检测结束"); } // 保存检测数据 void HeartModel::Heart_Save() { @@ -477,76 +474,61 @@ void HeartModel::Heart_Save() { data.timestamp); } -// 显示检测结果// 显示检测结果 void HeartModel::Heart_Result() { - // 心率提醒(0开 1关) - uint8_t HeartRemindState = ConfigModel::GetInstance()->get_configData_int( + // 获取心率提醒状态和阈值 + heartRemindState = ConfigModel::GetInstance()->get_configData_int( ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_REMIND); - uint16_t ThresholdValue = ConfigModel::GetInstance()->get_configData_int( + thresholdValue = ConfigModel::GetInstance()->get_configData_int( ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_THRESHOLD_VALUE); - if (HeartRemindState) { - // 检查当前心率是否高于或低于阈值 - uint16_t ThresholdState = ConfigModel::GetInstance()->get_configData_int( + if (heartRemindState) { + // 获取当前心率状态 + thresholdState = ConfigModel::GetInstance()->get_configData_int( ConfigModel::CONFIGMODEL_ITEM_HEARTRATE_MAX_MIN); - if (ThresholdState == 0 && currentheart < ThresholdValue && - currentheart != 0) { - // 当前心率低于阈值 - heartresult_ = HeartResult::LOW_RESULT; - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, - "检测结果:低结果情况,currentheart=%d,ThresholdValue=%d", - currentheart, ThresholdValue); - } else if (ThresholdState == 1 && currentheart > ThresholdValue) { - // 当前心率高于阈值 - heartresult_ = HeartResult::HIGH_RESULT; - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, - "检测结果:高结果情况,currentheart=%d,ThresholdValue=%d", - currentheart, ThresholdValue); + if (currentheart != 0) { + if (thresholdState == 0 && currentheart < thresholdValue) { + // 当前心率低于阈值 + heartresult_ = HeartResult::LOW_RESULT; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "检测结果:低结果情况,currentheart=%d,ThresholdValue=%d", + currentheart, thresholdValue); + } else if (thresholdState == 1 && currentheart > thresholdValue) { + // 当前心率高于阈值 + heartresult_ = HeartResult::HIGH_RESULT; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "检测结果:高结果情况,currentheart=%d,ThresholdValue=%d", + currentheart, thresholdValue); + } } } // 根据结果进行处理 + handleHeartResult(); +} +// 处理检测结果 +void HeartModel::handleHeartResult() { switch (heartresult_) { case HeartResult::SUCCESS: WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:成功"); Heart_Save(); - /*更新曲线*/ + // 更新曲线 GraphicService::GetInstance()->PostGraphicEvent( std::bind(&HeartModel::Heart_Update_View, HeartModel::GetInstance())); break; - case HeartResult::NOT_WORN: // 未佩戴状态 - case HeartResult::TIMEOUT: // 超时情况 - case HeartResult::INVALID_DATA: // 无效数据情况 - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:%s情况", - heartresult_ == HeartResult::NOT_WORN - ? "未佩戴状态" - : heartresult_ == HeartResult::TIMEOUT ? "超时" - : "无效数据"); - NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_ABNORMAL); + case HeartResult::NOT_WORN: + case HeartResult::TIMEOUT: + case HeartResult::INVALID_DATA: + logAndChangeSlice(heartresult_); break; case HeartResult::LOW_RESULT: - // 低心率结果处理 - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:低结果情况"); - HealthState lowHealthState; - lowHealthState.checkType = BLOOD_CHECK; - lowHealthState.resultStatus = LOW; - lowHealthState.checkResult = ThresholdValue; - HealthService::GetInstance()->SetHealthCurrent(lowHealthState); - NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID); + handleLowHeartRate(); break; case HeartResult::HIGH_RESULT: - // 高心率结果处理 - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:高结果情况"); - HealthState highHealthState; - highHealthState.checkType = BLOOD_CHECK; - highHealthState.resultStatus = HIGH; - highHealthState.checkResult = ThresholdValue; - HealthService::GetInstance()->SetHealthCurrent(highHealthState); - NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID); + handleHighHeartRate(); break; default: @@ -554,15 +536,38 @@ void HeartModel::Heart_Result() { break; } } - void HeartModel::SetWearStatus() - { - // 如果处于训练模式,提前返回 - if (uapi_dev_runtime_get_train_status() == 1) - return; - // 设置佩戴状态 - SetResult(HeartResult::NOT_WORN); - Heart_Stop(); - } +//进行日志打印与界面切换 +void HeartModel::logAndChangeSlice(HeartResult result) { + const char *resultMsg = + (result == HeartResult::NOT_WORN) + ? "未佩戴状态" + : (result == HeartResult::TIMEOUT) ? "超时" : "无效数据"; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:%s情况", resultMsg); + NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_ABNORMAL); +} +// 处理低心率情况 +void HeartModel::handleLowHeartRate() { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:低结果情况"); + HealthState lowHealthState = {BLOOD_CHECK, LOW, thresholdValue}; + HealthService::GetInstance()->SetHealthCurrent(lowHealthState); + NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID); +} +// 处理高心率情况 +void HeartModel::handleHighHeartRate() { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测结果:高结果情况"); + HealthState highHealthState = {BLOOD_CHECK, HIGH, thresholdValue}; + HealthService::GetInstance()->SetHealthCurrent(highHealthState); + NativeAbility::GetInstance().ChangeSlice(VIEW_CHECK_INVALID); +} +// 设置佩戴状态 +void HeartModel::SetWearStatus() { + // 如果处于训练模式,提前返回 + if (uapi_dev_runtime_get_train_status() == 1) + return; + // 设置佩戴状态 + SetResult(HeartResult::NOT_WORN); + Heart_Stop(); +} void HeartModel::UpHeartdata(uint16_t heart) { // 如果处于训练模式,提前返回 @@ -576,13 +581,10 @@ void HeartModel::UpHeartdata(uint16_t heart) { displayheart = 0; } display_counter_++; - } - else - { + } else { displayheart = 0; } - // 更新心率和计数器 if (displayheart != 0) { currentheart = displayheart; // 更新当前心率 diff --git a/code/sdk/application/wearable/fd230app/nativeui/main/include/dial/DialModelPower.h b/code/sdk/application/wearable/fd230app/nativeui/main/include/dial/DialModelPower.h index 247f6f445..2837b4df4 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/main/include/dial/DialModelPower.h +++ b/code/sdk/application/wearable/fd230app/nativeui/main/include/dial/DialModelPower.h @@ -1,21 +1,3 @@ -/*** - * @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 diff --git a/code/sdk/application/wearable/fd230app/nativeui/main/include/dial/DialModelPowerStandby.h b/code/sdk/application/wearable/fd230app/nativeui/main/include/dial/DialModelPowerStandby.h index 334bb2664..6a52879d1 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/main/include/dial/DialModelPowerStandby.h +++ b/code/sdk/application/wearable/fd230app/nativeui/main/include/dial/DialModelPowerStandby.h @@ -1,27 +1,4 @@ -/*** - * @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 diff --git a/code/sdk/application/wearable/fd230app/nativeui/main/src/MainPresenterSample.cpp b/code/sdk/application/wearable/fd230app/nativeui/main/src/MainPresenterSample.cpp index de0be7c36..21ec2c85e 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/main/src/MainPresenterSample.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/main/src/MainPresenterSample.cpp @@ -42,6 +42,8 @@ #include "ui_service.h" #include "time.h" #define TESTCHECK 0 +//心率弹窗 +#define HEART_RATE_CHECK_TIMEOUT 0 namespace OHOS { @@ -69,7 +71,13 @@ 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) @@ -470,9 +478,11 @@ namespace OHOS { // 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() diff --git a/code/sdk/application/wearable/fd230app/nativeui/main/src/dial/DialModelPower.cpp b/code/sdk/application/wearable/fd230app/nativeui/main/src/dial/DialModelPower.cpp index dc8f4f8e9..95bdf3ca1 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/main/src/dial/DialModelPower.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/main/src/dial/DialModelPower.cpp @@ -34,12 +34,12 @@ namespace OHOS 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(power_); diff --git a/code/sdk/application/wearable/fd230app/nativeui/main/src/dial/DialModelPowerStandby.cpp b/code/sdk/application/wearable/fd230app/nativeui/main/src/dial/DialModelPowerStandby.cpp index 6fdcfe21c..5e86d710f 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/main/src/dial/DialModelPowerStandby.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/main/src/dial/DialModelPowerStandby.cpp @@ -1,9 +1,4 @@ -/*** - * @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" @@ -21,12 +16,12 @@ namespace OHOS 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); diff --git a/code/sdk/application/wearable/fd230app/nativeui/screennotify/include/ui_screennotify.h b/code/sdk/application/wearable/fd230app/nativeui/screennotify/include/ui_screennotify.h index 4d202759a..6a6d6aa3d 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/screennotify/include/ui_screennotify.h +++ b/code/sdk/application/wearable/fd230app/nativeui/screennotify/include/ui_screennotify.h @@ -1,9 +1,4 @@ -/** - * 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" @@ -34,11 +29,14 @@ void set_back_to_home_interval(uint32_t time_sec); /** * @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 diff --git a/code/sdk/application/wearable/fd230app/nativeui/screennotify/src/ui_screennotify.cpp b/code/sdk/application/wearable/fd230app/nativeui/screennotify/src/ui_screennotify.cpp index e100581a8..c238397bc 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/screennotify/src/ui_screennotify.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/screennotify/src/ui_screennotify.cpp @@ -1,145 +1,156 @@ -#include -#include -#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 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 +#include + +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 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 diff --git a/code/sdk/application/wearable/fd230app/nativeui/takephotos/src/TakephotosModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/takephotos/src/TakephotosModel.cpp index a99952098..3837db09b 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/takephotos/src/TakephotosModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/takephotos/src/TakephotosModel.cpp @@ -93,7 +93,15 @@ extern "C" 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) 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 921cb2c75..98abd868c 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingModel.cpp @@ -129,9 +129,6 @@ static void Training_Notify(void *args, const Topic topic, Request *request) { } //增加训练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; } //训练基本信息更新 @@ -1063,6 +1060,9 @@ bool TraingModel::SaveSportData() { data.std = static_cast(sportdata->std); data.cdc = static_cast(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!"); @@ -1623,38 +1623,53 @@ static std::vector LoadTrainingDataFromTodayFile() { #ifdef __cplusplus extern "C" { #endif + +#include +#include +#include +#include +#include + // 获得数据个数 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; // 返回错误码 } } @@ -1662,46 +1677,52 @@ int write_Trainingdata_data(Trainingdata data) { 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 @@ -1743,8 +1764,6 @@ bool TraingModel::CheckDataJson() { bool TraingModel::SaveDataToJson(SportData *data) { FILE *fp; char *jsonStr = NULL; - // 创建sport文件夹 - CreateDirectoryIfNotExists(TRAINING_DATA_DIRECTORY); // 读取现有的 JSON 数据 fp = fopen(TRAINING_RECORD_FILE, "r"); -- 2.17.1