367 lines
14 KiB
C++
367 lines
14 KiB
C++
/*----------------------------------------------------------------------------
|
||
* 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
|