baldav/docs/session-logs/2026-09-11_route-editor-gapfill-fixes.md
4aiman aa7022ec6b routes: return a reliable id from addRoute (re-read, not lastInsertId)
Found in desktop testing: saving a built route showed 'Маршрут пуст' and dropped
to the list — addRoute returned the INSERT lastInsertId, an i64 the SQL plugin
corrupts by ±1, so showRouteDetail opened a non-existent id. Re-read the id via
CAST(id AS TEXT) (same guard importGpxSession uses). Session log: desktop
verification of all 6 fixes.
2026-09-11 01:25:28 +03:00

4.8 KiB
Raw Blame History

Сессия 2026-09-11 — редактор маршрутов и достройка: 6 правок

Контекст

После первой версии планировщика и достройки пользователь на телефоне поймал 6 проблем. Работал по утверждённому плану docs/plans/2026-09-11-route-editor-gapfill-fixes.md. Согласовано: тап по линии = вставить точку (долгий тап = дорога/прямая) с широкой зоной попадания; в редакторе показывать оковку с уклоном как в детали; достройка мостит только реальные длинные потери GPS.

Разбор трека 2026-09-08 (session 1788878075973, 14.67 км, 1648 точек, забрал копию БД с телефона через run-as): сэмплинг <5с, но порог dt>30с/хорда>60м давал 15 «пропусков», часть — обычная езда (три по 30с/89м = 10 км/ч), отсюда объезды и «+0.00 км».

Сделано

  1. Тумблеры день/ночь, уклон/высота и кнопка «моё место» (◎) в редакторе — переиспользованы addDarkMapControl, паттерны sdColorCtl/locBtn.
  2. Достройка (GPS.fillGaps): порог по умолчанию dt>60с, хорда>150м; пропуск, если дорога

    2× хорды (крюк) или добавляет < 40м (дорога ≈ прямая). Статус skipped-nogain — не рисуется и не считается «не удалось».

  3. Низ редактора: своя разметка .re-bottom — подсказка сверху, кнопки рядом, «Отмена» ниже (не трогая .rec-bottom экрана записи).
  4. Вставка точки: тап по линии (широкая невидимая полилиния-цель, pointer-events:stroke), долгий тап — дорога/прямая.
  5. Хранение: routes.waypoints_json {waypoints, legMode}. Сохраняются и опорные (5-6, для правки), и плотная геометрия. Открытие на правку грузит опорные; список показывает их число.
  6. Оковка+уклон построенного маршрута: в routeDirty сохраняются высоты ele из BRouter (раньше отбрасывались) → drawRoutePolyline рисует оковку и в редакторе, и в детали. drawRoutePolyline: прямые отрезки без высот — только тонкой линией.

Проверка (десктоп Xvfb :99 + домашний RouteServer, скрины)

  • Редактор: 3 точки по Новочеркасску → маршрут рисуется оковкой с уклоном (зелёный→красный) + тонкой линией, как в детали (#6). Тумблер уклон/высота (∡→⛰) переключает раскраску (#1). Тап по линии вставил точку (4-я, маршрут перестроился) — легко попал (#4). Низ: подсказка сверху, кнопки рядом, «Отмена» ниже (#3).
  • Сохранение: в БД points_json = 61 точка с ele + waypoints_json = 4 опорные; список показал «4 тчк · ▲» (#5). Деталь маршрута — оковка+уклон+профиль высоты, как импорт (#6).
  • Баг, найденный тестом: сохранение показывало «Маршрут пуст» — addRoute возвращал lastInsertId (i64 портится SQL-плагином ±1). Исправлено: id перечитывается через CAST(id AS TEXT) (как в importGpxSession). После фикса сохранение ведёт прямо в деталь.
  • Достройка (#2): на 06-22 старый порог давал 4 пропуска, новый (dt>60/хорда>150 + пропуск крюков и «нулевого выигрыша») — 2 реальных длинных дропаута (+1.64 км), маргинальные отсеяны.
  • Экран записи (.rec-bottom) не тронут. Тестовые маршруты из десктопной БД убраны.

Дальше

  • На теле встроенным движком офлайн: ./build.sh android -d -i. Проверить тач-жесты (тап-вставка, долгий тап — дорога/прямая) и достройку на реальных треках (09-08 и др.).