From c631b90fc33cdce9b3596d3dfd2faa87793e79cf Mon Sep 17 00:00:00 2001 From: Caisking Date: Tue, 13 Jan 2026 15:06:11 +0800 Subject: [PATCH] =?utf8?q?=E5=A2=9E=E5=8A=A0=E8=BD=A8=E8=BF=B9=E7=BC=93?= =?utf8?q?=E5=AD=98=E7=9A=84=E6=B8=85=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../nativeui/traing/src/TraingEnddataView.cpp | 133 +++--------------- 1 file changed, 18 insertions(+), 115 deletions(-) diff --git a/code/sdk/application/wearable/fd272/nativeapp/nativeui/traing/src/TraingEnddataView.cpp b/code/sdk/application/wearable/fd272/nativeapp/nativeui/traing/src/TraingEnddataView.cpp index 895341d09..6ad1e38b9 100644 --- a/code/sdk/application/wearable/fd272/nativeapp/nativeui/traing/src/TraingEnddataView.cpp +++ b/code/sdk/application/wearable/fd272/nativeapp/nativeui/traing/src/TraingEnddataView.cpp @@ -551,12 +551,12 @@ void TraingEnddataView::DeInit() { } if (canvas) { + // 清空轨迹数据,确保加载新的数据 + TraingModel::GetInstance()->ClearCanvasData(); + trackSegments_.clear(); delete canvas; canvas = nullptr; } - // 清空轨迹数据,确保加载新的数据 - TraingModel::GetInstance()->ClearCanvasData(); - trackSegments_.clear(); delete scrollView_; scrollView_ = nullptr; @@ -733,6 +733,7 @@ void TraingEnddataView::InitData() { } void TraingEnddataView::OnStart() { + bool isNeedGPS = TraingModel::GetInstance()->IsNeedGPS(TraingModel::GetInstance()->GetSportEvent()); // 判断是否需要GPS if (isNeedGPS == true) { @@ -742,22 +743,14 @@ void TraingEnddataView::OnStart() { SportData *enddata = TraingModel::GetInstance()->GetSportdata(); if (enddata != nullptr) { uint32_t startTimestamp = enddata->starttime; - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "加载轨迹图,starttime: %u", startTimestamp); - // 确保使用正确的starttime获取对应的GPS文件 - std::string gpsFilePath = TraingModel::GetInstance()->GetCanvasDataPath(startTimestamp); + std::string gpsFilePath =TraingModel::GetInstance()->GetCanvasDataPath(startTimestamp); if (!gpsFilePath.empty()) { - // 清空旧数据后再加载新数据 - TraingModel::GetInstance()->ClearCanvasData(); if (TraingModel::GetInstance()->LoadCanvasData(gpsFilePath) == true) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "gps文件加载成功: %s", gpsFilePath.c_str()); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "gps文件加载成功"); } else { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "gps文件加载失败: %s", gpsFilePath.c_str()); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "gps文件加载失败"); } - } else { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "未找到GPS文件,starttime: %u", startTimestamp); } - } else { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetSportdata() 返回 nullptr"); } #endif } @@ -769,20 +762,13 @@ void TraingEnddataView::OnStart() { scrollView_->SetTouchable(true); scrollView_->SetOnDragListener(presenter_); - // 检查是否有足够的GPS数据来绘制轨迹(测试模式下也允许绘制) - if (isNeedGPS == false && !useTestData_) { + // 检查是否有足够的GPS数据来绘制轨迹 + if (isNeedGPS == false) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "该运动项不需要GPS"); return; } -#if defined(SUPPORT_GNSS) || defined(TEST_10000_POINTS) - std::vector canvasData; - if (useTestData_ && !testCanvasData_.empty()) { - canvasData = testCanvasData_; - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "使用测试数据,canvasData.size() = %zu", canvasData.size()); - } else { - canvasData = TraingModel::GetInstance()->GetCanvasData(); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "使用GPS数据,canvasData.size() = %zu", canvasData.size()); - } +#if defined(SUPPORT_GNSS) + std::vector canvasData = TraingModel::GetInstance()->GetCanvasData(); if (canvasData.size() >= 3) { canvas = new UICanvas(); canvas->SetHeight(CANVAS_SIZE); @@ -793,7 +779,6 @@ void TraingEnddataView::OnStart() { // 有足够数据,绘制轨迹 DrawTrackSegment(canvas); DrawMarkers(canvas); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "轨迹图绘制完成"); } else { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GPS轨迹数据不足,不绘制轨迹"); } @@ -807,65 +792,23 @@ void TraingEnddataView::OnStart() { std::vector markers_ = {{{58, 18}, "起", Color::Green()}, {{299, 146}, "终", Color::Red()}}; -// 测试数据 -std::vector TraingEnddataView::testCanvasData_; -bool TraingEnddataView::useTestData_ = false; - void TraingEnddataView::GenerateTrackPoints() { trackSegments_.clear(); TrackSegment seg1; seg1.color = Color::Blue(); - // 如果使用测试数据,则使用测试数据,否则使用GPS数据 - std::vector canvasData; - if (useTestData_ && !testCanvasData_.empty()) { - canvasData = testCanvasData_; - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "使用测试数据,原始轨迹点数: %zu", canvasData.size()); - } else { - canvasData = TraingModel::GetInstance()->GetCanvasData(); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "使用GPS数据,原始轨迹点数: %zu", canvasData.size()); - } - - // UICanvas的PathParam.count是uint16_t类型,最大值为65535 - // 但为了性能和显示效果,我们限制最大绘制点数为300 - // 对于5小时的跑步(假设18000个点),采样到300个点足够显示轨迹形状 - const size_t MAX_TRACK_POINTS = 500; // 最大绘制点数,避免点位过多导致轨迹异常和性能问题 - std::vector sampledPoints; - - if (canvasData.size() > MAX_TRACK_POINTS) { - // 均匀采样,保留起点和终点 - sampledPoints.push_back(canvasData[0]); // 起点 - - double step = static_cast(canvasData.size() - 1) / (MAX_TRACK_POINTS - 1); - for (size_t i = 1; i < MAX_TRACK_POINTS - 1; ++i) { - size_t index = static_cast(i * step); - if (index < canvasData.size()) { - sampledPoints.push_back(canvasData[index]); - } - } - - sampledPoints.push_back(canvasData.back()); // 终点 - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "采样后轨迹点数: %zu (从 %zu 个点采样,采样率: %.2f%%)", - sampledPoints.size(), canvasData.size(), - (sampledPoints.size() * 100.0) / canvasData.size()); - } else { - // 点数不多,直接使用所有点 - sampledPoints = canvasData; - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "轨迹点数: %zu (无需采样)", sampledPoints.size()); - } + std::vector canvasData = TraingModel::GetInstance()->GetCanvasData(); //将点位赋值 - for (size_t i = 0; i < sampledPoints.size(); ++i) { - seg1.points.push_back(sampledPoints[i]); + for (size_t i = 0; i < canvasData.size(); ++i) { + seg1.points.push_back(canvasData[i]); } trackSegments_.push_back(seg1); - //修改markers_ 起终点坐标(使用原始数据的起终点,确保标记位置准确) - if (!canvasData.empty()) { - markers_[0].pos = canvasData[0]; - markers_[1].pos = canvasData.back(); - } + //修改markers_ 起终点坐标 + markers_[0].pos = canvasData[0]; + markers_[1].pos = canvasData.back(); } void TraingEnddataView::DrawTrackSegment(UICanvas *canvas) { // 绘制网格 @@ -878,8 +821,7 @@ void TraingEnddataView::DrawTrackSegment(UICanvas *canvas) { // 绘制轨迹 for (const auto &seg : trackSegments_) { - if (seg.points.size() < 3) { //至少需要 3 个点位 - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "轨迹点数不足: %zu,无法绘制", seg.points.size()); + if (seg.points.size() < 3) //至少需要 3 个点位 return; Paint paint; @@ -893,47 +835,8 @@ void TraingEnddataView::DrawTrackSegment(UICanvas *canvas) { canvas->LineTo(seg.points[i]); } canvas->DrawPath(paint); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "轨迹绘制完成,共绘制 %zu 条线段", seg.points.size() - 1); } } -} -void TraingEnddataView::GenerateTestTrackPoints(size_t pointCount) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "========== 开始生成 %zu 个测试点 ==========", pointCount); - - // 清空现有测试数据 - testCanvasData_.clear(); - testCanvasData_.reserve(pointCount); - - // 生成模拟轨迹点(螺旋形状,确保轨迹可见) - // 画布大小是 CANVAS_SIZE (400),我们生成一个在画布范围内的轨迹 - const int16_t centerX = CANVAS_SIZE / 2; - const int16_t centerY = CANVAS_SIZE / 2; - const int16_t maxRadius = CANVAS_SIZE / 2 - 50; // 留出边距 - - for (size_t i = 0; i < pointCount; ++i) { - // 生成螺旋轨迹 - double angle = (i * 2.0 * 3.14159265358979323846) / (pointCount / 4.0); // 4圈螺旋 - double radius = (maxRadius * i) / pointCount; // 从中心逐渐向外 - - int16_t x = static_cast(centerX + radius * cos(angle)); - int16_t y = static_cast(centerY + radius * sin(angle)); - - // 确保点在画布范围内 - if (x < 0) x = 0; - if (x >= CANVAS_SIZE) x = CANVAS_SIZE - 1; - if (y < 0) y = 0; - if (y >= CANVAS_SIZE) y = CANVAS_SIZE - 1; - - testCanvasData_.push_back({x, y}); - } - - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "生成了 %zu 个测试点", testCanvasData_.size()); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "起点: (%d, %d), 终点: (%d, %d)", - testCanvasData_[0].x, testCanvasData_[0].y, - testCanvasData_.back().x, testCanvasData_.back().y); - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "========== 测试点生成完成 =========="); -} - void TraingEnddataView::DrawMarkers(UICanvas *canvas) { Paint circlePaint; circlePaint.SetStyle(Paint::PaintStyle::FILL_STYLE); -- 2.17.1