baldav/docs/session-logs/2026-09-21_split-and-bike-guard.md

5.2 KiB
Raw Blame History

Сессия 2026-09-21 - разрезание трека + блокировка склейки разных великов

Контекст

Три вопроса пользователя (сначала разобрал по коду, потом делал):

  1. «Пересчитать» берёт велик СЕССИИ (не активный) - пользователя устраивает, не трогаем.
  2. Хочет разрезать трек в точке смены передачи, чтобы разным кускам назначать свой велик (два велика = один и тот же, разные передачи) - для точных мощности/каденса.
  3. Опасение: склейка разных великов слепит всё в один велик. Решение (по просьбе): при склейке треков с РАЗНЫМИ великами - предупреждать и НЕ склеивать (не хранить велик по точкам).

Сделано

  • Блокировка склейки (D): в обработчике #gps-sel-merge (main.js) - если у выбранных сессий разные bike_id (Set по bike_id, null=none), appAlert «велосипеды разные, склеить нельзя, задайте одинаковый и склеивайте» и return.
  • Разрезание (B): DB.splitGpsSession(sessionId, part2Ids, part1EndTime, part2StartTime) (db.js): вторая половина -> НОВАЯ сессия (id=Date.now(), копия date/activity/bike/source, start=part2 время, end=старый end), точки part2 переносятся по id чанками (200), seq=NULL; у старой end_time=part1. UI: кнопка #sd-split включает #sd-map.split-mode; в попапе точки кнопка .split-here (видна только в split-mode) -> confirmSplitAt(k) -> подтверждение -> splitGpsSession -> пересчёт обоих кусков (recalculateSession noDelete) -> назад в историю.
  • Точку разреза выбирают ТАПОМ ПО ТОЧКЕ (хит-таргеты уже есть), а не кликом карты - маркеры перехватывают клик, поэтому кнопка живёт в попапе.

Проверка (десктоп Xvfb, подсажен склеенный трек 16 сен 1789547934760, 3614 тчк, +2й велик)

  • Разрез: «Разрезать трек» -> тост + скролл к карте -> тап точки #3547 -> попап с «✂ Разрезать здесь» -> диалог (точка/время/км) -> «Разрезать» -> в истории ДВЕ сессии 16-го (part1 3548 тчк 19.54км, part2 66 тчк 343м), обе bike, стата пересчитана. Скрины.
  • Блокировка: part2 велик -> 2 (через SQL), выделил обе (долгий тап + тап), «Объединить» -> предупреждение «велосипеды разные, склеить нельзя», склейки не произошло. Скрин.
  • БД восстановлена из бэкапа (0 сессий 16 сен, 1 велик).

Замечания

  • Инъекция INSERT ... SELECT * тихо даёт 0 строк, если id сессии больше нет в pulled-БД (tools/track/baldav.db пере-пулена, старая 1789549492046 уже склеена на телефоне в 1789547934760). Проверять существование id перед выводами.
  • Xvfb :99 снова умирал; pgrep -f "Xvfb :99" ловит собственную команду (ложно «жив») - проверять сокет /tmp/.X11-unix/X99.
  • part2 start_time берётся из ts точки (UTC), а поле сессии - локальное; мелкая косметическая рассинхронизация времени (данные так хранятся), на функциональность не влияет.

Выкатка на роутер (по просьбе)

  • Залит СУЩЕСТВУЮЩИЙ binaries/baldav-debug.apk (0.1.464, build 464) на роутер keenetic (LAN 192.168.1.1) в /opt/share/www/baldav/baldav.apk + BUILD_NUMBER=464, БЕЗ пересборки (иначе номер уехал бы на 465). Проверено: файл 190101489 б, BUILD_NUMBER=464 на роутере. Доступно: http://192.168.1.1:88/baldav/baldav.apk. Пароль роутера взят из build.sh, не печатался. VPS-зеркало не трогал (просили только роутер).
  • Текущие версии сведены в README (раздел «Текущие версии»): app 0.1.464/build 464, на роутере 464, BRouter 1.6.3, сид продуктов 11.

Не сделано (по просьбе - позже/не нужно)

  • Велик по точкам (вариант C) не делаем: пользователь просто не будет склеивать разные велики.
  • Вырезание участка трека - позже.