修改gps相关数据接口
authorCaisking <Casiking@zhihuishixun.com>
Fri, 11 Jul 2025 06:55:16 +0000 (14:55 +0800)
committerCaisking <Casiking@zhihuishixun.com>
Fri, 11 Jul 2025 06:55:16 +0000 (14:55 +0800)
code/sdk/application/wearable/fd230app/nativeui/traing/include/TraingModel.h
code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingEnddataView.cpp
code/sdk/application/wearable/fd230app/nativeui/traing/src/TraingModel.cpp

index 7f1bfe0..38b2b10 100644 (file)
@@ -110,7 +110,8 @@ namespace OHOS {
 #define TRAINING_RECORD_FILE "user/userdata/sport/Record.json"
 #define TRAINING_HEART_FILE "user/userdata/sport/HeartTabel/"
 #define TRAINING_PACE_FILE "user/userdata/sport/PaceTabel/"
-#define TRAINING_GPS_FILE "user/userdata/sport/GPS/"
+#define TRAINING_CANVAS_FILE "user/userdata/sport/Canvas_Point/"
+#define TRAINING_GPS_FILE "user/userdata/sport/GPS_Point/"
 #define MAX_DATA_COUNT 10
 
 #define TIMER 1
@@ -371,14 +372,15 @@ public:
   void AddGPSData(uint32_t timestamp, double latitude, double longitude);
   bool SaveCanvasData();
   void ClearCanvasData();
-  std::string GetGPSDataPath(uint32_t timestamp);
-  //获取轨迹点集
+  bool LoadCanvasData(const std::string &filePath);
+  std::string GetCanvasDataPath(uint32_t timestamp);
   std::vector<Point> GetCanvasData() const;
   bool GetGPSConnectState();
   void SetGPSConnectState(bool state);
-  bool LoadGPSData(const std::string &filePath);
   void OpenGPS();
   void CloseGPS();
+  bool SaveGPSData();
+  std::string GetGPSDataPath(uint32_t timestamp);
   //运动心率、gps开启准备
   void start_heart_gps();
   //运动心率、gps关闭
index 235e2d6..5ffceca 100644 (file)
@@ -654,9 +654,9 @@ void TraingEnddataView::InitData() {
 
     //读取一下gps文件
     std::string gpsFilePath =
-        TraingModel::GetInstance()->GetGPSDataPath(enddata->starttime);
+        TraingModel::GetInstance()->GetCanvasDataPath(enddata->starttime);
     if (!gpsFilePath.empty()) {
-      if (TraingModel::GetInstance()->LoadGPSData(gpsFilePath) == false) {
+      if (TraingModel::GetInstance()->LoadCanvasData(gpsFilePath) == false) {
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "gps文件加载失败");
         return;
       }
index 02e3b3b..fdcfced 100644 (file)
@@ -807,7 +807,6 @@ void TraingModel::SetTimestamp() {
 
     stop_heart_gps(); // 停止心率和gps数据采集
 
-
 #if 0
       // 重置训练目标 [发生在训练前]
       sportTag_ = 0;
@@ -1425,13 +1424,15 @@ bool TraingModel::SaveSportData() {
     // 保存速度表
     if (!SavePaceTable()) {
       WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SaveSpeedData is error!");
-      // uapi_dev_runtime_set_train_storage_status(0); // 恢复状态
       // return false;
     }
     // 保存GPS数据
     if (!SaveCanvasData()) {
-      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SaveGpsData is error!");
-      // uapi_dev_runtime_set_train_storage_status(0); // 恢复状态
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SaveCanvasData is error!");
+      return false; //必须手表端存储成功
+    }
+    if (!SaveGPSData()) {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SaveGPSData is error!");
       // return false;
     }
   }
@@ -2843,12 +2844,13 @@ void TraingModel::AddGPSData(uint32_t timestamp, double latitude,
                 "Added GPS data #%zu: ts=%u, (%.6f, %.6f)", gpsData.size(),
                 timestamp, latitude, longitude);
 }
-//保存gps数据
+
+//保存canvas数据
 bool TraingModel::SaveCanvasData() {
 
   //打印一下gps的数据
   for (const auto &point : gpsData) {
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
                   "GPS Data: Latitude = %f, Longitude = %f", point.latitude,
                   point.longitude);
   }
@@ -2858,13 +2860,13 @@ bool TraingModel::SaveCanvasData() {
     return false;
   }
 
-  CreateDirectoryIfNotExists(TRAINING_GPS_FILE);
+  CreateDirectoryIfNotExists(TRAINING_CANVAS_FILE);
 
   WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "canvasData.size() = %zu",
                 canvasData.size());
 
   std::string filePath =
-      TRAINING_GPS_FILE + std::to_string(sportdata->starttime) + ".bin";
+      TRAINING_CANVAS_FILE + std::to_string(sportdata->starttime) + ".bin";
   WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SaveCanvasData filePath: %s",
                 filePath.c_str());
 
@@ -2885,15 +2887,18 @@ bool TraingModel::SaveCanvasData() {
   WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SaveGPSData Success.");
   return true; // 返回成功
 }
+// 清除canvas数据
 void TraingModel::ClearCanvasData() { canvasData.clear(); }
-
-std::string TraingModel::GetGPSDataPath(uint32_t timestamp) {
+// 获取轨迹点集
+std::vector<Point> TraingModel::GetCanvasData() const { return canvasData; }
+// 获取canvas数据
+std::string TraingModel::GetCanvasDataPath(uint32_t timestamp) {
   // 首先检查完全匹配的时间戳
   std::string exactFilePath =
-      TRAINING_GPS_FILE + std::to_string(timestamp) + ".bin";
-  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "gps表: %s", exactFilePath.c_str());
+      TRAINING_CANVAS_FILE + std::to_string(timestamp) + ".bin";
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "canvas表: %s", exactFilePath.c_str());
   if (IsFileAccessibleAndNotEmpty(exactFilePath)) {
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "找到gps表: %s",
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "找到canvas表: %s",
                   exactFilePath.c_str());
     return exactFilePath; // 返回完全匹配的文件路径
   }
@@ -2902,18 +2907,19 @@ std::string TraingModel::GetGPSDataPath(uint32_t timestamp) {
   for (int i = -2; i <= 2; ++i) {
     uint32_t checkTimestamp = timestamp + i;
     std::string filePath =
-        TRAINING_GPS_FILE + std::to_string(checkTimestamp) + ".bin";
+        TRAINING_CANVAS_FILE + std::to_string(checkTimestamp) + ".bin";
     if (IsFileAccessibleAndNotEmpty(filePath)) {
-      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "找到gps表: %s", filePath.c_str());
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "找到canvas表: %s",
+                    filePath.c_str());
       return filePath; // 返回找到的文件路径
     }
   }
 
-  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "未找到与时间戳相关的找到gps表。");
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "未找到与时间戳相关的找到canvas表。");
   return ""; // 未找到文件
 }
 // 加载GPS数据
-bool TraingModel::LoadGPSData(const std::string &filePath) {
+bool TraingModel::LoadCanvasData(const std::string &filePath) {
   std::ifstream gpsFile(filePath, std::ios::binary);
   if (!gpsFile) {
     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "无法打开文件: %s",
@@ -2938,12 +2944,65 @@ bool TraingModel::LoadGPSData(const std::string &filePath) {
     return false;
   }
 
-  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadGPSData Success. 加载了 %zu 个点",
-                canvasData.size());
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                "LoadCanvasData Success. 加载了 %zu 个点", canvasData.size());
   return true;
 }
-// 获取轨迹点集
-std::vector<Point> TraingModel::GetCanvasData() const { return canvasData; }
+//////////////////////////////////////gps存储///////////////////////////////////////
+//存储gps数据
+bool TraingModel::SaveGPSData() {
+  //打印gps数据
+  for (const auto &point : gpsData) {
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
+                  "GPS Data: Latitude = %f, Longitude = %f", point.latitude,
+                  point.longitude);
+  }
+  CreateDirectoryIfNotExists(TRAINING_GPS_FILE);
+  std::string filePath =
+      TRAINING_GPS_FILE + std::to_string(sportdata->starttime) + ".bin";
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SaveGPSData filePath: %s",
+                filePath.c_str());
+
+  std::ofstream gpsFile(filePath, std::ios::binary);
+  if (!gpsFile) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "无法打开文件: %s",
+                  filePath.c_str());
+    return false; // 返回失败
+  }
+  // 写入gps数据
+  if (!gpsFile.write(reinterpret_cast<const char *>(gpsData.data()),
+                     gpsData.size() * sizeof(GPSData))) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "写入GPS数据失败。");
+    return false; // 返回失败
+  }
+  gpsFile.close();
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SaveGPSData Success.");
+  return true;
+}
+std::string TraingModel::GetGPSDataPath(uint32_t timestamp) {
+  // 首先检查完全匹配的时间戳
+  std::string exactFilePath =
+      TRAINING_GPS_FILE + std::to_string(timestamp) + ".bin";
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "gps表: %s", exactFilePath.c_str());
+  if (IsFileAccessibleAndNotEmpty(exactFilePath)) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "找到gps表: %s",
+                  exactFilePath.c_str());
+    return exactFilePath; // 返回完全匹配的文件路径
+  }
+
+  // 如果未找到,检查时间戳相差1到2秒的文件
+  for (int i = -2; i <= 2; ++i) {
+    uint32_t checkTimestamp = timestamp + i;
+    std::string filePath =
+        TRAINING_GPS_FILE + std::to_string(checkTimestamp) + ".bin";
+    if (IsFileAccessibleAndNotEmpty(filePath)) {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "找到gps表: %s", filePath.c_str());
+      return filePath; // 返回找到的文件路径
+    }
+  }
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "未找到与时间戳相关的找到gps表。");
+  return "";
+}
 
 //获取GPS连接状态
 bool TraingModel::GetGPSConnectState() { return gpsconnect; }