mcu_hi3321_watch/tjd/ui/app/activity_recognition/TjdUiAppActivityRecognitionView.cpp
2025-05-26 20:15:20 +08:00

367 lines
14 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*----------------------------------------------------------------------------
* Copyright (c) TJD Technologies Co., Ltd. 2024. All rights reserved.
*
* Description: TjdUiAppActivityRecognitionView.cpp
*
* Author: wuchangxin@ss-tjd.com
*
* Create: 2025-03-24
*--------------------------------------------------------------------------*/
#include "TjdUiAppActivityRecognitionView.h"
#include "TjdUiAppActivityRecognitionPresenter.h"
#include "TjdUiAppSportView.h"
#include "TjdUiImageIds.h"
#include "TjdUiMultiLanguageExt.h"
#include "TjdUiScreenManage.h"
#include "cmsis_os2.h"
#include "common/image_cache_manager.h"
#include "graphic_service.h"
#include "motor.h"
#include "notification_manager.h"
#include <string>
#define IMAGE_BIN_PATH TJD_IMAGE_PATH "img_activity_recognition.bin"
using namespace OHOS;
namespace TJD {
// clang-format off
static inline int16_t HorizontalCenter(int16_t width, int16_t parentWidth) { return (parentWidth - width) / 2; }
static inline void InitLabelHorCenter(OHOS::UILabel &label, uint8_t size, int16_t y, int16_t target, const char *text)
{
label.SetFont(TJD_VECTOR_FONT_FILENAME, size);
label.SetText(text);
label.SetLineBreakMode(OHOS::UILabel::LINE_BREAK_ADAPT);
label.SetAlign(OHOS::TEXT_ALIGNMENT_CENTER, OHOS::TEXT_ALIGNMENT_CENTER);
label.SetPosition(HorizontalCenter(label.GetWidth(), target), y);
}
// clang-format on
static void ActivityRecognitionViewTimerFunc(void *arg)
{
GraphicService::GetInstance()->PostGraphicEvent([]() { OHOS::NotificationManager::GetInstance()->StopNotify(); });
}
ActivityRecognitionView::ActivityRecognitionView(uint8_t sportType)
{
SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
ImageInfo *image = nullptr;
std::string tip = "";
if (sportType == static_cast<uint8_t>(ACTIVITY_TYPE_RUNNING)) {
image = OHOS::ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_ACTIVITY_RECOGNITION_01_OUTDOOR_RUNNING,
IMAGE_BIN_PATH);
InitLabelHorCenter(sportName_, 36, 171, 466, "户外跑步");
tip = "检测到您可能在跑步\n是否开启运动?";
sportIcon_.SetViewIndex(ACTIVITY_TYPE_RUNNING);
} else {
image = OHOS::ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_ACTIVITY_RECOGNITION_02_OUTDOOR_WALKING,
IMAGE_BIN_PATH);
InitLabelHorCenter(sportName_, 36, 171, 466, "户外步行");
tip = "检测到您可能在步行\n是否开启运动?";
sportIcon_.SetViewIndex(ACTIVITY_TYPE_WALKING);
}
InitLabelHorCenter(sportTip_, 36, 228, 466, tip.c_str());
sportIcon_.SetPosition(183, 55, 100, 100);
sportIcon_.SetSrc(image);
image = OHOS::ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_ACTIVITY_RECOGNITION_CANCEL, IMAGE_BIN_PATH);
imgCancel_.SetPosition(103, 326);
imgCancel_.SetSrc(image);
imgCancel_.SetTouchable(true);
imgCancel_.SetViewId("Click_Cancel_");
imgCancel_.SetOnClickListener(TjdUiAppActivityRecognitionPresenter::GetInstance());
image = OHOS::ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_ACTIVITY_RECOGNITION_CONFIRM, IMAGE_BIN_PATH);
imgConfirm_.SetPosition(271, 326);
imgConfirm_.SetSrc(image);
imgConfirm_.SetTouchable(true);
imgConfirm_.SetViewId("Start_Sport");
imgConfirm_.SetOnClickListener(TjdUiAppActivityRecognitionPresenter::GetInstance());
g_ActivityRecognitionViewTimerId =
osTimerNew((osTimerFunc_t)ActivityRecognitionViewTimerFunc, osTimerOnce, NULL, NULL);
ShowView();
Add(&sportTip_);
Add(&sportIcon_);
Add(&sportName_);
Add(&imgCancel_);
Add(&imgConfirm_);
}
uint8_t ActivityRecognitionView::GetSportType() { return sportIcon_.GetViewIndex(); }
void ActivityRecognitionView::ShowView()
{
TjdUiScreenManage::SetScreenKeepOnTimeout(30 * 1000);
motor_param_t motorParam = {.cycle1_on = 200, .cycle1_off = 100, .cycle1_cnt = 0x1, .duty = 100};
tjd_driver_motor_user_start(&motorParam);
osTimerStart(g_ActivityRecognitionViewTimerId, 30 * 1000);
}
ActivityRecognitionView::~ActivityRecognitionView()
{
TjdUiScreenManage::ResetScreenKeepOnTimeout();
tjd_driver_motor_user_stop();
osTimerStop(g_ActivityRecognitionViewTimerId);
osTimerDelete(g_ActivityRecognitionViewTimerId);
RemoveAll();
}
MovementEndReminder::MovementEndReminder()
{
SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
ImageInfo *image = nullptr;
InitLabelHorCenter(sportTip_, 36, 194, 466, "您已经30分钟未运动\n是否结束运动?");
image = OHOS::ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_ACTIVITY_RECOGNITION_CANCEL, IMAGE_BIN_PATH);
imgCancel_.SetPosition(103, 326);
imgCancel_.SetSrc(image);
imgCancel_.SetTouchable(true);
imgCancel_.SetViewId("imgCancel_");
imgCancel_.SetOnClickListener(TjdUiAppActivityRecognitionPresenter::GetInstance());
image = OHOS::ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_ACTIVITY_RECOGNITION_CONFIRM, IMAGE_BIN_PATH);
imgConfirm_.SetPosition(271, 326);
imgConfirm_.SetSrc(image);
imgConfirm_.SetTouchable(true);
imgConfirm_.SetViewId("MovementEndReminderConfirm_");
imgConfirm_.SetOnClickListener(TjdUiAppActivityRecognitionPresenter::GetInstance());
g_MovementEndReminderTimerId = osTimerNew((osTimerFunc_t)ActivityRecognitionViewTimerFunc, osTimerOnce, NULL, NULL);
ShowView();
Add(&sportTip_);
Add(&imgCancel_);
Add(&imgConfirm_);
}
void MovementEndReminder::ShowView()
{
TjdUiScreenManage::SetScreenKeepOnTimeout(5 * 1000);
motor_param_t motorParam = {.cycle1_on = 200, .cycle1_off = 100, .cycle1_cnt = 0x1, .duty = 100};
tjd_driver_motor_user_start(&motorParam);
osTimerStart(g_MovementEndReminderTimerId, 5 * 1000);
}
MovementEndReminder::~MovementEndReminder()
{
TjdUiScreenManage::ResetScreenKeepOnTimeout();
tjd_driver_motor_user_stop();
osTimerStop(g_MovementEndReminderTimerId);
osTimerDelete(g_MovementEndReminderTimerId);
RemoveAll();
}
MovementForcedEndReminder::MovementForcedEndReminder()
{
SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
ImageInfo *image = nullptr;
InitLabelHorCenter(sportTip_, 32, 136, 466,
"检测到您长时间未\n产生运动数据,本次运动\n已自动结束,运动数据已\n保存至运动记录");
image = OHOS::ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_ACTIVITY_RECOGNITION_FINISH, IMAGE_BIN_PATH);
imgIcon_.SetPosition(183, 26);
imgIcon_.SetSrc(image);
image =
OHOS::ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_ACTIVITY_RECOGNITION_BJ_SUSPEND, IMAGE_BIN_PATH);
imgConfirm_.SetPosition(77, 378);
imgConfirm_.SetSrc(image);
imgConfirm_.SetTouchable(true);
imgConfirm_.SetViewId("MovementForcedEndReminderConfirm_");
imgConfirm_.SetOnClickListener(TjdUiAppActivityRecognitionPresenter::GetInstance());
g_MovementForcedEndReminderTimerId =
osTimerNew((osTimerFunc_t)ActivityRecognitionViewTimerFunc, osTimerOnce, NULL, NULL);
ShowView();
Add(&imgIcon_);
Add(&sportTip_);
Add(&imgConfirm_);
}
void MovementForcedEndReminder::ShowView()
{
TjdUiScreenManage::SetScreenKeepOnTimeout(5 * 1000);
motor_param_t motorParam = {.cycle1_on = 1000, .cycle1_off = 1000, .cycle1_cnt = 0x1, .duty = 100};
tjd_driver_motor_user_start(&motorParam);
osTimerStart(g_MovementForcedEndReminderTimerId, 5 * 1000);
if (OHOS::NativeAbility::GetInstance().GetCurSliceId() == TJD_APP_VIEW_SPORT) {
auto sportView = TjdUiAppSportView::GetInstance();
sportView->ShowTargetView(SPORT_END_DATA_VIEW);
}
}
MovementForcedEndReminder::~MovementForcedEndReminder()
{
TjdUiScreenManage::ResetScreenKeepOnTimeout();
tjd_driver_motor_user_stop();
osTimerStop(g_MovementForcedEndReminderTimerId);
osTimerDelete(g_MovementForcedEndReminderTimerId);
RemoveAll();
}
MovementTimeoutReminder::MovementTimeoutReminder(uint8_t timeStamp)
{
SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
ImageInfo *image = nullptr;
std::string timeStr =
std::string("您已运动") + std::to_string(timeStamp) + "h请及时结束\n注意休息\n是否立即结束运动?";
InitLabelHorCenter(sportTip_, 34, 173, 466, timeStr.c_str());
image = OHOS::ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_ACTIVITY_RECOGNITION_CANCEL, IMAGE_BIN_PATH);
imgCancel_.SetPosition(103, 326);
imgCancel_.SetSrc(image);
imgCancel_.SetTouchable(true);
imgCancel_.SetViewId("imgCancel_");
imgCancel_.SetOnClickListener(TjdUiAppActivityRecognitionPresenter::GetInstance());
image = OHOS::ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_ACTIVITY_RECOGNITION_CONFIRM, IMAGE_BIN_PATH);
imgConfirm_.SetPosition(271, 326);
imgConfirm_.SetSrc(image);
imgConfirm_.SetTouchable(true);
imgConfirm_.SetViewId("MovementTimeoutReminderConfirm_");
imgConfirm_.SetOnClickListener(TjdUiAppActivityRecognitionPresenter::GetInstance());
g_MovementTimeoutReminderTimerId =
osTimerNew((osTimerFunc_t)ActivityRecognitionViewTimerFunc, osTimerOnce, NULL, NULL);
ShowView();
Add(&sportTip_);
Add(&imgCancel_);
Add(&imgConfirm_);
}
void MovementTimeoutReminder::ShowView()
{
TjdUiScreenManage::SetScreenKeepOnTimeout(10 * 1000);
motor_param_t motorParam = {.cycle1_on = 1000, .cycle1_off = 1000, .cycle1_cnt = 0x1, .duty = 100};
tjd_driver_motor_user_start(&motorParam);
osTimerStart(g_MovementTimeoutReminderTimerId, 10 * 1000);
}
MovementTimeoutReminder::~MovementTimeoutReminder()
{
TjdUiScreenManage::ResetScreenKeepOnTimeout();
tjd_driver_motor_user_stop();
osTimerStop(g_MovementTimeoutReminderTimerId);
osTimerDelete(g_MovementTimeoutReminderTimerId);
RemoveAll();
}
MovementTimeoutForcedEndReminder::MovementTimeoutForcedEndReminder(uint8_t timeStamp)
{
SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
ImageInfo *image = nullptr;
std::string timeStr = std::string("您已运动") + std::to_string(timeStamp) +
"h劳逸结合\n才能形成更好的运动效果\n运动将会在1min后结束";
InitLabelHorCenter(sportTip_, 32, 173, 466, timeStr.c_str());
image = OHOS::ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_ACTIVITY_RECOGNITION_BUTTON, IMAGE_BIN_PATH);
imgConfirm_.SetPosition(187, 352);
imgConfirm_.SetSrc(image);
imgConfirm_.SetTouchable(true);
imgConfirm_.SetViewId("MovementTimeoutForcedEndReminderConfirm_");
imgConfirm_.SetOnClickListener(TjdUiAppActivityRecognitionPresenter::GetInstance());
g_MovementTimeoutForcedEndReminderTimerId =
osTimerNew((osTimerFunc_t)ActivityRecognitionViewTimerFunc, osTimerOnce, NULL, NULL);
ShowView();
Add(&sportTip_);
Add(&imgConfirm_);
}
void MovementTimeoutForcedEndReminder::ShowView()
{
TjdUiScreenManage::SetScreenKeepOnTimeout(10 * 1000);
motor_param_t motorParam = {.cycle1_on = 1000, .cycle1_off = 1000, .cycle1_cnt = 0x1, .duty = 100};
tjd_driver_motor_user_start(&motorParam);
osTimerStart(g_MovementTimeoutForcedEndReminderTimerId, 10 * 1000);
}
MovementTimeoutForcedEndReminder::~MovementTimeoutForcedEndReminder()
{
tjd_driver_motor_user_stop();
TjdUiScreenManage::ResetScreenKeepOnTimeout();
osTimerStop(g_MovementTimeoutForcedEndReminderTimerId);
osTimerDelete(g_MovementTimeoutForcedEndReminderTimerId);
RemoveAll();
}
static void CountDownTimerFunc(void *arg)
{
static uint8_t count = 0;
OHOS::UILabel *lbCountDown = static_cast<OHOS::UILabel *>(arg);
if (count == 10) {
GraphicService::GetInstance()->PostGraphicEvent(
[]() { OHOS::NotificationManager::GetInstance()->StopNotify(); });
count = 0;
}
lbCountDown->SetText(std::to_string(std::stoi(lbCountDown->GetText()) - 1).c_str());
count++;
}
MovementAutoEndView::MovementAutoEndView()
{
SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
ImageInfo *image = nullptr;
InitLabelHorCenter(sportTip_, 34, 175, 466, "运动将在 s\n后自动结束!");
lbCountDown_.SetFont(TJD_VECTOR_FONT_FILENAME, 52);
lbCountDown_.SetText("10");
lbCountDown_.SetLineBreakMode(OHOS::UILabel::LINE_BREAK_ADAPT);
lbCountDown_.SetAlign(OHOS::TEXT_ALIGNMENT_CENTER, OHOS::TEXT_ALIGNMENT_CENTER);
lbCountDown_.SetPosition(266, 156);
image = OHOS::ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_ACTIVITY_RECOGNITION_BUTTON, IMAGE_BIN_PATH);
imgConfirm_.SetPosition(187, 352);
imgConfirm_.SetSrc(image);
imgConfirm_.SetTouchable(true);
imgConfirm_.SetViewId("MovementAutoEndViewConfirm_");
imgConfirm_.SetOnClickListener(TjdUiAppActivityRecognitionPresenter::GetInstance());
g_MovementAutoEndViewTimerId = osTimerNew((osTimerFunc_t)CountDownTimerFunc, osTimerPeriodic, &lbCountDown_, NULL);
ShowView();
Add(&sportTip_);
Add(&imgConfirm_);
Add(&lbCountDown_);
}
void MovementAutoEndView::ShowView()
{
lbCountDown_.SetText("10");
TjdUiScreenManage::SetScreenKeepOnTimeout(10 * 1000);
motor_param_t motorParam = {.cycle1_on = 1000, .cycle1_off = 1000, .cycle1_cnt = 0x1, .duty = 100};
tjd_driver_motor_user_start(&motorParam);
osTimerStart(g_MovementAutoEndViewTimerId, 1000);
}
MovementAutoEndView::~MovementAutoEndView()
{
auto sportView = TjdUiAppSportView::GetInstance();
if (sportView != nullptr && TjdUiAppSportView::currentViewIndex_ != SPORT_END_DATA_VIEW) {
sportView->ShowTargetView(SPORT_END_DATA_VIEW);
}
TjdUiScreenManage::ResetScreenKeepOnTimeout();
tjd_driver_motor_user_stop();
osTimerStop(g_MovementAutoEndViewTimerId);
osTimerDelete(g_MovementAutoEndViewTimerId);
RemoveAll();
}
} // namespace TJD