#865,手表与手机同时进行10分钟倒计时,手机倒计时已结束手表还剩余40秒bug
authorluozheng <1732036298@qq.com>
Thu, 21 Nov 2024 09:19:15 +0000 (17:19 +0800)
committerluozheng <1732036298@qq.com>
Thu, 21 Nov 2024 09:19:15 +0000 (17:19 +0800)
code/sdk/application/wearable/fd230app/nativeui/countdown/include/CountDownModel.h
code/sdk/application/wearable/fd230app/nativeui/countdown/src/CountDownModel.cpp

index 674c403..41c1aa3 100644 (file)
@@ -1,8 +1,8 @@
 /*\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
@@ -98,8 +98,30 @@ namespace OHOS
         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
@@ -127,6 +149,9 @@ namespace OHOS
         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
index c0832fc..9c8817f 100644 (file)
@@ -2,7 +2,7 @@
  * @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
@@ -441,11 +446,67 @@ namespace OHOS
      */\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
@@ -461,6 +522,8 @@ namespace OHOS
             return;\r
         }\r
 \r
+        countdownstart();\r
+\r
         /* --------------------------------- 2.创建定时器 -------------------------------- */\r
         g_timer = osTimerNew((osTimerFunc_t)CountDown_TimerCallback, osTimerPeriodic, nullptr, nullptr);\r
         // 检查定时器创建是否成功\r
@@ -498,6 +561,8 @@ namespace OHOS
         // 检查定时器是否存在\r
         if (g_timer != nullptr)\r
         {\r
+            countdownstop();\r
+\r
             osTimerStop(g_timer);\r
             // 删除定时器并置为 nullptr\r
             osStatus_t ret = osTimerDelete(g_timer);\r
@@ -518,6 +583,8 @@ namespace OHOS
         // 检查定时器是否存在\r
         if (g_timer != nullptr)\r
         {\r
+            countdownpause();\r
+\r
             // 暂停定时器,但不删除它\r
             osStatus_t ret = osTimerStop(g_timer);\r
             if (ret != osOK)\r
@@ -535,6 +602,8 @@ namespace OHOS
         // 检查定时器是否存在\r
         if (g_timer != nullptr)\r
         {\r
+            countdownresume();\r
+\r
             int tick = osMs2Tick(interval);\r
             // 恢复定时器\r
             osStatus_t ret = osTimerStart(g_timer, tick);\r