From: luozheng <1732036298@qq.com> Date: Thu, 21 Nov 2024 09:19:15 +0000 (+0800) Subject: #865,手表与手机同时进行10分钟倒计时,手机倒计时已结束手表还剩余40秒bug X-Git-Tag: fd230_release_V1.3.102~29^2~15 X-Git-Url: http://git.snicker.com.cn/css/static/gitweb.css?a=commitdiff_plain;h=7deadf3a9404df72e74cb5c73a6ddd726289f6e9;p=mirrors%2FFD230.git #865,手表与手机同时进行10分钟倒计时,手机倒计时已结束手表还剩余40秒bug --- diff --git a/code/sdk/application/wearable/fd230app/nativeui/countdown/include/CountDownModel.h b/code/sdk/application/wearable/fd230app/nativeui/countdown/include/CountDownModel.h index 674c40329..41c1aa3d6 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/countdown/include/CountDownModel.h +++ b/code/sdk/application/wearable/fd230app/nativeui/countdown/include/CountDownModel.h @@ -1,8 +1,8 @@ /* * @Author: luozheng 1732036298@qq.com * @Date: 2024-04-07 18:15:53 - * @LastEditors: SnickerSun snickersun@163.com - * @LastEditTime: 2024-10-21 11:35:37 + * @LastEditors: luozheng 1732036298@qq.com + * @LastEditTime: 2024-11-21 16:06:32 * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/countdown/include/CountDownModel.h */ #ifndef COUNTDOWN_MODEL_H @@ -98,8 +98,30 @@ namespace OHOS void RequestStopRingtone(void); int ResetRingtonePlayback(void); + void countdownstart(); + void countdownpause(); + void countdownresume(); + void countdownstop(); + + void SetisRunning(bool val) { + isRunning = val; + } + bool GetisRunning(void) const { + return isRunning; + } + void SetisPaused(bool val) { + isPaused = val; + } + bool GetisPaused(void) const { + return isPaused; + } + uint32_t get_current_time();//获取当前系统时间戳 public: static int g_CountDownTimes; + static int totalSeconds; //要到计时总秒数 + static uint32_t startTime; //开始时间戳 + static uint32_t pauseTime; //暂停时间戳 + static uint32_t endTime; //结束时间戳 private: CountDownModel() {} @@ -127,6 +149,9 @@ namespace OHOS std::string CountTimeBackup{"00:00:00"}; bool IsChanageToStartCountDownViewFlag{false};//是否需要切换到开始倒计时界面标志 bool CountDownTimerIsPauseFlag{false}; + + bool isRunning{false};//记录倒计时是否正在运行 + bool isPaused{false}; //记录倒计时是否暂停 }; } #endif \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230app/nativeui/countdown/src/CountDownModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/countdown/src/CountDownModel.cpp index c0832fc16..9c8817f6a 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/countdown/src/CountDownModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/countdown/src/CountDownModel.cpp @@ -2,7 +2,7 @@ * @Author: luozheng 1732036298@qq.com * @Date: 2024-04-07 18:15:53 * @LastEditors: luozheng 1732036298@qq.com - * @LastEditTime: 2024-11-05 11:49:33 + * @LastEditTime: 2024-11-21 16:38:01 * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/countdown/src/CountDownModel.cpp */ #include "countdown/include/CountDownModel.h" @@ -19,12 +19,17 @@ #include "AppViewIDs.h" #include "NativeAbility.h" #include +#include namespace OHOS { /* -------------------------------------------------------------------------- */ // 声明定时器变量 static osTimerId_t g_timer = nullptr; int CountDownModel::g_CountDownTimes = {0}; + int CountDownModel::totalSeconds = 0; //总的倒计时时间 + uint32_t CountDownModel::startTime = 0; + uint32_t CountDownModel::pauseTime = 0; + uint32_t CountDownModel::endTime = 0; static constexpr int32 NUM_TEN = 10; // 主要用于格式化输出,当小时、分钟或秒小于10时,在其前面添加一个’0’以保持常规时间格式,例如“09:05:03”。 static constexpr int16 NUM_TIME_MIN = 60; static constexpr int16 NUM_TIME_HOUR = 3600; @@ -441,11 +446,67 @@ namespace OHOS */ static void CountDown_TimerCallback(int data) { - CountDownModel::g_CountDownTimes--; // 每次回调减少1秒 - if (CountDownModel::g_CountDownTimes <= 0) // 检查倒计时是否结束 + + /*拿系统时间实现倒计时功能*/ + bool isRunning = CountDownModel::GetInstance()->GetisRunning(); + bool isPaused = CountDownModel::GetInstance()->GetisPaused(); + + if (isRunning &&!isPaused) { - GraphicService::GetInstance()->PostGraphicEvent(std::bind(CountDown_TimerCallbackProc, data)); + 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) { + // 这里可以添加倒计时结束后的操作,比如发出提示音等 + GraphicService::GetInstance()->PostGraphicEvent(std::bind(CountDown_TimerCallbackProc, data)); + } + } + } + + uint32_t CountDownModel::get_current_time() + { + uint32_t time; + if (uapi_get_timestampe_ss(&time) != ERRCODE_SUCC) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to get timestamp"); + return 0; } + return time; + } + + void CountDownModel::countdownstart() + { + isRunning = true; + 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); + + } + + void CountDownModel::countdownpause() + { + if (isRunning &&!isPaused) { + isPaused = true; + CountDownModel::pauseTime = get_current_time(); + } + } + void CountDownModel::countdownresume() + { + if (isRunning && isPaused) { + isPaused = false; + 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); + } + } + + void CountDownModel::countdownstop() + { + isRunning = false; + isPaused = false; } /* @@ -461,6 +522,8 @@ namespace OHOS return; } + countdownstart(); + /* --------------------------------- 2.创建定时器 -------------------------------- */ g_timer = osTimerNew((osTimerFunc_t)CountDown_TimerCallback, osTimerPeriodic, nullptr, nullptr); // 检查定时器创建是否成功 @@ -498,6 +561,8 @@ namespace OHOS // 检查定时器是否存在 if (g_timer != nullptr) { + countdownstop(); + osTimerStop(g_timer); // 删除定时器并置为 nullptr osStatus_t ret = osTimerDelete(g_timer); @@ -518,6 +583,8 @@ namespace OHOS // 检查定时器是否存在 if (g_timer != nullptr) { + countdownpause(); + // 暂停定时器,但不删除它 osStatus_t ret = osTimerStop(g_timer); if (ret != osOK) @@ -535,6 +602,8 @@ namespace OHOS // 检查定时器是否存在 if (g_timer != nullptr) { + countdownresume(); + int tick = osMs2Tick(interval); // 恢复定时器 osStatus_t ret = osTimerStart(g_timer, tick);