}
if (canvas) {
+ // 清空轨迹数据,确保加载新的数据
+ TraingModel::GetInstance()->ClearCanvasData();
+ trackSegments_.clear();
delete canvas;
canvas = nullptr;
}
- // 清空轨迹数据,确保加载新的数据
- TraingModel::GetInstance()->ClearCanvasData();
- trackSegments_.clear();
delete scrollView_;
scrollView_ = nullptr;
}
void TraingEnddataView::OnStart() {
+
bool isNeedGPS = TraingModel::GetInstance()->IsNeedGPS(TraingModel::GetInstance()->GetSportEvent());
// 判断是否需要GPS
if (isNeedGPS == true) {
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
}
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<Point> 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<Point> canvasData = TraingModel::GetInstance()->GetCanvasData();
if (canvasData.size() >= 3) {
canvas = new UICanvas();
canvas->SetHeight(CANVAS_SIZE);
// 有足够数据,绘制轨迹
DrawTrackSegment(canvas);
DrawMarkers(canvas);
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "轨迹图绘制完成");
} else {
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GPS轨迹数据不足,不绘制轨迹");
}
std::vector<Marker> markers_ = {{{58, 18}, "起", Color::Green()},
{{299, 146}, "终", Color::Red()}};
-// 测试数据
-std::vector<Point> TraingEnddataView::testCanvasData_;
-bool TraingEnddataView::useTestData_ = false;
-
void TraingEnddataView::GenerateTrackPoints() {
trackSegments_.clear();
TrackSegment seg1;
seg1.color = Color::Blue();
- // 如果使用测试数据,则使用测试数据,否则使用GPS数据
- std::vector<Point> 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<Point> sampledPoints;
-
- if (canvasData.size() > MAX_TRACK_POINTS) {
- // 均匀采样,保留起点和终点
- sampledPoints.push_back(canvasData[0]); // 起点
-
- double step = static_cast<double>(canvasData.size() - 1) / (MAX_TRACK_POINTS - 1);
- for (size_t i = 1; i < MAX_TRACK_POINTS - 1; ++i) {
- size_t index = static_cast<size_t>(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<Point> 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) {
// 绘制网格
// 绘制轨迹
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;
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<int16_t>(centerX + radius * cos(angle));
- int16_t y = static_cast<int16_t>(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);