{
typedef enum
{
- RESPIRATORYTRAINING = 0,
- RESPIRATORYTRAININGCOMPLETED,
+ RESPIRATORYTRAINING = 0,
+ RESPIRATORYTRAININGCOMPLETED,
MAX_RESPIRATORYTRAININGID,
} RESPIRATORYTRAININGVIEWID;
int16_t step = -1;
float scale = 0;
uint16_t curTime = 0;
+ uint16_t prepareTiem = 0;
uint16_t durationTime = 5 * 1000; // 5000: means 5000ms
int16_t startVal = durationTime;
int16_t endVal = durationTime / 2; // 2: half
+ bool isprepare{false};
+ int prepare_count = 0;
};
static constexpr int RESPIRATORY_TRAINING_IMAGE_ANIMATOR_VIEW_X = 193;
RespiratoryTrainingCallback *RespiratoryTrainingCallBack_ = nullptr;
Animator *RespiratoryTrainingAnimator_ = nullptr;
UIImageView *RespiratoryTrainingImg_ = nullptr;
- //UILabelButton *RespiratoryTrainingStart_ = nullptr;
+ // UILabelButton *RespiratoryTrainingStart_ = nullptr;
UILabelExt *RespiratoryTrainingStartNote_ = nullptr;
UILabelExt *RespiratoryTrainingLabel_ = nullptr;
bool animateStart_ = false;
#include "respiratorytraining/include/RespiratoryTrainingView.h"
#include "heartrate/include/HeartModel.h"
#include <custom_utils.h>
+#include "gfx_utils/mem_check.h"
namespace OHOS
{
// 声明定时器变量
static osTimerId_t g_timer = NULL;
- static int Time = 5;
+ static int Time = 0;
static constexpr int ONE_MINUTE = 60; // 一分钟
static bool START_FLAG = false;
{
Time = 5;
START_FLAG = false;
- HeartModel::GetInstance()->Heart_Control(HeartState::End,HeartCheck::INITIATIVE); // 关闭心率检测
+ HeartModel::GetInstance()->Heart_Control(HeartState::End, HeartCheck::INITIATIVE); // 关闭心率检测
}
/* -------------------------------------------------------------------------- */
/*定时器到期时的处理*/
static void RT_TimerCallbackProc(int data)
{
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RT_TimerCallbackProc,Time = %d", Time);
- Time -= 1;
RespiratoryTrainingView *p_RespiratoryTrainingView = RespiratoryTrainingView::GetInstance();
if (p_RespiratoryTrainingView == nullptr)
{
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "p_RespiratoryTrainingView is nullptr!!");
return;
}
- if (Time <= 0)
- {
- if (START_FLAG == true)
- {
- RespiratoryTrainingModel::GetInstance().RT_StopTimer(); // 停止定时器
- RespiratoryTrainingModel::GetInstance().AddRespiratoryTrainingTimes(); // 呼吸训练次数加1
- p_RespiratoryTrainingView->GetRespiratoryTrainingAnimator_()->Stop(); // 关闭呼吸动画
- HeartModel::GetInstance()->Heart_Control(HeartState::End,HeartCheck::INITIATIVE); // 关闭心率检测
- p_RespiratoryTrainingView->ChangeView(RESPIRATORYTRAINING, RESPIRATORYTRAININGCOMPLETED);
- ScreenAlwaysOnCtr(CANCEL_SCREEN_ALWAYS_ON);/*取消常亮屏*/
- }
- else
- {
- Time = ONE_MINUTE;
- p_RespiratoryTrainingView->StartRespiratoryTraining(); // 开始呼吸训练
- START_FLAG = true;
- HeartModel::GetInstance()->Heart_Control(HeartState::Start,HeartCheck::INITIATIVE); // 开启心率检测
- }
- }
-
+ RespiratoryTrainingModel::GetInstance().RT_StopTimer(); // 停止定时器
+ RespiratoryTrainingModel::GetInstance().AddRespiratoryTrainingTimes(); // 呼吸训练次数加1
+ p_RespiratoryTrainingView->GetRespiratoryTrainingAnimator_()->Stop(); // 关闭呼吸动画
+ HeartModel::GetInstance()->Heart_Control(HeartState::End, HeartCheck::INITIATIVE); // 关闭心率检测
+ p_RespiratoryTrainingView->ChangeView(RESPIRATORYTRAINING, RESPIRATORYTRAININGCOMPLETED);
+ ScreenAlwaysOnCtr(CANCEL_SCREEN_ALWAYS_ON); /*取消常亮屏*/
return;
}
#include "animator/easing_equation.h"
#include "ui_resource_string.h"
#include "respiratorytraining/include/RespiratoryTrainingModel.h"
+#include "heartrate/include/HeartModel.h"
+#include "vibrator_service.h"
namespace OHOS
{
- static constexpr uint16_t ONE_SECOND = 1000; // 一秒
+ static constexpr uint16_t ONE_MIN = 60000; // 1分钟
static RespiratoryTrainingView *g_pRespiratoryTrainingView{nullptr};
RespiratoryTrainingView::RespiratoryTrainingView()
void RespiratoryTrainingCallback::Callback(UIView *view)
{
// 1.计算当前时间与开始时间的差值,用于控制动画的时间。
- curTime = HALTick::GetInstance().GetTime() - startTimestamp;
- // 2.判断当前时间是否大于等于训练总时长,若是则进行下一步操作,否则继续进行呼吸动画的变化。
+ uint32_t currentTime = HALTick::GetInstance().GetTime();
+ curTime = currentTime - startTimestamp;
+
+ // 2.判断当前时间是否大于等于训练总时长,若是则进行下一步操作。
if (curTime >= durationTime)
{
- // 计算动画缩放比例,根据呼吸的起始值、结束值、当前时间、总时间和缓动函数 QuadEaseInOut 进行计算。
- curTime = durationTime;
- scale =
- static_cast<float>(EasingEquation::QuadEaseInOut(startVal, endVal, curTime, durationTime)) / durationTime;
+ prepare_count++;
+ // 计算动画缩放比例
+ scale = static_cast<float>(EasingEquation::QuadEaseInOut(startVal, endVal, durationTime, durationTime)) / durationTime;
+
// 切换起始值和结束值,更新下一次呼吸的状态。
- int16_t temp = startVal;
- startVal = endVal;
- endVal = temp;
- startTimestamp = HALTick::GetInstance().GetTime();
- isBreathIn = !isBreathIn;
- if (isBreathIn)
- {
- // breath->SetText("现在吸气");
- breath->SetTextId(STR_INHALE_NOW);
- }
- else
+ std::swap(startVal, endVal);
+ startTimestamp = currentTime;
+
+ if (prepare_count >= 2)
{
- // breath->SetText("现在呼气");
- breath->SetTextId(STR_EXHALE_NOW);
+ // 只有在准备时间结束后才切换呼吸状态和文本
+ isBreathIn = !isBreathIn;
+ if (isBreathIn)
+ {
+ // breath->SetText("现在吸气");
+ breath->SetTextId(STR_INHALE_NOW);
+ }
+ else
+ {
+ // breath->SetText("现在呼气");
+ breath->SetTextId(STR_EXHALE_NOW);
+ }
+ // 震动提醒
+ ui_api_vibrate_once_func();
+ breath->ForceResetText();
}
- breath->ForceResetText();
}
else
{
- scale =
- static_cast<float>(EasingEquation::QuadEaseInOut(startVal, endVal, curTime, durationTime)) / durationTime;
+ // 继续进行呼吸动画的变化
+ scale = static_cast<float>(EasingEquation::QuadEaseInOut(startVal, endVal, curTime, durationTime)) / durationTime;
}
- // 根据动画步长 step 更新图片的旋转角度 angle,每次旋转完成后将角度重置为 0,实现连续旋转效果。
+
+ // 根据动画步长 step 更新图片的旋转角度 angle
angle += step;
if (angle <= -360)
- { // 360: degrees per cycle
+ {
angle = 0;
}
+
// 根据计算得到的缩放比例 scale 对图片进行缩放操作,并根据角度对图片进行旋转操作
img_->Scale({scale, scale}, VIEW_CENTER);
img_->Rotate(angle, VIEW_CENTER);
return false;
}
RespiratoryTrainingLabel_->SetPosition(53, 320, 360, 70);
- RespiratoryTrainingLabel_->SetTextId(STR_EXHALE_NOW); // 现在呼气
+ RespiratoryTrainingLabel_->SetTextId(STR_KEEP_STILL_FOCUS_ON_BREATHING); // 准备
RespiratoryTrainingLabel_->SetStyle(STYLE_TEXT_FONT, 30);
RespiratoryTrainingLabel_->SetStyle(STYLE_LINE_HEIGHT, 35);
RespiratoryTrainingLabel_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);
RespiratoryTrainingStart_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
RespiratoryTrainingStart_->SetOnClickListener(this);
RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->Add(RespiratoryTrainingStart_);
-#elif 1
+#else
RespiratoryTrainingStartNote_ = new UILabelExt();
if (RespiratoryTrainingStartNote_ == nullptr)
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordListViewInit fail!!");
return;
}
- RespiratoryTrainingModel::GetInstance().RT_StartTimer(ONE_SECOND);
+ StartRespiratoryTraining(); // 开始呼吸训练
+ HeartModel::GetInstance()->Heart_Control(HeartState::Start, HeartCheck::INITIATIVE); // 开启心率检测
+ RespiratoryTrainingModel::GetInstance().RT_StartTimer(ONE_MIN); // 开启一个一分钟的定时器
+ ui_api_vibrate_once_func(); // 震动提醒
}
void RespiratoryTrainingView::ClearAll(void)