From ceae62cd28ec18976fd1860dbbc96e054d975072 Mon Sep 17 00:00:00 2001 From: luozheng <1732036298@qq.com> Date: Thu, 12 Mar 2026 11:56:55 +0800 Subject: [PATCH] =?utf8?q?=E5=80=92=E8=AE=A1=E6=97=B6=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../countdown/include/CountDownModel.h | 13 +- .../include/MainCountDownPresenter.h | 2 +- .../nativeui/countdown/src/CountDownModel.cpp | 117 ++++++++++++++++-- .../countdown/src/MainCountDownPresenter.cpp | 4 + 4 files changed, 121 insertions(+), 15 deletions(-) diff --git a/code/sdk/application/wearable/n9/nativeapp/nativeui/countdown/include/CountDownModel.h b/code/sdk/application/wearable/n9/nativeapp/nativeui/countdown/include/CountDownModel.h index 41c1aa3d6..41810b9da 100644 --- a/code/sdk/application/wearable/n9/nativeapp/nativeui/countdown/include/CountDownModel.h +++ b/code/sdk/application/wearable/n9/nativeapp/nativeui/countdown/include/CountDownModel.h @@ -68,6 +68,11 @@ namespace OHOS public: static CountDownModel *GetInstance(); // shared_ptr:当没有引用指向这个实例时会自动释放内存 + //震动定时器 + void CountDown_VibratorTimerStart(uint32_t interval = 1000); + void CountDown_VibratorTimerStop(void); + bool isNeedVibratorTimerStop(); + bool CountDownTimerIsEnd(); // 计时器是否结束 bool GetChanageToStartCountDownView(); void SetChanageToStartCountDownView(bool val); @@ -115,13 +120,13 @@ namespace OHOS bool GetisPaused(void) const { return isPaused; } - uint32_t get_current_time();//获取当前系统时间戳 + uint32_t get_current_time(); // 获取当前系统时间戳(ms) public: static int g_CountDownTimes; static int totalSeconds; //要到计时总秒数 - static uint32_t startTime; //开始时间戳 - static uint32_t pauseTime; //暂停时间戳 - static uint32_t endTime; //结束时间戳 + static uint32_t startTime; // 开始时间戳(ms) + static uint32_t pauseTime; // 暂停时间戳(ms) + static uint32_t endTime; // 结束时间戳(ms) private: CountDownModel() {} diff --git a/code/sdk/application/wearable/n9/nativeapp/nativeui/countdown/include/MainCountDownPresenter.h b/code/sdk/application/wearable/n9/nativeapp/nativeui/countdown/include/MainCountDownPresenter.h index 226a9c03d..fcae7c27a 100644 --- a/code/sdk/application/wearable/n9/nativeapp/nativeui/countdown/include/MainCountDownPresenter.h +++ b/code/sdk/application/wearable/n9/nativeapp/nativeui/countdown/include/MainCountDownPresenter.h @@ -26,7 +26,7 @@ namespace OHOS COUNTDOWN_MAX, } CountDownViewId; - static constexpr const int COUNTDOWN_TIMER_DURATION = 1000; // 计时器的定时器周期 + static constexpr const int COUNTDOWN_TIMER_DURATION = 500; // 计时器的定时器周期(ms) class MainCountDownView; class MainCountDownPresenter : public Presenter, public UIView::OnClickListener, diff --git a/code/sdk/application/wearable/n9/nativeapp/nativeui/countdown/src/CountDownModel.cpp b/code/sdk/application/wearable/n9/nativeapp/nativeui/countdown/src/CountDownModel.cpp index f32602644..97e00cf58 100644 --- a/code/sdk/application/wearable/n9/nativeapp/nativeui/countdown/src/CountDownModel.cpp +++ b/code/sdk/application/wearable/n9/nativeapp/nativeui/countdown/src/CountDownModel.cpp @@ -21,6 +21,7 @@ #include #include #include +#include "vibrator_service.h" namespace OHOS { /* -------------------------------------------------------------------------- */ @@ -383,6 +384,7 @@ namespace OHOS CountDown_StopTimer(); // 停止定时器 uapi_set_screen_on_api(); // 点亮屏幕 CountDownModel::GetInstance()->RequestStartRingtone(); // 播放铃声 + // CountDownModel::GetInstance()->CountDown_VibratorTimerStart(); // 触发震动 StartCountDownView::GetInstance()->GetPlayOrPauseToggleButton()->SetVisible(false); p_StartCountDownView->GetRepeatButton()->SetVisible(true); @@ -459,22 +461,25 @@ namespace OHOS bool isRunning = CountDownModel::GetInstance()->GetisRunning(); bool isPaused = CountDownModel::GetInstance()->GetisPaused(); - if (isRunning &&!isPaused) + if (isRunning && !isPaused) { - uint32_t currentTime = CountDownModel::GetInstance()->get_current_time(); - CountDownModel::g_CountDownTimes = CountDownModel::totalSeconds - (currentTime - CountDownModel::startTime); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "当前时间戳:%u,倒计时剩余时间:%d", currentTime ,CountDownModel::g_CountDownTimes); - if (CountDownModel::g_CountDownTimes <= 0 && currentTime == CountDownModel::endTime) { + uint32_t currentTime = CountDownModel::GetInstance()->get_current_time(); + if (currentTime >= CountDownModel::endTime) { + CountDownModel::g_CountDownTimes = 0; // 这里可以添加倒计时结束后的操作,比如发出提示音等 GraphicService::GetInstance()->PostGraphicEvent(std::bind(CountDown_TimerCallbackProc, data)); + return; } + uint32_t remainingMs = CountDownModel::endTime - currentTime; + CountDownModel::g_CountDownTimes = static_cast((remainingMs + 999) / 1000); // ceil to seconds + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "当前时间戳(ms):%u,倒计时剩余时间(s):%d", currentTime, CountDownModel::g_CountDownTimes); } } uint32_t CountDownModel::get_current_time() { uint32_t time; - if (uapi_get_timestampe_ss(&time) != ERRCODE_SUCC) { + if (uapi_get_timestampe_ms(&time) != ERRCODE_SUCC) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to get timestamp"); return 0; } @@ -487,8 +492,8 @@ namespace OHOS isPaused = false; CountDownModel::totalSeconds = CountDownModel::g_CountDownTimes; CountDownModel::startTime = get_current_time(); //获取开始时间戳 - CountDownModel::endTime = CountDownModel::startTime + g_CountDownTimes; //获取结束时间戳 - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "startTime:%u,endTime:%u",CountDownModel::startTime,CountDownModel::endTime); + CountDownModel::endTime = CountDownModel::startTime + static_cast(g_CountDownTimes) * 1000; //获取结束时间戳(ms) + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "startTime(ms):%u,endTime(ms):%u",CountDownModel::startTime,CountDownModel::endTime); } @@ -506,8 +511,14 @@ namespace OHOS uint32_t currentTime = get_current_time(); uint32_t pauseDuration = currentTime - CountDownModel::pauseTime; CountDownModel::endTime = CountDownModel::endTime + pauseDuration; - CountDownModel::totalSeconds = CountDownModel::totalSeconds + pauseDuration; - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "startTime:%u,pauseDuration:%u,endTime:%u",CountDownModel::startTime,pauseDuration,CountDownModel::endTime); + if (currentTime >= CountDownModel::endTime) { + CountDownModel::g_CountDownTimes = 0; + } else { + uint32_t remainingMs = CountDownModel::endTime - currentTime; + CountDownModel::g_CountDownTimes = static_cast((remainingMs + 999) / 1000); // ceil to seconds + } + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "startTime(ms):%u,pauseDuration(ms):%u,endTime(ms):%u", + CountDownModel::startTime, pauseDuration, CountDownModel::endTime); } } @@ -622,6 +633,92 @@ namespace OHOS } } + static osTimerId_t g_vibrator_timer = nullptr; + static void CountDown_VibratorTimerCallbackProc(void *arg) + { + WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "CountDown_VibratorTimerCallbackProc"); + if(CountDownModel::GetInstance()->isNeedVibratorTimerStop()) + { + CountDownModel::GetInstance()->CountDown_VibratorTimerStop(); + return; + } + // 触发震动 + custom_VibratorFunc_int(0); + custom_VibratorFunc_int(0); + } + + static void CountDown_VibratorTimerCallback(void *arg) + { + GraphicService::GetInstance()->PostGraphicEvent(std::bind(CountDown_VibratorTimerCallbackProc, arg)); + } + + void CountDownModel::CountDown_VibratorTimerStart(uint32_t interval) + { + // 检查定时器是否存在 + if (g_vibrator_timer != nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDown_VibratorTimerStart Timer already exists!!"); + return; + } + g_vibrator_timer = osTimerNew((osTimerFunc_t)CountDown_VibratorTimerCallback, osTimerPeriodic, nullptr, nullptr); + // 检查定时器创建是否成功 + if (g_vibrator_timer == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDown_VibratorTimerStart Timer create failed!!"); + return; + } + + int tick = osMs2Tick(interval); + osStatus_t ret = osTimerStart(g_vibrator_timer, tick); + if (ret != osOK) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDown_VibratorTimerStart] osTimerStart failed, ret = %lx!!", ret); + if (g_vibrator_timer != nullptr) + { + ret = osTimerDelete(g_vibrator_timer); + } + g_vibrator_timer = nullptr; + return; + } + return; + } + + void CountDownModel::CountDown_VibratorTimerStop(void) + { + // 检查定时器是否存在 + if (g_vibrator_timer != nullptr) + { + osTimerStop(g_vibrator_timer); + // 删除定时器并置为 nullptr + osStatus_t ret = osTimerDelete(g_vibrator_timer); + if (ret != osOK) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDown_VibratorTimerStop osTimerDelete failed, ret = %lx!!", ret); + } + g_vibrator_timer = nullptr; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "stop vibrator timer success!!"); + } + } + + bool CountDownModel::isNeedVibratorTimerStop() + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "isNeedVibratorTimerStop"); + if (playerCtr.get() == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDownModel] playerCtr.get() == nullptr"); + return OHOS_FAILURE; + } + int32_t state = 0; + playerCtr->GetPlayerState(state); + if (state != PlayerStates::PLAYER_STARTED) + { + return true; + } + return false; + } + + + /* ----------------------- CountDownRingPlayerListener ---------------------- */ void CountDownRingPlayerListener::SetOwner(std::shared_ptr player) diff --git a/code/sdk/application/wearable/n9/nativeapp/nativeui/countdown/src/MainCountDownPresenter.cpp b/code/sdk/application/wearable/n9/nativeapp/nativeui/countdown/src/MainCountDownPresenter.cpp index ba3ceb2f9..639caadf3 100644 --- a/code/sdk/application/wearable/n9/nativeapp/nativeui/countdown/src/MainCountDownPresenter.cpp +++ b/code/sdk/application/wearable/n9/nativeapp/nativeui/countdown/src/MainCountDownPresenter.cpp @@ -269,6 +269,10 @@ namespace OHOS p_CountDownModel->SetCountDownTimerIsPause(false); p_CountDownModel->CountDown_StartTimer(COUNTDOWN_TIMER_DURATION); p_CountDownModel->CountDown_ResumeTimer(COUNTDOWN_TIMER_DURATION); + if (p_StartCountDownView->GetShowCountDownTimelabel()) { + p_StartCountDownView->GetShowCountDownTimelabel()->SetText( + CountDownModel::GetInstance()->DisplayCountDownDuration()); + } /*视图恢复*/ p_StartCountDownView->SetImageAndLabel(true); p_StartCountDownView->ShowEndView(false); -- 2.17.1