+
#include <list>
#include <cstdio>
#include "ability_state.h"
#include "components/root_view.h"
#include "notification_manager.h"
#include "DialBinTypesV2.h"
+#include <unordered_set>
+#include "ConfigModel.h"
+#include <cstdint>
+
+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 = 5;
-// 需要屏蔽掉的slice,ignore_slice_ids数组中的slice灭屏超时后不会调转到默认界面
-uint16_t ignore_slice_ids[] = {
+static uint32_t g_back_to_home_interval = 3; // 超时时间 3秒
+static const uint32_t g_screen_off_time_interval = 10; // 超时时间 10秒
+//息屏不上锁
+const uint16_t ignore_slice_ids[] = {
VIEW_INVALID,
- VIEW_SETTING,
- VIEW_UISAMPLE,
-#ifdef SUPPORT_ALIPAY_SEC
- VIEW_MAIN_ALIPAY,
-#endif
+ VIEW_SAVEBAT, // 省电模式
+ VIEW_TRAININGCRAD, // 训练卡片
+};
+//息屏10秒回到主界面
+const uint16_t special_slice_ids[] = {
+ VIEW_ADD_CARD, //卡片管理
+ VIEW_SET_DIAL, //表盘管理
+ VIEW_HEART_CHART //心率检测
};
-static std::list<ScreenStatusNotifyCallback> g_callback;
+static std::unordered_set<ScreenStatusNotifyCallback> g_callbacks;
-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) {
- return;
- }
- }
- if (sc->screen_off_time_interval > g_back_to_home_interval) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "screen off time = %u",
- sc->screen_off_time_interval);
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GetNativeAbilityState = %u",
- OHOS::NativeAbility::GetInstance().GetNativeAbilityState());
- if (OHOS::NativeAbility::GetInstance().GetNativeAbilityState() == STATE_ACTIVE) {
- if (current_slice_id != VIEW_MAIN) { // 主表盘
- OHOS::NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN);
- } else {
- if (!OHOS::MainViewSample::GetInstance()->IsMainClockPage()) {
- // 当前页面为主表盘的其他页面时,切换回主表盘页面
- OHOS::MainViewSample::GetInstance()->SwitchToClockPage();
- }
- }
- }
+static bool isSliceIgnored(uint16_t slice_id) {
+ for (uint16_t id : ignore_slice_ids) {
+ if (id == slice_id) {
+ return true;
}
+ }
+ return false;
}
+static void GuiEnterAod(bool entry) {
+ using namespace OHOS;
+ DisplayState newState = entry ? DisplayState::AOD : DisplayState::NORMAL;
-static void GuiEnterAod(bool entry)
-{
- using namespace OHOS;
- DisplayState newState = entry ? DisplayState::AOD : DisplayState::NORMAL;
-
- uint16_t current_slice_id = 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) {
- return;
- }
+ uint16_t current_slice_id = 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) {
+ return;
}
- if (NativeAbility::GetInstance().GetNativeAbilityState() == STATE_ACTIVE) {
- if (newState == DisplayState::AOD) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "enter aod");
- NativeAbility::GetInstance().ChangeSlice(VIEW_AOD);
- } else {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "exit aod");
- NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN);
- }
+ }
+ if (NativeAbility::GetInstance().GetNativeAbilityState() == STATE_ACTIVE) {
+ if (newState == DisplayState::AOD) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "enter aod");
+ NativeAbility::GetInstance().ChangeSlice(VIEW_AOD);
+ } else {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "exit aod");
+ NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN);
}
-};
+ }
+}
+static void ChangeToHomeView(void) {
+ screen_context_t *sc = power_display_get_screen_context();
+ uint16_t current_slice_id =
+ OHOS::NativeAbility::GetInstance().GetCurSliceId();
-void notify_screen_on_event(void)
-{
- for (auto callback : g_callback) {
- callback(SCREEN_STATUS_ON);
- }
- ChangeToHomeView();
- if (GraphicService::GetInstance()->IsNativeRunning() && !OHOS::NotificationManager::GetInstance()->HasNotifyShowing()) {
- OHOS::NativeAbility::GetInstance().ResumeSlice(); // ensure that don't resume twice if switch to home
+ 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 %u",
+ sc->screen_off_time_interval, g_back_to_home_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_screen_off_time_interval) {
+ handleLockDisabled(current_slice_id);
+ }
}
-void notify_screen_off_event(void)
-{
- for (auto callback : g_callback) {
- callback(SCREEN_STATUS_OFF);
- }
- if (GraphicService::GetInstance()->IsNativeRunning()) {
- OHOS::NativeAbility::GetInstance().StopSliceTransition(); // make sure to end slice transition before turning screen off.
- OHOS::NativeAbility::GetInstance().PauseSlice();
+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_aod_on_event(void)
{
GuiEnterAod(true);
{
GuiEnterAod(false);
}
+void notify_screen_on_event(void) {
+ for (auto callback : g_callbacks) {
+ callback(SCREEN_STATUS_ON);
+ }
+ ChangeToHomeView();
+}
-void set_back_to_home_interval(uint32_t time_sec)
-{
- g_back_to_home_interval = time_sec;
+void notify_screen_off_event(void) {
+ for (auto callback : g_callbacks) {
+ callback(SCREEN_STATUS_OFF);
+ }
}
-uint32_t get_back_to_home_interval(void)
-{
- return g_back_to_home_interval;
+void set_back_to_home_interval(uint32_t time_sec) {
+ g_back_to_home_interval = time_sec;
}
-void registerNotifyScreenStatus(ScreenStatusNotifyCallback callback)
-{
- if (callback != nullptr) {
- g_callback.push_back(callback);
- }
+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_callback.remove(callback);
- }
+void deregisterNotifyScreenStatus(ScreenStatusNotifyCallback callback) {
+ if (callback != nullptr) {
+ g_callbacks.erase(callback);
+ }
}
#ifdef __cplusplus
}
-#endif
+#endif
\ No newline at end of file
#endif
#ifdef SUPPORT_CYWEE_SERVICE
+#include "cywee_hal.h"
#include "cywee_service.h"
#endif
}
int flag = 0;
static void Training_Notify(void *args, const Topic topic, Request *request) {
-#ifdef CYWEE_ACTIVITY_ENABLE
+#ifdef SUPPORT_CYWEE_SERVICE
UNUSED(args);
UNUSED(topic);
if (request == NULL) {
"memcpy_s act_result_t fail ret = %d", rets);
return;
}
- // GraphicService::GetInstance()->PostGraphicEvent(
- // std::bind(&TraingCardPresenter::send_sport_cmd,
- // TraingCardPresenter::GetInstance(), traingbleInfo));
+#ifdef BLE_SERVER_ENABLE
TraingCardPresenter::GetInstance()->send_sport_cmd(traingbleInfo);
+#endif
delete traingbleInfo;
}
//增加训练runtime控制
return sum / sortedHeartRates.size(); // 返回平均值
}
-#ifdef CYWEE_ACTIVITY_ENABLE
+#ifdef SUPPORT_CYWEE_SERVICE
/*分析数据*/
void TraingModel::AnalysisData(act_result_t *cyweeInfo) {
+ if (cyweeInfo == NULL)
+ return;
+
// 不同的运动类型解析不同的数据
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+ "AnalysisData:[steps %d, distance %d,calories %d, pace %d, "
+ "step_frequency %d, step_length %d]",
+ cyweeInfo->steps, cyweeInfo->distance, cyweeInfo->calories,
+ cyweeInfo->pace, cyweeInfo->step_frequency,
+ cyweeInfo->step_length);
// 通用数据
sportdata->steps = cyweeInfo->steps;
sportdata->distance = cyweeInfo->distance;
#endif
/*分析activity extra info数据*/
-#ifdef CYWEE_ACTIVITY_ENABLE
+#ifdef SUPPORT_CYWEE_SERVICE
void TraingModel::AnalysisExtraData(act_ext_result_t *cyweeInfo) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[apc:%d fpc:%d cdc:%d std:%d]",
+ //判断是否为特殊训练
+ if (isspecialsport_ == false) {
+ return;
+ }
+
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[apc:%d fpc:%d cdc:%d std:%d]",
cyweeInfo->avg_pace, cyweeInfo->max_pace,
cyweeInfo->avg_step_freq, cyweeInfo->avg_step_len);
//平均配速
// 检查重复时间戳
for (const auto &entry : heartRateTable) {
if (entry.timestamp == timestamp) {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
- "时间戳重复无法添加数据 AddHeartRateData is error!");
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"时间戳重复无法添加数据 AddHeartRateData is error!");
return false; // 返回重复
}
}
if (heartRateTable.size() >= MAX_ENTRIES) {
- WEARABLE_LOGE(
- WEARABLE_LOG_MODULE_APP,
- "达到最大心率数据条目限制 无法添加新的数据 AddHeartRateData is error!");
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"达到最大心率数据条目限制 无法添加新的数据 AddHeartRateData is error!");
return false; // 返回条目满了
}
if (g_motionTimes > 0) {
sportdata->duration = g_motionTimes; // 设置训练时长
- // 每分钟进行配速和心率数据存储
- StoreDataIfMinutePassed();
}
return motionDuration; // 返回格式化的运动时长
}
}
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "duration:[%d] g_motionTimes[%d]\r\n",
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "duration:[%d] g_motionTimes[%d]\r\n",
sportdata->duration, g_motionTimes);
}
pauseStartTimestamp = sportdata->starttime;
}
- uint32_t currentTimestamp =
- OHOS::TraingModel::GetInstance()->get_current_time(); // 获取当前时间戳
- g_motionTimes = (currentTimestamp - pauseStartTimestamp) +
- totalPausedDuration; // 更新运动时间
+ uint32_t currentTimestamp =OHOS::TraingModel::GetInstance()->get_current_time(); // 获取当前时间戳
+ g_motionTimes = (currentTimestamp - pauseStartTimestamp) + totalPausedDuration; // 更新运动时间
sportdata->duration = g_motionTimes; // 更新持续时间
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
return;
}
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "sport_data_callbackProc");
-#ifdef CYWEE_ACTIVITY_ENABLE
+#ifdef SUPPORT_CYWEE_SERVICE
act_result_t cyweeInfo;
cywee_get_act_data(&cyweeInfo);
- TraingModel::GetInstance()->AnalysisData(cyweeInfo);
+ TraingModel::GetInstance()->AnalysisData(&cyweeInfo);
// 更新其他目标完成度
TraingModel::GetInstance()->CheckSportTag();
act_ext_result_t cyweeInfo_ext;
cywee_get_act_ext_data(&cyweeInfo_ext);
- TraingModel::GetInstance()->AnalysisExtraData(cyweeInfo_ext);
+ TraingModel::GetInstance()->AnalysisExtraData(&cyweeInfo_ext);
#endif
//训练心率
uint8_t hrs = 0;