优化星历下载,合并星历相关代码 3265/2
authorluozheng <1732036298@qq.com>
Sun, 4 Jan 2026 03:08:55 +0000 (11:08 +0800)
committerluozheng <1732036298@qq.com>
Thu, 12 Mar 2026 02:38:04 +0000 (10:38 +0800)
13 files changed:
code/sdk/application/wearable/n9/nativeapp/nativeui/ephemeris_download/include/EphemerisDownloadPresenter.h
code/sdk/application/wearable/n9/nativeapp/nativeui/ephemeris_download/include/EphemerisDownloadView.h
code/sdk/application/wearable/n9/nativeapp/nativeui/ephemeris_download/src/EphemerisDownloadModel.cpp
code/sdk/application/wearable/n9/nativeapp/nativeui/ephemeris_download/src/EphemerisDownloadPresenter.cpp
code/sdk/application/wearable/n9/nativeapp/nativeui/ephemeris_download/src/EphemerisDownloadView.cpp
code/sdk/application/wearable/n9/service/msg_center/src/notify/transmitting.cpp
code/sdk/zhihui/UI/CustomUIComponentTool/uicomponents/UIComponents.cpp
code/sdk/zhihui/services/ble_service/bleservice/bleEvent.c
code/sdk/zhihui/services/ble_service/bleservice/bleEvent.h
code/sdk/zhihui/services/gnss/src/gnss_http_server.c
code/sdk/zhihui/utils/custom_runtime.c
code/sdk/zhihui/utils/custom_runtime.h
code/sdk/zhihui/utilscpp/custom_utilscpp.cpp

index f498e7d..73b9c5b 100644 (file)
@@ -28,8 +28,8 @@ namespace OHOS
         ~EphemerisDownloadPresenter();
         EphemerisDownloadPresenter(const EphemerisDownloadPresenter &) = delete;
         EphemerisDownloadPresenter &operator=(const EphemerisDownloadPresenter &) = delete;
+        void OnStart() override;
         void OnResume() override;
-        void OnStop() override;
         bool OnClick(UIView &view, const ClickEvent &event) override;
         bool OnDrag(UIView &view, const DragEvent &event) override;
         bool OnKeyAct(UIView &view, const KeyEvent &event) override;
@@ -39,6 +39,9 @@ namespace OHOS
         
         // 供Model调用的回调函数
         void UpdateDownloadStatus();
+
+    private:
+        int16_t currentView_{0};  // EPHEMERIS_VIEW_MAIN or EPHEMERIS_VIEW_BT_DISCONNECT
     };
 
 } // OHOS
index 876caf0..c84add8 100644 (file)
@@ -21,16 +21,24 @@ namespace OHOS {
 class EphemerisDownloadPresenter;
 class EphemerisDownloadView : public View<EphemerisDownloadPresenter> {
 public:
+  // 蓝牙未连接页关闭按钮 Id
+  static constexpr const char * EPHEMERIS_BT_DISCONNECT_CLOSE_ID = "ephemeris_bt_close";
+  // 子界面索引(与 MainAlarmView 的切换逻辑一致)
+  static constexpr int16_t EPHEMERIS_VIEW_MAIN = 0;
+  static constexpr int16_t EPHEMERIS_VIEW_BT_DISCONNECT = 1;
+  static constexpr int16_t EPHEMERIS_VIEW_MAX = 2;
+
   EphemerisDownloadView();
   ~EphemerisDownloadView() override;
   EphemerisDownloadView(const EphemerisDownloadView &) = delete;
   EphemerisDownloadView &operator=(const EphemerisDownloadView &) = delete;
   static EphemerisDownloadView *GetInstance(void);
 
-
   void OnStart() override;
   bool EphemerisDownloadInit();
   void OnClick(UIView &view);
+  // 切换子界面(与 MainAlarmView::ChangeView 逻辑一致)
+  void ChangeView(int16_t hideView, int16_t showView);
   //获取下载的label
   UILabelExt *GetDownloadLabel();
   //获取有效期的label
@@ -41,16 +49,26 @@ public:
   void UpdateValidityPeriod();
   //更新下载按钮状态
   void UpdateDownloadButton();
-  
+
+private:
+  bool InitBtDisconnectView();
+
 private:
+  UIViewGroup *group{nullptr};
+  UIViewGroup *container_[EPHEMERIS_VIEW_MAX]{nullptr};
   UILabelExt *labelTitle_{nullptr};
   UILabelExt *labelStatus_{nullptr};
-  UILabelExt *labelStatusValue_{nullptr};  // 新增:状态值标签
+  UILabelExt *labelStatusValue_{nullptr};
   UILabelExt *labelValidity_{nullptr};
-  UILabelExt *labelValidityValue_{nullptr}; // 新增:有效期值标签
+  UILabelExt *labelValidityValue_{nullptr};
   UILabelButtonExt *btnDownload_{nullptr};
   UILabelButtonExt *btnBack_{nullptr};
   UILabelExt *labelNote_{nullptr};
+  // 蓝牙未连接页组件(排版与 VIEW_FIND_PHONE 未连接时一致,无查找手机逻辑)
+  UILabelExt *labelTitleBt_{nullptr};
+  UIImageView *imageViewBt_{nullptr};
+  UILabelExt *labelHintBt_{nullptr};
+  UILabelButtonExt *btnCloseBt_{nullptr};
 };
 
 } // OHOS
index b1bfef3..81124e3 100644 (file)
@@ -7,17 +7,27 @@
 #include "wearable_log.h"
 #include "cmsis_os.h"
 #include "service/graphic_service.h"
+#include "ConfigModel.h"
 
 #if defined(SUPPORT_GNSS)
 #include "gnss_http_server.h"
 #endif
 
-//最长的有效期 目前为2天
-#define MAX_VALIDITY_PERIOD 2 * 24 * 60
+//最长的有效期 目前为7天
+#define MAX_VALIDITY_PERIOD 7 * 24 * 60
 
 namespace OHOS {
 
-EphemerisDownloadModel::EphemerisDownloadModel() {}
+EphemerisDownloadModel::EphemerisDownloadModel() 
+  : ephemerisDownloadStatus(EphemerisDownloadStatus::NOT_DOWNLOADED) {
+  // 初始化时检查星历数据是否有效,如果有效则更新状态
+#if defined(SUPPORT_GNSS)
+  if (GetValidityPeriod()) {
+    ephemerisDownloadStatus = EphemerisDownloadStatus::DOWNLOADED;
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "EphemerisDownloadModel: 检测到有效星历数据,状态设置为已下载");
+  }
+#endif
+}
 
 EphemerisDownloadModel::~EphemerisDownloadModel() {}
 
@@ -99,11 +109,21 @@ std::string EphemerisDownloadModel::GetEphemerisValidityPeriod() {
     int days = validityPeriod / (24 * 60);
     int hours = (validityPeriod % (24 * 60)) / 60;
     int minutes = validityPeriod % 60;
-    ephemerisValidityPeriod = std::to_string(days) + "天" +
-                              std::to_string(hours) + "小时" +
-                              std::to_string(minutes) + "分钟";
+    //根据语言选择显示格式
+    if(ConfigModel::GetInstance()->GetLanguage() == 0)
+        ephemerisValidityPeriod = std::to_string(days) + "天" +
+                                  std::to_string(hours) + "小时" +
+                                  std::to_string(minutes) + "分钟";
+    else
+        ephemerisValidityPeriod = std::to_string(days) + " d " +
+                                  std::to_string(hours) + " h " +
+                                  std::to_string(minutes) + " m";
   } else {
-    ephemerisValidityPeriod = "无星历数据";
+    //根据语言选择显示格式
+    if(ConfigModel::GetInstance()->GetLanguage() == 0)
+        ephemerisValidityPeriod = "无优化数据";
+    else
+        ephemerisValidityPeriod = "No Opt Data";
   }
 #endif
   return ephemerisValidityPeriod;
index 0e3d28a..40cdde7 100644 (file)
@@ -4,6 +4,7 @@
 
 #include "common/key_code.h"
 #include "custom_utils.h"
+#include "custom_runtime.h"
 #include "key/include/KeyInputListener.h"
 
 #include "AppViewIDs.h"
@@ -11,6 +12,8 @@
 
 #include "NativeRegisterManager.h"
 #include "wearable_log.h"
+#include "ui_resource_string.h"
+#include "ConfigModel.h"
 
 #ifdef SUPPORT_BLE_SERVICE
 #include "bleEvent.h"
@@ -29,11 +32,11 @@ EphemerisDownloadPresenter::EphemerisDownloadPresenter() {
 
 EphemerisDownloadPresenter::~EphemerisDownloadPresenter() {}
 
-void EphemerisDownloadPresenter::OnResume() {
-  RootView::GetInstance()->SetOnKeyActListener(this);
+void EphemerisDownloadPresenter::OnStart() {
 }
 
-void EphemerisDownloadPresenter::OnStop() {
+void EphemerisDownloadPresenter::OnResume() {
+  RootView::GetInstance()->SetOnKeyActListener(this);
 }
 
 EphemerisDownloadPresenter* EphemerisDownloadPresenter::GetInstance() {
@@ -44,13 +47,52 @@ bool EphemerisDownloadPresenter::OnClick(UIView &view,
                                          const ClickEvent &event) {
   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "EphemerisDownloadPresenter::OnClick");
   UNUSED(event);
+  // 蓝牙未连接页的关闭按钮:切回主界面
+  if (strcmp(view.GetViewId(), EphemerisDownloadView::EPHEMERIS_BT_DISCONNECT_CLOSE_ID) == 0) {
+    EphemerisDownloadView *v = EphemerisDownloadView::GetInstance();
+    if (v != nullptr) {
+      v->ChangeView(EphemerisDownloadView::EPHEMERIS_VIEW_BT_DISCONNECT,
+                    EphemerisDownloadView::EPHEMERIS_VIEW_MAIN);
+      currentView_ = EphemerisDownloadView::EPHEMERIS_VIEW_MAIN;
+    }
+    return true;
+  }
   //点击下载按键
   if (strcmp(view.GetViewId(), DOWNLOAD_ID) == 0) {
-    //进行下载
+
+    //检差有效期,如果是有效的,则不能下载
+    if(EphemerisDownloadModel::GetInstance().GetValidityPeriod())
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "有效期有效,不能下载");
+        return true;
+    }
+    
+    //检查蓝牙连接状态
+    uint8_t ble_connect_stat = uapi_dev_runtime_get_ble_connect_stat();
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ble phone connect stat = %d", ble_connect_stat);
+    
+    if (ble_connect_stat == 0) {
+      //蓝牙未连接,跳转到查找手机Slice显示蓝牙未连接提示
+      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Bluetooth not connected, jump to find phone slice");
+      NativeAbility::GetInstance().EnterSlice(VIEW_FIND_PHONE);
+      return true;
+    }
+
+    //蓝牙已连接,进行下载
     // EphemerisDownloadModel::GetInstance().DownloadEphemeris();
     #ifdef SUPPORT_BLE_SERVICE
     ble_request_epo_file();
     #endif
+
+          // 蓝牙未连接,在当前 Slice 内切换到蓝牙未连接提示页(与 MainAlarmView 切换逻辑一致)
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Bluetooth not connected, show BT disconnect view");
+          EphemerisDownloadView *view = EphemerisDownloadView::GetInstance();
+          if (view != nullptr) {
+            view->ChangeView(EphemerisDownloadView::EPHEMERIS_VIEW_MAIN,
+                             EphemerisDownloadView::EPHEMERIS_VIEW_BT_DISCONNECT);
+            currentView_ = EphemerisDownloadView::EPHEMERIS_VIEW_BT_DISCONNECT;
+          }
+    return true;
   }
   //点击返回按键
   else if (strcmp(view.GetViewId(), BACK_ID) == 0) {
@@ -65,7 +107,16 @@ bool EphemerisDownloadPresenter::OnDrag(UIView &view, const DragEvent &event) {
   if ((event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) &&
       (event.GetDeltaX() > X_DRAG_OFFSET) &&
       (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) {
-    NativeAbility::GetInstance().Back();
+    if (currentView_ == EphemerisDownloadView::EPHEMERIS_VIEW_BT_DISCONNECT) {
+      EphemerisDownloadView *v = EphemerisDownloadView::GetInstance();
+      if (v != nullptr) {
+        v->ChangeView(EphemerisDownloadView::EPHEMERIS_VIEW_BT_DISCONNECT,
+                      EphemerisDownloadView::EPHEMERIS_VIEW_MAIN);
+        currentView_ = EphemerisDownloadView::EPHEMERIS_VIEW_MAIN;
+      }
+    } else {
+      NativeAbility::GetInstance().Back();
+    }
   }
   return true;
 }
@@ -76,14 +127,24 @@ bool EphemerisDownloadPresenter::OnKeyAct(UIView &view, const KeyEvent &event) {
   // 如果是power键,且是亮屏状态,按键释放就返回上一级
   if (keyID == static_cast<uint16_t>(ZliteKeyCode::ZLITE_KEY_POWER) &&
       keyState == 1 && uapi_get_screen_state() == 0) {
-    // 回退
-    NativeAbility::GetInstance().Back();
+    if (currentView_ == EphemerisDownloadView::EPHEMERIS_VIEW_BT_DISCONNECT) {
+      EphemerisDownloadView *v = EphemerisDownloadView::GetInstance();
+      if (v != nullptr) {
+        v->ChangeView(EphemerisDownloadView::EPHEMERIS_VIEW_BT_DISCONNECT,
+                      EphemerisDownloadView::EPHEMERIS_VIEW_MAIN);
+        currentView_ = EphemerisDownloadView::EPHEMERIS_VIEW_MAIN;
+      }
+    } else {
+      NativeAbility::GetInstance().Back();
+    }
   }
   return true;
 }
 
 
 void EphemerisDownloadPresenter::UpdateDownloadStatus() {
+
+  RootView::GetInstance()->SetOnKeyActListener(this);
   //根据下载状态更新视图
   switch (EphemerisDownloadModel::GetInstance().GetEphemerisDownloadStatus()) {
   case EphemerisDownloadStatus::DOWNLOADING:
@@ -95,12 +156,17 @@ void EphemerisDownloadPresenter::UpdateDownloadStatus() {
         //显示下载进度等
         if(EphemerisDownloadModel::GetInstance().GetEphemerisDownloadProgress() == -1)
         {
-            EphemerisDownloadView::GetInstance()->GetDownloadLabel()->SetText(
-                "下载失败");
+            if(ConfigModel::GetInstance()->GetLanguage() == 0)
+                EphemerisDownloadView::GetInstance()->GetDownloadLabel()->SetText("优化失败");  
+            else
+                EphemerisDownloadView::GetInstance()->GetDownloadLabel()->SetText("Optimization Failed");  
         }
         else if(EphemerisDownloadModel::GetInstance().GetEphemerisDownloadProgress() == 0)
         {
-            EphemerisDownloadView::GetInstance()->GetDownloadLabel()->SetText("正在链接网络");
+            if(ConfigModel::GetInstance()->GetLanguage() == 0)
+                EphemerisDownloadView::GetInstance()->GetDownloadLabel()->SetText("正在链接网络");  
+            else
+                EphemerisDownloadView::GetInstance()->GetDownloadLabel()->SetText("Connecting to Network");  
             //设置下载按键
             EphemerisDownloadView::GetInstance()->UpdateDownloadButton();
         }
@@ -112,7 +178,7 @@ void EphemerisDownloadPresenter::UpdateDownloadStatus() {
             {
                 progress = 100;
             }
-            std::string progress_str = "æ­£å\9c¨ä¸\8bè½½"+std::to_string(progress)+"%";
+            std::string progress_str = "æ­£å\9c¨ä¼\98å\8c\96"+std::to_string(progress)+"%";
             EphemerisDownloadView::GetInstance()->GetDownloadLabel()->SetText(progress_str.c_str());
             //设置下载按键
             EphemerisDownloadView::GetInstance()->UpdateDownloadButton();
@@ -131,8 +197,10 @@ void EphemerisDownloadPresenter::UpdateDownloadStatus() {
   case EphemerisDownloadStatus::DOWNLOADED:
     if (EphemerisDownloadView::GetInstance()) {
       if (EphemerisDownloadView::GetInstance()->GetDownloadLabel()) {
-        EphemerisDownloadView::GetInstance()->GetDownloadLabel()->SetText(
-            "下载成功");
+        if(ConfigModel::GetInstance()->GetLanguage() == 0)
+            EphemerisDownloadView::GetInstance()->GetDownloadLabel()->SetText("优化成功");  
+        else
+            EphemerisDownloadView::GetInstance()->GetDownloadLabel()->SetText("Opt Success");  
         //设置下载按键
         EphemerisDownloadView::GetInstance()->UpdateDownloadButton();
       }
@@ -146,7 +214,10 @@ void EphemerisDownloadPresenter::UpdateDownloadStatus() {
   case EphemerisDownloadStatus::FAILED:
     if (EphemerisDownloadView::GetInstance()) {
       if (EphemerisDownloadView::GetInstance()->GetDownloadLabel()) {
-        EphemerisDownloadView::GetInstance()->GetDownloadLabel()->SetText("下载失败");
+        if(ConfigModel::GetInstance()->GetLanguage() == 0)
+            EphemerisDownloadView::GetInstance()->GetDownloadLabel()->SetText("优化失败");  
+        else
+            EphemerisDownloadView::GetInstance()->GetDownloadLabel()->SetText("Opt Failed");  
       }
       //设置下载按键
       EphemerisDownloadView::GetInstance()->UpdateDownloadButton();
index c21482e..cb0875c 100644 (file)
@@ -8,6 +8,8 @@
 #include "wearable_log.h"
 #include "UiConfig.h"
 #include "uicomponents/UIComponents.h"
+#include "ConfigModel.h"
+
 
 namespace OHOS {
 
@@ -20,6 +22,14 @@ EphemerisDownloadView::EphemerisDownloadView() {
 }
 
 EphemerisDownloadView::~EphemerisDownloadView() {
+
+    if (group!=nullptr)
+    {
+        group->RemoveAll();
+        delete group;
+        group = nullptr;
+    }
+
     if (labelTitle_!=nullptr)
     {
         delete labelTitle_;
@@ -60,6 +70,16 @@ EphemerisDownloadView::~EphemerisDownloadView() {
         delete labelNote_;
         labelNote_ = nullptr;
     }
+    // 蓝牙未连接页容器及子控件
+    if (container_[EPHEMERIS_VIEW_BT_DISCONNECT] != nullptr) {
+        container_[EPHEMERIS_VIEW_BT_DISCONNECT]->RemoveAll();
+        if (labelTitleBt_ != nullptr) { delete labelTitleBt_; labelTitleBt_ = nullptr; }
+        if (imageViewBt_ != nullptr) { delete imageViewBt_; imageViewBt_ = nullptr; }
+        if (labelHintBt_ != nullptr) { delete labelHintBt_; labelHintBt_ = nullptr; }
+        if (btnCloseBt_ != nullptr) { delete btnCloseBt_; btnCloseBt_ = nullptr; }
+        delete container_[EPHEMERIS_VIEW_BT_DISCONNECT];
+        container_[EPHEMERIS_VIEW_BT_DISCONNECT] = nullptr;
+    }
     g_pEphemerisDownloadView = nullptr;
     //停止定时器
     EphemerisDownloadModel::GetInstance().ephemeris_stop_data_timer();
@@ -69,12 +89,6 @@ void EphemerisDownloadView::OnStart() {
     if (!EphemerisDownloadInit()) {
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "EphemerisDownloadView::EphemerisDownloadInit fail");
     }
-
-    GetRootContainer()->SetDraggable(true);
-    GetRootContainer()->SetPosition(0, 0, 466, 466);
-    GetRootContainer()->SetOnDragListener(presenter_);
-
-    GetRootContainer()->SetTouchable(true);
 }
 
 EphemerisDownloadView *EphemerisDownloadView::GetInstance() {
@@ -82,6 +96,20 @@ EphemerisDownloadView *EphemerisDownloadView::GetInstance() {
 }
 
 bool EphemerisDownloadView::EphemerisDownloadInit() {
+    group = new UIViewGroup();
+    if (group == nullptr)
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[FindPhoneViewInit_BlueToothConnected] group new fail!!");
+        return false;
+    }
+    group->SetPosition(0, 0, 466, 466);
+    group->SetStyle(STYLE_BACKGROUND_OPA, 0);
+    group->SetTouchable(true);
+    group->SetDraggable(true);
+    group->SetOnDragListener(presenter_);
+    container_[EPHEMERIS_VIEW_MAIN] = group;
+    AddViewToRootContainer(container_[EPHEMERIS_VIEW_MAIN]);
+
     // 初始化标题 - 居中显示
     labelTitle_ = new UILabelExt();
     if (labelTitle_ == nullptr) {
@@ -90,11 +118,14 @@ bool EphemerisDownloadView::EphemerisDownloadInit() {
     }
     labelTitle_->SetPosition(83, 50, 300, 50);
     labelTitle_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
-    labelTitle_->SetText("星历下载");
+    if(ConfigModel::GetInstance()->GetLanguage() == 0)
+        labelTitle_->SetText("定位优化");
+    else
+        labelTitle_->SetText("Location Optimization");
     labelTitle_->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);
     labelTitle_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
     labelTitle_->SetTextColor(Color::White());
-    AddViewToRootContainer(labelTitle_);
+    group->Add(labelTitle_);
 
     // 初始化状态标签 - 左对齐,带圆点前缀
     labelStatus_ = new UILabelExt();
@@ -105,9 +136,12 @@ bool EphemerisDownloadView::EphemerisDownloadInit() {
     labelStatus_->SetPosition(50, 120, 360, 70);
     labelStatus_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
     labelStatus_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);
-    labelStatus_->SetText("● 下载状态:");
+    if(ConfigModel::GetInstance()->GetLanguage() == 0)
+        labelStatus_->SetText("● 优化状态:");
+    else
+        labelStatus_->SetText("● Opt Status:");
     labelStatus_->SetTextColor(Color::Yellow());//黄色
-    AddViewToRootContainer(labelStatus_);
+    group->Add(labelStatus_);
 
     // 初始化状态值标签 - 显示具体状态
     labelStatusValue_ = new UILabelExt();
@@ -115,10 +149,13 @@ bool EphemerisDownloadView::EphemerisDownloadInit() {
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "labelStatusValue_ new failed");
         return false;
     }
-    labelStatusValue_->SetPosition(220, 120, 360, 70);
+    if(ConfigModel::GetInstance()->GetLanguage() == 0)
+        labelStatusValue_->SetPosition(220, 120, 360, 70);
+    else
+        labelStatusValue_->SetPosition(240, 120, 360, 70);
     labelStatusValue_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 28);
     labelStatusValue_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);
-    AddViewToRootContainer(labelStatusValue_);
+    group->Add(labelStatusValue_);
 
     // 初始化有效期标签 - 左对齐,带圆点前缀
     labelValidity_ = new UILabelExt();
@@ -129,9 +166,12 @@ bool EphemerisDownloadView::EphemerisDownloadInit() {
     labelValidity_->SetPosition(50, 170, 360, 70);
     labelValidity_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
     labelValidity_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);
-    labelValidity_->SetText("● 有效期:");
+    if(ConfigModel::GetInstance()->GetLanguage() == 0)
+        labelValidity_->SetText("● 有效期:");
+    else
+        labelValidity_->SetText("● Expiry Date:");
     labelValidity_->SetTextColor(Color::Green());//绿色
-    AddViewToRootContainer(labelValidity_);
+    group->Add(labelValidity_);
 
     // 初始化有效期值标签 - 显示具体有效期
     labelValidityValue_ = new UILabelExt();
@@ -139,10 +179,13 @@ bool EphemerisDownloadView::EphemerisDownloadInit() {
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "labelValidityValue_ new failed");
         return false;
     }
-    labelValidityValue_->SetPosition(220, 170, 360, 70);
+    if(ConfigModel::GetInstance()->GetLanguage() == 0)
+     labelValidityValue_->SetPosition(220, 170, 360, 70);
+    else
+     labelValidityValue_->SetPosition(250, 170, 360, 70);
     labelValidityValue_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 28);
     labelValidityValue_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);
-    AddViewToRootContainer(labelValidityValue_);
+    group->Add(labelValidityValue_);
 
     // 初始化说明标签 - 居中显示,灰色文字
     labelNote_ = new UILabelExt();
@@ -153,31 +196,125 @@ bool EphemerisDownloadView::EphemerisDownloadInit() {
     labelNote_->SetPosition(50, 230, 366, 80);
     labelNote_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 20);
     labelNote_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
-    labelNote_->SetText("注:请打开4G,需要在网络连接状态下才可以下载");
+    if(ConfigModel::GetInstance()->GetLanguage() == 0)
+        labelNote_->SetText("注:需要在网络连接状态下并且有效期失效时才可以下载");
+    else
+        labelNote_->SetText("Note: You can only download when the network is connected and the expiration date is invalid.");
     labelNote_->SetTextColor(Color::GetColorFromRGBA(0x99, 0x99, 0x99, 0xff)); // 灰色
     //修改为靠左对齐
     labelNote_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);
-    AddViewToRootContainer(labelNote_);
+    group->Add(labelNote_);
 
     InitButtonExt(btnDownload_, 58, 320, 170, 90, DOWNLOAD_ID, STR_EPHEMERIS_DOWNLOAD, 30);
+    printf("btnDownload_ 初始化完成\n");
     btnDownload_->SetStyle(STYLE_BACKGROUND_COLOR, 0xff191919); // 设置按键颜色
-    btnDownload_->SetText("下载");
+    if(ConfigModel::GetInstance()->GetLanguage() == 0)
+        btnDownload_->SetText("优化");
+    else
+        btnDownload_->SetText("Optimized");
     btnDownload_->SetOnClickListener(presenter_);
     InitButtonExt(btnBack_, 238, 320, 170, 90, BACK_ID, STR_CANCEL, 30);
+    printf("btnBack_ 初始化完成\n");
     btnBack_->SetStyle(STYLE_BACKGROUND_COLOR, 0xffFF8A36); // 设置按键颜色
     btnBack_->SetOnClickListener(presenter_);
-    AddViewToRootContainer(btnDownload_);
-    AddViewToRootContainer(btnBack_);
+    group->Add(btnDownload_);
+    group->Add(btnBack_);
 
     // 初始化完成后更新所有状态
     UpdateDownloadStatus();
     UpdateValidityPeriod();
     UpdateDownloadButton();
-  
 
+    // 蓝牙未连接页(排版与 VIEW_FIND_PHONE 未连接时一致)
+    if (!InitBtDisconnectView()) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "EphemerisDownloadView::InitBtDisconnectView fail");
+        return false;
+    }
+
+    return true;
+}
+
+bool EphemerisDownloadView::InitBtDisconnectView() {
+    container_[EPHEMERIS_VIEW_BT_DISCONNECT] = new UIViewGroup();
+    if (container_[EPHEMERIS_VIEW_BT_DISCONNECT] == nullptr) {
+        return false;
+    }
+    container_[EPHEMERIS_VIEW_BT_DISCONNECT]->SetPosition(0, 0, 466, 466);
+    container_[EPHEMERIS_VIEW_BT_DISCONNECT]->SetStyle(STYLE_BACKGROUND_OPA, 0);
+    container_[EPHEMERIS_VIEW_BT_DISCONNECT]->SetTouchable(true);
+    container_[EPHEMERIS_VIEW_BT_DISCONNECT]->SetDraggable(true);
+    container_[EPHEMERIS_VIEW_BT_DISCONNECT]->SetOnDragListener(presenter_);
+
+    // 标题 - 与 FindPhone 未连接页排版一致(83, 50, 300, 35)
+    labelTitleBt_ = new UILabelExt();
+    if (labelTitleBt_ == nullptr) return false;
+    labelTitleBt_->SetPosition(83, 50, 300, 35);
+    labelTitleBt_->SetStyle(STYLE_TEXT_FONT, 30);
+    labelTitleBt_->SetStyle(STYLE_LINE_HEIGHT, 35);
+    if (ConfigModel::GetInstance()->GetLanguage() == 0) {
+        labelTitleBt_->SetText("定位优化");
+    } else {
+        labelTitleBt_->SetText("Location Optimization");
+    }
+    labelTitleBt_->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);
+    labelTitleBt_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+    labelTitleBt_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
+    labelTitleBt_->SetTextColor(Color::White());
+    container_[EPHEMERIS_VIEW_BT_DISCONNECT]->Add(labelTitleBt_);
+
+    // 图标 - 与「正在优化定位速度」界面的下载动图第一张一致(transmitting 使用 /user/res/down/ 24 帧)
+    imageViewBt_ = new UIImageView();
+    if (imageViewBt_ == nullptr) return false;
+    imageViewBt_->SetPosition(183, 140, 100, 100);
+    imageViewBt_->SetSrc("/user/res/down/23.bin");
+    container_[EPHEMERIS_VIEW_BT_DISCONNECT]->Add(imageViewBt_);
+
+    // 提示文案 - 蓝牙未连接(83, 270, 300, 35)
+    labelHintBt_ = new UILabelExt();
+    if (labelHintBt_ == nullptr) return false;
+    labelHintBt_->SetPosition(83, 270, 300, 35);
+    labelHintBt_->SetStyle(STYLE_TEXT_FONT, 30);
+    labelHintBt_->SetStyle(STYLE_LINE_HEIGHT, 35);
+    if (ConfigModel::GetInstance()->GetLanguage() == 0) {
+        labelHintBt_->SetText("正在等待APP下载资源包,请稍等");
+    } else {
+        labelHintBt_->SetText("Waiting for the APP");
+    }
+    labelHintBt_->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);
+    labelHintBt_->SetTextColor(Color::GetColorFromRGBA(0x4f, 0xc3, 0x4c, 0xff));
+    labelHintBt_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+    labelHintBt_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
+    container_[EPHEMERIS_VIEW_BT_DISCONNECT]->Add(labelHintBt_);
+
+    // 关闭按钮 - 与 FindPhone 未连接页一致(0, 366, 466, 100)
+    btnCloseBt_ = new UILabelButtonExt();
+    if (btnCloseBt_ == nullptr) return false;
+    btnCloseBt_->SetPosition(0, 366, 466, 100);
+    btnCloseBt_->SetViewId(EPHEMERIS_BT_DISCONNECT_CLOSE_ID);
+    btnCloseBt_->SetImageSrc(PNG_BUTTON_466x100_IMAGE, PNG_BUTTON_466x100_IMAGE);
+    btnCloseBt_->SetTextId(STR_CLOSE);
+    btnCloseBt_->SetTextColor(Color::GetColorFromRGBA(0xff, 0x5a, 0x36, 0xff));
+    btnCloseBt_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
+    btnCloseBt_->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED);
+    btnCloseBt_->SetOnClickListener(presenter_);
+    container_[EPHEMERIS_VIEW_BT_DISCONNECT]->Add(btnCloseBt_);
+
+    AddViewToRootContainer(container_[EPHEMERIS_VIEW_BT_DISCONNECT]);
+    container_[EPHEMERIS_VIEW_BT_DISCONNECT]->SetVisible(false);
     return true;
 }
 
+void EphemerisDownloadView::ChangeView(int16_t hideView, int16_t showView) {
+    if (hideView >= EPHEMERIS_VIEW_MAX || showView >= EPHEMERIS_VIEW_MAX ||
+        container_[hideView] == nullptr || container_[showView] == nullptr) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "EphemerisDownloadView::ChangeView invalid view %d -> %d", hideView, showView);
+        return;
+    }
+    container_[hideView]->SetVisible(false);
+    container_[showView]->SetVisible(true);
+    Draw();
+}
+
 UILabelExt *EphemerisDownloadView::GetDownloadLabel() {
     return labelStatusValue_;
 }
@@ -189,14 +326,33 @@ UILabelExt *EphemerisDownloadView::GetValidityPeriodLabel() {
 // 更新下载状态显示
 void EphemerisDownloadView::UpdateDownloadStatus() {
     if (labelStatusValue_ == nullptr) return;
-    //如果有效期大于0,则显示下载成功
+    
+    // 先同步状态:如果有效期有效,确保状态为已下载
     if(EphemerisDownloadModel::GetInstance().GetValidityPeriod())
     {
-        labelStatusValue_->SetText("数据有效");
+        // 如果有效期有效,但状态不是已下载,则更新状态
+        if(EphemerisDownloadModel::GetInstance().GetEphemerisDownloadStatus() != EphemerisDownloadStatus::DOWNLOADED)
+        {
+            EphemerisDownloadModel::GetInstance().SetEphemerisDownloadStatus(EphemerisDownloadStatus::DOWNLOADED);
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UpdateDownloadStatus: 同步状态为已下载");
+        }
+        if(ConfigModel::GetInstance()->GetLanguage() == 0)
+            labelStatusValue_->SetText("已优化");
+        else
+            labelStatusValue_->SetText("Optimized");
     }
     else
     {
-        labelStatusValue_->SetText("未下载");
+        // 如果有效期无效,但状态是已下载,则更新状态
+        if(EphemerisDownloadModel::GetInstance().GetEphemerisDownloadStatus() == EphemerisDownloadStatus::DOWNLOADED)
+        {
+            EphemerisDownloadModel::GetInstance().SetEphemerisDownloadStatus(EphemerisDownloadStatus::NOT_DOWNLOADED);
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UpdateDownloadStatus: 同步状态为未下载");
+        }
+        if(ConfigModel::GetInstance()->GetLanguage() == 0)
+            labelStatusValue_->SetText("未优化");
+        else
+            labelStatusValue_->SetText("Not Optimized");
     }
 }
 
@@ -206,7 +362,10 @@ void EphemerisDownloadView::UpdateValidityPeriod() {
     
     std::string period = EphemerisDownloadModel::GetInstance().GetEphemerisValidityPeriod();
     if (period.empty()) {
-        labelValidityValue_->SetText("无数据");
+        if(ConfigModel::GetInstance()->GetLanguage() == 0)
+            labelValidityValue_->SetText("未优化");
+        else
+            labelValidityValue_->SetText("Not Optimized");
     } else {
         labelValidityValue_->SetText(period.c_str());
     }
@@ -221,18 +380,28 @@ void EphemerisDownloadView::UpdateDownloadButton() {
     switch (status) {
         case EphemerisDownloadStatus::NOT_DOWNLOADED:
         case EphemerisDownloadStatus::FAILED:
-            btnDownload_->SetText("未下载");
+            if(ConfigModel::GetInstance()->GetLanguage() == 0)
+                btnDownload_->SetText("点击优化");
+            else
+                btnDownload_->SetText("Optimize");
             btnDownload_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Blue().full); // 蓝色
             btnDownload_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::GetColorFromRGBA(0xcc, 0x70, 0x00, 0xff).full, UIButton::PRESSED);
             break;
         case EphemerisDownloadStatus::DOWNLOADING:
-            btnDownload_->SetText("下载中");
+            if(ConfigModel::GetInstance()->GetLanguage() == 0)
+                btnDownload_->SetText("优化中");
+            else
+                btnDownload_->SetText("Optimizing");
             btnDownload_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full); // 灰色
             btnDownload_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::GetColorFromRGBA(0x44, 0x44, 0x44, 0xff).full, UIButton::PRESSED);
             break;
         case EphemerisDownloadStatus::DOWNLOADED:
-            btnDownload_->SetText("已下载");
-            btnDownload_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Green().full); // 绿色
+            if(ConfigModel::GetInstance()->GetLanguage() == 0)
+                btnDownload_->SetText("已优化");
+            else
+                btnDownload_->SetText("Optimized");
+            // btnDownload_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Green().full); // 绿色
+            btnDownload_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Gray().full); // 灰色
             btnDownload_->SetStyleForState(STYLE_BACKGROUND_COLOR, Color::GetColorFromRGBA(0x44, 0x44, 0x44, 0xff).full, UIButton::PRESSED);
             break;
     }
index dd7685f..e83fa68 100644 (file)
@@ -5,7 +5,7 @@
 #include "components/ui_image_view.h"
 #include "components/ui_label.h"
 #include "components/ui_label_ext.h"
-#include "components/ui_label_button_ext.h"
+#include "components/ui_label_button_ext.h"  
 #ifdef SUPPORT_BLE_SERVICE
 // #include "battery_service.h"
 #include "bleEvent.h"
 namespace OHOS
 {
     static UIImageView *imageCharge = nullptr;
-    static UIViewGroup *UIViewGroup_transmitting = nullptr;
+    static UIViewGroup *UIViewGroup_transmitting=nullptr;
 
-    static UIImageView *transmitting_img = nullptr;
+    static UIImageView *transmitting_img=nullptr;
 
-    static UISlider *updatasider = nullptr;
+    static UISlider *updatasider=nullptr;
 
-    static UILabelExt *Title = nullptr;
+    static UILabelExt *Title=nullptr;
 
-    static UILabelExt *label_ = nullptr;
+    static UILabelExt *label_=nullptr;
 
-    static UIImageAnimatorView *downImageAnimatorView = nullptr;
+    static UIImageAnimatorView *downImageAnimatorView=nullptr;
 
-    static constexpr char *ShutDownPaths = "/user/res/down/";
-    static constexpr int16_t SHUTDOWN_IMAGE_ANIMATOR_VIEW_NUM_FRAMES = 24;                // 图片帧数
-    static constexpr int16_t SHUTDOWN_IMAGE_ANIMATOR_TIME = 150;                          // 图片更新间隔
+    static constexpr char *ShutDownPaths = "/user/res/down/"; 
+    static constexpr int16_t SHUTDOWN_IMAGE_ANIMATOR_VIEW_NUM_FRAMES = 24; // 图片帧数
+    static constexpr int16_t SHUTDOWN_IMAGE_ANIMATOR_TIME = 150;           // 图片更新间隔
     static ImageAnimatorInfo ImageInfo_animator[SHUTDOWN_IMAGE_ANIMATOR_VIEW_NUM_FRAMES]; // 关机图像的信息
     static constexpr int16_t SHUTDOWN_IMAGE_ANIMATOR_VIEW_X = 183;
     static constexpr int16_t SHUTDOWN_IMAGE_ANIMATOR_VIEW_Y = 140;
     static constexpr int16_t SHUTDOWN_IMAGE_ANIMATOR_VIEW_W = 100;
     static constexpr int16_t SHUTDOWN_IMAGE_ANIMATOR_VIEW_H = 100;
 
-    const ImageInfo **imageInfo_dwon{nullptr}; // 关机图片路径数组
+    const ImageInfo **imageInfo_dwon{nullptr};                                     // 关机图片路径数组
 
-#define TRANSMITTING_SUCC_PATH PNG_SUCC_IMAGE;
-#define TRANSMITTING_FAIL_PATH PNG_ATTENTION_IMAGE;
-#define TRANSMITTING_OTA_DOWN "/user/res/system/FOOINGLOGO.bin"
+    #define TRANSMITTING_SUCC_PATH PNG_SUCC_IMAGE;
+    #define TRANSMITTING_FAIL_PATH PNG_ATTENTION_IMAGE;
+    #define TRANSMITTING_OTA_DOWN  "/user/system/FOOINGOTALOGO.bin"
+    
 
-#define LOW_POWER_BUTTON "LOW_POWER_BUTTON"
 
-    static void CreatetransmittingAnimator(void)
+    #define LOW_POWER_BUTTON "LOW_POWER_BUTTON"
+
+    
+
+    static void  CreatetransmittingAnimator(void)
     {
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ShutDownAnimatorView::ShowUpShutDownAnimatorView");
-        imageInfo_dwon = CreateImageInfoArray(ShutDownPaths, SHUTDOWN_IMAGE_ANIMATOR_VIEW_NUM_FRAMES, "bin");
+        imageInfo_dwon = CreateImageInfoArray(ShutDownPaths,SHUTDOWN_IMAGE_ANIMATOR_VIEW_NUM_FRAMES, "bin");
 
         if (downImageAnimatorView == nullptr)
         {
@@ -87,102 +91,141 @@ namespace OHOS
             downImageAnimatorView->SetImageAnimatorSrc(ImageInfo_animator, SHUTDOWN_IMAGE_ANIMATOR_VIEW_NUM_FRAMES, 100);
             downImageAnimatorView->SetRepeat(true);
             downImageAnimatorView->SetRepeatTimes(1);
+           
         }
         downImageAnimatorView->SetVisible(true);
         downImageAnimatorView->Start();
-        // downImageAnimatorView->Start();
-
-        return;
+        //downImageAnimatorView->Start();
+        
+        return ;
     }
+ 
+
+   
 
-    static uint8_t Transmitting_falg = 1;
+    static uint8_t Transmitting_falg=1;
     void set_transmittingShow_falg(uint8_t falg)
     {
-        Transmitting_falg = falg;
+        Transmitting_falg=falg;
     }
 
-    static osTimerId_t transmitting_timer = NULL;
+   static  osTimerId_t  transmitting_timer= NULL;
 
-    void Freetransmitting(void)
+   void Freetransmitting(void)
     {
-        if (UIViewGroup_transmitting != nullptr)
-        {
-            UIViewGroup_transmitting->RemoveAll();
+       if (UIViewGroup_transmitting != nullptr) 
+       {
+        UIViewGroup_transmitting->RemoveAll();
 
-            if (transmitting_img)
-            {
-                delete transmitting_img;
-                transmitting_img = nullptr;
-            }
-            if (Title)
-            {
-                delete Title;
-                Title = nullptr;
-            }
-            if (label_)
-            {
-                delete label_;
-                label_ = nullptr;
-            }
-            if (downImageAnimatorView)
-            {
-                FreeImageInfoArray(imageInfo_dwon, ShutDownPaths, SHUTDOWN_IMAGE_ANIMATOR_VIEW_NUM_FRAMES, "bin");
-                delete downImageAnimatorView;
-                downImageAnimatorView = nullptr;
-            }
-            if (updatasider)
-            {
-                delete updatasider;
-                updatasider = nullptr;
-            }
-            if (transmitting_timer)
-            {
-
-                osTimerStop(transmitting_timer);
-                osStatus_t ret = osTimerDelete(transmitting_timer);
-                if (ret != osOK)
-                {
-                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Disatransmitting_timer failed  ret = %lx!", ret);
-                    // return;
-                }
-                transmitting_timer = nullptr;
-            }
-
-            const power_display_svr_api_t *display_api = power_display_svr_get_api();
-            if (display_api->get_screen_state() != SCREEN_ON)
-            {
-                display_api->turn_on_screen();
+        if(transmitting_img)
+        {
+            delete transmitting_img;
+            transmitting_img = nullptr;
+        }
+         if(Title)
+        {
+            delete Title;
+            Title = nullptr;
+        }
+         if(label_)
+        {
+            delete label_;
+            label_ = nullptr;
+        }
+        if(downImageAnimatorView)
+        {
+            FreeImageInfoArray(imageInfo_dwon,ShutDownPaths, SHUTDOWN_IMAGE_ANIMATOR_VIEW_NUM_FRAMES,"bin");
+            delete downImageAnimatorView;
+            downImageAnimatorView = nullptr;
+        }
+        if(updatasider)
+        {
+            delete updatasider;
+            updatasider = nullptr;
+        }
+        if(transmitting_timer)
+        {
+        
+            osTimerStop(transmitting_timer);
+            osStatus_t  ret = osTimerDelete(transmitting_timer);
+            if (ret != osOK) {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Disatransmitting_timer failed  ret = %lx!", ret);
+                //return;
             }
-            display_api->set_auto_timeout_function(true);
+            transmitting_timer = nullptr;
+        }
 
+        const power_display_svr_api_t *display_api = power_display_svr_get_api();
+        if (display_api->get_screen_state() != SCREEN_ON)
+        {   
+               display_api->turn_on_screen();  
+        }  
+        display_api->set_auto_timeout_function(true);
+        
 #ifdef SUPPORT_CYWEE_SERVICE
-            cywee_hand_wake_switch(1); // 关闭抬腕亮屏,和息屏
+        cywee_hand_wake_switch(1); // 关闭抬腕亮屏,和息屏
 #endif
 
-            RootView::GetInstance()->Remove(UIViewGroup_transmitting);
-            delete UIViewGroup_transmitting;
-            UIViewGroup_transmitting = nullptr;
+        RootView::GetInstance()->Remove(UIViewGroup_transmitting);
+        delete UIViewGroup_transmitting;
+        UIViewGroup_transmitting = nullptr;
 
-            uapi_dev_runtime_set_transmitting_status(0);
+        uapi_dev_runtime_set_transmitting_status(0);
         }
     }
-    static uint8_t timer_falg_low_power = 5;
+    static uint8_t timer_falg_low_power=5;
 
-    static uint8_t test_flag = 0;
 
+    static uint8_t transmitting_ota_timeout = 10;  // 10秒超时计数(每秒减1)
+    static uint32_t cur_recv_value = 0;            // 当前接收值
+    static uint32_t last_recv_value = 0;           // 上一次接收值
+    static bool is_ota_data_stop = false;          // 标记是否停止传输
+    static bool is_first_check = true;             // 首次检测标记(避免初始值误判)
     static void OTATimerCallBackProc(int data)
-    {
-#ifdef SUPPORT_BLE_SERVICE
-#if 0
+    {   
+        #ifdef SUPPORT_BLE_SERVICE
         if(updatasider)
-            updatasider->SetValue(test_flag++);
-#else
-        if (updatasider)
-            updatasider->SetValue(get_OTA_recv_value());
-#endif
-        if (updatasider)
+        {
+            cur_recv_value = get_OTA_recv_value(); // 获取当前接收值
+            updatasider->SetValue(cur_recv_value);
             updatasider->Invalidate();
-#endif
+
+            // ===== 核心检测逻辑 =====
+            // 首次检测:初始化上一次值,不做判断
+            if (is_first_check)
+            {
+                last_recv_value = cur_recv_value;
+                is_first_check = false;
+                return;
+            }
+
+            // 非首次检测:对比当前值与上一次值
+            if (cur_recv_value == last_recv_value)
+            {
+                // 值无变化,超时计数减1
+                transmitting_ota_timeout--;
+                if (transmitting_ota_timeout == 0)
+                {
+                    // 10秒值未变化,判定APP停止传输
+                    is_ota_data_stop = true;
+                    transmitting_ota_timeout = 10; // 重置计数(可选,根据业务需求)
+                    is_first_check = true;        // 重置首次检测标记(可选)
+                    
+                    // 【此处添加停止传输后的业务逻辑】
+                    // 示例:打印日志、停止OTA定时器、通知上层等
+                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OTA传输停止:10秒未收到新数据");
+                    NotificationManager::GetInstance()->StopNotify();
+                }
+            }
+            else
+            {
+                // 值有变化,重置超时计数和上一次值
+                transmitting_ota_timeout = 10;
+                last_recv_value = cur_recv_value;
+                is_ota_data_stop = false;
+            }
+        }
+        #endif
     }
 
     void OTATimerCallBack(int data)
@@ -192,43 +235,66 @@ namespace OHOS
 
     void dialtimerCallBack(int data)
     {
-        NotificationManager::GetInstance()->StopNotify();
+      NotificationManager::GetInstance()->StopNotify();
     }
 
-    void creat_down_OTA()
+    static uint8_t epo_timer_falg=20;
+    void epo_timerCallBack(int data)
     {
+        //给15s时间,等待EPO文件解压完成,超过15s不管成功与否,都停止通知
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "epo_timerCallBack epo_timer_falg = %d", epo_timer_falg);
+        if(epo_timer_falg<=0)
+        {
+            epo_timer_falg=20;
+            NotificationManager::GetInstance()->StopNotify();
+        }
+        else
+        {
+            //如果EPO文件解压成功,停止通知
+            if(uapi_dev_runtime_get_epo_file_extracted_status() == 1)
+            {
+                NativeAbility::GetInstance().ChangeSlice(VIEW_EPHEMERIS_DOWNLOAD);
+                NotificationManager::GetInstance()->StopNotify();
+            }
+        }
+        epo_timer_falg--;
+    }
+
+    
+
+   void creat_down_OTA()
+   {
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "OTA 界面创建");
         if (Title == nullptr)
         {
             Title = new UILabelExt();
+            if(Title == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Title new fail");
+            }
         }
-        Title->SetPosition(83, 50); // widget's left position and top position
-        Title->Resize(300, 35);     // widget's width and height
-        Title->SetViewId("label1"); // Set style
+        Title->SetPosition(83, 50);         
+        Title->Resize(300, 35);           
         Title->SetStyle(STYLE_TEXT_FONT, 30);
-
-        // Set additional property
         Title->SetText("OTA下载中");
-        Title->SetTextId(STR_OTA_DOWNLOAD);
-
+        Title->SetTextId (STR_OTA_DOWNLOAD);
         Title->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);
         Title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
         Title->SetRollSpeed(0);
         Title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
-
-        // Add to rootView
         UIViewGroup_transmitting->Add(Title);
-
         if (updatasider == nullptr)
         {
             updatasider = new UISlider();
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SystemUpdateView new fail");
+            if(updatasider == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "updatasider new fail");
+            }
         }
-
         updatasider->SetSliderColor(Color::Gray(), Color::Silver());
         updatasider->SetPosition(63, 317, 340, 50);
         updatasider->SetViewId("SystemUpdateView_updatasider");
-        updatasider->SetRange(0, 100);
-
+        updatasider->SetRange(100, 0);
         updatasider->SetStyle(STYLE_BORDER_RADIUS, 100);
         updatasider->SetBackgroundStyle(STYLE_LINE_CAP, CapType::CAP_ROUND);
         updatasider->SetForegroundStyle(STYLE_LINE_CAP, CapType::CAP_ROUND);
@@ -238,17 +304,18 @@ namespace OHOS
         updatasider->SetTouchable(false);
         updatasider->SetValue(0);
         UIViewGroup_transmitting->Add(updatasider);
-
-        if (label_ == nullptr)
+        /* -------------------------------------------------------------------------- */
+        if (label_ == nullptr) 
         {
             label_ = new UILabelExt();
+            if(label_ == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "label_ new fail");
+            }
         }
-        label_->SetPosition(60, 220); // widget's left position and top position
-        label_->Resize(345, 101);     // widget's width and height
-        label_->SetViewId("label2");  // Set style
+        label_->SetPosition(60, 220);         
+        label_->Resize(345, 101);          
         label_->SetStyle(STYLE_TEXT_FONT, 30);
-
-        // Set additional property
         label_->SetText("软件正在更新");
         label_->SetTextId(STR_OTA_DOWNLOADING);
         label_->SetLineBreakMode(UILabel::LINE_BREAK_MARQUEE);
@@ -256,129 +323,123 @@ namespace OHOS
         label_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
         label_->SetRollSpeed(0);
         label_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
-
-        // Add to rootView
         UIViewGroup_transmitting->Add(label_);
-
-        // Add ImageView to App
-
+        /* -------------------------------------------------------------------------- */
         if (transmitting_img == nullptr)
         {
             transmitting_img = new UIImageView();
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SystemUpdateView::FOOINGLOGOImage new fail!");
+            if(transmitting_img == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "transmitting_img new fail");
+            }
         }
-        transmitting_img->SetPosition(117, 87, 230, 160);
+        transmitting_img->SetPosition(193, 130, 80, 88);
         const char *imagesPath = TRANSMITTING_OTA_DOWN;
         transmitting_img->SetSrc(imagesPath);
         UIViewGroup_transmitting->Add(transmitting_img);
 
         uint32_t tick;
         osStatus_t retTimer;
-
-#ifdef SUPPORT_BLE_SERVICE
+        
+        #ifdef SUPPORT_BLE_SERVICE
         Set_OTA_recv_value();
-#endif
-        if (transmitting_timer != NULL)
+        transmitting_ota_timeout = 10;
+        #endif
+        if(transmitting_timer!=NULL)
         {
             osTimerStop(transmitting_timer);
             osTimerDelete(transmitting_timer);
             transmitting_timer = NULL;
         }
         transmitting_timer = osTimerNew((osTimerFunc_t)OTATimerCallBack, osTimerPeriodic, NULL, NULL);
-        tick = 500; // osMs2Tick(1000);
+        tick =500;// osMs2Tick(1000);
         retTimer = osTimerStart(transmitting_timer, tick);
-        if (retTimer != osOK && transmitting_timer != NULL)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StartCallTimer osTimerStart failed, ret = %lx!!", retTimer);
+        if (retTimer != osOK && transmitting_timer != NULL) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"StartCallTimer osTimerStart failed, ret = %lx!!", retTimer);
             osTimerDelete(transmitting_timer);
             transmitting_timer = NULL;
-            return;
+            return ;
         }
     }
-    static upg_result_t upg_result;
-    static uint32_t last_image_index;
+    static  upg_result_t upg_result;
+    static  uint32_t last_image_index;
 
-    static char updata_fail_str[32] = {0};
+    static char updata_fail_str[32]={0};
 
     static uint8_t TRANSMIT_DATA;
 
     void get_updatafail_data(void)
     {
-#ifdef SUPPORT_BLE_SERVICE
+        #ifdef SUPPORT_BLE_SERVICE
         errcode_t ret;
         ret = uapi_upg_get_result(&upg_result, &last_image_index);
-        if (ret != ERRCODE_SUCC)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "uapi_upg_get_result error = 0x%x\r\n", ret);
-        }
-        else
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "upg_result = %d, last_image_index:%d\r\n", upg_result, last_image_index);
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "uapi_upg_get_result OK!!\r\n");
-            if (upg_result != UPG_RESULT_UPDATE_SUCCESS)
-            {
-                sprintf_s(updata_fail_str, 32, "%d_%d", (int)upg_result, last_image_index);
-                TRANSMIT_DATA = OTA_UPDATA_FAIL;
-                if (ConfigModel::GetInstance()->get_configData_int(ConfigModel::CONFIGMODEL_ITEM_OTA_UPGRADE))
+        if (ret != ERRCODE_SUCC) {
+             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"uapi_upg_get_result error = 0x%x\r\n", ret);
+        } else {
+             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"upg_result = %d, last_image_index:%d\r\n", upg_result, last_image_index);
+             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"uapi_upg_get_result OK!!\r\n");
+             if(upg_result!=UPG_RESULT_UPDATE_SUCCESS)
+             {
+                sprintf_s(updata_fail_str,32,"%d_%d",(int)upg_result,last_image_index);
+                TRANSMIT_DATA=OTA_UPDATA_FAIL;
+                if(ConfigModel::GetInstance()->get_configData_int(ConfigModel::CONFIGMODEL_ITEM_OTA_UPGRADE))
                 {
-                    CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT, &TRANSMIT_DATA, 1);
-                    ConfigModel::GetInstance()->set_condigData_Int(ConfigModel::CONFIGMODEL_ITEM_OTA_UPGRADE, 0);
+                    CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+                    ConfigModel::GetInstance()->set_condigData_Int(ConfigModel::CONFIGMODEL_ITEM_OTA_UPGRADE,0);
                 }
-            }
+             }
+            
         }
-#endif
+        #endif
     }
 
     void Creat_OTA_Updata_FAIL()
     {
-        if (Title == nullptr)
+
+        if (Title == nullptr) 
         {
             Title = new UILabelExt();
+            if(Title == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Title new fail");
+            }
         }
-        Title->SetPosition(83, 50); // widget's left position and top position
-        Title->Resize(300, 35);     // widget's width and height
-        Title->SetViewId("label1"); // Set style
+        Title->SetPosition(83, 50);         
+        Title->Resize(300, 35);          
         Title->SetStyle(STYLE_TEXT_FONT, 30);
-
-        // Set additional property
         Title->SetText("OTA upgrade failure");
         Title->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);
         Title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
         Title->SetRollSpeed(0);
         Title->SetFont(DEFAULT_VECTOR_FONT_FILENAME_EN, 30);
-
         UIViewGroup_transmitting->Add(Title);
-
-        if (label_ == nullptr)
+        /* -------------------------------------------------------------------------- */
+        if (label_ == nullptr) 
         {
             label_ = new UILabelExt();
+            if(label_ == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "label_ new fail");
+            }
         }
-        label_->SetPosition(60, 281); // widget's left position and top position
-        label_->Resize(345, 101);     // widget's width and height
-        label_->SetViewId("label2");  // Set style
+        label_->SetPosition(60, 281);         
+        label_->Resize(345, 101);          
+        label_->SetViewId("label2");
         label_->SetStyle(STYLE_TEXT_FONT, 30);
-
-        // Set additional property
-        char fail_str[128] = {0};
-        sprintf_s(fail_str, 128, "ota升级失败,请尝试重启设备");
-
+        char fail_str[128]={0};
+        sprintf_s(fail_str,128,"ota升级失败,请尝试重启设备");
         label_->SetText(fail_str);
         label_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);
         label_->SetTextColor(Color::GetColorFromRGBA(0xAA, 0xAA, 0xAA, 0xff));
         label_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
         label_->SetRollSpeed(0);
         label_->SetFont(DEFAULT_VECTOR_FONT_FILENAME_EN, 30);
-
         UIViewGroup_transmitting->Add(label_);
-
-        // Add ImageView to App
-
         if (transmitting_img == nullptr)
         {
             transmitting_img = new UIImageView();
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SystemUpdateView::FOOINGLOGOImage new fail!");
         }
-        transmitting_img->SetPosition(193, 150, 80, 80);
+        transmitting_img->SetPosition(193, 150,80, 80);
         const char *imagesPath = TRANSMITTING_FAIL_PATH;
         transmitting_img->SetSrc(imagesPath);
         UIViewGroup_transmitting->Add(transmitting_img);
@@ -386,52 +447,52 @@ namespace OHOS
 
     void Creat_CAT1_OTA_Updata()
     {
-        if (Title == nullptr)
+        if (Title == nullptr) 
         {
             Title = new UILabelExt();
+            if(Title == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Title new fail");
+            }
         }
-        Title->SetPosition(83, 50); // widget's left position and top position
-        Title->Resize(300, 35);     // widget's width and height
-        Title->SetViewId("label1"); // Set style
+        Title->SetPosition(83, 50);         
+        Title->Resize(300, 35);         
         Title->SetStyle(STYLE_TEXT_FONT, 30);
-
-        // Set additional property
         Title->SetText("CAT1 OTA upgradeing");
         Title->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);
         Title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
         Title->SetRollSpeed(0);
         Title->SetFont(DEFAULT_VECTOR_FONT_FILENAME_EN, 30);
-
         UIViewGroup_transmitting->Add(Title);
-
-        if (label_ == nullptr)
+        /* -------------------------------------------------------------------------- */
+        if (label_ == nullptr) 
         {
             label_ = new UILabelExt();
+            if(label_ == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "label_ new fail");
+            }
         }
-        label_->SetPosition(60, 281); // widget's left position and top position
-        label_->Resize(345, 101);     // widget's width and height
-        label_->SetViewId("label2");  // Set style
+        label_->SetPosition(60, 281);         
+        label_->Resize(345, 101);         
         label_->SetStyle(STYLE_TEXT_FONT, 30);
-
-        // Set additional property
-
         label_->SetText("4G模块OTA升级中,请勿操作,升级成功后会自动重启");
         label_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);
         label_->SetTextColor(Color::GetColorFromRGBA(0xAA, 0xAA, 0xAA, 0xff));
         label_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
         label_->SetRollSpeed(0);
         label_->SetFont(DEFAULT_VECTOR_FONT_FILENAME_EN, 30);
-
         UIViewGroup_transmitting->Add(label_);
-
-        // Add ImageView to App
-
+        /* -------------------------------------------------------------------------- */
         if (transmitting_img == nullptr)
         {
             transmitting_img = new UIImageView();
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SystemUpdateView::FOOINGLOGOImage new fail!");
+            if(transmitting_img == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "transmitting_img new fail");
+            }
         }
-        transmitting_img->SetPosition(193, 150, 80, 80);
+        transmitting_img->SetPosition(193, 150,80, 80);
         const char *imagesPath = TRANSMITTING_FAIL_PATH;
         transmitting_img->SetSrc(imagesPath);
         UIViewGroup_transmitting->Add(transmitting_img);
@@ -439,91 +500,87 @@ namespace OHOS
 
     void creat_down_OTA_FAIL()
     {
-        if (Title == nullptr)
+        if (Title == nullptr) 
         {
             Title = new UILabelExt();
+            if(Title == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Title new fail");
+            }
         }
-        Title->SetPosition(143, 51); // widget's left position and top position
-        Title->Resize(800, 88);      // widget's width and height
-        Title->SetViewId("label1");  // Set style
+        Title->SetPosition(143, 51);         
+        Title->Resize(800, 88);          
         Title->SetStyle(STYLE_TEXT_FONT, 30);
-
-        // Set additional property
         Title->SetText("OTA下载失败");
-        Title->SetTextId(STR_OTA_DOWNLOADFIAL);
+        Title->SetTextId (STR_OTA_DOWNLOADFIAL);
         Title->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);
         Title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
         Title->SetRollSpeed(0);
         Title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
-
-        // Add to rootView
+        /* -------------------------------------------------------------------------- */
         UIViewGroup_transmitting->Add(Title);
-        if (label_ == nullptr)
+        /* -------------------------------------------------------------------------- */
+        if (label_ == nullptr) 
         {
             label_ = new UILabelExt();
+            if(label_ == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "label_ new fail");
+            }
         }
-        label_->SetPosition(60, 281); // widget's left position and top position
-        label_->Resize(345, 101);     // widget's width and height
-        label_->SetViewId("label2");  // Set style
+        label_->SetPosition(60, 281);         
+        label_->Resize(345, 101);          
         label_->SetStyle(STYLE_TEXT_FONT, 30);
-
-        // Set additional property
         label_->SetText("下载升级包失败,请退出或者重新下载");
         label_->SetTextId(STR_OTA_DOWNLOADFIAL_TRY);
-
         label_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);
         label_->SetTextColor(Color::GetColorFromRGBA(0xAA, 0xAA, 0xAA, 0xff));
         label_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
         label_->SetRollSpeed(0);
         label_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
-
         UIViewGroup_transmitting->Add(label_);
-
-        // Add ImageView to App
-
         if (transmitting_img == nullptr)
         {
             transmitting_img = new UIImageView();
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SystemUpdateView::FOOINGLOGOImage new fail!");
         }
-        transmitting_img->SetPosition(117, 87, 230, 160);
+        transmitting_img->SetPosition(193, 130, 80, 88);
         const char *imagesPath = TRANSMITTING_OTA_DOWN;
         transmitting_img->SetSrc(imagesPath);
         UIViewGroup_transmitting->Add(transmitting_img);
     }
 
     void creat_down_OTA_SUCC()
-    {
-        if (Title == nullptr)
+   {
+        if (Title == nullptr) 
         {
             Title = new UILabelExt();
+            if(Title == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Title new fail");
+            }
         }
-        Title->SetPosition(143, 51); // widget's left position and top position
-        Title->Resize(800, 88);      // widget's width and height
-        Title->SetViewId("label1");  // Set style
+        Title->SetPosition(143, 51);         
+        Title->Resize(800, 88);          
         Title->SetStyle(STYLE_TEXT_FONT, 30);
-
-        // Set additional property
         Title->SetText("OTA下载成功");
-        Title->SetTextId(STR_OTA_DOWNLOADSUCC);
+        Title->SetTextId (STR_OTA_DOWNLOADSUCC);
         Title->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);
         Title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
         Title->SetRollSpeed(0);
         Title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
-
-        // Add to rootView
         UIViewGroup_transmitting->Add(Title);
 
-        if (label_ == nullptr)
+        if (label_ == nullptr) 
         {
             label_ = new UILabelExt();
+            if(label_ == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "label_ new fail");
+            }
         }
-        label_->SetPosition(60, 281); // widget's left position and top position
-        label_->Resize(345, 101);     // widget's width and height
-        label_->SetViewId("label2");  // Set style
+        label_->SetPosition(60, 281);         
+        label_->Resize(345, 101);          
         label_->SetStyle(STYLE_TEXT_FONT, 30);
-
-        // Set additional property
         label_->SetText("下载升级包成功,可以开始升级手表");
         label_->SetTextId(STR_OTA_DOWNLOADSUCC_UPDATA);
         label_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);
@@ -531,56 +588,54 @@ namespace OHOS
         label_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
         label_->SetRollSpeed(0);
         label_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
-
-        // Add to rootView
         UIViewGroup_transmitting->Add(label_);
-
-        // Add ImageView to App
-
         if (transmitting_img == nullptr)
         {
             transmitting_img = new UIImageView();
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SystemUpdateView::FOOINGLOGOImage new fail!");
+            if(transmitting_img == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "transmitting_img new fail");
+            }
         }
-        transmitting_img->SetPosition(117, 87, 230, 160);
+        transmitting_img->SetPosition(193, 130, 80, 88);
         const char *imagesPath = TRANSMITTING_OTA_DOWN;
         transmitting_img->SetSrc(imagesPath);
         UIViewGroup_transmitting->Add(transmitting_img);
     }
-
+   
     void creat_down_Dial()
     {
-        if (Title == nullptr)
+        if (Title == nullptr) 
         {
             Title = new UILabelExt();
+            if(Title == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Title new fail");
+            }
         }
-        Title->SetPosition(158, 51); // widget's left position and top position
-        Title->Resize(800, 88);      // widget's width and height
-        Title->SetViewId("label1");  // Set style
+        Title->SetPosition(158, 51);         
+        Title->Resize(800, 88);          
         Title->SetStyle(STYLE_TEXT_FONT, 30);
-
-        // Set additional property
         Title->SetText("表盘安装中");
-        Title->SetTextId(STR_DIAL_DOWNLOADING_TITLE);
+        Title->SetTextId (STR_DIAL_DOWNLOADING_TITLE);
         Title->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);
         Title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
         Title->SetRollSpeed(0);
         Title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
-
-        // Add to rootView
         UIViewGroup_transmitting->Add(Title);
         Title->SetVisible(true);
-
-        if (label_ == nullptr)
+        /* -------------------------------------------------------------------------- */
+        if (label_ == nullptr) 
         {
             label_ = new UILabelExt();
+            if(label_ == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "label_ new fail");
+            }
         }
-        label_->SetPosition(60, 281); // widget's left position and top position
-        label_->Resize(345, 101);     // widget's width and height
-        label_->SetViewId("label2");  // Set style
+        label_->SetPosition(60, 281);         
+        label_->Resize(345, 101);          
         label_->SetStyle(STYLE_TEXT_FONT, 30);
-
-        // Set additional property
         label_->SetText("正在安装表盘,请不要做其他操作或关闭手表");
         label_->SetTextId(STR_DIAL_DOWNLOADING_LABEL);
         label_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);
@@ -588,51 +643,46 @@ namespace OHOS
         label_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
         label_->SetRollSpeed(0);
         label_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
-
-        // Add to rootView
         UIViewGroup_transmitting->Add(label_);
         label_->SetVisible(true);
-
         CreatetransmittingAnimator();
-        // UIViewGroup_transmitting->Add(updatasider);
-
         UIViewGroup_transmitting->Add(downImageAnimatorView);
     }
 
+
     void creat_down_MP3()
     {
-        if (Title == nullptr)
+        if (Title == nullptr) 
         {
             Title = new UILabelExt();
+            if(Title == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Title new fail");
+            }
         }
-        Title->SetPosition(158, 51); // widget's left position and top position
-        Title->Resize(800, 88);      // widget's width and height
-        Title->SetViewId("label1");  // Set style
+        Title->SetPosition(158, 51);        
+        Title->Resize(800, 88);         
         Title->SetStyle(STYLE_TEXT_FONT, 30);
-
-        // Set additional property
         Title->SetText("音乐传输中");
-        Title->SetTextId(STR_MUSIC_TRANSMIT);
-
+        Title->SetTextId (STR_MUSIC_TRANSMIT);
         Title->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);
         Title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
         Title->SetRollSpeed(0);
         Title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
-
-        // Add to rootView
-        UIViewGroup_transmitting->Add(Title);
         Title->SetVisible(true);
-
-        if (label_ == nullptr)
+        UIViewGroup_transmitting->Add(Title);
+        /* -------------------------------------------------------------------------- */
+        if (label_ == nullptr) 
         {
             label_ = new UILabelExt();
+            if(label_ == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "label_ new fail");
+            }
         }
-        label_->SetPosition(60, 281); // widget's left position and top position
-        label_->Resize(345, 101);     // widget's width and height
-        label_->SetViewId("label2");  // Set style
+        label_->SetPosition(60, 281);         
+        label_->Resize(345, 101);          
         label_->SetStyle(STYLE_TEXT_FONT, 30);
-
-        // Set additional property
         label_->SetText("正在传输音乐,请不要做其他操作或关闭手表");
         label_->SetTextId(STR_MUSIC_TRANSMIT_NOTE);
         label_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);
@@ -640,51 +690,45 @@ namespace OHOS
         label_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
         label_->SetRollSpeed(0);
         label_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
-
-        // Add to rootView
-        UIViewGroup_transmitting->Add(label_);
         label_->SetVisible(true);
-
+        UIViewGroup_transmitting->Add(label_);
         CreatetransmittingAnimator();
-        // UIViewGroup_transmitting->Add(updatasider);
-
         UIViewGroup_transmitting->Add(downImageAnimatorView);
     }
 
     void creat_down_BIN()
     {
-        if (Title == nullptr)
+        if (Title == nullptr) 
         {
             Title = new UILabelExt();
+            if(Title == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Title new fail");
+            }
         }
-        Title->SetPosition(158, 51); // widget's left position and top position
-        Title->Resize(800, 88);      // widget's width and height
-        Title->SetViewId("label1");  // Set style
+        Title->SetPosition(158, 51);         
+        Title->Resize(800, 88);          
         Title->SetStyle(STYLE_TEXT_FONT, 30);
-
-        // Set additional property
         Title->SetText("数据传输中");
         //  Title->SetTextId (STR_MUSIC_TRANSMIT);
-
         Title->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);
         Title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
         Title->SetRollSpeed(0);
         Title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
-
-        // Add to rootView
-        UIViewGroup_transmitting->Add(Title);
         Title->SetVisible(true);
-
-        if (label_ == nullptr)
+        UIViewGroup_transmitting->Add(Title);
+        /* -------------------------------------------------------------------------- */
+        if (label_ == nullptr) 
         {
             label_ = new UILabelExt();
+            if(label_ == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "label_ new fail");
+            }
         }
-        label_->SetPosition(60, 281); // widget's left position and top position
-        label_->Resize(345, 101);     // widget's width and height
-        label_->SetViewId("label2");  // Set style
+        label_->SetPosition(60, 281);         
+        label_->Resize(345, 101);          
         label_->SetStyle(STYLE_TEXT_FONT, 30);
-
-        // Set additional property
         label_->SetText("正在下载应用,请不要做其他操作或关闭手表");
         // label_->SetTextId(STR_MUSIC_TRANSMIT_NOTE);
         label_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);
@@ -692,50 +736,45 @@ namespace OHOS
         label_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
         label_->SetRollSpeed(0);
         label_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
-
-        // Add to rootView
-        UIViewGroup_transmitting->Add(label_);
         label_->SetVisible(true);
-
+        UIViewGroup_transmitting->Add(label_);
         CreatetransmittingAnimator();
-        // UIViewGroup_transmitting->Add(updatasider);
-
         UIViewGroup_transmitting->Add(downImageAnimatorView);
     }
 
+
     void creat_down_MP3_succ()
     {
-        if (Title == nullptr)
+        if (Title == nullptr) 
         {
             Title = new UILabelExt();
+            if(Title == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Title new fail");
+            }
         }
-        Title->SetPosition(173, 51); // widget's left position and top position
-        Title->Resize(800, 88);      // widget's width and height
-        Title->SetViewId("label1");  // Set style
+        Title->SetPosition(173, 51);         
+        Title->Resize(800, 88);          
         Title->SetStyle(STYLE_TEXT_FONT, 30);
-
-        // Set additional property
         Title->SetText("传输成功");
-        Title->SetTextId(STR_MP3_SUCC_TITLE);
+        Title->SetTextId (STR_MP3_SUCC_TITLE);
         Title->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);
         Title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
         Title->SetRollSpeed(0);
         Title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
-
-        // Add to rootView
-        UIViewGroup_transmitting->Add(Title);
         Title->SetVisible(true);
-
-        if (label_ == nullptr)
+        UIViewGroup_transmitting->Add(Title);
+        if (label_ == nullptr) 
         {
             label_ = new UILabelExt();
+            if(label_ == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "label_ new fail");
+            }
         }
-        label_->SetPosition(60, 281); // widget's left position and top position
-        label_->Resize(345, 101);     // widget's width and height
-        label_->SetViewId("label2");  // Set style
+        label_->SetPosition(60, 281);         
+        label_->Resize(345, 101);          
         label_->SetStyle(STYLE_TEXT_FONT, 30);
-
-        // Set additional property
         label_->SetText("音乐传输成功正在校验,请稍等");
         label_->SetTextId(STR_MUSIC_TRANSMIT_SUCCESS_NOTE);
         label_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);
@@ -743,74 +782,70 @@ namespace OHOS
         label_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
         label_->SetRollSpeed(0);
         label_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
-
+        label_->SetVisible(true);
+        UIViewGroup_transmitting->Add(label_);
+        /* -------------------------------------------------------------------------- */
         if (transmitting_img == nullptr)
         {
             transmitting_img = new UIImageView();
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SystemUpdateView::FOOINGLOGOImage new fail!");
+            if(transmitting_img == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "transmitting_img new fail");
+            }
         }
-        transmitting_img->SetPosition(193, 150, 80, 80);
+        transmitting_img->SetPosition(193, 150,80, 80);
         const char *imagesPath = TRANSMITTING_SUCC_PATH;
         transmitting_img->SetSrc(imagesPath);
         UIViewGroup_transmitting->Add(transmitting_img);
-
+        /* -------------------------------------------------------------------------- */
         uint32_t tick;
         osStatus_t retTimer;
-        if (transmitting_timer != NULL)
+        if(transmitting_timer!=NULL)
         {
             osTimerStop(transmitting_timer);
             osTimerDelete(transmitting_timer);
             transmitting_timer = NULL;
         }
         transmitting_timer = osTimerNew((osTimerFunc_t)dialtimerCallBack, osTimerPeriodic, NULL, NULL);
-        tick = 2000; // osMs2Tick(1000);
+        tick =2000;// osMs2Tick(1000);
         retTimer = osTimerStart(transmitting_timer, tick);
-        if (retTimer != osOK && transmitting_timer != NULL)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StartCallTimer osTimerStart failed, ret = %lx!!", retTimer);
+        if (retTimer != osOK && transmitting_timer != NULL) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"StartCallTimer osTimerStart failed, ret = %lx!!", retTimer);
             osTimerDelete(transmitting_timer);
             transmitting_timer = NULL;
-            return;
+            return ;
         }
-
-        // Add to rootView
-        UIViewGroup_transmitting->Add(label_);
-        label_->SetVisible(true);
     }
 
+
     void creat_down_BIN_succ()
     {
-        if (Title == nullptr)
-        {
-            Title = new UILabelExt();
+        if (Title == nullptr) {
+        Title = new UILabelExt();
         }
-        Title->SetPosition(173, 51); // widget's left position and top position
-        Title->Resize(800, 88);      // widget's width and height
-        Title->SetViewId("label1");  // Set style
+        Title->SetPosition(173, 51);         
+        Title->Resize(800, 88);          
         Title->SetStyle(STYLE_TEXT_FONT, 30);
-
-        // Set additional property
         Title->SetText("传输成功");
         //  Title->SetTextId (STR_MP3_SUCC_TITLE);
         Title->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);
         Title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
         Title->SetRollSpeed(0);
         Title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
-
-        // Add to rootView
-        UIViewGroup_transmitting->Add(Title);
         Title->SetVisible(true);
-
-        if (label_ == nullptr)
+        UIViewGroup_transmitting->Add(Title);
+        /* -------------------------------------------------------------------------- */
+        if (label_ == nullptr) 
         {
             label_ = new UILabelExt();
+            if(label_ == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "label_ new fail");
+            }
         }
-        label_->SetPosition(60, 281); // widget's left position and top position
-        label_->Resize(345, 101);     // widget's width and height
-        label_->SetViewId("label2");  // Set style
+        label_->SetPosition(60, 281);         
+        label_->Resize(345, 101);          
         label_->SetStyle(STYLE_TEXT_FONT, 30);
-
-        // Set additional property
         label_->SetText("应用安装中,请稍等");
         //  label_->SetTextId(STR_MUSIC_TRANSMIT_SUCCESS_NOTE);
         label_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);
@@ -818,74 +853,70 @@ namespace OHOS
         label_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
         label_->SetRollSpeed(0);
         label_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
-
+        label_->SetVisible(true);
+        UIViewGroup_transmitting->Add(label_);
+        /* -------------------------------------------------------------------------- */
         if (transmitting_img == nullptr)
         {
             transmitting_img = new UIImageView();
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SystemUpdateView::FOOINGLOGOImage new fail!");
         }
-        transmitting_img->SetPosition(193, 150, 80, 80);
+        transmitting_img->SetPosition(193, 150,80, 80);
         const char *imagesPath = TRANSMITTING_SUCC_PATH;
         transmitting_img->SetSrc(imagesPath);
         UIViewGroup_transmitting->Add(transmitting_img);
-
+        /* -------------------------------------------------------------------------- */
         uint32_t tick;
         osStatus_t retTimer;
-        if (transmitting_timer != NULL)
+        if(transmitting_timer!=NULL)
         {
             osTimerStop(transmitting_timer);
             osTimerDelete(transmitting_timer);
             transmitting_timer = NULL;
         }
         transmitting_timer = osTimerNew((osTimerFunc_t)dialtimerCallBack, osTimerPeriodic, NULL, NULL);
-        tick = 2000; // osMs2Tick(1000);
+        tick =2000;// osMs2Tick(1000);
         retTimer = osTimerStart(transmitting_timer, tick);
-        if (retTimer != osOK && transmitting_timer != NULL)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StartCallTimer osTimerStart failed, ret = %lx!!", retTimer);
+        if (retTimer != osOK && transmitting_timer != NULL) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"StartCallTimer osTimerStart failed, ret = %lx!!", retTimer);
             osTimerDelete(transmitting_timer);
             transmitting_timer = NULL;
-            return;
+            return ;
         }
-
-        // Add to rootView
-        UIViewGroup_transmitting->Add(label_);
-        label_->SetVisible(true);
     }
 
     void creat_down_Dial_succ()
     {
-        if (Title == nullptr)
+        if (Title == nullptr) 
         {
             Title = new UILabelExt();
+            if(Title == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Title new fail");
+            }
         }
-        Title->SetPosition(173, 51); // widget's left position and top position
-        Title->Resize(800, 88);      // widget's width and height
-        Title->SetViewId("label1");  // Set style
+        Title->SetPosition(173, 51);        
+        Title->Resize(800, 88);          
         Title->SetStyle(STYLE_TEXT_FONT, 30);
-
-        // Set additional property
         Title->SetText("安装成功");
-        Title->SetTextId(STR_DIAL_SUCC_TITLE);
+        Title->SetTextId (STR_DIAL_SUCC_TITLE);
         Title->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);
         Title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
         Title->SetRollSpeed(0);
         Title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
-
-        // Add to rootView
-        UIViewGroup_transmitting->Add(Title);
         Title->SetVisible(true);
-
-        if (label_ == nullptr)
+        UIViewGroup_transmitting->Add(Title);
+        /* -------------------------------------------------------------------------- */
+        if (label_ == nullptr) 
         {
             label_ = new UILabelExt();
+            if(label_ == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "label_ new fail");
+            }
         }
-        label_->SetPosition(60, 281); // widget's left position and top position
-        label_->Resize(345, 101);     // widget's width and height
-        label_->SetViewId("label2");  // Set style
+        label_->SetPosition(60, 281);         
+        label_->Resize(345, 101);          
         label_->SetStyle(STYLE_TEXT_FONT, 30);
-
-        // Set additional property
         label_->SetText("表盘安装成功正在更新表盘,请稍等");
         label_->SetTextId(STR_DIAL_SUCC_LABEL);
         label_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);
@@ -893,253 +924,242 @@ namespace OHOS
         label_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
         label_->SetRollSpeed(0);
         label_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
-
+        label_->SetVisible(true);
+        UIViewGroup_transmitting->Add(label_);
+        /* -------------------------------------------------------------------------- */
         if (transmitting_img == nullptr)
         {
             transmitting_img = new UIImageView();
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SystemUpdateView::FOOINGLOGOImage new fail!");
+            if(transmitting_img == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "transmitting_img new fail");
+            }
         }
-        transmitting_img->SetPosition(193, 150, 80, 80);
+        transmitting_img->SetPosition(193, 150,80, 80);
         const char *imagesPath = TRANSMITTING_SUCC_PATH;
         transmitting_img->SetSrc(imagesPath);
         UIViewGroup_transmitting->Add(transmitting_img);
-
+        /* -------------------------------------------------------------------------- */
         uint32_t tick;
         osStatus_t retTimer;
-        if (transmitting_timer != NULL)
+        if(transmitting_timer!=NULL)
         {
             osTimerStop(transmitting_timer);
             osTimerDelete(transmitting_timer);
             transmitting_timer = NULL;
         }
-        transmitting_timer = osTimerNew((osTimerFunc_t)dialtimerCallBack, osTimerPeriodic, NULL, NULL);
-        tick = 2000; // osMs2Tick(1000);
+        transmitting_timer = osTimerNew((osTimerFunc_t)dialtimerCallBack, osTimerOnce, NULL, NULL);
+        tick =2000;// osMs2Tick(1000);
         retTimer = osTimerStart(transmitting_timer, tick);
-        if (retTimer != osOK && transmitting_timer != NULL)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StartCallTimer osTimerStart failed, ret = %lx!!", retTimer);
+        if (retTimer != osOK && transmitting_timer != NULL) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"StartCallTimer osTimerStart failed, ret = %lx!!", retTimer);
             osTimerDelete(transmitting_timer);
             transmitting_timer = NULL;
-            return;
+            return ;
         }
-
-        // Add to rootView
-        UIViewGroup_transmitting->Add(label_);
-        label_->SetVisible(true);
     }
 
     void creat_down_max_Dial_fail()
     {
-        if (Title == nullptr)
+        if (Title == nullptr) 
         {
             Title = new UILabelExt();
+            if(Title == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Title new fail");
+            }
         }
-        Title->SetPosition(173, 51); // widget's left position and top position
-        Title->Resize(800, 88);      // widget's width and height
-        Title->SetViewId("label1");  // Set style
+        Title->SetPosition(173, 51);         
+        Title->Resize(800, 88);          
         Title->SetStyle(STYLE_TEXT_FONT, 30);
-
-        // Set additional property
-        Title->SetTextId(STR_OPERAT_FAIL); // TODO:多国语言
-                                           // Title->SetTextId (STR_DIAL_FAIL_TITLE);
+        Title->SetTextId(STR_OPERAT_FAIL);//TODO:多国语言
         Title->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);
         Title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
         Title->SetRollSpeed(0);
         Title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
-
-        // Add to rootView
-        UIViewGroup_transmitting->Add(Title);
         Title->SetVisible(true);
-
-        if (label_ == nullptr)
+        UIViewGroup_transmitting->Add(Title);
+        /* -------------------------------------------------------------------------- */
+        if (label_ == nullptr) 
         {
             label_ = new UILabelExt();
+            if(label_ == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "label_ new fail");
+            }
         }
-        label_->SetPosition(60, 281); // widget's left position and top position
-        label_->Resize(345, 101);     // widget's width and height
-        label_->SetViewId("label2");  // Set style
+        label_->SetPosition(60, 281);        
+        label_->Resize(345, 101);          
         label_->SetStyle(STYLE_TEXT_FONT, 30);
-
-        // Set additional property
-
-        label_->SetTextId(STR_DIAL_NOTE); // TODO:多国语言
-
+        label_->SetTextId(STR_DIAL_NOTE);//TODO:多国语言
         label_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);
         label_->SetTextColor(Color::GetColorFromRGBA(0xAA, 0xAA, 0xAA, 0xff));
         label_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
         label_->SetRollSpeed(0);
         label_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
-
+        label_->SetVisible(true);
+        UIViewGroup_transmitting->Add(label_);
+        /* -------------------------------------------------------------------------- */
         if (transmitting_img == nullptr)
         {
             transmitting_img = new UIImageView();
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SystemUpdateView::FOOINGLOGOImage new fail!");
         }
-        transmitting_img->SetPosition(193, 150, 80, 80);
+        transmitting_img->SetPosition(193, 150,80, 80);
         const char *imagesPath = TRANSMITTING_FAIL_PATH;
         transmitting_img->SetSrc(imagesPath);
         UIViewGroup_transmitting->Add(transmitting_img);
-
-        // Add to rootView
-        UIViewGroup_transmitting->Add(label_);
-        label_->SetVisible(true);
     }
 
     void creat_down_max_MP3_fail()
     {
-        if (Title == nullptr)
+        if (Title == nullptr) 
         {
             Title = new UILabelExt();
+            if(Title == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Title new fail");
+            }
         }
-        Title->SetPosition(173, 51); // widget's left position and top position
-        Title->Resize(800, 88);      // widget's width and height
-        Title->SetViewId("label1");  // Set style
+        Title->SetPosition(173, 51);         
+        Title->Resize(800, 88);          
         Title->SetStyle(STYLE_TEXT_FONT, 30);
-
-        // Set additional property
-        Title->SetTextId(STR_OPERAT_FAIL); // TODO:多国语言
-                                           // Title->SetTextId (STR_DIAL_FAIL_TITLE);
+        Title->SetTextId(STR_OPERAT_FAIL);//TODO:多国语言
         Title->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);
         Title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
         Title->SetRollSpeed(0);
         Title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
-
-        // Add to rootView
-        UIViewGroup_transmitting->Add(Title);
         Title->SetVisible(true);
-
-        if (label_ == nullptr)
+        UIViewGroup_transmitting->Add(Title);
+        /* -------------------------------------------------------------------------- */
+        if (label_ == nullptr) 
         {
             label_ = new UILabelExt();
+            if(label_ == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "label_ new fail");
+            }
         }
-        label_->SetPosition(60, 281); // widget's left position and top position
-        label_->Resize(345, 101);     // widget's width and height
-        label_->SetViewId("label2");  // Set style
+        label_->SetPosition(60, 281);         
+        label_->Resize(345, 101);          
         label_->SetStyle(STYLE_TEXT_FONT, 30);
-
-        // Set additional property
-
-        // label_->SetTextId(STR_DIAL_NOTE);//TODO:多国语言
-        //
-        //
-        // if(ConfigModel::GetInstance()->GetLanguage() == ZH_CN)
         label_->SetText("本地下载音乐已达到存储上限;请先删除部分歌曲再进行上传");
-        // else
-        // label_->SetText(
-        // "The storage capacity of locally downloaded music has reached the upper limit.\
-        // Please delete some songs before uploading");
-
         label_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);
         label_->SetTextColor(Color::GetColorFromRGBA(0xAA, 0xAA, 0xAA, 0xff));
         label_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
         label_->SetRollSpeed(0);
         label_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
-
+        label_->SetVisible(true);
+        UIViewGroup_transmitting->Add(label_);
+        /* -------------------------------------------------------------------------- */
         if (transmitting_img == nullptr)
         {
             transmitting_img = new UIImageView();
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SystemUpdateView::FOOINGLOGOImage new fail!");
+            if(transmitting_img == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "transmitting_img new fail");
+            }
         }
-        transmitting_img->SetPosition(193, 150, 80, 80);
+        transmitting_img->SetPosition(193, 150,80, 80);
         const char *imagesPath = TRANSMITTING_FAIL_PATH;
         transmitting_img->SetSrc(imagesPath);
         UIViewGroup_transmitting->Add(transmitting_img);
-
-        // Add to rootView
-        UIViewGroup_transmitting->Add(label_);
-        label_->SetVisible(true);
     }
 
     void creat_down_Dial_fail()
     {
-        if (Title == nullptr)
+        if (Title == nullptr) 
         {
             Title = new UILabelExt();
+            if(Title == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Title new fail");
+            }
         }
-        Title->SetPosition(173, 51); // widget's left position and top position
-        Title->Resize(800, 88);      // widget's width and height
-        Title->SetViewId("label1");  // Set style
+        Title->SetPosition(173, 51);         
+        Title->Resize(800, 88);          
         Title->SetStyle(STYLE_TEXT_FONT, 30);
-
-        // Set additional property
-        Title->SetText("安装失败");
-        Title->SetTextId(STR_DIAL_FAIL_TITLE);
+        if(ConfigModel::GetInstance()->GetLanguage() == 0)
+            Title->SetText("安装失败");
+        else
+            Title->SetText("Install Failed");
+        Title->SetTextId (STR_DIAL_FAIL_TITLE);
         Title->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);
         Title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
         Title->SetRollSpeed(0);
         Title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
-
-        // Add to rootView
-        UIViewGroup_transmitting->Add(Title);
         Title->SetVisible(true);
-
-        if (label_ == nullptr)
+        UIViewGroup_transmitting->Add(Title);
+        /* -------------------------------------------------------------------------- */
+        if (label_ == nullptr) 
         {
             label_ = new UILabelExt();
+            if(label_ == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "label_ new fail");
+            }
         }
-        label_->SetPosition(60, 281); // widget's left position and top position
-        label_->Resize(345, 101);     // widget's width and height
-        label_->SetViewId("label2");  // Set style
+        label_->SetPosition(60, 281);         
+        label_->Resize(345, 101);          
         label_->SetStyle(STYLE_TEXT_FONT, 30);
-
-        // Set additional property
-
         label_->SetTextId(STR_DIAL_FAIL_LABEL);
-
         label_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);
         label_->SetTextColor(Color::GetColorFromRGBA(0xAA, 0xAA, 0xAA, 0xff));
         label_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
         label_->SetRollSpeed(0);
         label_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
-
+        label_->SetVisible(true);
+        UIViewGroup_transmitting->Add(label_);
+        /* -------------------------------------------------------------------------- */
         if (transmitting_img == nullptr)
         {
             transmitting_img = new UIImageView();
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SystemUpdateView::FOOINGLOGOImage new fail!");
+            if(transmitting_img == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "transmitting_img new fail");
+            }
         }
-        transmitting_img->SetPosition(193, 150, 80, 80);
+        transmitting_img->SetPosition(193, 150,80, 80);
         const char *imagesPath = TRANSMITTING_FAIL_PATH;
         transmitting_img->SetSrc(imagesPath);
         UIViewGroup_transmitting->Add(transmitting_img);
-
-        // Add to rootView
-        UIViewGroup_transmitting->Add(label_);
-        label_->SetVisible(true);
     }
 
     void creat_down_MP3_fail()
     {
-        if (Title == nullptr)
+        if (Title == nullptr) 
         {
             Title = new UILabelExt();
+            if(Title == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Title new fail");
+            }
         }
-        Title->SetPosition(173, 51); // widget's left position and top position
-        Title->Resize(800, 88);      // widget's width and height
-        Title->SetViewId("label1");  // Set style
+        Title->SetPosition(173, 51);         
+        Title->Resize(800, 88);          
         Title->SetStyle(STYLE_TEXT_FONT, 30);
-
-        // Set additional property
-        Title->SetText("传输失败");
-        Title->SetTextId(STR_MP3_FAIL_TITL);
+        if(ConfigModel::GetInstance()->GetLanguage() == 0)
+            Title->SetText("传输失败");
+        else
+            Title->SetText("Transfer Failed");
+        Title->SetTextId (STR_MP3_FAIL_TITL);
         Title->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);
         Title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
         Title->SetRollSpeed(0);
         Title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
-
-        // Add to rootView
-        UIViewGroup_transmitting->Add(Title);
         Title->SetVisible(true);
-
-        if (label_ == nullptr)
+        UIViewGroup_transmitting->Add(Title);
+        /* -------------------------------------------------------------------------- */
+        if (label_ == nullptr) 
         {
             label_ = new UILabelExt();
+            if(label_ == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "label_ new fail");
+            }
         }
-        label_->SetPosition(60, 281); // widget's left position and top position
-        label_->Resize(345, 101);     // widget's width and height
-        label_->SetViewId("label2");  // Set style
+        label_->SetPosition(60, 281);         
+        label_->Resize(345, 101);          
         label_->SetStyle(STYLE_TEXT_FONT, 30);
-
-        // Set additional property
         label_->SetText("音乐传输失败,请退出或重新安装");
         label_->SetTextId(STR_MP3_FAIL_LABEL);
         label_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);
@@ -1147,343 +1167,374 @@ namespace OHOS
         label_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
         label_->SetRollSpeed(0);
         label_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
-
+        label_->SetVisible(true);
+        UIViewGroup_transmitting->Add(label_);
+        /* -------------------------------------------------------------------------- */
         if (transmitting_img == nullptr)
         {
             transmitting_img = new UIImageView();
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SystemUpdateView::FOOINGLOGOImage new fail!");
         }
-        transmitting_img->SetPosition(193, 150, 80, 80);
+        transmitting_img->SetPosition(193, 150,80, 80);
         const char *imagesPath = TRANSMITTING_FAIL_PATH;
         transmitting_img->SetSrc(imagesPath);
         UIViewGroup_transmitting->Add(transmitting_img);
-
-        // Add to rootView
-        UIViewGroup_transmitting->Add(label_);
-        label_->SetVisible(true);
     }
 
     void creat_down_BIN_fail()
     {
-        if (Title == nullptr)
+        if (Title == nullptr) 
         {
             Title = new UILabelExt();
+            if(Title == nullptr)    
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Title new fail");
+            }
         }
-        Title->SetPosition(173, 51); // widget's left position and top position
-        Title->Resize(800, 88);      // widget's width and height
-        Title->SetViewId("label1");  // Set style
+        Title->SetPosition(173, 51);         
+        Title->Resize(800, 88);         
         Title->SetStyle(STYLE_TEXT_FONT, 30);
-
-        // Set additional property
-        Title->SetText("传输失败");
+        if(ConfigModel::GetInstance()->GetLanguage() == 0)
+            Title->SetText("传输失败");
+        else
+            Title->SetText("Transfer Failed");
         // Title->SetTextId (STR_MP3_FAIL_TITL);
         Title->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);
         Title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
         Title->SetRollSpeed(0);
         Title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
-
-        // Add to rootView
         UIViewGroup_transmitting->Add(Title);
         Title->SetVisible(true);
-
-        if (label_ == nullptr)
+        /* -------------------------------------------------------------------------- */
+        if (label_ == nullptr) 
         {
             label_ = new UILabelExt();
+            if(label_ == nullptr)    
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "label_ new fail");
+            }
         }
-        label_->SetPosition(60, 281); // widget's left position and top position
-        label_->Resize(345, 101);     // widget's width and height
-        label_->SetViewId("label2");  // Set style
+        label_->SetPosition(60, 281);         
+        label_->Resize(345, 101);         
         label_->SetStyle(STYLE_TEXT_FONT, 30);
-
-        // Set additional property
-        label_->SetText("app安装失败,请退出或重新安装");
+        if(ConfigModel::GetInstance()->GetLanguage() == 0)
+            label_->SetText("app安装失败,请退出或重新安装");
+        else
+            label_->SetText("App install failed, please exit or reinstall");
         // label_->SetTextId(STR_MP3_FAIL_LABEL);
         label_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);
         label_->SetTextColor(Color::GetColorFromRGBA(0xAA, 0xAA, 0xAA, 0xff));
         label_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
         label_->SetRollSpeed(0);
         label_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
-
+        UIViewGroup_transmitting->Add(label_);
+        label_->SetVisible(true);
+        /* -------------------------------------------------------------------------- */
         if (transmitting_img == nullptr)
         {
             transmitting_img = new UIImageView();
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SystemUpdateView::FOOINGLOGOImage new fail!");
+            if(transmitting_img == nullptr)    
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "transmitting_img new fail");
+            }
         }
-        transmitting_img->SetPosition(193, 150, 80, 80);
+        transmitting_img->SetPosition(193, 150,80, 80);
         const char *imagesPath = TRANSMITTING_FAIL_PATH;
         transmitting_img->SetSrc(imagesPath);
         UIViewGroup_transmitting->Add(transmitting_img);
-
-        // Add to rootView
-        UIViewGroup_transmitting->Add(label_);
-        label_->SetVisible(true);
     }
 
+    
     void creat_down_EPO()
     {
-        printf("creat_down_EPO\n");
-        if (Title == nullptr)
+        if (Title == nullptr) 
         {
             Title = new UILabelExt();
+            if(Title == nullptr)    
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Title new fail");
+            }
         }
-        Title->SetPosition(158, 51);
-        Title->Resize(800, 88);
+        Title->SetPosition(108, 51);        
+        Title->Resize(300, 88);          
         Title->SetViewId("label1");
         Title->SetStyle(STYLE_TEXT_FONT, 30);
-
-        Title->SetText("星历下载中");
+        if(ConfigModel::GetInstance()->GetLanguage() == 0)
+            Title->SetText("正在优化定位速度");
+        else
+            Title->SetText("Optimizing");
         Title->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);
         Title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
         Title->SetRollSpeed(0);
         Title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
-
-        // Add to rootView
-        UIViewGroup_transmitting->Add(Title);
+        Title->SetX((466 - Title->GetWidth()) / 2);
         Title->SetVisible(true);
-
-        if (label_ == nullptr)
+        UIViewGroup_transmitting->Add(Title);
+        /* -------------------------------------------------------------------------- */
+        if (label_ == nullptr) 
         {
             label_ = new UILabelExt();
+            if(label_ == nullptr)    
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "label_ new fail");
+            }
         }
-        label_->SetPosition(60, 281);
-        label_->Resize(345, 101);
+        label_->SetPosition(60, 281);         
+        label_->Resize(345, 101);          
         label_->SetStyle(STYLE_TEXT_FONT, 30);
-        // Set additional property
-        label_->SetText("正在下载星历,请不要做其他操作或关闭手表");
+        if(ConfigModel::GetInstance()->GetLanguage() == 0)
+            label_->SetText("请稍等...");
+        else
+            label_->SetText("Please wait...");
         label_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);
         label_->SetTextColor(Color::GetColorFromRGBA(0xAA, 0xAA, 0xAA, 0xff));
         label_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
         label_->SetRollSpeed(0);
         label_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
-
-        // Add to rootView
         UIViewGroup_transmitting->Add(label_);
         label_->SetVisible(true);
-
+        /* -------------------------------------------------------------------------- */
         CreatetransmittingAnimator();
-
         UIViewGroup_transmitting->Add(downImageAnimatorView);
     }
 
     void creat_down_EPO_succ()
     {
-        printf("creat_down_EPO_succ\n");
-        if (Title == nullptr)
+        if (Title == nullptr) 
         {
             Title = new UILabelExt();
+            if(Title == nullptr)    
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Title new fail");
+            }
         }
-        Title->SetPosition(173, 51);
-        Title->Resize(800, 88);
+        Title->SetPosition(173, 51);         
+        Title->Resize(800, 88);          
         Title->SetStyle(STYLE_TEXT_FONT, 30);
 
-        Title->SetText("星历下载成功");
+        if(ConfigModel::GetInstance()->GetLanguage() == 0)
+            Title->SetText("优化成功");
+        else
+            Title->SetText("Opt Success");
         Title->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);
         Title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
         Title->SetRollSpeed(0);
         Title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
-
         Title->SetX((466 - Title->GetWidth()) / 2);
-
-        // Add to rootView
         UIViewGroup_transmitting->Add(Title);
         Title->SetVisible(true);
-
-        if (label_ == nullptr)
+        /* -------------------------------------------------------------------------- */
+        if (label_ == nullptr) 
         {
             label_ = new UILabelExt();
+            if(label_ == nullptr)    
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "label_ new fail");
+            }
         }
-        label_->SetPosition(60, 281);
-        label_->Resize(345, 101);
+        label_->SetPosition(60, 281);         
+        label_->Resize(345, 101);          
         label_->SetViewId("label2");
         label_->SetStyle(STYLE_TEXT_FONT, 30);
-
-        // Set additional property
-        label_->SetText("星历下载成功,请稍等...");
+        if(ConfigModel::GetInstance()->GetLanguage() == 0)
+            label_->SetText("优化成功,请稍等...");
+        else
+            label_->SetText("Opt Success, Please wait...");
         label_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);
         label_->SetTextColor(Color::GetColorFromRGBA(0xAA, 0xAA, 0xAA, 0xff));
         label_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
         label_->SetRollSpeed(0);
         label_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
-
+        UIViewGroup_transmitting->Add(label_);
+        label_->SetVisible(true);
+        /* -------------------------------------------------------------------------- */
         if (transmitting_img == nullptr)
         {
             transmitting_img = new UIImageView();
+            if(transmitting_img == nullptr)    
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "transmitting_img new fail");
+            }
         }
-        transmitting_img->SetPosition(193, 150, 80, 80);
+        transmitting_img->SetPosition(193, 150,80, 80);
         const char *imagesPath = TRANSMITTING_SUCC_PATH;
         transmitting_img->SetSrc(imagesPath);
         UIViewGroup_transmitting->Add(transmitting_img);
-
         uint32_t tick;
         osStatus_t retTimer;
-        if (transmitting_timer != NULL)
+        if(transmitting_timer!=NULL)
         {
             osTimerStop(transmitting_timer);
             osTimerDelete(transmitting_timer);
             transmitting_timer = NULL;
+            epo_timer_falg=20;
         }
-        transmitting_timer = osTimerNew((osTimerFunc_t)dialtimerCallBack, osTimerPeriodic, NULL, NULL);
-        tick = 3000; // osMs2Tick(1000);
+        transmitting_timer = osTimerNew((osTimerFunc_t)epo_timerCallBack, osTimerPeriodic, NULL, NULL);
+        tick =1000;// osMs2Tick(1000);
         retTimer = osTimerStart(transmitting_timer, tick);
-        if (retTimer != osOK && transmitting_timer != NULL)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StartCallTimer osTimerStart failed, ret = %lx!!", retTimer);
+        if (retTimer != osOK && transmitting_timer != NULL) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"StartCallTimer osTimerStart failed, ret = %lx!!", retTimer);
             osTimerDelete(transmitting_timer);
             transmitting_timer = NULL;
-            return;
+            return ;
         }
-
-        // Add to rootView
-        UIViewGroup_transmitting->Add(label_);
-        label_->SetVisible(true);
     }
 
     void creat_down_EPO_fail()
     {
-        printf("creat_down_EPO_fail\n");
-        if (Title == nullptr)
+        if (Title == nullptr) 
         {
             Title = new UILabelExt();
+            if(Title == nullptr)    
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Title new fail");
+            }
         }
-        Title->SetPosition(173, 51);
-        Title->Resize(800, 88);
-        Title->SetViewId("label1");
+        Title->SetPosition(173, 51);         
+        Title->Resize(800, 88);          
         Title->SetStyle(STYLE_TEXT_FONT, 30);
-
-        // Set additional property
-        Title->SetText("星历下载失败");
+        if(ConfigModel::GetInstance()->GetLanguage() == 0)
+            Title->SetText("优化失败");
+        else
+            Title->SetText("Opt Failed");
         Title->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);
         Title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
         Title->SetRollSpeed(0);
         Title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
         Title->SetX((466 - Title->GetWidth()) / 2);
-
-        // Add to rootView
         UIViewGroup_transmitting->Add(Title);
         Title->SetVisible(true);
-
-        if (label_ == nullptr)
+        /* -------------------------------------------------------------------------- */
+        if (label_ == nullptr) 
         {
             label_ = new UILabelExt();
+            if(label_ == nullptr)    
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "label_ new fail");
+            }
         }
-        label_->SetPosition(60, 281);
-        label_->Resize(345, 101);
+        label_->SetPosition(60, 281);         
+        label_->Resize(345, 101);          
         label_->SetStyle(STYLE_TEXT_FONT, 30);
-        Title->SetText("星历下载失败,请重新下载");
-
+        if(ConfigModel::GetInstance()->GetLanguage() == 0)
+            label_->SetText("优化失败,请重试");
+        else
+            label_->SetText("Opt Failed, Please try again");
+        label_->SetX((466 - label_->GetWidth()) / 2);
         label_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);
         label_->SetTextColor(Color::GetColorFromRGBA(0xAA, 0xAA, 0xAA, 0xff));
         label_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
         label_->SetRollSpeed(0);
         label_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
-
         UIViewGroup_transmitting->Add(label_);
         label_->SetVisible(true);
     }
 
     bool transmittingISShow(void)
     {
-        if (uapi_dev_runtime_get_transmitting_status())
-            return true;
-        else
-            return false;
+       if(uapi_dev_runtime_get_transmitting_status())
+       return true;
+       else
+       return false;
     }
 
     UIViewGroup *transmittingShow()
     {
-
-        if (UIViewGroup_transmitting == nullptr)
-        {
+    
+        if (UIViewGroup_transmitting == nullptr) {
             UIViewGroup_transmitting = new UIViewGroup();
+            if(UIViewGroup_transmitting == nullptr)    
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UIViewGroup_transmitting new fail");
+            }
             UIViewGroup_transmitting->SetPosition(0, 0, 466, 466);
-            // UIViewGroup_transmitting->SetStyle(STYLE_BACKGROUND_OPA, 0);
         }
         else
         {
             UIViewGroup_transmitting->RemoveAll();
         }
         uapi_dev_runtime_set_transmitting_status(1);
-        printf("Transmitting_falg:%d", Transmitting_falg);
-#ifdef SUPPORT_BLE_SERVICE
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Transmitting_falg:%d",Transmitting_falg);
+        #ifdef SUPPORT_BLE_SERVICE
         switch (Transmitting_falg)
         {
-        case TRANS_DIAL_TRANSMITTING:
-            creat_down_Dial();
-            break;
-        case TRANS_DIAL_SUCC:
-            creat_down_Dial_succ();
-            break;
-        case TRANS_DIAL_FAIL:
-            creat_down_Dial_fail();
-            break;
-        case TRANS_DIAL_MAX_FAIL:
-            creat_down_max_Dial_fail();
-            break;
-
-        case TRANS_OTA_TRANSMITTING:
-            creat_down_OTA();
-            break;
-        case TRANS_OTA_SUCC:
-            creat_down_OTA_SUCC();
-            break;
-        case TRANS_OTA_FAIL:
-            creat_down_OTA_FAIL();
-            break;
-        case TRANS_MP3_TRANSMITTING:
-            creat_down_MP3();
-            break;
-        case TRANS_MP3_SUCC:
-            creat_down_MP3_succ();
-            break;
-        case TRANS_MP3_FAIL:
-            creat_down_MP3_fail();
-            break;
-        case OTA_UPDATA_FAIL:
-            Creat_OTA_Updata_FAIL();
-            break;
-        case START_CAT1_OTA:
-            Creat_CAT1_OTA_Updata();
-            break;
-        case TRANS_MP3_MAX_FAIL:
-            creat_down_max_MP3_fail();
-            break;
-        case TRANS_BIN_TRANSMITTING:
-            creat_down_BIN();
-            break;
-        case TRANS_BIN_SUCC:
-            creat_down_BIN_succ();
-            break;
-        case TRANS_BIN_FAIL:
-            creat_down_BIN_fail();
-            break;
-        case TRANS_EPO_TRANSMITTING:
-            creat_down_EPO();
-            break;
-        case TRANS_EPO_SUCC:
-            creat_down_EPO_succ();
-            break;
-        case TRANS_EPO_FAIL:
-            creat_down_EPO_fail();
-            break;
-
+            case TRANS_DIAL_TRANSMITTING:
+                creat_down_Dial();
+                break;
+            case TRANS_DIAL_SUCC:
+                creat_down_Dial_succ();
+                break;
+            case TRANS_DIAL_FAIL:
+                creat_down_Dial_fail();
+                break;
+            case TRANS_DIAL_MAX_FAIL:
+                creat_down_max_Dial_fail();
+                break;
+            
+            case TRANS_OTA_TRANSMITTING:
+                creat_down_OTA();
+                break;
+             case TRANS_OTA_SUCC:
+                creat_down_OTA_SUCC();
+                break;
+             case TRANS_OTA_FAIL:
+                creat_down_OTA_FAIL();
+                break;
+            case TRANS_MP3_TRANSMITTING:
+                creat_down_MP3();
+                break;
+             case TRANS_MP3_SUCC:
+                creat_down_MP3_succ();
+                break;
+             case TRANS_MP3_FAIL:
+                creat_down_MP3_fail();
+                break;
+             case OTA_UPDATA_FAIL:
+                Creat_OTA_Updata_FAIL();
+                break;
+            case START_CAT1_OTA:
+                Creat_CAT1_OTA_Updata();
+                break;
+            case TRANS_MP3_MAX_FAIL:
+                creat_down_max_MP3_fail();
+                break;
+            case TRANS_BIN_TRANSMITTING:
+                creat_down_BIN();
+                break;
+            case TRANS_BIN_SUCC:
+                creat_down_BIN_succ();
+                break;
+             case TRANS_BIN_FAIL:
+                 creat_down_BIN_fail();
+                break;
+            case TRANS_EPO_TRANSMITTING:
+                creat_down_EPO();
+                break;
+             case TRANS_EPO_SUCC:
+                creat_down_EPO_succ();
+                break;
+             case TRANS_EPO_FAIL:
+                creat_down_EPO_fail();
+                break;
+            
         default:
             break;
         }
-        if (Transmitting_falg == TRANS_DIAL_TRANSMITTING || Transmitting_falg == TRANS_OTA_TRANSMITTING || Transmitting_falg == TRANS_MP3_TRANSMITTING)
+        if(Transmitting_falg==TRANS_DIAL_TRANSMITTING || Transmitting_falg==TRANS_OTA_TRANSMITTING || Transmitting_falg==TRANS_MP3_TRANSMITTING)
         {
             // if(uapi_hfp_connect_state())
             // {
             //     uapi_hfp_disconnect();
             // }
         }
-        else if (Transmitting_falg != OTA_UPDATA_FAIL)
+        else if(Transmitting_falg!=OTA_UPDATA_FAIL)
         {
             // if(uapi_dev_runtime_get_bt_powerstat() &&  cm_get_HFP_switch())
             // {
             //     uapi_hfp_connect();
             // }
+        
         }
-#endif
+        #endif
 
         UIView::OnClickListener *button1Click = static_cast<UIView::OnClickListener *>(transmittingViewEventListener::GetInstance());
         UIViewGroup_transmitting->SetOnClickListener(button1Click);
@@ -1491,14 +1542,15 @@ namespace OHOS
 
         const power_display_svr_api_t *display_api = power_display_svr_get_api();
         if (display_api->get_screen_state() != SCREEN_ON)
-        {
-            display_api->turn_on_screen();
-        }
+        {   
+               display_api->turn_on_screen();  
+        }  
         display_api->set_auto_timeout_function(false);
 #ifdef SUPPORT_CYWEE_SERVICE
         cywee_hand_wake_switch(0); // 关闭抬腕亮屏,和息屏
 #endif
 
+       
         NotificationManager::GetInstance()->RegisterNotifyCleanupFunction(Freetransmitting);
         return UIViewGroup_transmitting;
     }
@@ -1519,15 +1571,21 @@ namespace OHOS
         return &lowppowrViewEventListene_t;
     }
 
-    bool transmittingViewEventListener::OnClick(UIView &view, const ClickEvent &event)
+
+    bool transmittingViewEventListener::OnClick(UIView& view, const ClickEvent& event)
     {
-#ifdef SUPPORT_BLE_SERVICE
+        #ifdef SUPPORT_BLE_SERVICE
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OnClick");
-        if (Transmitting_falg != TRANS_DIAL_TRANSMITTING && Transmitting_falg != TRANS_OTA_TRANSMITTING && Transmitting_falg != TRANS_MP3_TRANSMITTING && Transmitting_falg != START_CAT1_OTA && Transmitting_falg != TRANS_BIN_TRANSMITTING && Transmitting_falg != TRANS_EPO_TRANSMITTING)
+        if(Transmitting_falg!=TRANS_DIAL_TRANSMITTING
+        && Transmitting_falg!=TRANS_OTA_TRANSMITTING 
+        && Transmitting_falg!=TRANS_MP3_TRANSMITTING 
+        && Transmitting_falg!=START_CAT1_OTA
+        && Transmitting_falg!=TRANS_BIN_TRANSMITTING
+        && Transmitting_falg!=TRANS_EPO_TRANSMITTING)
         {
             NotificationManager::GetInstance()->StopNotify();
         }
-#endif
+        #endif
         return true;
         UNUSED(event);
     }
index 0d66ea6..59ba73d 100644 (file)
@@ -445,15 +445,16 @@ bool InitImageView(UIImageView *&imageView, int left, int top, int width,
   imageView->SetPosition(left, top);
   imageView->SetAutoEnable(true);
   imageView->SetViewId(viewId);
+  imageView->SetSrc(imagePath);
 
-  ImageInfo *image =
-      ImageCacheManager::GetInstance().LoadSingleRes(imagePath, false);
-  if (image == nullptr) {
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
-                  "LoadAllDialFromRam loadimage %s fail", imagePath);
-    return false;
-  }
-  imageView->SetSrc(image);
+  // ImageInfo *image =
+  //     ImageCacheManager::GetInstance().LoadSingleRes(imagePath, false);
+  // if (image == nullptr) {
+  //   WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+  //                 "LoadAllDialFromRam loadimage %s fail", imagePath);
+  //   return false;
+  // }
+  // imageView->SetSrc(image);
   return true;
 }
 /*带默认参数的初始化label*/
@@ -873,3 +874,4 @@ bool IsFileAccessibleAndNotEmpty(const std::string &filePath) {
 }
 
 } // namespace OHOS
+
index fb2a9de..1f042cf 100644 (file)
@@ -52,6 +52,7 @@ extern "C" {
 
 #include "custom_utils.h"
 #include "custom_runtime.h"
+#include "gnss_http_server.h"
 #include "bleANCS.h"
 #ifdef CUSTOM_ZHIHUI
 #include "Bluetooyhpabpserver.h"
@@ -183,7 +184,6 @@ static void *ym_malloc(unsigned int size)
 static void  ym_free(void * p)
 {
     free(p);
-    p = NULL;
 }
 void malloc_test(void)
 {
@@ -2582,90 +2582,192 @@ void SetsleepSetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalD
     }
 }
 
-void SetDrinkSetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//设置喝水提醒s设置
+// 设置喝水提醒参数指令处理函数
+void SetDrinkSetParamCmd(uint16_t cmd, uint8_t *data, uint16_t len, uint8_t *totalData, uint8_t crcvalue)
 {
+    // ===== 1. 初始化变量,打印入参(关键:确认接收的基础信息)=====
     uint32_t tmp = 1;
     uint16_t tmp_data = 1;
     uint8_t sendBuf[19];
-    memset(sendBuf,0,19);
+    memset(sendBuf, 0, 19);
+    
+    // 打印函数入参,确认指令/数据/长度/CRC是否正确
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"进入喝水提醒设置函数:cmd=0x%04X, 数据长度len=%d, 校验CRC值=0x%02X", cmd, len, crcvalue);
+    
+    if (data != NULL && len > 0) {
+        // 打印接收的原始数据(前9字节,覆盖所有解析字段)
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"接收的原始参数data(前9字节):");
+        for (uint16_t i = 0; i < (len > 9 ? 9 : len); i++) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"data[%d] = 0x%02X", i, data[i]);
+        }
+    } else {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"接收的data为空或长度为0!");
+    }
+
+    // ===== 2. 构建响应帧基础数据 =====
     sendBuf[0] = 0x72;
     sendBuf[1] = 0x02;
     sendBuf[2] = 0x14;
-    memcpy(sendBuf+3,&tmp,4);
-    memcpy(sendBuf+7,&tmp,4);
-    memcpy(sendBuf+11,&tmp,4);
-    memcpy(sendBuf+15,&tmp_data,2);
-
-       if(Check_CRC(data,len,crcvalue))
-       {
-        msg_drink_info_t drink_info={0};
+    memcpy(sendBuf+3, &tmp, 4);    // 固定填充4字节tmp(值为1)
+    memcpy(sendBuf+7, &tmp, 4);    // 固定填充4字节tmp
+    memcpy(sendBuf+11, &tmp, 4);   // 固定填充4字节tmp
+    memcpy(sendBuf+15, &tmp_data, 2);  // 固定填充2字节tmp_data(值为1)
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"响应帧基础数据初始化完成,前17字节:0x%02X 0x%02X 0x%02X ...", sendBuf[0], sendBuf[1], sendBuf[2]);
+
+    // ===== 3. CRC校验(核心:确认数据完整性)=====
+    uint8_t crc_result = Check_CRC(data, len, crcvalue);
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"CRC校验结果:%s(%d)", crc_result ? "成功" : "失败", crc_result);
+    
+    if (crc_result) {
+        // ===== 4. CRC校验通过,解析参数(关键:确认参数解析是否正确)=====
+        msg_drink_info_t drink_info = {0};
         drink_info.drink_on = data[0];
-        if(data[1])
-        {
-            drink_info.drink_on=2;
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"初始解析drink_on = %d", drink_info.drink_on);
+
+        // 扩展开关处理:data[1]非0时,drink_on强制设为2
+        if (data[1]) {
+            drink_info.drink_on = 2;
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"data[1]=%d非0,drink_on强制设为2", data[1]);
         }
-        // drink_info.drink_on = data[1];
-         drink_info.goal = data[2]+data[3]*256;
-         drink_info.time_start = data[4]<<16|data[5];
-        if(data[1])
-        {
-            drink_info.time_end = data[6]<<16|data[7];
+
+        // 解析每日饮水目标(16位:data[2]低8位 + data[3]高8位)
+        drink_info.goal = data[2] + data[3] * 256;
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"解析每日饮水目标goal = %d ml", drink_info.goal);
+
+        // 【修复潜在问题】解析开始时间(原代码错误,改为HHMM格式:data[4]=小时,data[5]=分钟)
+        // 原代码:drink_info.time_start = data[4]<<16|data[5]; (错误,8位左移16位丢失)
+        drink_info.time_start = data[4]<<16|data[5]; //前16位为小时,后16位为分钟
+        // 解析结束时间和频率(仅当data[1]非0时)
+        if (data[1]) {
+            drink_info.time_end = data[6]<<16|data[7];  // 比如data[6]=12, data[7]=30 → 1230(12点30分)
             drink_info.freq = data[8];
-           
+        } else {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"data[1]=0,不解析结束时间和频率");
         }
+
+        // ===== 5. 调用蓝牙接口设置提醒,打印设置结果 =====
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"调用蓝牙接口设置喝水提醒:drink_on=%d, goal=%dml, start=%04d, end=%04d, freq=%d",
+                   drink_info.drink_on, drink_info.goal, drink_info.time_start, drink_info.time_end, drink_info.freq);
         ble_set_drink_remind(drink_info);
-        
-        sendBuf[17] = 1;
-        sendBuf[18] = Calculate_CRC(sendBuf,18);
-        sendBleData(sendBuf,19);
-    }
-       else
-       {
-               sendBuf[17] = 0;
-        sendBuf[18] = Calculate_CRC(sendBuf,18);
-        sendBleData(sendBuf,19);
+
+        // ===== 6. 构建成功响应并发送 =====
+        sendBuf[17] = 1;  // 1=设置成功
+        sendBuf[18] = Calculate_CRC(sendBuf, 18);
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"设置成功,构建响应帧:状态位=1,响应CRC=0x%02X", sendBuf[18]);
+        sendBleData(sendBuf, 19);
+    } else {
+        // ===== 7. CRC校验失败,构建失败响应并发送 =====
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"CRC校验失败,返回失败响应");
+        sendBuf[17] = 0;  // 0=设置失败
+        sendBuf[18] = Calculate_CRC(sendBuf, 18);
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"构建失败响应帧:状态位=0,响应CRC=0x%02X", sendBuf[18]);
+        sendBleData(sendBuf, 19);
     }
-    
+
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"喝水提醒设置函数执行完毕");
 }
 
-void SetsedentarinessSetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//设置久坐设置
+// 设置久坐设置
+// 设置久坐提醒参数指令处理函数
+void SetsedentarinessSetParamCmd(uint16_t cmd, uint8_t *data, uint16_t len, uint8_t *totalData, uint8_t crcvalue)
 {
+    // ===== 1. 初始化变量,打印入参(确认接收的基础信息)=====
     uint32_t tmp = 1;
     uint16_t tmp_data = 1;
     uint8_t sendBuf[19];
-    memset(sendBuf,0,19);
+    memset(sendBuf, 0, 19);
+    
+    // 打印函数入参,确认指令、数据长度、CRC校验值是否正确
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"进入久坐提醒设置函数:cmd=0x%04X, 数据长度len=%d, 校验CRC值=0x%02X", cmd, len, crcvalue);
+    
+    // 打印接收的原始数据(前6字节,覆盖所有解析字段)
+    if (data != NULL && len > 0) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"接收的原始参数data(前6字节):");
+        for (uint16_t i = 0; i < (len > 6 ? 6 : len); i++) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"data[%d] = 0x%02X", i, data[i]);
+        }
+    } else {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"接收的data为空或长度为0!");
+    }
+
+    // ===== 2. 构建响应帧基础数据 =====
     sendBuf[0] = 0x72;
     sendBuf[1] = 0x02;
     sendBuf[2] = 0x1D;
-    memcpy(sendBuf+3,&tmp,4);
-    memcpy(sendBuf+7,&tmp,4);
-    memcpy(sendBuf+11,&tmp,4);
-    memcpy(sendBuf+15,&tmp_data,2);
+    memcpy(sendBuf+3, &tmp, 4);    // 固定填充4字节tmp(值为1)
+    memcpy(sendBuf+7, &tmp, 4);    // 固定填充4字节tmp
+    memcpy(sendBuf+11, &tmp, 4);   // 固定填充4字节tmp
+    memcpy(sendBuf+15, &tmp_data, 2);  // 固定填充2字节tmp_data(值为1)
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"响应帧基础数据初始化完成,帧头:0x%02X 0x%02X 0x%02X", sendBuf[0], sendBuf[1], sendBuf[2]);
+
+    // ===== 3. CRC校验(核心:确认数据完整性)=====
+    uint8_t crc_result = Check_CRC(data, len, crcvalue);
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"CRC校验结果:%s(%d)", crc_result ? "成功" : "失败", crc_result);
+    
+    if (crc_result) {
+        // ===== 4. CRC校验通过,解析参数(关键:确认参数解析是否正确)=====
+        msg_sedent_set_param_info_t sedent_data = {0};
+        
+        // 校验数据长度,避免数组越界
+        if (len < 1) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"数据长度不足,无法解析久坐开关(至少需要1字节)");
+            sendBuf[17] = 0;
+            sendBuf[18] = Calculate_CRC(sendBuf, 18);
+            sendBleData(sendBuf, 19);
+            return;
+        }
 
-       if(Check_CRC(data,len,crcvalue))
-       {
-        msg_sedent_set_param_info_t sedent_data={0};
-        sedent_data.sedent_on=data[0];
+        // 解析久坐提醒开关
+        sedent_data.sedent_on = data[0];
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"解析久坐提醒开关sedent_on = %d(0=关闭,1=开启)", sedent_data.sedent_on);
 
-        memcpy_s( &sedent_data.sedent_time,4,&data[1],4);
-       
+        // 解析久坐时长(4字节):先判断长度,再拷贝
+        if (len >= 5) {  // data[1]-data[4] 需要至少5字节数据(索引0-4)
+            memcpy_s(&sedent_data.sedent_time, sizeof(sedent_data.sedent_time), &data[1], 4);
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"解析久坐时长sedent_time = %u 小时", sedent_data.sedent_time);
+        } else {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"数据长度不足(仅%d字节),无法解析久坐时长(需要5字节)", len);
+            sendBuf[17] = 0;
+            sendBuf[18] = Calculate_CRC(sendBuf, 18);
+            sendBleData(sendBuf, 19);
+            return;
+        }
 
-        sedent_data.frequenc = data[5];
+        // 解析提醒频率:判断长度,避免访问data[5]越界
+        if (len >= 6) {
+            sedent_data.frequenc = data[5];
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"解析提醒频率frequenc = %d h/次", sedent_data.frequenc);
+        } else {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"数据长度不足(仅%d字节),无法解析提醒频率(需要6字节)", len);
+            sendBuf[17] = 0;
+            sendBuf[18] = Calculate_CRC(sendBuf, 18);
+            sendBleData(sendBuf, 19);
+            return;
+        }
 
+        // ===== 5. 调用底层接口设置久坐提醒,打印参数 =====
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"调用底层接口设置久坐提醒:开关=%d, 久坐时长=%u分钟, 提醒频率=%d小时/次",
+                   sedent_data.sedent_on, sedent_data.sedent_time, sedent_data.frequenc);
         set_sedent_param(&sedent_data);
 
-        sendBuf[17] = 1;
-        sendBuf[18] = Calculate_CRC(sendBuf,18);
-        sendBleData(sendBuf,19);
-    }
-       else
-       {
-               sendBuf[17] = 0;
-        sendBuf[18] = Calculate_CRC(sendBuf,18);
-        sendBleData(sendBuf,19);
+        // ===== 6. 构建成功响应并发送 =====
+        sendBuf[17] = 1;  // 1=设置成功
+        sendBuf[18] = Calculate_CRC(sendBuf, 18);
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"久坐提醒设置成功,响应状态位=1,响应CRC=0x%02X", sendBuf[18]);
+        sendBleData(sendBuf, 19);
+    } else {
+        // ===== 7. CRC校验失败,构建失败响应并发送 =====
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"CRC校验失败,返回失败响应");
+        sendBuf[17] = 0;  // 0=设置失败
+        sendBuf[18] = Calculate_CRC(sendBuf, 18);
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"构建失败响应帧:状态位=0,响应CRC=0x%02X", sendBuf[18]);
+        sendBleData(sendBuf, 19);
     }
+
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"久坐提醒设置函数执行完毕");
 }
 
+
 void SetmsgfiltrationCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//设置久坐设置
 {
     uint32_t tmp = 1;
@@ -4208,7 +4310,7 @@ void SetUserInfo(ble_read_data *buffer_handle,uint16_t cmd,uint8_t *data,uint16_
         msg_userinfo.calorie=p_userinfo->calorie;
         msg_userinfo.distance=p_userinfo->distance;
 
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"getUserInfo:!!age %d, fat %d, sex %d, height %d, stand %d, step %d , timeformat %d , weight %d !!!!!!\r\n",
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"getUserInfo:!!age %d, fat %d, sex %d, height %d, stand %d, step %d , timeformat %d , weight %d !!!!!!\r\n",
         p_userinfo->age,
         p_userinfo->fat_time,
         p_userinfo->gender,
@@ -4521,24 +4623,46 @@ static void switchDialCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *total
 //关于本机内容
 static void aboutDeviceCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
 {
+    // 1. 入口日志:记录请求基本信息
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[AboutDevice] 进入接口,cmd:%d, data_len:%d, crcvalue:0x%02X", cmd, len, crcvalue);
 
     uint8_t _major,_mid,_minor;
-    uapi_get_fw_version(&_major,&_mid,&_minor);
+    // 2. 获取固件版本日志
+    int fw_ret = uapi_get_fw_version(&_major,&_mid,&_minor);
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AboutDevice] 获取固件版本:ret:%d, major:%d, mid:%d, minor:%d", fw_ret, _major, _mid, _minor);
+
     cJSON *dataJSON = cJSON_CreateObject();
+    if (dataJSON == NULL) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AboutDevice] JSON 对象创建失败!");
+        return;
+    }
     cJSON_AddNumberToObject(dataJSON,"code",1);
     cJSON_AddNumberToObject(dataJSON,"major",_major);
     cJSON_AddNumberToObject(dataJSON,"mid",_mid);
     cJSON_AddNumberToObject(dataJSON,"minor",_minor);
-    unsigned char addr[6];
-    bluetooth_get_local_addr(&addr[0],6);
-    char mac_data[24];
+
+    // 3. 获取MAC地址日志
+    unsigned char addr[6] = {0};
+    int bt_ret = bluetooth_get_local_addr(&addr[0],6);
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AboutDevice] 获取蓝牙MAC地址:ret:%d, addr:[%02X:%02X:%02X:%02X:%02X:%02X]", 
+                   bt_ret, addr[5],addr[4],addr[3],addr[2],addr[1],addr[0]);
+    
+    char mac_data[24] = {0};
     memset(mac_data,0,24);
     sprintf(mac_data,"%02X:%02X:%02X:%02X:%02X:%02X",addr[5],addr[4],addr[3],addr[2],addr[1],addr[0]);
     cJSON_AddStringToObject(dataJSON, "macAddress",mac_data);
 
+    // 4. JSON 序列化日志
     char *json_format = cJSON_PrintUnformatted(dataJSON);
     cJSON_Delete(dataJSON);
+    if (json_format == NULL) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AboutDevice] JSON 序列化失败!");
+        return;
+    }
     uint32_t data_len = strlen(json_format);
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[AboutDevice] JSON 序列化完成:len:%d, content:%s", data_len, json_format);
+
+    // 5. 构建发送数据缓冲区日志
     uint8_t value[data_len+19];
     memset(value,0,data_len+19);
     uint32_t tmp = 1;
@@ -4550,22 +4674,34 @@ static void aboutDeviceCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *tota
     memcpy(value+7,&data_len,4);
     memcpy(value+11,&tmp,4);
     memcpy(value+15,&tmp_data,2);
-    if(Check_CRC(data,len,crcvalue))
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[AboutDevice] 构建发送缓冲区:总长度:%d, 头部[0-16]: 0x%02X 0x%02X 0x%02X ...", 
+                   data_len+19, value[0], value[1], value[2]);
+
+    // 6. CRC 校验日志
+    int crc_check = Check_CRC(data,len,crcvalue);
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[AboutDevice] CRC 校验结果:%d (1=成功,0=失败)", crc_check);
+
+    if(crc_check)
     {
-        memcpy(value+17,(uint8_t *)json_format,data_len);//17+69 = 86
-        
-        value[data_len+17] = Calculate_CRC(value,data_len+17);//
-        //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"data_len:%d %x %d!!!!!\r\n",data_len,value[data_len+17],data_len+17);
+        memcpy(value+17,(uint8_t *)json_format,data_len);
+        value[data_len+17] = Calculate_CRC(value,data_len+17);
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[AboutDevice] 准备发送有效数据:长度:%d, CRC值:0x%02X", 
+                       data_len+18, value[data_len+17]);
         sendBleData(value,data_len+18);
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[AboutDevice] 有效数据已调用 sendBleData 发送");
     }else
     {
         value[17] = 0;
         uint8_t lrc = Calculate_CRC(value,18);
         value[18] = lrc;
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[AboutDevice] 准备发送错误数据:长度:19, CRC值:0x%02X", lrc);
         sendBleData(value,19);
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[AboutDevice] 错误数据已调用 sendBleData 发送");
     }
     
+    // 7. 释放资源日志
     cJSON_free(json_format);
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[AboutDevice] 接口执行完成,资源已释放");
 }
 //查找手表 01 04
 //设置查找手表的状态,1 校验成 2手表已找到,停止查找手表
@@ -5308,16 +5444,50 @@ static void GetWatchStatusCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *t
     memcpy(value+11,&tmp,4);
     memcpy(value+15,&tmp_data,2);
 
-    //0空闲状态 9 usb状态 10 运动训练状态
-     uint8_t watchStatus = 0;
-     
-    if(uapi_dev_runtime_get_train_status())
-    watchStatus=10;
-   
+    /* 0=空闲 9=星历未解压或过期(非运动时上报,app 可发起星历更新) 10=运动训练 */
+    uint8_t watchStatus = 0;
+    if (uapi_dev_runtime_get_train_status() != 0) {
+        watchStatus = 10;
+    }
+    // } else {
+    //     /* 获取状态前先刷新星历检查结果,以便 runtime 中的星历过期状态是最新的 */
+    //     (void)gnss_check_agnss_status();
+    //     if (uapi_dev_runtime_get_epo_file_extracted_status() == 0 ||
+    //         uapi_dev_runtime_get_ephemeris_expired_status() != 0) {
+    //         /* 星历未解压或星历过期,非运动状态下上报 9,app 获取后可发起星历更新 */
+    //         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"GetWatchStatusCmd 星历未解压或星历过期\r\n");
+    //         watchStatus = 9;
+    //     }
+    // }
     value[17] = watchStatus;
     value[18] = Calculate_CRC(value,18);
     sendBleData(value,19);
 }
+
+/** 获取星历有效剩余秒数(协议 01.18):格式与 01.1A 一致,包头 + 数据包(4B 剩余时间 单位s) + CRC */
+static void GetEphemerisValidSecCmd(uint16_t cmd, uint8_t *data, uint16_t len, uint8_t *totaldata, uint8_t crcvalue)
+{
+    uint8_t value[22];
+    memset(value, 0, sizeof(value));
+    value[0] = 0x72;   /* 传输方向:手表发 */
+    value[1] = 0x01;   /* 指令 类型 */
+    value[2] = 0x18;   /* 指令 ID (01.18) */
+    uint32_t tmp = 1;
+    uint32_t datalen = 4;   /* 数据总长度:4 字节(剩余时间 单位s) */
+    uint16_t tmp_data = 4;  /* 分包数据长度:4 字节 */
+    memcpy(value + 3, &tmp, 4);       /* 数据包总数 */
+    memcpy(value + 7, &datalen, 4);   /* 数据总长度 */
+    memcpy(value + 11, &tmp, 4);      /* 分包索引 */
+    memcpy(value + 15, &tmp_data, 2); /* 分包数据长度 */
+
+    int remaining_minutes = gnss_check_agnss_status();
+    uint32_t valid_sec = (remaining_minutes > 0) ? (uint32_t)(remaining_minutes * 60) : 0;
+    memcpy(value + 17, &valid_sec, 4); /* 数据包:剩余时间 单位s,小端 */
+
+    value[21] = Calculate_CRC(value, 21);
+    sendBleData(value, 22);
+}
+
 //获取手表屏幕参数
 static void GetScreenParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
 {
@@ -5856,11 +6026,11 @@ static void GetAllDialUidCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *to
 
         if(dial_num *2 !=get_all_dial_id(dail_uid_buf+1,dial_num*2))
         {
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GetAllDialUidCmd  dial_num %d err\r\n",dial_num);
+              WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetAllDialUidCmd  dial_num %d err\r\n",dial_num);
         }
         else
         {
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GetAllDialUidCmd yes\r\n");
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetAllDialUidCmd yes\r\n");
 
         }
         ble_data_type type_={0x01,0x2a,temp_data_size,1,1};
@@ -6489,6 +6659,9 @@ void type2AE3Data(ble_read_data *buffer_handle,uint8_t *cmd_buf ,uint8_t *data,u
         case SEND_CURR_STATUS_CMD: //获取手表当前状态
             GetWatchStatusCmd(cmd,data,datalen,totaldata,crcvalue);
             break;
+        case GET_EPHEMERIS_VALID_SEC_CMD: //获取星历有效剩余秒数
+            GetEphemerisValidSecCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
         case GET_WATCH_LCD_PARAM_CMD: //获取手表屏幕参数
             GetScreenParamCmd(cmd,data,datalen,totaldata,crcvalue);
             break;
@@ -6562,8 +6735,14 @@ void type2AE3Data(ble_read_data *buffer_handle,uint8_t *cmd_buf ,uint8_t *data,u
         case SYN_APP_GET_GPS_DATA_CMD://app获取GPS数据
             GetGPSCmd(cmd,data,datalen,totaldata,crcvalue);
             break;
+        case SYN_TRAIN_SPEED_CMD://同步训练配速数据
+            SYN_train_speed_datatCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        case SYN_BASIC_REAL_HEATR_CMD://同步训练心率数据
+            SYN_train_heart_datatCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
         
-        case GET_SPECIF_TYPE_FILE_CMD://获取指定类型文件目录 
+        case GET_SPECIF_TYPE_FILE_CMD://获取指定类型文件目录  
         case AI_IS_READ_DATA_CMD:
         case SYN_HEART_HISTORY_DATA_CMD://同步心率历史数据
         case SYN_SPO2_HISTORY_DATA_CMD://同步血氧历史数据
@@ -6628,6 +6807,7 @@ void typeHexFiveData(uint8_t *buf_cmd,uint8_t *data,uint16_t datalen)
 void ble_request_epo_file(void)
 {
     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ble_request_epo_file");
+    removeFilesInFolder(GNSS_DATA_DIR);
     uint8_t value[19] = {0};
     uint32_t tmp = 1;
     uint16_t tmp_data = 1;
@@ -7232,6 +7412,8 @@ static errcode_t handle_epo_file_decompress(ble_read_data *buffer_handle)
     if (extract_ret == ERRCODE_SUCC)
     {
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[handle_epo_file_decompress] EPO lzma file extracted successfully\n");
+        // 设置EPO文件解压状态为成功
+        uapi_dev_runtime_set_epo_file_extracted_status(1);
         // 解压成功后删除lzma文件
         remove(lzma_file_path);
         return ERRCODE_SUCC;
@@ -7239,6 +7421,8 @@ static errcode_t handle_epo_file_decompress(ble_read_data *buffer_handle)
     else
     {
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[handle_epo_file_decompress] Failed to extract EPO lzma file, ret=0x%X\n", extract_ret);
+        // 设置EPO文件解压状态为失败
+        uapi_dev_runtime_set_epo_file_extracted_status(0);
         return ERRCODE_FAIL;
     }
 }
@@ -7569,7 +7753,7 @@ static void  ble_transfer_Timer_CallBack(int data)
         cancel_recv_file(1);
     }
 }
-uint8_t OTA_FILE_value=0;
+uint32_t OTA_FILE_value=0;
 
 errcode_t decode_ota_data(ble_read_data *buffer_handle,uint8_t *data,uint16_t datalen,uint8_t crcvalue)
 {
@@ -7761,8 +7945,9 @@ errcode_t decode_ota_data(ble_read_data *buffer_handle,uint8_t *data,uint16_t da
                 buffer_handle->file_recv_stat.lrcvalue = calculate_lrc(data_,datalen,buffer_handle->file_recv_stat.lrcvalue);
                         buffer_handle->file_recv_stat.received_size += datalen;
                 OTA_FILE_value= ((float) buffer_handle->file_recv_stat.received_size / (float)buffer_handle->file_recv_stat.file_size) *100;
-                  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"handle_recv_file received_size %d %0.3lf\n",buffer_handle->file_recv_stat.received_size
-                  ,(float) buffer_handle->file_recv_stat.received_size / (float)buffer_handle->file_recv_stat.file_size);
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"handle_recv_file received_size %d %0.3lf\n",buffer_handle->file_recv_stat.received_size
+                ,(float) buffer_handle->file_recv_stat.received_size / (float)buffer_handle->file_recv_stat.file_size);
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"OTA_FILE_value %d \n",OTA_FILE_value);
 
             }else{
                   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file write file failed! ret %d != %d\n",writtensize,datalen);
@@ -9335,7 +9520,7 @@ errcode_t cancel_recv_file(uint8_t flag)
     return ERRCODE_SUCC;
 }
 
-uint8_t get_OTA_recv_value()
+uint32_t get_OTA_recv_value()
 {
     return OTA_FILE_value;
 }
index 520de68..aa279b5 100644 (file)
@@ -66,6 +66,7 @@ void cameram_send_data(void);
 #define SPORT_PAUSE_RESET_CMD 0x0116 //训练暂停/恢复
 #define SEND_CURR_DIAL_TOAPP_CMD 0x0117 //发送当前表盘TOapp
 #define SEND_CURR_STATUS_CMD 0x0119 //获取手表当前状态
+#define GET_EPHEMERIS_VALID_SEC_CMD 0x0118 //获取星历有效剩余秒数
 #define SEND_UPPAIR_CMD 0x0110 //发送解除配对消息 Unpairing
 #define GET_WATCH_LCD_PARAM_CMD 0x011A //获取手表屏幕参数
 #define DELETE_DIAL_CMD 0x011B //删除表盘
@@ -771,7 +772,7 @@ typedef struct
 
 
         
-uint8_t get_OTA_recv_value(void);
+uint32_t get_OTA_recv_value(void);
 
 void Set_OTA_recv_value(void);
 
index 13635de..0fdaf0b 100644 (file)
@@ -2384,12 +2384,14 @@ int gnss_check_agnss_status(void)
 
     if (PGNSS_DATA_PATH == NULL || strlen(PGNSS_DATA_PATH) == 0) {
         printf("ERROR: PGNSS_DATA_PATH is empty\n");
+        uapi_dev_runtime_set_ephemeris_expired_status(1);
         return -1;
     }
 
     DIR *dir = opendir(PGNSS_DATA_PATH);
     if (dir == NULL) {
         printf("Cannot open AGNSS directory: %s\n", PGNSS_DATA_PATH);
+        uapi_dev_runtime_set_ephemeris_expired_status(1);
         return -1;
     }
 
@@ -2399,6 +2401,7 @@ int gnss_check_agnss_status(void)
     if (current_timestamp == 0) {
         printf("ERROR: Failed to get current timestamp\n");
         closedir(dir);
+        uapi_dev_runtime_set_ephemeris_expired_status(1);
         return -1;
     }
     // 调试日志:打印正确的当前时间戳
@@ -2499,14 +2502,14 @@ int gnss_check_agnss_status(void)
     // 打印未来文件夹数量(调试用)
     // printf("future_folder_count : %d\n", future_folder_count);
 
-    // 返回剩余有效分钟数
+    // 返回剩余有效分钟数,并同步星历过期状态到 runtime(供 BLE 等查询)
     if (found_valid_folder) {
         uint32_t remaining_seconds = VALID_TIME_WINDOW - min_time_diff;
         int remaining_minutes = (int)(remaining_seconds / 60) + (future_folder_count * 24 * 60);
-        printf("Valid folder remaining minutes: %d\n", remaining_minutes);
+        uapi_dev_runtime_set_ephemeris_expired_status(0); /* 星历有效 */
         return remaining_minutes;
     } else {
-        printf("No valid folder in 24 hours\n");
+        uapi_dev_runtime_set_ephemeris_expired_status(1); /* 星历过期 */
         return 0;
     }
 }
index 07603c9..8df62c2 100644 (file)
@@ -69,6 +69,8 @@ typedef struct
     bt_runtime_status_t bt_runtime;
     char current_dial_name[32];
     char current_epo_file_path[128]; // EPO文件完整路径
+    uint8_t epo_file_extracted_status;//EPO文件解压状态 0 未解压, 1 解压成功
+    uint8_t ephemeris_expired_status; // 星历过期状态 0 有效,1 过期/未检查
     uint8_t time_hour_show_model;
     uint8_t sleep_monitoring_status;//睡眠监测
     uint8_t sleep_status;//睡眠状态
@@ -77,6 +79,7 @@ typedef struct
     uint8_t sedentary_status;
     uint8_t drinkremind_status;
     uint8_t train_status;//训练状态
+    uint8_t train_status_is_end_flag;//训练结束界面标志,1 处于结束界面 0 非结束界面
     uint8_t saveele_status;//省电模式状态
     uint8_t lock_status;//密码锁状态
     uint8_t motion_recognition_status;//运动识别开关状态
@@ -272,6 +275,39 @@ char* uapi_dev_runtime_get_epo_file_path(void)
 {
     return (char*)&(g_runtime.current_epo_file_path[0]);
 }
+
+/**
+ * 设置 EPO 文件解压状态
+*/
+void uapi_dev_runtime_set_epo_file_extracted_status(uint8_t status)
+{
+    g_runtime.epo_file_extracted_status = status;
+}
+
+/**
+ * 获取 EPO 文件解压状态
+*/
+uint8_t uapi_dev_runtime_get_epo_file_extracted_status(void)
+{
+    return g_runtime.epo_file_extracted_status;
+}
+
+/**
+ * 设置星历过期状态(0 有效,1 过期/未检查)
+ */
+void uapi_dev_runtime_set_ephemeris_expired_status(uint8_t status)
+{
+    g_runtime.ephemeris_expired_status = status;
+}
+
+/**
+ * 获取星历过期状态(0 有效,1 过期或未检查)
+ */
+uint8_t uapi_dev_runtime_get_ephemeris_expired_status(void)
+{
+    return g_runtime.ephemeris_expired_status;
+}
+
 void uapi_dev_runtime_set_bt_powerstat(uint8_t stat)
 {
     g_runtime.bt_runtime.bt_powerOn = stat;
@@ -417,6 +453,15 @@ uint8_t uapi_dev_runtime_get_train_status(void)
 {
     return g_runtime.train_status;
 }
+/*设置训练结束界面标志*/
+void uapi_dev_runtime_set_train_status_is_end_flag(uint8_t flag)
+{
+    g_runtime.train_status_is_end_flag = flag;
+}
+uint8_t uapi_dev_runtime_get_train_status_is_end_flag(void)
+{
+    return g_runtime.train_status_is_end_flag;
+}
 /*设置省电模式状态*/
 void uapi_dev_runtime_set_saveele_status(uint8_t status)
 {
index b8e4354..5d1175c 100644 (file)
@@ -48,6 +48,23 @@ void uapi_dev_runtime_set_epo_file_path(char* file_path);
 */
 char* uapi_dev_runtime_get_epo_file_path(void);
 
+/**
+ * 设置 EPO 文件解压状态
+*/
+void uapi_dev_runtime_set_epo_file_extracted_status(uint8_t status);
+/**
+ * 获取 EPO 文件解压状态
+*/
+uint8_t uapi_dev_runtime_get_epo_file_extracted_status(void);
+
+/**
+ * 设置星历过期状态(由 GNSS 检查后更新:0 有效,1 过期/未检查)
+ */
+void uapi_dev_runtime_set_ephemeris_expired_status(uint8_t status);
+/**
+ * 获取星历过期状态(0 有效,1 过期或未检查)
+ */
+uint8_t uapi_dev_runtime_get_ephemeris_expired_status(void);
 
 void uapi_dev_runtime_set_vibmod(uint8_t vibmod);
 
@@ -79,6 +96,14 @@ uint8_t uapi_dev_runtime_get_drinkremind_status(void);
 void uapi_dev_runtime_set_train_status(uint8_t status);
 uint8_t uapi_dev_runtime_get_train_status(void);
 
+/*
+    设置训练结束界面标志
+    0 非结束界面
+    1 处于结束界面(不弹窗等)
+*/
+void uapi_dev_runtime_set_train_status_is_end_flag(uint8_t flag);
+uint8_t uapi_dev_runtime_get_train_status_is_end_flag(void);
+
 /*
     设置训练状态
     0 未开启省电
index f5340f3..b58317f 100644 (file)
@@ -387,26 +387,8 @@ errcode_t uapi_epo_lzma_decompress(const char* lzma_file_path)
         return ERRCODE_FAIL;
     }
 
-    /* 第一遍扫描,尝试找到AssistInfo_*文件的时间戳,用作目录名 */
-    char assist_ts[32] = {0};
-    long data_start_pos = ftell(fp);
-    for (uint32_t i = 0; i < file_count; i++) {
-        uint16_t filename_len = 0;
-        if (fread(&filename_len, 1, 2, fp) != 2) { break; }
-        if (filename_len == 0 || filename_len > 255) { break; }
-        char filename[256] = {0};
-        if (fread(filename, 1, filename_len, fp) != filename_len) { break; }
-        uint32_t file_size = 0;
-        if (fread(&file_size, 1, 4, fp) != 4) { break; }
-        if (file_size > 0) { (void)fseek(fp, file_size, SEEK_CUR); }
-        if (assist_ts[0] == '\0' && strncmp(filename, "AssistInfo_", strlen("AssistInfo_")) == 0) {
-            extract_timestamp_from_name(filename, assist_ts, sizeof(assist_ts));
-        }
-    }
-    /* 回到文件列表起始位置准备正式解压 */
-    (void)fseek(fp, data_start_pos, SEEK_SET);
-
     int extracted_count = 0;
+    char current_batch_ts[32] = {0}; // 维护当前批次的时间戳(替代原全局assist_ts)
 
     // 遍历每个文件
     for (uint32_t i = 0; i < file_count; i++) {
@@ -441,21 +423,22 @@ errcode_t uapi_epo_lzma_decompress(const char* lzma_file_path)
             break;
         }
 
-        /* 确定目录时间戳:优先用AssistInfo中的时间戳,否则取自身文件名中的时间戳 */
-        char dir_ts[32] = {0};
-        if (assist_ts[0] != '\0') {
-            (void)strncpy(dir_ts, assist_ts, sizeof(dir_ts) - 1);
-        } else {
-            extract_timestamp_from_name(filename, dir_ts, sizeof(dir_ts));
+        // 关键逻辑:遇到AssistInfo_*文件时,更新当前批次时间戳
+        if (strncmp(filename, "AssistInfo_", strlen("AssistInfo_")) == 0) {
+            extract_timestamp_from_name(filename, current_batch_ts, sizeof(current_batch_ts));
+            printf("[uapi_epo_lzma_decompress] Switch to new batch, timestamp: %s (from file: %s)\n", 
+                   current_batch_ts, filename);
         }
-        if (dir_ts[0] == '\0') {
-            printf("[uapi_epo_lzma_decompress] Failed to parse timestamp for file %s\n", filename);
+
+        // 校验当前批次时间戳是否有效(必须先遇到AssistInfo_*才能解压后续文件)
+        if (current_batch_ts[0] == '\0') {
+            printf("[uapi_epo_lzma_decompress] No valid batch timestamp (not found AssistInfo_* yet) for file %s\n", filename);
             break;
         }
 
         /* 生成输出目录并确保存在 */
         char output_dir[128] = {0};
-        int dir_ret = snprintf(output_dir, sizeof(output_dir), "/user/userdata/gnss/%s", dir_ts);
+        int dir_ret = snprintf(output_dir, sizeof(output_dir), "/user/userdata/gnss/%s", current_batch_ts);
         if (dir_ret < 0 || dir_ret >= (int)sizeof(output_dir)) {
             printf("[uapi_epo_lzma_decompress] Failed to build output dir for file %u\n", i);
             break;
@@ -513,7 +496,8 @@ errcode_t uapi_epo_lzma_decompress(const char* lzma_file_path)
             break;
         }
 
-        printf("[uapi_epo_lzma_decompress] Extracted: %s (%u bytes)\n", output_path, file_size);
+        // printf("[uapi_epo_lzma_decompress] Extracted: %s (%u bytes) [batch: %s]\n", 
+        //        output_path, file_size, current_batch_ts);
         extracted_count++;
     }
 
@@ -543,20 +527,20 @@ void uapi_dump_meminfo(void)
 void CustomEventPublish(uint16_t topic, uint8_t *data, uint32_t size) {  
     int32_t ret;  
 
-    BroadcastApi *broadcastApi = NULL;  
-    IUnknown *api = NULL;  
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ChargerEventPublish topic=%u!!", topic);  
+    BroadcastApi *broadcastApi = nullptr;  
+    IUnknown *api = nullptr;  
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CustomEventPublish topic=%u!!", topic);  
 
     void *publishData = nullptr;  
     if (size > 0) {  
         publishData = malloc(size);  
         if (publishData == nullptr) {  
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ChargerEventPublish malloc failed! size = %u", size);  
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CustomEventPublish malloc failed! size = %u", size);  
             return;  
         }  
         ret = memcpy_s(publishData, size, (const void *)data, size);  
         if (ret != EOK) {  
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ChargerEventPublish memcpy_s failed! ret = %d", ret);  
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CustomEventPublish memcpy_s failed! ret = %d", ret);  
             free(publishData);  
             return;  
         }  
@@ -566,14 +550,14 @@ void CustomEventPublish(uint16_t topic, uint8_t *data, uint32_t size) {
 
     /* public request */  
     api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME, BROADCAST_FEATURE_NAME);  
-    if (api == NULL) {  
+    if (api == nullptr) {  
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetFeatureApi failed for service: %s, feature: %s", BROADCAST_SERVICE_NAME, BROADCAST_FEATURE_NAME);  
         free(publishData);  
         return;  
     }  
 
     ret = api->QueryInterface(api, DEFAULT_VERSION, (void **)&broadcastApi);  
-    if (ret != 0 || broadcastApi == NULL) {  
+    if (ret != 0 || broadcastApi == nullptr) {  
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "QueryInterface failed! ret = %d, api = %p", ret, api);  
         free(publishData);  
         return;  
@@ -585,10 +569,8 @@ void CustomEventPublish(uint16_t topic, uint8_t *data, uint32_t size) {
     }  
 
     broadcastApi->Release((IUnknown *)broadcastApi);  
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ChargerEventPublish end!!");  
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CustomEventPublish end!!");  
 
-    // // 释放内存  
-    // free(publishData);  
     return;  
 }