/*\r
* @Author: luozheng 1732036298@qq.com\r
* @Date: 2024-04-07 18:15:53\r
- * @LastEditors: SnickerSun snickersun@163.com\r
- * @LastEditTime: 2024-10-21 11:35:37\r
+ * @LastEditors: luozheng 1732036298@qq.com\r
+ * @LastEditTime: 2024-11-21 16:06:32\r
* @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/countdown/include/CountDownModel.h\r
*/\r
#ifndef COUNTDOWN_MODEL_H\r
void RequestStopRingtone(void);\r
int ResetRingtonePlayback(void);\r
\r
+ void countdownstart();\r
+ void countdownpause();\r
+ void countdownresume();\r
+ void countdownstop();\r
+\r
+ void SetisRunning(bool val) {\r
+ isRunning = val;\r
+ }\r
+ bool GetisRunning(void) const {\r
+ return isRunning;\r
+ }\r
+ void SetisPaused(bool val) {\r
+ isPaused = val;\r
+ }\r
+ bool GetisPaused(void) const {\r
+ return isPaused;\r
+ }\r
+ uint32_t get_current_time();//获取当前系统时间戳\r
public:\r
static int g_CountDownTimes;\r
+ static int totalSeconds; //要到计时总秒数\r
+ static uint32_t startTime; //开始时间戳\r
+ static uint32_t pauseTime; //暂停时间戳\r
+ static uint32_t endTime; //结束时间戳\r
\r
private:\r
CountDownModel() {}\r
std::string CountTimeBackup{"00:00:00"};\r
bool IsChanageToStartCountDownViewFlag{false};//是否需要切换到开始倒计时界面标志\r
bool CountDownTimerIsPauseFlag{false};\r
+\r
+ bool isRunning{false};//记录倒计时是否正在运行\r
+ bool isPaused{false}; //记录倒计时是否暂停\r
};\r
}\r
#endif
\ No newline at end of file
* @Author: luozheng 1732036298@qq.com\r
* @Date: 2024-04-07 18:15:53\r
* @LastEditors: luozheng 1732036298@qq.com\r
- * @LastEditTime: 2024-11-05 11:49:33\r
+ * @LastEditTime: 2024-11-21 16:38:01\r
* @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/countdown/src/CountDownModel.cpp\r
*/\r
#include "countdown/include/CountDownModel.h"\r
#include "AppViewIDs.h"\r
#include "NativeAbility.h"\r
#include <custom_utils.h>\r
+#include <errcode.h>\r
namespace OHOS\r
{\r
/* -------------------------------------------------------------------------- */\r
// 声明定时器变量\r
static osTimerId_t g_timer = nullptr;\r
int CountDownModel::g_CountDownTimes = {0};\r
+ int CountDownModel::totalSeconds = 0; //总的倒计时时间\r
+ uint32_t CountDownModel::startTime = 0;\r
+ uint32_t CountDownModel::pauseTime = 0;\r
+ uint32_t CountDownModel::endTime = 0;\r
static constexpr int32 NUM_TEN = 10; // 主要用于格式化输出,当小时、分钟或秒小于10时,在其前面添加一个’0’以保持常规时间格式,例如“09:05:03”。\r
static constexpr int16 NUM_TIME_MIN = 60;\r
static constexpr int16 NUM_TIME_HOUR = 3600;\r
*/\r
static void CountDown_TimerCallback(int data)\r
{\r
- CountDownModel::g_CountDownTimes--; // 每次回调减少1秒\r
- if (CountDownModel::g_CountDownTimes <= 0) // 检查倒计时是否结束\r
+\r
+ /*拿系统时间实现倒计时功能*/\r
+ bool isRunning = CountDownModel::GetInstance()->GetisRunning();\r
+ bool isPaused = CountDownModel::GetInstance()->GetisPaused();\r
+\r
+ if (isRunning &&!isPaused) \r
{\r
- GraphicService::GetInstance()->PostGraphicEvent(std::bind(CountDown_TimerCallbackProc, data));\r
+ uint32_t currentTime = CountDownModel::GetInstance()->get_current_time();\r
+ CountDownModel::g_CountDownTimes = CountDownModel::totalSeconds - (currentTime - CountDownModel::startTime);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "当前时间戳:%u,倒计时剩余时间:%d", currentTime ,CountDownModel::g_CountDownTimes);\r
+ if (CountDownModel::g_CountDownTimes <= 0 && currentTime == CountDownModel::endTime) {\r
+ // 这里可以添加倒计时结束后的操作,比如发出提示音等\r
+ GraphicService::GetInstance()->PostGraphicEvent(std::bind(CountDown_TimerCallbackProc, data));\r
+ }\r
+ }\r
+ }\r
+\r
+ uint32_t CountDownModel::get_current_time()\r
+ {\r
+ uint32_t time;\r
+ if (uapi_get_timestampe_ss(&time) != ERRCODE_SUCC) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to get timestamp");\r
+ return 0;\r
}\r
+ return time;\r
+ }\r
+\r
+ void CountDownModel::countdownstart()\r
+ {\r
+ isRunning = true;\r
+ isPaused = false;\r
+ CountDownModel::totalSeconds = CountDownModel::g_CountDownTimes;\r
+ CountDownModel::startTime = get_current_time(); //获取开始时间戳\r
+ CountDownModel::endTime = CountDownModel::startTime + g_CountDownTimes; //获取结束时间戳\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "startTime:%u,endTime:%u",CountDownModel::startTime,CountDownModel::endTime);\r
+\r
+ }\r
+ \r
+ void CountDownModel::countdownpause()\r
+ {\r
+ if (isRunning &&!isPaused) {\r
+ isPaused = true;\r
+ CountDownModel::pauseTime = get_current_time();\r
+ }\r
+ }\r
+ void CountDownModel::countdownresume()\r
+ {\r
+ if (isRunning && isPaused) {\r
+ isPaused = false;\r
+ uint32_t currentTime = get_current_time();\r
+ uint32_t pauseDuration = currentTime - CountDownModel::pauseTime;\r
+ CountDownModel::endTime = CountDownModel::endTime + pauseDuration;\r
+ CountDownModel::totalSeconds = CountDownModel::totalSeconds + pauseDuration;\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "startTime:%u,pauseDuration:%u,endTime:%u",CountDownModel::startTime,pauseDuration,CountDownModel::endTime);\r
+ }\r
+ }\r
+ \r
+ void CountDownModel::countdownstop()\r
+ {\r
+ isRunning = false;\r
+ isPaused = false;\r
}\r
\r
/*\r
return;\r
}\r
\r
+ countdownstart();\r
+\r
/* --------------------------------- 2.创建定时器 -------------------------------- */\r
g_timer = osTimerNew((osTimerFunc_t)CountDown_TimerCallback, osTimerPeriodic, nullptr, nullptr);\r
// 检查定时器创建是否成功\r
// 检查定时器是否存在\r
if (g_timer != nullptr)\r
{\r
+ countdownstop();\r
+\r
osTimerStop(g_timer);\r
// 删除定时器并置为 nullptr\r
osStatus_t ret = osTimerDelete(g_timer);\r
// 检查定时器是否存在\r
if (g_timer != nullptr)\r
{\r
+ countdownpause();\r
+\r
// 暂停定时器,但不删除它\r
osStatus_t ret = osTimerStop(g_timer);\r
if (ret != osOK)\r
// 检查定时器是否存在\r
if (g_timer != nullptr)\r
{\r
+ countdownresume();\r
+\r
int tick = osMs2Tick(interval);\r
// 恢复定时器\r
osStatus_t ret = osTimerStart(g_timer, tick);\r