From e9efb4fc6c3a514440f75c68c6f681cd46a79fab Mon Sep 17 00:00:00 2001 From: 4aiman Date: Mon, 7 Sep 2026 13:53:40 +0300 Subject: [PATCH 1/5] GPS stats: exclude manual pauses; reject unrealistic altitude steps Manual pause (hand-paused at foot of a climb, walked up, resumed) was counted as riding: computeStats bridged the GPS gap for distance and elevRef survived the gap, leaking the on-foot climb into elevation gain. - gps_sessions.pauses (JSON) now persists manual-pause intervals - computeStats(opts.pauses): a segment crossing a pause is excluded entirely (no distance/speed/elevation/kcal), elevRef reset, paused time subtracted from duration; automatic GPS gaps still interpolated - altitude glitch guard: an adjacent smoothed step steeper than maxRealGradePct (100% = 45deg) is not banked and does not move elevRef (covers Android no-fix 0.0); a smooth change to any value (a real 0 near a river) still passes - recorder writes "alt":null when hasAltitude() is false (real fixed 0 kept) - pauses threaded through live-stop, recalculateSession, recovery and bulk recompute - new-tracks only (old tracks never stored pauses; no manual segment-cut UI) Also: track-detail header shows a click-to-copy track ID. --- PROJECT_MAP.md | 9 ++- ...6-09-07-manual-pauses-altitude-glitches.md | 56 +++++++++++++++++++ ...6-09-07_manual-pauses-altitude-glitches.md | 28 ++++++++++ frontend/js/db.js | 17 ++++-- frontend/js/gps.js | 51 +++++++++++++---- frontend/js/main.js | 32 +++++++++-- .../java/dev/baldav/app/GpsRecorderService.kt | 5 +- 7 files changed, 178 insertions(+), 20 deletions(-) create mode 100644 docs/plans/2026-09-07-manual-pauses-altitude-glitches.md create mode 100644 docs/session-logs/2026-09-07_manual-pauses-altitude-glitches.md diff --git a/PROJECT_MAP.md b/PROJECT_MAP.md index e198b9e..e0883a2 100644 --- a/PROJECT_MAP.md +++ b/PROJECT_MAP.md @@ -103,7 +103,7 @@ | `activity_log` | Лог активности | date, type, minutes, kcal, activity_type (squats/jumprope/stretch/swim/manual), sets, reps, distance_m | | `supplements` | Добавки (БАД) | name, daily_dose_g, витамины/минералы | | `supplement_log` | Приём добавок | date, supplement_id, dose_g | -| `gps_sessions` | GPS тренировки | date, activity_type, distance, kcal, speed, elevation, bike_id, smoothed, smooth_window, smooth_iters (де-джиттер) | +| `gps_sessions` | GPS тренировки | date, activity_type, distance, kcal, speed, elevation, bike_id, smoothed, smooth_window, smooth_iters (де-джиттер), pauses (JSON ручных пауз) | | `gps_points` | Точки трека | session_id, ts, lat, lon, altitude_gps_m, altitude_srtm_m, speed_ms, seq, bearing_deg, accuracy_m, lat_smoothed, lon_smoothed (обратимый де-джиттер), heart_rate, spo2, bp_sys, bp_dia, accel_rms/max, gyro_pitch/yaw | | `routes` | Сохранённые маршруты (оверлей навигации) | name, color, points_json (`{lat,lon,ele?}`), created_at | | `bikes` | Велосипеды | name, weight_kg, wheel, звёзды, surface_type, is_active | @@ -198,6 +198,13 @@ segMaxMs = maxSpeedKmh/3.6 (вело) или walkMaxSpeedKmh/3.6 (пеш); gapTh норма (иначе) → segDist = хорда (haversine) distance += segDist; высота/maxSpeed — только на «норме»; ккал в разрыве/estimated = walk-MET по времени Зависит только от ts+speed (не от флага estimated) → live == «Стоп» == пересчёт. gapThreshold настраивается, применяется при пересчёте. + +Ручная пауза (opts.pauses = [{startTs,endTs}] мс): сегмент, пересекающий паузу (prevMsstartTs), + исключается ЦЕЛИКОМ — ни дистанции, ни высоты, ни ккал, ни времени (pausedSec вычитается из duration), elevRef=null + (перепад, набранный пешком за паузу, не банкуется на первом сегменте после резюма). Авто-GPS-гэп (без паузы) — считается как раньше. +Глюк-гард высоты: соседний сглаженный перепад с грейдом > maxRealGradePct (1.0 = 100% = 45°) не банкуется и не двигает elevRef + (скачок/ступенька, в т.ч. Android no-fix 0.0). Плавный приход к любому значению (реальный 0 у реки) проходит. + Kotlin пишет "alt":null без фикса высоты (hasAltitude()), честный 0 с фиксом сохраняется. Паузы: колонка gps_sessions.pauses (JSON). ``` ### Ходьба/бег — MET-таблица diff --git a/docs/plans/2026-09-07-manual-pauses-altitude-glitches.md b/docs/plans/2026-09-07-manual-pauses-altitude-glitches.md new file mode 100644 index 0000000..b5e7356 --- /dev/null +++ b/docs/plans/2026-09-07-manual-pauses-altitude-glitches.md @@ -0,0 +1,56 @@ +# План: ручные паузы и глюки высоты в расчёте статистики трека + +## Context (зачем) +Две ошибки в `GPS.computeStats` (frontend/js/gps.js): +1. **Ручная пауза считается как езда.** Пользователь внизу подъёма ставит паузу руками, + идёт пешком, наверху снимает. `computeStats` через гэп всё равно считает дистанцию + по позиции, а `elevRef` переживает гэп → первый сегмент после резюма сравнивается с + высотой ДО паузы → перепад подъёма утекает в elevGain. Нужно: **ручную паузу + исключать** (ни дистанции, ни перепада, ни времени, ни ккал), а **автоматический + GPS-гэп в движении — считать как сейчас** (интерполяция). +2. **Глюки высоты, включая честный 0.** Android при отсутствии фикса высоты пишет + `location.altitude=0.0` → в данных 146 точек `altitude_gps_m=0`, которые как «реальная + высота» дают ложные перепады. НО плавный приход к 0 у реки — реальная высота + (пользователь часто у рек). Правило: отбрасывать **нереальный уклон** (скачок / + грейд >45° = >100%), а плавные значения (в т.ч. 0) — оставлять. + +Решения (по ответам): **только для НОВЫХ треков** (ручного «разрезания» старых не делаем). +Паузы отслеживаются в `GPS.recording.pauses` (`[{startTs,endTs,startLat,...}]`, мс epoch), +но в БД НЕ сохранялись — начали сохранять. Данные разбираются офлайн через `tools/track/`. + +## Изменения (финал, как реализовано) +1. **Persist пауз (БД).** Колонка `pauses TEXT` в `gps_sessions` тем же JS-путём ADD COLUMN + под `PRAGMA table_info(gps_sessions)`-гардом (db.js ~1540). `finishGpsSession(...pauses)` + получил аргумент `pauses`: `hasPauses = pauses !== undefined` → пишет `JSON.stringify(pauses||[])`, + `undefined` оставляет колонку как есть. `getGpsSession` парсит `pauses` из JSON. +2. **`computeStats(points, wKg, opts)` — исключение ручных пауз.** `opts.pauses` (мс epoch) → + `inManualPause(aMs,bMs) = pauses.some(z => aMsz.s)`. В сегментном цикле: + `if (inManualPause(prevMs,pMs)) { pausedSec += dt; elevRef = null; continue; }` — целиком + исключает сегмент (дистанция/скорость/высота/ккал), сбрасывает elevRef. `duration -= pausedSec`. +3. **Фильтр высоты по уклону.** В банковании перепада: `glitch = prevAlt!=null && segDist>0 && + |smoothedAlt[i]-prevAlt|/segDist > MAX_GRADE` (`MAX_GRADE = config.maxRealGradePct ?? 1.0` + = 100% = 45°). При glitch — не банковать и не двигать elevRef. Плавные изменения (0 у реки) проходят. + Существующие фильтры (выброс >4м, «застревание», сглаживание) оставлены. +4. **Запись высоты (Kotlin `GpsRecorderService.kt` ~465).** `altStr = if (location.hasAltitude()) + location.altitude.toString() else "null"` → `"alt":${altStr}`. Нет фикса → null (не 0). Идёт вперёд. +5. **Проброс пауз через вызовы `computeStats`/`finishGpsSession`:** live-стоп (recPauses), + `recalculateSession` recorded-ветка (sessPauses), recovery (`s.pauses||[]`), + `recomputeAllStats` bulk (bulkPauses из session.pauses), `showSessionDetail` (main.js: + `{pauses: session.pauses||[]}` + вычет pauseMs из duration). + Ручная-маршрут ветка recalculateSession паузы не передаёт (у нарисованных маршрутов пауз нет). + +## Файлы +- `frontend/js/gps.js` — computeStats (паузы + фильтр уклона), проброс в finish/recalculate/recovery/stop/bulk. +- `frontend/js/db.js` — миграция `pauses`, finishGpsSession, getGpsSession. +- `frontend/js/main.js` — showSessionDetail: передать `session.pauses`, вычесть pauseMs. +- `src-tauri/gen/android/app/src/main/java/dev/baldav/app/GpsRecorderService.kt` — alt=null без фикса. + +## Верификация +1. `node --check` на трёх JS — чисто. +2. `./build.sh -d -i android` → короткая поездка с ручной паузой на склоне → в деталях трека + участок паузы не учтён (нет дистанции/перепада), в БД `pauses` = JSON; треки с 0-глюками не раздуты, + плавный 0 у реки — профиль цел. + +## Не трогаем +- Ручной инструмент «выделить/исключить участок» — отложено. +- Старые треки ретроактивно не правим (паузы не были сохранены). Seed/продукты не трогаем. diff --git a/docs/session-logs/2026-09-07_manual-pauses-altitude-glitches.md b/docs/session-logs/2026-09-07_manual-pauses-altitude-glitches.md new file mode 100644 index 0000000..5184ecd --- /dev/null +++ b/docs/session-logs/2026-09-07_manual-pauses-altitude-glitches.md @@ -0,0 +1,28 @@ +# Сессия 2026-09-07: ручные паузы и глюки высоты в статистике трека + +## Контекст +На последнем ~56км-треке подъём пройден пешком: внизу пауза руками, наверху снята. BalDav +мостил GPS-гэп (дистанция + перепад высоты через elevRef, переживший гэп) как езду. Плюс +Android пишет `altitude=0.0` без фикса высоты (146 точек в данных), что как «реальная высота» +раздувает набор высоты. Пользователь часто у рек, где 0 может быть честным — нельзя тупо +выкидывать 0. Правило: исключать нереальный уклон (>45°/>100%), плавные значения (в т.ч. 0) хранить. + +## Действия (по плану docs/plans/2026-09-07-manual-pauses-altitude-glitches.md) +Работали по утверждённому плану. Реализовано: +- db.js: колонка `gps_sessions.pauses TEXT` (JS ADD COLUMN миграция), `finishGpsSession(...,pauses)` + с `hasPauses`-гардом (undefined = не трогать колонку), `getGpsSession` парсит JSON. +- gps.js `computeStats`: `opts.pauses` → `inManualPause`; сегмент, пересекающий паузу, + исключается целиком (дистанция/скорость/высота/ккал), `elevRef=null`, `pausedSec` вычитается + из duration. Глюк-гард высоты: соседний перепад с грейдом > `maxRealGradePct` (1.0=45°) не + банкуется и не двигает elevRef. Проброс пауз во все вызовы: live-стоп, recalculateSession + (recorded), recovery, recomputeAllStats (bulk), showSessionDetail. +- main.js showSessionDetail: передаёт `session.pauses`, вычитает pauseMs из длительности. +- Kotlin GpsRecorderService: `alt=null` без `hasAltitude()`, честный 0 с фиксом сохраняется. + +## Результат +Только для НОВЫХ треков (старые паузы не сохранялись — ретро-фикса нет; UI ручного разрезания +отложен). Все 3 JS проходят `node --check`. PROJECT_MAP обновлён (computeStats-раздел + колонка pauses). + +## Следующие шаги +- `./build.sh -d -i android`, записать короткую поездку с ручной паузой на склоне, проверить: + участок паузы не в статистике, `pauses` в БД = JSON, треки с 0-глюками не раздуты. diff --git a/frontend/js/db.js b/frontend/js/db.js index 8fbce5d..f337150 100644 --- a/frontend/js/db.js +++ b/frontend/js/db.js @@ -779,14 +779,19 @@ async function addGpsPointsBulk(sessionId, points, startSeq) { return inserted; } -async function finishGpsSession(id, endTime, distM, kcal, avgSpd, maxSpd, elevGain, elevLoss) { +async function finishGpsSession(id, endTime, distM, kcal, avgSpd, maxSpd, elevGain, elevLoss, pauses) { // Guard against NaN — SQLite may reject or corrupt NaN values const safe = v => (v != null && !isNaN(v)) ? v : null; + // pauses: array of manual-pause intervals; store as JSON. undefined = leave column as-is. + const hasPauses = pauses !== undefined; + const pausesJson = hasPauses ? JSON.stringify(pauses || []) : null; await execute( `UPDATE gps_sessions SET end_time=?1, total_distance_m=?2, total_kcal=?3, - avg_speed_kmh=?4, max_speed_kmh=?5, elevation_gain_m=?6, elevation_loss_m=?7 + avg_speed_kmh=?4, max_speed_kmh=?5, elevation_gain_m=?6, elevation_loss_m=?7${hasPauses ? ", pauses=?9" : ""} WHERE id=?8`, - [endTime, safe(distM), safe(kcal), safe(avgSpd), safe(maxSpd), safe(elevGain), safe(elevLoss), id] + hasPauses + ? [endTime, safe(distM), safe(kcal), safe(avgSpd), safe(maxSpd), safe(elevGain), safe(elevLoss), id, pausesJson] + : [endTime, safe(distM), safe(kcal), safe(avgSpd), safe(maxSpd), safe(elevGain), safe(elevLoss), id] ); } @@ -843,7 +848,10 @@ async function getGpsSessionsForDate(date) { async function getGpsSession(id) { const rows = await select("SELECT *, CAST(id AS TEXT) AS id_str FROM gps_sessions WHERE id = ?1", [id]); - return rows.length ? rows[0] : null; + if (!rows.length) return null; + const s = rows[0]; + if (typeof s.pauses === "string") { try { s.pauses = JSON.parse(s.pauses); } catch { s.pauses = []; } } + return s; } async function getGpsPoints(sessionId) { @@ -1529,6 +1537,7 @@ async function runMigrations() { if (!gsCols.includes("smoothed")) await execute("ALTER TABLE gps_sessions ADD COLUMN smoothed INTEGER DEFAULT 0"); if (!gsCols.includes("smooth_window")) await execute("ALTER TABLE gps_sessions ADD COLUMN smooth_window INTEGER"); if (!gsCols.includes("smooth_iters")) await execute("ALTER TABLE gps_sessions ADD COLUMN smooth_iters INTEGER"); + if (!gsCols.includes("pauses")) await execute("ALTER TABLE gps_sessions ADD COLUMN pauses TEXT"); // JSON [{startTs,endTs,...}] manual pauses // Add tire_pressure_bar to bikes (for Crr correction by tire pressure) const bikeCols = (await select("PRAGMA table_info(bikes)")).map(r => r.name); diff --git a/frontend/js/gps.js b/frontend/js/gps.js index e21d4bd..aeed8f6 100644 --- a/frontend/js/gps.js +++ b/frontend/js/gps.js @@ -111,6 +111,16 @@ GPS.computeStats = function(points, weightKg, opts) { let elevRef = null; // running reference for cumulative elevation hysteresis const speeds = []; // m/s per segment + // Manual pauses (ms epoch): the rider hand-paused, so that stretch must NOT count + // (walked, not ridden) — unlike an automatic GPS gap in motion, which we keep. + // A segment that touches a pause interval is dropped and elevRef is reset (so the + // elevation delta across the pause is not banked as a climb). + const manualPauses = (opts && opts.pauses ? opts.pauses : []) + .map(z => ({ s: z.startTs, e: z.endTs })).filter(z => z.s != null && z.e != null); + const inManualPause = (aMs, bMs) => manualPauses.some(z => aMs < z.e && bMs > z.s); + const MAX_GRADE = GPS.config.maxRealGradePct ?? 1.0; // 1.0 = 100% = 45°; steeper adjacent alt step = glitch + let pausedSec = 0; + // 5-point moving average on altitude to kill GPS jitter (typically 5-15m noise) // Step 1: Extract raw altitudes and filter outliers. // An outlier is a point that jumps far from its neighbors and returns back — @@ -203,6 +213,11 @@ GPS.computeStats = function(points, weightKg, opts) { let dt = (new Date(p.ts) - new Date(prev.ts)) / 1000; let v = dt > 0 ? d / dt : 0; // m/s + // Manual pause: exclude entirely (walked, not ridden). Reset elevRef so the + // elevation gained during the pause isn't banked on the next real segment. + let prevMs = new Date(prev.ts).getTime(), pMs = new Date(p.ts).getTime(); + if (inManualPause(prevMs, pMs)) { pausedSec += Math.max(0, dt); elevRef = null; continue; } + let isEstimated = (sorted[i].accuracy >= 999) || sorted[i].estimated; let segMaxMs = isBike ? (GPS.config.maxSpeedKmh / 3.6) : (GPS.config.walkMaxSpeedKmh / 3.6); let gapThr = GPS.config.gapThresholdSec ?? 30; @@ -239,10 +254,17 @@ GPS.computeStats = function(points, weightKg, opts) { // climbs. Accumulate the rise/fall from the reference and only bank it (and // advance the reference) once it clears the 1 m dead zone. if (smoothedAlt[i] != null) { - if (elevRef == null) elevRef = smoothedAlt[i]; - let rise = smoothedAlt[i] - elevRef; - if (rise > 1) { elevGain += rise; elevRef = smoothedAlt[i]; } - else if (rise < -1) { elevLoss += -rise; elevRef = smoothedAlt[i]; } + // Reject a physically impossible adjacent altitude step (glitch — incl. an + // Android no-fix 0.0): grade over the segment steeper than MAX_GRADE (45°). + // A smooth change to any value (e.g. a real 0 near a river) passes. + let prevAlt = smoothedAlt[i - 1]; + let glitch = prevAlt != null && segDist > 0 && Math.abs(smoothedAlt[i] - prevAlt) / segDist > MAX_GRADE; + if (!glitch) { + if (elevRef == null) elevRef = smoothedAlt[i]; + let rise = smoothedAlt[i] - elevRef; + if (rise > 1) { elevGain += rise; elevRef = smoothedAlt[i]; } + else if (rise < -1) { elevLoss += -rise; elevRef = smoothedAlt[i]; } + } } } @@ -353,7 +375,7 @@ GPS.computeStats = function(points, weightKg, opts) { const first = new Date(sorted[0].ts); const last = new Date(sorted[sorted.length - 1].ts); - const duration = (last - first) / 1000; + const duration = Math.max(0, (last - first) / 1000 - pausedSec); // exclude manual-pause time const avgSpeed = duration > 0 ? (distance / duration) : 0; const avgSpeedKmh = avgSpeed * 3.6; const maxSpeedKmh = maxSpeed * 3.6; @@ -991,10 +1013,11 @@ GPS.recoverSession = async function() { chainringTeeth: s.chainringTeeth, cogTeeth: s.cogTeeth, wheelDiameterInch: s.wheelDiameterInch, + pauses: s.pauses || [], }; const stats = GPS.computeStats(pts, s.weightKg || 80, recoverOpts); await DB.finishGpsSession(s.sessionId, new Date().toTimeString().slice(0, 5), - stats.distance, stats.kcal, stats.avgSpeed, stats.maxSpeed, stats.elevGain, stats.elevLoss); + stats.distance, stats.kcal, stats.avgSpeed, stats.maxSpeed, stats.elevGain, stats.elevLoss, s.pauses || []); // Store bike_id if present if (s.bikeId) await DB.updateSessionBike(s.sessionId, s.bikeId); console.log("[GPS] Recovered session", s.sessionId, "with", pts.length, "points"); @@ -1171,6 +1194,8 @@ GPS.stopRecording = async function() { cogTeeth: GPS.recording.cogTeeth, wheelDiameterInch: GPS.recording.wheelDiameterInch, }; + const recPauses = GPS.recording.pauses || []; + recOpts.pauses = recPauses; const stats = GPS.computeStats(GPS.recording.points, GPS.recording.weightKg, recOpts); const endTime = new Date().toTimeString().slice(0, 5); @@ -1178,7 +1203,7 @@ GPS.stopRecording = async function() { await DB.finishGpsSession( GPS.recording.sessionId, endTime, stats.distance, stats.kcal, stats.avgSpeed, stats.maxSpeed, - stats.elevGain, stats.elevLoss + stats.elevGain, stats.elevLoss, recPauses ); // DB save confirmed — now safe to delete the points file if (nativePointsFile) { @@ -1710,6 +1735,8 @@ GPS.recalculateSession = async function(sessionId, opts) { const CRR_MAP = { asphalt: 0.004, mixed: 0.006, gravel: 0.008 }; // Use cleaned sorted array, not original points + const sessPauses = Array.isArray(session.pauses) ? session.pauses + : (typeof session.pauses === "string" ? (() => { try { return JSON.parse(session.pauses); } catch { return []; } })() : []); const stats = GPS.computeStats(sorted, weightKg, { bikeWeightKg: bike?.weight_kg ?? 0, activityType: session.activity_type ?? "bike", @@ -1718,13 +1745,14 @@ GPS.recalculateSession = async function(sessionId, opts) { chainringTeeth: bike?.chainring_teeth, cogTeeth: bike?.cog_teeth, wheelDiameterInch: bike?.wheel_diameter_inch, + pauses: sessPauses, }); - // Update session in DB + // Update session in DB (preserve pauses) await DB.finishGpsSession(sessionId, session.end_time ?? session.start_time, stats.distance, stats.kcal, stats.avgSpeed, stats.maxSpeed, - stats.elevGain, stats.elevLoss + stats.elevGain, stats.elevLoss, sessPauses ); return stats; @@ -1760,6 +1788,8 @@ GPS.recomputeAllStats = async function(onProgress) { const points = await DB.getGpsPoints(sid); if (points.length < 2) { skipped++; continue; } const bike = session.bike_id ? await DB.getBike(session.bike_id) : await DB.getActiveBike(); + const bulkPauses = Array.isArray(session.pauses) ? session.pauses + : (typeof session.pauses === "string" ? (() => { try { return JSON.parse(session.pauses); } catch { return []; } })() : []); const stats = GPS.computeStats(points, weightKg, { bikeWeightKg: bike?.weight_kg ?? 0, activityType: session.activity_type ?? "bike", @@ -1768,9 +1798,10 @@ GPS.recomputeAllStats = async function(onProgress) { chainringTeeth: bike?.chainring_teeth, cogTeeth: bike?.cog_teeth, wheelDiameterInch: bike?.wheel_diameter_inch, + pauses: bulkPauses, }); await DB.finishGpsSession(sid, session.end_time ?? session.start_time, - stats.distance, stats.kcal, stats.avgSpeed, stats.maxSpeed, stats.elevGain, stats.elevLoss); + stats.distance, stats.kcal, stats.avgSpeed, stats.maxSpeed, stats.elevGain, stats.elevLoss, bulkPauses); updated++; } catch (e) { console.error(`[recalc-all] ${sid} failed`, e); skipped++; } } diff --git a/frontend/js/main.js b/frontend/js/main.js index 620e29f..421e333 100644 --- a/frontend/js/main.js +++ b/frontend/js/main.js @@ -4541,14 +4541,16 @@ async function showSessionDetail(sessionId) { elevGain: Math.round(session.elevation_gain_m || 0), elevLoss: Math.round(session.elevation_loss_m || 0), duration: 0, - } : GPS.computeStats(points, state.latestWeight?.weight_kg ?? state.profile?.weight_kg ?? 80); - // Compute duration from points regardless + } : GPS.computeStats(points, state.latestWeight?.weight_kg ?? state.profile?.weight_kg ?? 80, { pauses: session.pauses || [] }); + // Manual-pause total (ms) to exclude from displayed duration + let pauseMs = (session.pauses || []).reduce((a, z) => a + Math.max(0, (z.endTs || 0) - (z.startTs || 0)), 0); + // Compute duration from points regardless (minus manual pauses) if (points.length >= 2) { - stats.duration = Math.round((new Date(points[points.length-1].ts) - new Date(points[0].ts)) / 1000); + stats.duration = Math.max(0, Math.round((new Date(points[points.length-1].ts) - new Date(points[0].ts)) / 1000 - pauseMs / 1000)); } // Always compute segments from points (needed for the Segments section) if (!stats.segments && points.length >= 3) { - let fullStats = GPS.computeStats(points, state.latestWeight?.weight_kg ?? state.profile?.weight_kg ?? 80); + let fullStats = GPS.computeStats(points, state.latestWeight?.weight_kg ?? state.profile?.weight_kg ?? 80, { pauses: session.pauses || [] }); stats.segments = fullStats.segments; } @@ -4600,6 +4602,7 @@ async function showSessionDetail(sessionId) { showModal(`

${actName}

+
ID: ${session.id}
Время
@@ -5158,6 +5161,10 @@ async function showSessionDetail(sessionId) { let exp = document.querySelector("#sd-export"); if (exp) exp.onclick = () => GPS.exportGPX(sessionId); + // Track ID — click to copy to clipboard + let idEl = document.querySelector("#sd-track-id"); + if (idEl) idEl.onclick = () => copyToClipboard(String(sessionId), "ID скопирован: " + sessionId); + // Chart fullscreen in modal — push to winStack, back collapses document.querySelectorAll(".chart-wrap").forEach(wrap => { wrap.onclick = () => { @@ -7561,6 +7568,23 @@ function showToast(msg, duration) { setTimeout(hide, duration || 6000); } +// Copy text to clipboard (navigator.clipboard with a hidden-textarea fallback for +// WebViews where the async API is unavailable). Optional toast on success. +function copyToClipboard(text, toastMsg) { + let ok = () => { if (toastMsg) showToast(toastMsg); }; + let fallback = () => { + try { + let ta = document.createElement("textarea"); + ta.value = text; ta.style.position = "fixed"; ta.style.opacity = "0"; + document.body.appendChild(ta); ta.focus(); ta.select(); + document.execCommand("copy"); ta.remove(); ok(); + } catch (e) { showToast("Не удалось скопировать"); } + }; + if (navigator.clipboard && navigator.clipboard.writeText) { + navigator.clipboard.writeText(text).then(ok).catch(fallback); + } else fallback(); +} + function esc(str) { return String(str ?? "") .replace(/&/g, "&").replace(/ write null, not 0.0: Android returns 0.0 when hasAltitude() + // is false, and a fake 0 corrupts elevation stats. A real fixed 0 is kept. + val altStr = if (location.hasAltitude()) location.altitude.toString() else "null" + val line = """{"lat":${location.latitude},"lon":${location.longitude},"alt":${altStr},"speed":${location.speed},"acc":${location.accuracy},"bearing":${bearing},"ts":${now}${sensorData}}""" synchronized(bufferLock) { pointBuffer.add(line) } From 9f8ab0eeb101e87c95cef9bd808a5fa46f357ea9 Mon Sep 17 00:00:00 2001 From: 4aiman Date: Mon, 7 Sep 2026 15:50:19 +0300 Subject: [PATCH 2/5] GPS model: accel-based Crr scale, auto walk-the-bike split; document climb/elevation limits Acted on docs/gps-model-findings.md (independent analysis of 156 rides). Implemented: - crrFromAccel extended past the old 0.008 ceiling: 7-11 -> 0.008, 11-15 -> 0.012 (packed dirt), >15 -> 0.020 (grass/rut/gravel). Rough surfaces were undercounted ~3x. Applied to session median and per-point Crr. - Auto walk-the-bike detection (single-speed only, gear_count 1/unset): a normal-fix segment slower than the 30-rpm-cadence speed is the rider pushing, not riding. Excluded from ride distance/speed/elevation (elevRef reset so a pushed climb doesn't merge with the ridden one); effort counted as walking, not bike physics. Every sub-threshold point excluded regardless of duration; only runs >=30s reported as walked (walkBikeSec/walkBikeMeters). gearCount threaded through every computeStats/finish caller. Documented as known limitations (left as-is by decision, need calibration/DEM): - kcal max(physics, MET) never sums the biological overhead, so climbs are slightly undercounted (comment + README + PROJECT_MAP). - absolute elevation gain is bounded by the raw GPS altimeter (tens of percent; needs a terrain model / wired DEM preload). --- PROJECT_MAP.md | 20 +++++- README.md | 2 +- .../2026-09-07_gps-model-findings-impl.md | 40 +++++++++++ frontend/js/gps.js | 69 +++++++++++++++++-- frontend/js/main.js | 2 + 5 files changed, 125 insertions(+), 8 deletions(-) create mode 100644 docs/session-logs/2026-09-07_gps-model-findings-impl.md diff --git a/PROJECT_MAP.md b/PROJECT_MAP.md index e0883a2..beec2d2 100644 --- a/PROJECT_MAP.md +++ b/PROJECT_MAP.md @@ -177,17 +177,29 @@ ``` Power = v * (m*g*sin(gradient) + Crr*m*g*cos(gradient) + 0.5*CdA*rho*v^2) m = rider_kg + bike_kg; gradient из СГЛАЖЕННОЙ высоты - Crr = 0.004 (асфальт) / 0.006 (смешанный) / 0.008 (грунт) + Crr (ручной surface_type): 0.004 асфальт / 0.006 смешанный / 0.008 грунт + Crr по акселерометру (crrFromAccel, если есть accel_rms >10 точек): <3=0.004, 3-7=0.006, + 7-11=0.008, 11-15=0.012 (плотный грунт), >15=0.020 (трава/колея/щебень). Прежний потолок 0.008 + занижал грунты ~3x (замер: трава требует 0.020-0.031). Мапится и медиана сессии, и каждая точка (ptCrr). CdA = 0.6, rho = 1.225, efficiency = 0.25 Педалирование (power>0): kcal = max(физика, MET-нетто), физика = power*dt/(0.25*4184) MET по скорости: <16км/ч=6.0, <19=6.8, <22=8.0, <25=10.0, <28=12.0, иначе 14.0 MET-нетто = (dt/60)*((MET-1)*3.5*weight)/200 (−1 MET покоя, он уже в BMR) Floor только при v≥5км/ч (ниже — дрожание GPS, не езда) + ИЗВЕСТНОЕ ОГРАНИЧЕНИЕ (по решению не правим, нужна калибровка): max() не СКЛАДЫВАЕТ — + на подъёмах физика выигрывает, а накладные (баланс/стабилизация корпуса, без внешней работы, + их ловит MET-этаж) теряются. Направление ошибки известно: подъёмы недосчитаны (по поездке ~1.34x + MET/физика, но равнина 1.85x, подъём 0.41x). Честный фикс = физика/КПД + накладные, отложен. Накат / freewheel (power≤0, «велик катился бы сам»): kcal = базальный метаболизм (детектор кручу/накат по IMU-каденсу проверен на 50Hz — сигнал слишком слаб, не используется; хук cadence_rpm — под BLE-датчик шатуна) Набор высоты: кумулятивный гистерезис (elevRef, порог 1м) — на плотных треках per-point разница <1м даёт 0 + ИЗВЕСТНОЕ ОГРАНИЧЕНИЕ (по решению не правим): абсолютный набор по сырому GPS-альтиметру расходится + с независимым пересчётом в ОБЕ стороны (медиана разброса высоты между проездами одной точки ~10м). + Без модели рельефа (DEM) не разрешается. Реальный фикс — предзагрузка DEM по району дома по проводу + (кнопка «уточнить высоты» → GPXZ работает, но требует сети, а РЭБ/РКН глушат в поле). Пока: набор + имеет точность порядка десятков процентов, на расчёт мощности влияет слабо (там уклон по окну, ограничен сверху). ``` ### Дистанция по сегментам (computeStats, gps.js ~189-235) @@ -205,6 +217,12 @@ distance += segDist; высота/maxSpeed — только на «норме»; Глюк-гард высоты: соседний сглаженный перепад с грейдом > maxRealGradePct (1.0 = 100% = 45°) не банкуется и не двигает elevRef (скачок/ступенька, в т.ч. Android no-fix 0.0). Плавный приход к любому значению (реальный 0 у реки) проходит. Kotlin пишет "alt":null без фикса высоты (hasAltitude()), честный 0 с фиксом сохраняется. Паузы: колонка gps_sessions.pauses (JSON). +Пеший пуш велосипеда (только односкоростной, gear_count 1 или пусто + есть звезда/трещотка/колесо): + на фиксированной передаче каденс <30 об/мин = велик не едет, его ведут. Порог скорости walkBikeMs = 30*wheelCirc*gearRatio/60. + Сегмент медленнее порога (нормальный фикс, не гэп) исключается из ездовой дистанции/скорости/высоты (elevRef=null — пеший + подъём не склеивается с ездовым), усилие считается как ходьба (walk-MET нетто), не по физике. #7: исключается КАЖДАЯ такая точка + без оглядки на длительность (краткие торможения тоже, безвредно ~0м); в отчёт как «пешком» идут только сплошные пробеги ≥30с. + Возврат computeStats: walkBikeSec (время пуша ≥30с-пробегами), walkBikeMeters (пешая дистанция). opts.gearCount прокинут во все вызовы. ``` ### Ходьба/бег — MET-таблица diff --git a/README.md b/README.md index e5e43a2..ce19f55 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ - **Дневник питания** — ~13000 продуктов с меткой источника (Магнит, 5ка, ИОН, KDV, Гриднев, свои). Поиск порядко-независимый (слова в любом порядке). Каталог чистится от неиспользованного импорта без метки (health-diet и пр.) кнопкой в настройках — съеденные и в рецептах сохраняются. 37 нутриентов (витамины, минералы, omega-3/6, вода, клетчатка). Рецепты с термообработкой. Формулы порций (4*30, 300+50). - **GPS трекинг** — запись маршрутов на велосипеде/пешком в фоне (foreground service, точки пишутся при выключенном экране; один файл на сессию с id сессии в имени `gps_points__s.jsonl` для однозначной привязки, переживает START_STICKY-перезапуск ОС; полный до-импорт нативных точек по timestamp при финализации — без потерь, даже если экран был выключен всю запись, а при пробуждении экрана точки видимо нарастают на карте по мере импорта). При живой записи нативный файл — источник истины для БД, watchPosition только рисует маркер (без дублей одного фикса с разными ts). Восстановление точек из файлов на устройстве — матч файла к сессии по id/дате, дозаполнение разрывов с дедупом по близости ±2.5с, безопасный пересчёт без удаления точек, чистка уже импортированных файлов. Оффлайн карты (Leaflet + IndexedDB кэш). Импорт GPX/FTB (FitoTrack). Экспорт GPX. Фильтр altitude outlier'ов и GPS-залипаний. Отбор точек по точности (жёсткий порог по настройке «Мин. точность» — рубит грубые сотовые фиксы ~800м, оставляет слабый но точный GPS; где сигнала нет — честный разрыв). Направление (bearing) каждой точки пишется в БД. Вращение карты по компасу (leaflet-rotate, EMA-сглаживание, gimbal lock компенсация) и course-up по GPS-курсу (в ландшафте карта доворачивается вместе с экраном — курс к физическому верху). Ландшафтный режим (CSS rotation + панель справа, 3 режима: off/auto/lock). Dead reckoning при потере GPS (гироскоп + акселерометр). Placeholder до GPS (пиксельарт). Карта проезженных дорог (дедупликация 2м, вело/пешие). Настраиваемый цвет линии трека (чтобы отличать от цветных дорог). Навигационный маркер позиции с треугольником-направленцем (по компасу или GPS-курсу); порядок слоёв тайлы<дороги<маршрут<трек<маркер. Импорт тайлов по регионам (SQLite, роутер LAN). - **BLE пульсометр** — подключение к FitPro браслетам и стандартным HR датчикам (0x180D). ЧСС, SpO2, давление в реальном времени при записи трека. -- **Расчёт ккал** — велосипед: НЕТТО-модель (суточный баланс уже учитывает BMR, поэтому активность считается сверх покоя). Кручение = max(физика мощности из gradient+Crr+CdA / КПД, эмпирический MET-нетто по скорости); накат (freewheel, `power≤0` — «велик катился бы сам») = только базовый обмен. MET-таблица для ходьбы/бега и тренировок (приседания 6.0, скакалка 12.3, растяжки 2.3, бассейн 8.0). Набор высоты — кумулятивный гистерезис (устойчив на плотных треках, где per-point разница <1м). Пункт меню «Пересчитать высоту/калории» пересчитывает статистику всех треков без изменения точек. Профили велосипедов. BMR по Mifflin-St Jeor с коэффициентом активности. +- **Расчёт ккал** — велосипед: НЕТТО-модель (суточный баланс уже учитывает BMR, поэтому активность считается сверх покоя). Кручение = max(физика мощности из gradient+Crr+CdA / КПД, эмпирический MET-нетто по скорости); накат (freewheel, `power≤0` — «велик катился бы сам») = только базовый обмен. Crr на грунтах уточняется по вибрации акселерометра (до 0.020 на траве/колее). Ходьба с велосипедом в горку (только односкоростной) отделяется автоматически по скорости ниже каденса 30 об/мин и не засчитывается как езда. MET-таблица для ходьбы/бега и тренировок (приседания 6.0, скакалка 12.3, растяжки 2.3, бассейн 8.0). Набор высоты — кумулятивный гистерезис (устойчив на плотных треках, где per-point разница <1м); абсолютная точность набора ограничена сырым GPS-альтиметром (порядка десятков процентов, без модели рельефа не разрешается). Известное ограничение: `max(физика, MET)` не складывает накладные расходы, поэтому подъёмы по ккал слегка недосчитываются. Пункт меню «Пересчитать высоту/калории» пересчитывает статистику всех треков без изменения точек. Профили велосипедов. BMR по Mifflin-St Jeor с коэффициентом активности. - **Дистанция на разрывах GPS** — на «слепых» участках (интервал между фиксами > `gapThresholdSec`) путь считается по скорости (speed×dt, с ограничением по макс. скорости), а не прямой хордой — иначе разрывы занижают/искажают длину. Телепорт-скачки без временного разрыва отбрасываются. Расчёт зависит только от времени и скорости, поэтому live-счётчик, «Стоп» и пересчёт дают одинаковую длину. Порог `gapThresholdSec` настраивается; при изменении и пересчёте применяется сразу. - **Тренировки** — приседания (подходы x повторения), скакалка, растяжки, бассейн (дистанция). Автоматический расчёт ккал по MET и весу. - **Нутриенты** — 37 микронутриентов (витамины, минералы, жирные кислоты, женьшень, ресвератрол, CoQ10). Нормы РСП/АУП (РФ/ЕС/США). Фармакокинетика — запасы в организме по полураспаду. diff --git a/docs/session-logs/2026-09-07_gps-model-findings-impl.md b/docs/session-logs/2026-09-07_gps-model-findings-impl.md new file mode 100644 index 0000000..e56dfe0 --- /dev/null +++ b/docs/session-logs/2026-09-07_gps-model-findings-impl.md @@ -0,0 +1,40 @@ +# Сессия 2026-09-07: реализация находок по расчётной модели GPS + +## Контекст +Разобрали `docs/gps-model-findings.md` (вывод независимого инструмента `tools/track/track.py` +по 156 поездкам). Пользователь принял решения по каждой находке. Плана в plan-mode не было — +работали по прямым решениям пользователя, зафиксированным ниже. + +## Решения пользователя и что сделано +- **#1 Crr-потолок 0.008 занижен → внедряем.** `crrFromAccel` в gps.js расширен: 7-11=0.008, + 11-15=0.012 (плотный грунт), >15=0.020 (трава/колея). Мапится и медиана сессии, и per-point ptCrr. +- **#2 max(физика,MET) не складывает, подъёмы недосчитаны → только пометить.** Не меняем формулу: + добавлен комментарий у `Math.max(physicsKcal, metNetKcal)` (ИЗВЕСТНОЕ ОГРАНИЧЕНИЕ, нужна калибровка), + записано в README и PROJECT_MAP. +- **#3+#7 ходьба с велосипедом как езда → внедряем.** computeStats: для односкоростного + (`gearCount` 1/пусто + звезда/трещотка/колесо) порог walkBikeMs = 30 об/мин; сегмент медленнее + порога (нормальный фикс) исключается из ездовой дистанции/скорости/высоты (elevRef=null), + усилие = walk-MET нетто. #7: исключается каждая точка без гейта по длительности, в отчёт «пешком» + только пробеги ≥30с. Возврат: walkBikeSec/walkBikeMeters. `gearCount` прокинут во все вызовы + (live-stop, recalculateSession, recovery, bulk, main.js старт записи + detail). Время пуша ≥30с + вычитается из duration (средняя скорость остаётся чисто ездовой). +- **#4 набор высоты расходится в обе стороны → только пометить.** Не код: записано в README и + PROJECT_MAP (предел сырого GPS-альтиметра, реальный фикс — предзагрузка DEM по проводу). +- **#5/#6** — к сведению (пульс потерян браслет; ветер в track.py, не в приложении). + +## Ветер (часть 2 доки) +Пользователь: калории от неточного ветра не считать. Хочет простые отслеживаемые вещи — голосовые +метки («ветер в лицо») и/или кнопки в UI (нажал когда дует в лицо, отжал когда перестал), писать +данные и делать выводы после набора километража. Это вариант 5 в роли РАЗМЕТКИ, не измерения. +Трубка Пито (вариант 3) — точно нет. Вариант 2 (предзагрузка прогноза) — пользователь не понял, +нужно объяснить. Реализация ветер-фичи — отдельным шагом (нужны решения по UX: триггер-слова, +место кнопки, схема хранения событий). + +## Результат +Модельные правки #1/#3/#7 внедрены, #2/#4 задокументированы. `node --check` чист по всем файлам. +Собрано и поставлено ранее build 436 (только правки пауз/высоты); эти правки требуют новой сборки. + +## Следующие шаги +- Собрать/поставить новую сборку, проверить: на грунтах ккал выше; пеший подъём на односкоростном + не в ездовой статистике и не склеивается с ездовым подъёмом. +- Ветер: спроектировать и внедрить разметку событий (голос/кнопки). diff --git a/frontend/js/gps.js b/frontend/js/gps.js index aeed8f6..dda7441 100644 --- a/frontend/js/gps.js +++ b/frontend/js/gps.js @@ -181,15 +181,21 @@ GPS.computeStats = function(points, weightKg, opts) { const rho = GPS.config.airDensity ?? 1.225; const efficiency = (GPS.config.pedalEfficiency ?? 25) / 100; // Rolling resistance: base from surface type, corrected by tire pressure. - // If accelerometer data available, estimate Crr from vibration (accel RMS): - // RMS < 3 → smooth asphalt (0.004), 3-7 → mixed (0.006), > 7 → gravel (0.008) + // If accelerometer data available, estimate Crr from vibration (accel RMS). + // Scale (lower bound of a back-solve on measured tracks — better to undercount): + // RMS < 3 → 0.004 smooth asphalt | 11-15 → 0.012 packed dirt + // 3-7 → 0.006 mixed | > 15 → 0.020 grass / rut / gravel + // 7-11 → 0.008 broken asphalt + // The old ceiling of 0.008 (gravel) undercounted rough surfaces ~3x: measured + // grass+tractor-rut needs 0.020-0.031, packed dirt 0.012. crrFromAccel maps both + // the session median (default Crr) and each point (ptCrr below) through this scale. + const crrFromAccel = (rms) => rms < 3 ? 0.004 : rms < 7 ? 0.006 : rms < 11 ? 0.008 : rms < 15 ? 0.012 : 0.020; let baseCrr = opts?.surfaceCrr ?? 0.006; const accelVals = sorted.map(p => p.accel_rms).filter(v => v != null && v > 0); if (accelVals.length > 10) { accelVals.sort((a, b) => a - b); const medianAccel = accelVals[Math.floor(accelVals.length / 2)]; - const accelCrr = medianAccel < 3 ? 0.004 : medianAccel < 7 ? 0.006 : 0.008; - baseCrr = accelCrr; // override with sensor-based estimate + baseCrr = crrFromAccel(medianAccel); // override with sensor-based estimate } const tirePressure = opts?.tirePressureBar ?? 3.0; const Crr = baseCrr * Math.sqrt(3.0 / tirePressure); @@ -207,6 +213,20 @@ GPS.computeStats = function(points, weightKg, opts) { const wheelCirc = hasGearData ? Math.PI * opts.wheelDiameterInch * 0.0254 : 0; // meters const gearRatio = hasGearData ? opts.chainringTeeth / opts.cogTeeth : 0; + // Walking the bike (single-speed only). On a fixed ratio, below ~30 rpm cadence + // the bike can't stay upright — so a sustained sub-30-rpm speed means the rider + // is pushing it, not riding. speed = cadence * distance-per-crank-rev. + // distance-per-rev = wheelCirc * gearRatio; at 30 rpm → walkBikeMs m/s. + // Only for single-speed (gear_count 1 or unset): on a geared bike low speed proves + // nothing (accelerometer can't tell pushing from riding — measured). Sub-threshold + // segments are excluded from ride distance/speed/elevation so a pushed climb doesn't + // merge with the ridden one; the effort is counted as walking, not bike physics. + const gearCount = opts?.gearCount; + const singleSpeed = isBike && hasGearData && (gearCount == null || gearCount <= 1); + const walkBikeMs = singleSpeed ? (30 * wheelCirc * gearRatio) / 60 : 0; + let walkBikeSec = 0, walkBikeDist = 0; // reported total (only runs ≥30s, see #7) + let wbRunSec = 0, wbRunDist = 0; // current contiguous push run + for (let i = 1; i < sorted.length; i++) { let p = sorted[i], prev = sorted[i - 1]; let d = GPS.distance(prev.lat, prev.lon, p.lat, p.lon); @@ -245,6 +265,24 @@ GPS.computeStats = function(points, weightKg, opts) { // altitude and max-speed stats; gap and spike segments do not. let normalMove = !isGap && !isSpike && dt > 0; + // Walking the bike (single-speed): a normal-fix segment slower than the 30-rpm + // speed. Exclude it from ride distance/speed/elevation (elevRef reset breaks the + // pushed-vs-ridden climb merge) and count the effort as walking, not bike physics. + // Per #7: exclude EVERY such point regardless of duration (brief brake-to-stops + // land here too — harmless, ~0 m and low cost); accumulate contiguous runs and + // only report those ≥30s as "walked" (a stop before a pothole isn't walking). + if (walkBikeMs > 0 && normalMove && v > 0 && v < walkBikeMs) { + wbRunSec += dt; wbRunDist += segDist; + elevRef = null; + const wKmh = v * 3.6; + const wmet = wKmh < 4 ? 2.5 : wKmh < 5.5 ? 3.5 : wKmh < 7 ? 5.0 : 8.0; + totalKcal += (dt / 60) * ((wmet - 1) * 3.5 * wKg) / 200; // NET (BMR booked in daily balance) + continue; + } + // Not (or no longer) pushing → flush a completed push run into the reported total. + if (wbRunSec >= 30) { walkBikeSec += wbRunSec; walkBikeDist += wbRunDist; } + wbRunSec = 0; wbRunDist = 0; + if (segDist > 0) distance += segDist; if (normalMove) { speeds.push(v); @@ -297,7 +335,7 @@ GPS.computeStats = function(points, weightKg, opts) { // Per-point Crr from accelerometer (if available), else session-wide Crr const ptAccel = sorted[i].accel_rms; const ptCrr = (ptAccel != null && ptAccel > 0) - ? (ptAccel < 3 ? 0.004 : ptAccel < 7 ? 0.006 : 0.008) * Math.sqrt(3.0 / tirePressure) + ? crrFromAccel(ptAccel) * Math.sqrt(3.0 / tirePressure) : Crr; // Power required (watts): gravity + rolling resistance + aerodynamic drag @@ -332,6 +370,12 @@ GPS.computeStats = function(points, weightKg, opts) { if (vKmh >= 5) { const met = vKmh < 16 ? 6.0 : vKmh < 19 ? 6.8 : vKmh < 22 ? 8.0 : vKmh < 25 ? 10.0 : vKmh < 28 ? 12.0 : 14.0; const metNetKcal = (dt / 60) * ((met - 1) * 3.5 * wKg) / 200; + // KNOWN LIMITATION (measured, left as-is by decision): max() never SUMS the + // two, so on climbs — where physics wins big — the biological overhead the + // MET floor captures (balancing, core stabilisation, no external work) is + // dropped. Direction of the error is known: climbs are undercounted (whole- + // ride ~1.34x MET/physics, but flat 1.85x and climb 0.41x). A principled fix + // (physics/eff + overhead) needs calibration, so it is deferred, not applied. totalKcal += Math.max(physicsKcal, metNetKcal); } else { totalKcal += physicsKcal; // creeping < 5 km/h: negligible @@ -362,6 +406,9 @@ GPS.computeStats = function(points, weightKg, opts) { } } + // Flush a push run still open at the track's end. + if (wbRunSec >= 30) { walkBikeSec += wbRunSec; walkBikeDist += wbRunDist; } + // 9-point smoothed speeds for maxSpeed (kills spikes from GPS noise) let maxSpeed = 0; for (let i = 0; i < speeds.length; i++) { @@ -375,7 +422,9 @@ GPS.computeStats = function(points, weightKg, opts) { const first = new Date(sorted[0].ts); const last = new Date(sorted[sorted.length - 1].ts); - const duration = Math.max(0, (last - first) / 1000 - pausedSec); // exclude manual-pause time + // Exclude manual-pause time and sustained bike-push time — both keep avgSpeed + // (distance/duration) a pure riding figure, consistent with the excluded distance. + const duration = Math.max(0, (last - first) / 1000 - pausedSec - walkBikeSec); const avgSpeed = duration > 0 ? (distance / duration) : 0; const avgSpeedKmh = avgSpeed * 3.6; const maxSpeedKmh = maxSpeed * 3.6; @@ -481,6 +530,8 @@ GPS.computeStats = function(points, weightKg, opts) { duration: Math.round(duration), avgCadence, segments, + walkBikeSec: Math.round(walkBikeSec), // time spent pushing the bike (single-speed, ≥30s runs) + walkBikeMeters: Math.round(walkBikeDist), // distance walked pushing it (excluded from ride distance) }; }; @@ -930,6 +981,7 @@ GPS._persistState = function() { chainringTeeth: GPS.recording.chainringTeeth ?? null, cogTeeth: GPS.recording.cogTeeth ?? null, wheelDiameterInch: GPS.recording.wheelDiameterInch ?? null, + gearCount: GPS.recording.gearCount ?? null, })); } catch {} }; @@ -1013,6 +1065,7 @@ GPS.recoverSession = async function() { chainringTeeth: s.chainringTeeth, cogTeeth: s.cogTeeth, wheelDiameterInch: s.wheelDiameterInch, + gearCount: s.gearCount, pauses: s.pauses || [], }; const stats = GPS.computeStats(pts, s.weightKg || 80, recoverOpts); @@ -1193,6 +1246,7 @@ GPS.stopRecording = async function() { chainringTeeth: GPS.recording.chainringTeeth, cogTeeth: GPS.recording.cogTeeth, wheelDiameterInch: GPS.recording.wheelDiameterInch, + gearCount: GPS.recording.gearCount, }; const recPauses = GPS.recording.pauses || []; recOpts.pauses = recPauses; @@ -1232,6 +1286,7 @@ GPS.stopRecording = async function() { GPS.recording.chainringTeeth = null; GPS.recording.cogTeeth = null; GPS.recording.wheelDiameterInch = null; + GPS.recording.gearCount = null; GPS._clearPersistedState(); return { sessionId: sid, stats, pauses }; }; @@ -1745,6 +1800,7 @@ GPS.recalculateSession = async function(sessionId, opts) { chainringTeeth: bike?.chainring_teeth, cogTeeth: bike?.cog_teeth, wheelDiameterInch: bike?.wheel_diameter_inch, + gearCount: bike?.gear_count, pauses: sessPauses, }); @@ -1798,6 +1854,7 @@ GPS.recomputeAllStats = async function(onProgress) { chainringTeeth: bike?.chainring_teeth, cogTeeth: bike?.cog_teeth, wheelDiameterInch: bike?.wheel_diameter_inch, + gearCount: bike?.gear_count, pauses: bulkPauses, }); await DB.finishGpsSession(sid, session.end_time ?? session.start_time, diff --git a/frontend/js/main.js b/frontend/js/main.js index 421e333..a8c4026 100644 --- a/frontend/js/main.js +++ b/frontend/js/main.js @@ -2774,6 +2774,7 @@ async function renderGpsScreen(container) { GPS.recording.chainringTeeth = bike.chainring_teeth; GPS.recording.cogTeeth = bike.cog_teeth; GPS.recording.wheelDiameterInch = bike.wheel_diameter_inch; + GPS.recording.gearCount = bike.gear_count; } } await GPS.startRecording(type, wkg); @@ -4776,6 +4777,7 @@ async function showSessionDetail(sessionId) { bikeWeightKg: bike?.weight_kg ?? 0, activityType: session.activity_type ?? "bike", surfaceCrr: CRR[bike?.surface_type] ?? 0.006, tirePressureBar: bike?.tire_pressure_bar ?? 3.0, chainringTeeth: bike?.chainring_teeth, cogTeeth: bike?.cog_teeth, wheelDiameterInch: bike?.wheel_diameter_inch, + gearCount: bike?.gear_count, }); await DB.finishGpsSession(sessionId, session.end_time ?? session.start_time, st.distance, st.kcal, st.avgSpeed, st.maxSpeed, st.elevGain, st.elevLoss); From 2d23f3a47510911ee08f7d1f28fa6d92657e7826 Mon Sep 17 00:00:00 2001 From: 4aiman Date: Mon, 7 Sep 2026 17:10:16 +0300 Subject: [PATCH 3/5] Wind: "headwind in the face" label button on the recording screen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Variant 5 from the findings doc, as GROUND TRUTH for validating the from-track wind estimate — it does NOT feed kcal/power. Chosen scope (per user): a toggle button now, binary "in the face" only, voice later. - rec screen button "Ветер в лицо": tap opens a headwind interval, tap closes it; the open state is highlighted and survives a screen re-render - GPS.toggleWindMark()/_closeOpenWindMark(); recording.windMarks = [{startTs,endTs}] ms, persisted to localStorage, written to the DB on finish and restored on crash recovery (a dangling interval auto-closes) - gps_sessions.wind_marks (JSON) + DB.setSessionWindMarks (separate from finishGpsSession so recompute paths preserve marks); parsed in getGpsSession - rec-bottom wraps now so the third button never overflows a narrow screen Analysis (marks vs estimate) stays in tools/track once enough km accumulate. --- PROJECT_MAP.md | 6 ++- README.md | 1 + .../2026-09-07_gps-model-findings-impl.md | 23 +++++++---- frontend/css/styles.css | 1 + frontend/js/db.js | 10 +++++ frontend/js/gps.js | 41 +++++++++++++++++++ frontend/js/main.js | 10 +++++ 7 files changed, 83 insertions(+), 9 deletions(-) diff --git a/PROJECT_MAP.md b/PROJECT_MAP.md index beec2d2..73679fc 100644 --- a/PROJECT_MAP.md +++ b/PROJECT_MAP.md @@ -103,7 +103,7 @@ | `activity_log` | Лог активности | date, type, minutes, kcal, activity_type (squats/jumprope/stretch/swim/manual), sets, reps, distance_m | | `supplements` | Добавки (БАД) | name, daily_dose_g, витамины/минералы | | `supplement_log` | Приём добавок | date, supplement_id, dose_g | -| `gps_sessions` | GPS тренировки | date, activity_type, distance, kcal, speed, elevation, bike_id, smoothed, smooth_window, smooth_iters (де-джиттер), pauses (JSON ручных пауз) | +| `gps_sessions` | GPS тренировки | date, activity_type, distance, kcal, speed, elevation, bike_id, smoothed, smooth_window, smooth_iters (де-джиттер), pauses (JSON ручных пауз), wind_marks (JSON меток «ветер в лицо») | | `gps_points` | Точки трека | session_id, ts, lat, lon, altitude_gps_m, altitude_srtm_m, speed_ms, seq, bearing_deg, accuracy_m, lat_smoothed, lon_smoothed (обратимый де-джиттер), heart_rate, spo2, bp_sys, bp_dia, accel_rms/max, gyro_pitch/yaw | | `routes` | Сохранённые маршруты (оверлей навигации) | name, color, points_json (`{lat,lon,ele?}`), created_at | | `bikes` | Велосипеды | name, weight_kg, wheel, звёзды, surface_type, is_active | @@ -223,6 +223,10 @@ distance += segDist; высота/maxSpeed — только на «норме»; подъём не склеивается с ездовым), усилие считается как ходьба (walk-MET нетто), не по физике. #7: исключается КАЖДАЯ такая точка без оглядки на длительность (краткие торможения тоже, безвредно ~0м); в отчёт как «пешком» идут только сплошные пробеги ≥30с. Возврат computeStats: walkBikeSec (время пуша ≥30с-пробегами), walkBikeMeters (пешая дистанция). opts.gearCount прокинут во все вызовы. +Метки ветра (разметка, НЕ расчёт): кнопка «Ветер в лицо» на экране записи — тап открывает интервал встречного ветра, + тап закрывает. GPS.toggleWindMark()/_closeOpenWindMark(); GPS.recording.windMarks=[{startTs,endTs}] мс, персист в localStorage, + запись в БД (DB.setSessionWindMarks) на финише + восстановление в recovery. Колонка gps_sessions.wind_marks (JSON). Это ground + truth для проверки оценки ветра по треку (tools/track/track.py, wind_by_passes) — на distance/kcal/power НЕ влияет. Голос — потом. ``` ### Ходьба/бег — MET-таблица diff --git a/README.md b/README.md index ce19f55..24db5ac 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,7 @@ - **Высоты маршрута (рельеф до поездки)** — экран предпросмотра маршрута (тап по названию): профиль высоты (крутые участки красным), длина/набор/сброс/макс. уклон, тап по точке — высота и уклон, разворот карты на весь экран. Топографическая обводка линии с тогглом **уклон/высота**: уклон дискретными полосами по 1% (зелёный→жёлтый→красный→коричневый→чёрный, ≥10% чёрный) или гипсометрия по высоте (зелёный→жёлтый→коричневый). Обводка и тоггл доступны и в оверлее на карте записанного трека и во время записи; маршрут рисуется ПОД треком. Высоты (`` из GPX или онлайн) тянутся по цепочке: **GPXZ** (Copernicus GLO-30, точнее для уклонов; ключ в GPS-настройках, хранится только на устройстве) → open-elevation → open-meteo → OpenTopoData (без ключа). Калории пересчитываются по сглаженным точкам; для уклона высоты сглаживаются (гасит вертикальный шум SRTM). - **Редактор маршрутов** — создание («Новый маршрут») и правка сохранённого маршрута прямо в приложении: тап по карте — добавить точку в конец, тап по линии — вставить точку в это место, тащить точку — двигать, тап по точке — удалить. Высоты подтягиваются онлайн после отрисовки (из предпросмотра). - **Де-джиттер трека** — сглаживание дрожащего GPS-трека методом Савицкого-Голея (настраиваемое окно/число итераций, живое превью на карте детали трека). Хранится обратимо: оригинал и сглаженный вариант лежат раздельно, калории пересчитываются по сглаженным точкам, откат к оригиналу в один тап. Точность каждого фикса (`accuracy_m`) пишется в БД: при пересчёте трека точки хуже порога «Макс. погрешность GPS» исключаются из расчёта и линии (обратимо — точки в БД остаются; поднять порог = вернуть). Работает во всех пересчётах (кнопка «Пересчитать», «Пересчитать всё», после де-джиттера); импорт/старьё без точности и dead-reckoning заполнения не трогает. +- **Метки ветра** — кнопка «Ветер в лицо» на экране записи: тап открывает интервал встречного ветра, тап закрывает. Метки хранятся с треком (`wind_marks`) как эталон для проверки оценки ветра по треку; на расчёт калорий/мощности не влияют. Голосовые метки — на будущее. - **Экспорт/импорт** — свои продукты, рецепты и добавки одним файлом (JSON). - **Вес, сон, добавки** — логирование с историей. diff --git a/docs/session-logs/2026-09-07_gps-model-findings-impl.md b/docs/session-logs/2026-09-07_gps-model-findings-impl.md index e56dfe0..1166631 100644 --- a/docs/session-logs/2026-09-07_gps-model-findings-impl.md +++ b/docs/session-logs/2026-09-07_gps-model-findings-impl.md @@ -23,12 +23,18 @@ - **#5/#6** — к сведению (пульс потерян браслет; ветер в track.py, не в приложении). ## Ветер (часть 2 доки) -Пользователь: калории от неточного ветра не считать. Хочет простые отслеживаемые вещи — голосовые -метки («ветер в лицо») и/или кнопки в UI (нажал когда дует в лицо, отжал когда перестал), писать -данные и делать выводы после набора километража. Это вариант 5 в роли РАЗМЕТКИ, не измерения. -Трубка Пито (вариант 3) — точно нет. Вариант 2 (предзагрузка прогноза) — пользователь не понял, -нужно объяснить. Реализация ветер-фичи — отдельным шагом (нужны решения по UX: триггер-слова, -место кнопки, схема хранения событий). +Пользователь: калории от неточного ветра не считать. Хочет простые отслеживаемые вещи — метки +«ветер в лицо», писать данные и делать выводы после набора километража. Это вариант 5 в роли +РАЗМЕТКИ, не измерения. Трубка Пито (вариант 3) — точно нет. Вариант 2 (предзагрузка прогноза) — +объяснил (скачать прогноз дома по проводу как подсказку-затравку для оценки по треку; изъян тот же, +что у «уточнить высоты» — надо не забыть нажать перед выездом). + +Решения по UX (AskUserQuestion): кнопка-тоггл, голос потом; только «в лицо» (бинарно). Реализовано: +- кнопка «Ветер в лицо» на экране записи (тап открыть интервал / тап закрыть, активная подсвечена); +- GPS.toggleWindMark()/_closeOpenWindMark(); windMarks=[{startTs,endTs}] мс, персист в localStorage, + запись DB.setSessionWindMarks на финише, восстановление в recovery (недозакрытый интервал закрывается); +- колонка gps_sessions.wind_marks (JSON), парсинг в getGpsSession. На distance/kcal/power НЕ влияет. +- Анализ (сравнение меток с оценкой ветра по треку) — позже в tools/track/track.py, после километража. ## Результат Модельные правки #1/#3/#7 внедрены, #2/#4 задокументированы. `node --check` чист по всем файлам. @@ -36,5 +42,6 @@ ## Следующие шаги - Собрать/поставить новую сборку, проверить: на грунтах ккал выше; пеший подъём на односкоростном - не в ездовой статистике и не склеивается с ездовым подъёмом. -- Ветер: спроектировать и внедрить разметку событий (голос/кнопки). + не в ездовой статистике и не склеивается с ездовым подъёмом; кнопка «Ветер в лицо» пишет + интервалы в gps_sessions.wind_marks. +- Ветер: добавить голосовые метки (отдельным шагом); анализ меток vs оценка по треку в track.py. diff --git a/frontend/css/styles.css b/frontend/css/styles.css index 89b5c49..14faeec 100644 --- a/frontend/css/styles.css +++ b/frontend/css/styles.css @@ -1262,6 +1262,7 @@ select { .rec-bottom { display: flex; align-items: center; + flex-wrap: wrap; gap: 12px; padding: 8px 12px; padding-bottom: calc(8px + var(--safe-area-bottom)); diff --git a/frontend/js/db.js b/frontend/js/db.js index f337150..7968408 100644 --- a/frontend/js/db.js +++ b/frontend/js/db.js @@ -851,9 +851,17 @@ async function getGpsSession(id) { if (!rows.length) return null; const s = rows[0]; if (typeof s.pauses === "string") { try { s.pauses = JSON.parse(s.pauses); } catch { s.pauses = []; } } + if (typeof s.wind_marks === "string") { try { s.wind_marks = JSON.parse(s.wind_marks); } catch { s.wind_marks = []; } } return s; } +// Save headwind labels for a session (JSON). Kept separate from finishGpsSession so +// recompute paths preserve marks (they never call this). Marks are ground truth for +// the wind estimate — they do not affect distance/kcal/power. +async function setSessionWindMarks(id, marks) { + await execute("UPDATE gps_sessions SET wind_marks=?1 WHERE id=?2", [JSON.stringify(marks || []), id]); +} + async function getGpsPoints(sessionId) { return select("SELECT * FROM gps_points WHERE session_id = ?1 ORDER BY COALESCE(seq, 999999), ts ASC", [sessionId]); } @@ -1196,6 +1204,7 @@ window.DB.createGpsSession = createGpsSession; window.DB.addGpsPoint = addGpsPoint; window.DB.addGpsPointsBulk = addGpsPointsBulk; window.DB.finishGpsSession = finishGpsSession; +window.DB.setSessionWindMarks = setSessionWindMarks; window.DB.saveSmoothedTrack = saveSmoothedTrack; window.DB.setSessionSmoothed = setSessionSmoothed; window.DB.getGpsSessions = getGpsSessions; @@ -1538,6 +1547,7 @@ async function runMigrations() { if (!gsCols.includes("smooth_window")) await execute("ALTER TABLE gps_sessions ADD COLUMN smooth_window INTEGER"); if (!gsCols.includes("smooth_iters")) await execute("ALTER TABLE gps_sessions ADD COLUMN smooth_iters INTEGER"); if (!gsCols.includes("pauses")) await execute("ALTER TABLE gps_sessions ADD COLUMN pauses TEXT"); // JSON [{startTs,endTs,...}] manual pauses + if (!gsCols.includes("wind_marks")) await execute("ALTER TABLE gps_sessions ADD COLUMN wind_marks TEXT"); // JSON [{startTs,endTs}] headwind labels (ground truth for wind estimate) // Add tire_pressure_bar to bikes (for Crr correction by tire pressure) const bikeCols = (await select("PRAGMA table_info(bikes)")).map(r => r.name); diff --git a/frontend/js/gps.js b/frontend/js/gps.js index dda7441..c1c1c90 100644 --- a/frontend/js/gps.js +++ b/frontend/js/gps.js @@ -962,6 +962,32 @@ GPS._processIncomingPoint = async function(p, fromNative) { if (GPS.recording.onPoint) GPS.recording.onPoint(p); }; +// Headwind labelling (variant 5 as VALIDATION, not measurement): the rider taps +// to open a "wind in the face" interval and taps again to close it. Marks are +// stored per session ([{startTs, endTs}] ms epoch) and later compared against the +// from-track wind estimate — they are ground truth, they do NOT feed kcal/power. +// Returns true if a headwind interval is now open (button should show active). +GPS.toggleWindMark = function() { + if (!GPS.recording.windMarks) GPS.recording.windMarks = []; + if (GPS.recording._currentWind) { + GPS.recording._currentWind.endTs = Date.now(); + GPS.recording._currentWind = null; + } else { + GPS.recording._currentWind = { startTs: Date.now(), endTs: null }; + GPS.recording.windMarks.push(GPS.recording._currentWind); + } + GPS._persistState(); + return GPS.recording._currentWind != null; +}; + +// Close an interval left open (rider forgot to tap off before Stop / recovery). +GPS._closeOpenWindMark = function() { + if (GPS.recording._currentWind && GPS.recording._currentWind.endTs == null) { + GPS.recording._currentWind.endTs = Date.now(); + } + GPS.recording._currentWind = null; +}; + // Persist recording state to localStorage for crash recovery GPS._persistState = function() { try { @@ -973,6 +999,7 @@ GPS._persistState = function() { totalPauseMs: GPS.recording.totalPauseMs, manualPaused: GPS.recording.manualPaused, pauses: GPS.recording.pauses || [], + windMarks: GPS.recording.windMarks || [], pointCount: GPS.recording.points.length, bikeId: GPS.recording.bikeId ?? null, bikeWeightKg: GPS.recording.bikeWeightKg ?? null, @@ -1071,6 +1098,11 @@ GPS.recoverSession = async function() { const stats = GPS.computeStats(pts, s.weightKg || 80, recoverOpts); await DB.finishGpsSession(s.sessionId, new Date().toTimeString().slice(0, 5), stats.distance, stats.kcal, stats.avgSpeed, stats.maxSpeed, stats.elevGain, stats.elevLoss, s.pauses || []); + // Restore headwind marks captured before the crash (close a dangling open one) + if (Array.isArray(s.windMarks) && s.windMarks.length) { + for (const w of s.windMarks) if (w && w.endTs == null) w.endTs = new Date(pts[pts.length - 1].ts).getTime(); + try { await DB.setSessionWindMarks(s.sessionId, s.windMarks); } catch (e) { console.error("[GPS] wind marks restore failed:", e); } + } // Store bike_id if present if (s.bikeId) await DB.updateSessionBike(s.sessionId, s.bikeId); console.log("[GPS] Recovered session", s.sessionId, "with", pts.length, "points"); @@ -1104,6 +1136,8 @@ GPS.startRecording = async function(activityType, weightKg) { GPS.recording.manualPaused = false; GPS.recording.pauses = []; GPS.recording._currentPause = null; + GPS.recording.windMarks = []; // headwind labels: [{startTs, endTs}] ms epoch + GPS.recording._currentWind = null; // open headwind interval, if any GPS.recording.nativeService = false; GPS.recording._pollTimer = null; GPS.recording._lastProcessedTs = 0; @@ -1253,12 +1287,17 @@ GPS.stopRecording = async function() { const stats = GPS.computeStats(GPS.recording.points, GPS.recording.weightKg, recOpts); const endTime = new Date().toTimeString().slice(0, 5); + // Close an open headwind interval and persist all marks with the session. + GPS._closeOpenWindMark(); + const recWindMarks = GPS.recording.windMarks || []; + try { await DB.finishGpsSession( GPS.recording.sessionId, endTime, stats.distance, stats.kcal, stats.avgSpeed, stats.maxSpeed, stats.elevGain, stats.elevLoss, recPauses ); + try { await DB.setSessionWindMarks(GPS.recording.sessionId, recWindMarks); } catch (e) { console.error("[GPS] wind marks save failed:", e); } // DB save confirmed — now safe to delete the points file if (nativePointsFile) { try { await window.__TAURI__.core.invoke("delete_points_file", { filename: nativePointsFile }); } catch {} @@ -1287,6 +1326,8 @@ GPS.stopRecording = async function() { GPS.recording.cogTeeth = null; GPS.recording.wheelDiameterInch = null; GPS.recording.gearCount = null; + GPS.recording.windMarks = []; + GPS.recording._currentWind = null; GPS._clearPersistedState(); return { sessionId: sid, stats, pauses }; }; diff --git a/frontend/js/main.js b/frontend/js/main.js index a8c4026..0b9bc82 100644 --- a/frontend/js/main.js +++ b/frontend/js/main.js @@ -3841,6 +3841,7 @@ async function renderRecordingInline(container) {
${GPS.recording.state === "waiting_gps" ? "Поиск GPS..." : GPS.recording.state === "ready" ? "Начните движение..." : ""}
+
@@ -4289,6 +4290,15 @@ async function renderRecordingInline(container) { fetchTemperature(); let weatherTimer = setInterval(fetchTemperature, 15 * 60 * 1000); + // Headwind label toggle: tap to open a "wind in the face" interval, tap to close. + // Marks are ground truth for validating the from-track wind estimate — not kcal. + let windBtn = container.querySelector("#rec-wind"); + if (windBtn) windBtn.onclick = () => { + let active = GPS.toggleWindMark(); + windBtn.style.background = active ? "#ffb74d" : ""; + windBtn.style.color = active ? "#1a1a1a" : ""; + }; + // Pause button container.querySelector("#rec-pause").onclick = () => { if (GPS.recording.manualPaused) { From 5b345a1df461c477b7aefbf06f8585a9259acf64 Mon Sep 17 00:00:00 2001 From: 4aiman Date: Mon, 7 Sep 2026 17:15:19 +0300 Subject: [PATCH 4/5] rec screen: status-bar backdrop so the system bar stays visible over the map MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The recording map is edge-to-edge and drew behind the system status bar, leaving its icons unreadable over the tiles (the map controls were already offset by --safe-area-top, so the design intended a visible bar). Paint a solid strip the height of the top inset behind the bar — like the header on every other screen. Disabled in the rotated landscape modes. --- .../2026-09-07_rec-statusbar-backdrop.md | 24 +++++++++++++++++++ frontend/css/styles.css | 15 ++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 docs/session-logs/2026-09-07_rec-statusbar-backdrop.md diff --git a/docs/session-logs/2026-09-07_rec-statusbar-backdrop.md b/docs/session-logs/2026-09-07_rec-statusbar-backdrop.md new file mode 100644 index 0000000..b075fa4 --- /dev/null +++ b/docs/session-logs/2026-09-07_rec-statusbar-backdrop.md @@ -0,0 +1,24 @@ +# Сессия 2026-09-07: статус-бар на экране записи + +## Проблема +При включённом трекинге не видно системный статус-бар. Пользователь: перекрывают его только +карты, остальное приложение ведёт себя нормально. Просьба — сделать бар видимым (не рисовать свой +индикатор батареи). + +## Причина +Карта на экране записи (`.rec-map-wrap`/`.rec-map`) рисуется edge-to-edge и заходит под системный +статус-бар. Контролы карты (компас, зум-кнопки leaflet) уже сдвинуты вниз на `--safe-area-top` +(строки 1155, 1161 styles.css) — то есть дизайн задумывался с видимым статус-баром, но у самого бара +нет подложки: иконки теряются на тайлах карты. На остальных экранах подложку даёт «шапка» +(`padding-top: calc(... + var(--safe-area-top)); background: var(--surface)`). + +## Решение (только CSS, без сдвига координат карты) +Псевдоэлемент `.rec-map-wrap::before` — сплошная полоса высотой `var(--safe-area-top)` цвета +`var(--surface)`, `z-index:1100`, `pointer-events:none`. Даёт статус-бару подложку как «шапка». +Контролы карты уже начинаются ниже полосы, наложения нет. В ландшафте (rot-90/270) полоса отключена +(`display:none`) — там карта повёрнута и инсет физически в другом месте. + +`--safe-area-top` ставится из нативных инсетов (main.js:189, get_safe_insets), на устройстве ненулевой. + +## Файлы +- frontend/css/styles.css — `.rec-map-wrap::before` + отключение в rot-90/270. diff --git a/frontend/css/styles.css b/frontend/css/styles.css index 14faeec..ff48d88 100644 --- a/frontend/css/styles.css +++ b/frontend/css/styles.css @@ -1159,6 +1159,21 @@ select { } /* Keep Leaflet zoom controls below the status bar on the recording map. */ .rec-map-wrap .leaflet-top { margin-top: var(--safe-area-top, 0px); } +/* Status-bar backdrop. The recording map is edge-to-edge (draws behind the system + status bar), so the bar had no backing and its icons were unreadable over the map + tiles. Paint a solid strip the height of the top inset — like the header on every + other screen — so the status bar stays visible. Controls already start below it. */ +.rec-map-wrap::before { + content: ""; + position: absolute; + top: 0; left: 0; right: 0; + height: var(--safe-area-top, 0px); + background: var(--surface); + z-index: 1100; + pointer-events: none; +} +.rec-screen.rot-90 .rec-map-wrap::before, +.rec-screen.rot-270 .rec-map-wrap::before { display: none; } .rec-compass-arrow { position: absolute; inset: 0; transition: transform 0.12s linear; } .rec-compass-arrow::before { content: "N"; position: absolute; top: 1px; left: 50%; transform: translateX(-50%); From c3188911c3f7ac49c8063bbaf94226d472a6d3c0 Mon Sep 17 00:00:00 2001 From: 4aiman Date: Wed, 9 Sep 2026 00:56:13 +0300 Subject: [PATCH 5/5] BRouter: analysis + embed the offline routing engine (Stage 1) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Analysis in docs/brouter-findings.md: how BRouter knows roads (.rd5 segments), routes and reaches low elevation gain (profile uphill/downhill cost + kinematics), the three call surfaces, and an evaluation of two ideas — fill GPS gaps along roads, and offline waypoint route planning. License is MIT; the engine has no desktop-only deps, so it embeds on Android ART. Stage 1 (embed + bridge, compiles into the apk; on-device route not yet run): - vendored brouter-1.6.3-all.jar into the Android module (dexes cleanly) and bundled the trekking/shortest profiles + lookups.dat as assets, copied to files/brouter/profiles2 on launch - MainActivity: a brouter_command.txt handler on the existing FileObserver runs btools.router.RoutingEngine off the UI thread (recipe taken via javap from ServerHandler) and returns the track as GPX - Rust brouter_route command: same file bridge as GPS (request + command, poll for the result), registered in the invoke handler - frontend/js/router.js: BRouter.route(points, profile) -> GPX (parseRouteGPX) - LICENSE-brouter (MIT notice) kept alongside the vendored engine Segments (.rd5, ~13-23 MB per 5x5 tile) are delivered later (Stage 2, wired download inside BalDav). IMPLEMENTATION_PLAN.md tracks the 5 stages. --- IMPLEMENTATION_PLAN.md | 79 ++ LICENSE-brouter | 30 + PROJECT_MAP.md | 7 + docs/brouter-findings.md | 191 ++++ docs/gps-model-findings.md | 353 +++++++ .../2026-09-07_brouter-findings.md | 39 + frontend/index.html | 1 + frontend/js/router.js | 20 + src-tauri/gen/android/app/build.gradle.kts | 77 ++ .../android/app/libs/brouter-1.6.3-all.jar | Bin 0 -> 356201 bytes .../main/assets/brouter/profiles2/lookups.dat | 938 ++++++++++++++++++ .../assets/brouter/profiles2/shortest.brf | 149 +++ .../assets/brouter/profiles2/trekking.brf | 330 ++++++ .../main/java/dev/baldav/app/MainActivity.kt | 81 ++ src-tauri/src/lib.rs | 44 +- 15 files changed, 2338 insertions(+), 1 deletion(-) create mode 100644 IMPLEMENTATION_PLAN.md create mode 100644 LICENSE-brouter create mode 100644 docs/brouter-findings.md create mode 100644 docs/gps-model-findings.md create mode 100644 docs/session-logs/2026-09-07_brouter-findings.md create mode 100644 frontend/js/router.js create mode 100644 src-tauri/gen/android/app/build.gradle.kts create mode 100644 src-tauri/gen/android/app/libs/brouter-1.6.3-all.jar create mode 100644 src-tauri/gen/android/app/src/main/assets/brouter/profiles2/lookups.dat create mode 100644 src-tauri/gen/android/app/src/main/assets/brouter/profiles2/shortest.brf create mode 100644 src-tauri/gen/android/app/src/main/assets/brouter/profiles2/trekking.brf diff --git a/IMPLEMENTATION_PLAN.md b/IMPLEMENTATION_PLAN.md new file mode 100644 index 0000000..488bb11 --- /dev/null +++ b/IMPLEMENTATION_PLAN.md @@ -0,0 +1,79 @@ +# IMPLEMENTATION_PLAN: встраивание BRouter в BalDav + +Основано на `docs/brouter-findings.md`. Цель — оффлайн-роутинг внутри BalDav (движок BRouter +встроен в Android-модуль, `btools.router.RoutingEngine` в процессе, MIT). Две прикладные фичи: +идея 1 (заполнение GPS-пропусков по дороге) и идея 2 (оффлайн-планирование маршрута по точкам). + +Ключевые решения: встраивание (вариант B); сегменты `.rd5` качаются по проводу внутри BalDav в +app data dir; профиль trekking (идея 2) и shortest (идея 1); лицензия MIT (положить `LICENSE-brouter`). + +Мост как у GPS-сервиса: JS → Rust `invoke` → Kotlin (движок) → результат обратно. Данные: +профили — assets в apk; сегменты — app data dir (скачиваются). Движок зовём напрямую (без RouteServer). + +--- + +## Stage 1 — Встраивание движка + спайк «проложи 2 точки» +**Goal:** движок компилируется в составе BalDav и возвращает маршрут по паре точек на телефоне. +**Changes:** +- Извлечь `brouter-1.6.3-all.jar` в `src-tauri/gen/android/app/libs/`, подключить в gradle + (`implementation files('libs/brouter-1.6.3-all.jar')`), включить desugaring при необходимости. +- Профили в assets: `assets/brouter/profiles2/{lookups.dat,trekking.brf,shortest.brf}`. +- Kotlin `BRouterService`/функция: копирует профили из assets в files, зовёт + `btools.router.RoutingEngine(segmentsDir, profilesDir, profile, waypoints, outGpx)`, читает результат. +- Rust-команда `brouter_route(lonlats, profile) -> String(geojson/gpx)` в plugin bridge. +- JS-обёртка (новый `frontend/js/router.js` или в gps.js): `BRouter.route(points, profile)`. +- `LICENSE-brouter` (MIT-нотис) в корень. +**Success:** на телефоне с вручную положенным тайлом региона (adb push для спайка) вызов +`BRouter.route([[lon,lat],[lon,lat]], "shortest")` возвращает дорожный GPX/GeoJSON, а не ошибку. +**Tests:** ручной вызов из DevTools (CDP) + лог движка; сверить, что трек идёт по дорогам. +**Status:** not started + +## Stage 2 — Экран загрузки сегментов по проводу +**Goal:** пользователь скачивает тайлы `.rd5` региона внутри BalDav в app data dir. +**Changes:** +- Экран/настройка «Сегменты дорог»: список нужных тайлов по региону (карта/выбор), кнопка скачать + с `brouter.de/brouter/segments4/.rd5`, прогресс, размер, дата. Хранить в app data dir + (путь, который читает Stage 1). +- Управление: список скачанного, удалить/обновить. +**Success:** дома по проводу тайлы региона (E35_N45/E40_N45 — уточнить) скачиваются и лежат так, +что Stage 1 их читает; в поле сеть не нужна. +**Tests:** скачать тайл, проложить маршрут офлайн (сеть выключить) — работает. +**Status:** not started + +## Stage 3 — Идея 2: оффлайн-планирование по опорным точкам +**Goal:** тап опорных точек → дорожный маршрут trekking → существующий предпросмотр/профиль. +**Changes:** +- В `showRouteEditor` (frontend/js/main.js): между опорными точками звать `BRouter.route(..., + "trekking")` вместо прямых отрезков; результат (GPX/GeoJSON) парсить существующим `parseRouteGPX`, + дальше работает `showRouteDetail`/`routeElevStats`/`drawRoutePolyline`. +- Фолбэк на прямую линию, если движок/сегмент недоступны. +**Success:** тап точек даёт маршрут по дорогам с профилем высоты; сохраняется как маршрут. +**Tests:** спланировать знакомый маршрут офлайн, сверить с онлайн-BRouter (та же геометрия). +**Status:** not started + +## Stage 4 — Идея 1: заполнение GPS-пропусков по дороге +**Goal:** GPS-разрыв заполняется дорожным путём (shortest), с фолбэком на хорду. +**Changes:** +- В ветке `isGap` `computeStats`/при обработке трека: проложить `BRouter.route(предгэп, послегэп, + "shortest")`; если длина по графу > ~3× хорды (константа, подобрать на практике) — оставить хорду. +- Точки-заполнители помечать `estimated`; решить зачёт дорожной дистанции (по умолчанию — считать + дорожную длину, но с лимитом гэпа). +**Success:** записанный трек с дропаутом GPS показывает дорожный фолловинг вместо хорды, кроме +случая «дорога в разы длиннее». +**Tests:** трек с известным дропаутом на дороге → заполнение по дороге; дропаут на поле → хорда. +**Status:** not started + +## Stage 5 — Полировка (опционально) +**Goal:** удобство и корректность. +**Changes:** настройка «избегать подъёмов» (крутилка `uphillcost` в trekking); обновление сегментов; +доки (README/PROJECT_MAP), лог сессии; проверка размера apk. +**Status:** not started + +--- + +## Потенциальные проблемы +- Desugaring/`java.lang.invoke` при dex — проверить сборку (AGP обычно тянет). +- Размер/имена тайлов региона на brouter.de — уточнить при Stage 2. +- Время роутинга на телефоне на больших `.rd5` — замерить (может понадобиться таймаут/поток). +- Формат вывода: GeoJSON проще парсить, чем GPX; выбрать при Stage 1. +- Заполнение гэпов не должно ломать существующие фильтры высоты/скорости (estimated-флаг). diff --git a/LICENSE-brouter b/LICENSE-brouter new file mode 100644 index 0000000..e8a0d0e --- /dev/null +++ b/LICENSE-brouter @@ -0,0 +1,30 @@ +BalDav embeds the BRouter routing engine (brouter-1.6.3-all.jar, +src-tauri/gen/android/app/libs/) and its routing profiles +(src-tauri/gen/android/app/src/main/assets/brouter/profiles2/). + +BRouter is a third-party component distributed under the MIT License. +Source: https://github.com/abrensch/brouter + +--- + +MIT License + +Copyright (c) 2019 BRouter contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/PROJECT_MAP.md b/PROJECT_MAP.md index 73679fc..752765a 100644 --- a/PROJECT_MAP.md +++ b/PROJECT_MAP.md @@ -84,6 +84,13 @@ | `ion_products.json` | 1111 продуктов ION (сырые данные скрейпера) | | `5ka_products_fresh.json` | 3103 продукта 5ka (сырые данные) | +### Разборы (docs/) + +| Файл | Назначение | +|------|------------| +| `docs/gps-model-findings.md` | Находки по расчётной модели GPS (Crr/ккал/высота/ветер) — часть внедрена, см. лог 2026-09-07 | +| `docs/brouter-findings.md` | Разбор BRouter 1.6.3 (оффлайн-роутинг): данные `.rd5`, профили, малый набор высоты, 3 способа вызова + встраивание; под идеи «заполнение GPS-пропусков» и «оффлайн-планирование по точкам». Рекомендация — встраивание движка (jar 356 КБ) в Android-модуль | + ## База данных ### Таблицы (Rust v1 миграция + JS миграции) diff --git a/docs/brouter-findings.md b/docs/brouter-findings.md new file mode 100644 index 0000000..ad86cf7 --- /dev/null +++ b/docs/brouter-findings.md @@ -0,0 +1,191 @@ +# Разбор BRouter 1.6.3 под две идеи BalDav (2026-09-07) + +Получено разбором `brouter-1.6.3.zip` (read-only: листинг архива, чтение текстовых +доков и профилей через stdout, инспекция `brouter-1.6.3-all.jar` в памяти — распаковки +на диск и запуска Java не было). Цель — понять, как BRouter «знает, где дорога» и строит +маршруты с малым набором высоты, и оценить под это две идеи пользователя: + +1. **Заполнение GPS-пропусков по дороге** — когда GPS пропадает и появляется, пробел + заполнять кратчайшим путём по реальным дорогам, а не хордой/скорость×время. +2. **Оффлайн-планирование маршрута по опорным точкам** в BalDav — замена онлайн-BRouter. + +Обе идеи требуют оффлайн-роутинга; сеть в поле недоступна (РЭБ/РКН — как в обсуждениях +ветра и DEM), поэтому годятся только оффлайн-схемы. + +--- + +## 1. Что внутри дистрибутива + +| Часть | Что это | +|---|---| +| `BRouterApp.1.6.3-api19-release.apk`, `...api30-release.apk` | Android-приложение `btools.routingapp` (одно и то же, под разные min-SDK). Считает маршрут, карту НЕ рисует. | +| `brouter-1.6.3-all.jar` (356 КБ) | Standalone-движок на чистой Java. Main-Class `btools.server.BRouter` (HTTP-сервер). Тот же движок, что в apk. | +| `profiles2/*.brf` | Профили маршрутизации (текстовые скрипты стоимости). `lookups.dat` — таблица тегов/значений. | +| `readmes/` | Документация: установка, `profile_developers_guide.txt`, `mapcreation.md`, интеграция с OsmAnd, особенности Android 11. | + +BRouter — **маршрутизатор без карты**: на вход опорные точки + профиль, на выход трек +(GPX/GeoJSON). Отрисовка и навигация — на стороне карт-тула (OsmAnd/Locus/…), либо, в нашем +случае, на стороне BalDav. + +## 2. Где дорога: данные `.rd5` + +- Граф дорог — **сегментные файлы `.rd5`**, тайлы **5°×5°** по широте/долготе. Внутри — + OSM-ways и nodes, закодированные в бинарный битстрим по таблице `lookups.dat` (для каждого + тега — набор значений с частотами и алиасами). +- Готовые тайлы качаются с **brouter.de/brouter/segments4** (пересобираются еженедельно) или + строятся самому из OSM-dump + SRTM (`mapcreation.md`, скрипт `process_pbf_planet.sh`, + требуется Osmosis/pbfparser). +- **Высоты** в сегментах берутся из **SRTM-90м** (CGIAR). Именно они дают BRouter'у профиль + рельефа, по которому он считает набор высоты (см. §4). Без SRTM сегменты соберутся, но без + высот — маршруты «с малым набором» не получатся. +- Для нашего региона (Ростовская обл., ~47N/40E) нужны тайлы, чьи SW-углы кратны 5: + вероятно **`E35_N45.rd5`** (35–40E, 45–50N) и **`E40_N45.rd5`** (40–45E) — Новочеркасск ~40.1E + попадает во второй. Точные имена и размер (обычно десятки МБ на тайл) — **проверить при + загрузке**. Загрузка одноразовая по проводу — тот же паттерн «скачать дома», что для DEM/прогноза. + +## 3. Как строится маршрут (движок) + +- Класс `btools.router.RoutingEngine`. Ключевые шаги (по строкам байткода): + `matchWaypointsToNodes` — **привязка каждой опорной точки к ближайшему дорожному узлу графа** + (это и есть ответ «где дорога, а где нет»: точка вне дорог подтягивается к дороге), затем поиск + пути по графу между привязанными узлами. +- Стоимость ребра считает **интерпретатор профиля** (`btools.expressions`) по тегам ребра из + `.rd5`. Поиск минимизирует суммарную стоимость (по сути A*/Dijkstra по сегментному графу с + кэшами профиля). +- На выход движок отдаёт трек и метрики: `track-length`, `filtered ascend` и `plain-ascend` + (набор высоты — сглаженный и сырой), `cost`, `energy`, `time` (по кинематике профиля). + Формат — GPX (`formatAsGpx`/`writeGpx`) или GeoJSON/KML. + +## 4. Малый набор высоты — как именно (основной режим) + +Это чисто вопрос **профиля**, а не движка. В `trekking.brf` (context:global): + +``` +assign consider_elevation = true +assign downhillcost = 60 # штраф за спуск +assign downhillcutoff = 1.5 # уклоны меньше 1.5% не штрафуются +assign uphillcost = 0 # (в trekking по умолчанию 0; крутить вверх — здесь) +assign uphillcutoff = 1.5 +``` + +Плюс **кинематическая модель времени/энергии** — прямой аналог модели мощности BalDav: + +``` +assign totalMass = 90 # масса байк+седок, кг +assign maxSpeed = 45 # км/ч +assign S_C_x = 0.225 # CdA (площадь×коэф. лобового сопротивления) +assign C_r = 0.01 # коэффициент качения +assign bikerPower = 100 # средняя мощность, Вт +``` + +Чтобы получить маршрут **с малым набором высоты**, поднимают `uphillcost` (и/или `downhillcost`): +движок начинает предпочитать обходные, но более пологие дороги. `uphillcutoff`/`downhillcutoff` +задают порог уклона, ниже которого рельеф игнорируется. То есть «основной режим» пользователя в +онлайн-BRouter — это trekking с ненулевым `uphillcost`. + +Отдельно есть **`shortest.brf`**: `downhillcost=0`, `uphillcost=0`, `turncost=0` — чистейший +кратчайший путь по дорогам, без учёта рельефа. Это ровно то, что нужно для **идеи 1** (заполнить +GPS-пропуск — важно «просто чтобы была дорога», кратчайшая). + +## 5. Как вызвать оффлайн — три поверхности + +**(а) Standalone-jar на компе (HTTP-сервер).** Подтверждённая строка usage: + +``` +java -cp brouter-1.6.3-all.jar btools.server.RouteServer [bindaddress] +``` + +Запрос (тот же API, что у brouter.de/brouter-web): + +``` +GET http://127.0.0.1:/brouter?lonlats=39.7,47.2|40.1,47.4&profile=shortest&format=geojson&timode=0&alternativeidx=0 +``` + +Параметры (из байткода `RouteServer`): `lonlats` (пары lon,lat через `|`), `profile`, `format` +(gpx/geojson/kml), `timode` (turnInstructionMode), `alternativeidx`, `nogos`. Нужен JRE + каталог +сегментов `.rd5` + каталог профилей. Годится для инструментов `tools/track/` (проложить маршрут по +`lonlats`, что уже выдаёт `tools/steep_segments.js`). + +**(б) Приложение BRouter на телефоне — Server-Mode.** Приложение поднимает локальный HTTP-сервер +(порт 17777 по умолчанию); любой клиент на устройстве, включая WebView BalDav, шлёт тот же +`GET /brouter?lonlats=...`. Требует установленного приложения BRouter и скачанных сегментов. + +**(в) Приложение BRouter — Android-intent.** С v1.6.2 у приложения есть «интерфейс без файлового +доступа»: BalDav (Kotlin) шлёт intent к `btools.routingapp` с опорными точками и профилем, получает +GPX/GeoJSON обратно. Данные приложения с Android 11 лежат в +`Android/media/btools.routingapp/brouter/segments4`. + +**(г) Встраивание движка в BalDav.** `brouter-1.6.3-all.jar` — чистая Java (356 КБ), пакеты +`router`/`mapaccess`/`expressions`/`codec`/`util`. Классы движка можно добавить в Android-модуль +BalDav (`src-tauri/gen/android`) и звать из Kotlin, а из JS — через существующий Rust↔Kotlin-мост +(как GPS-сервис). Полностью самодостаточно и оффлайн, второе приложение не нужно. + +## 6. Идея 1 — заполнение GPS-пропусков по дороге + +- **Как:** при разрыве взять последнюю точку до пропуска и первую после, проложить между ними + маршрут профилем `shortest.brf`, вставить дорожную полилинию как заполнение гэпа. +- **Стык с `computeStats` (frontend/js/gps.js, ветка `isGap`):** сейчас гэп заполняется хордой или + `скорость×время`. Дорожный путь точнее (по реальным дорогам). Точки-заполнители помечать + `estimated` (как dead-reckoning), чтобы они не влияли на глюк-фильтры высоты и были видимо + «достроенными». **Решить:** идёт ли дорожная дистанция в зачёт трека или только рисуется (сейчас + гэп считается по скорости; дорожная длина может быть и точнее, и длиннее реального пути). +- **Риски/границы:** без сегментов на регион заполнить нечем; дорога-кратчайшая может отличаться от + фактически проеханной; на бездорожье (поля, где пользователь реально ездит) кратчайший путь по + графу дорог может увести. Нужен разумный лимит длины гэпа, при котором достраиваем. + +## 7. Идея 2 — оффлайн-планирование маршрута по точкам + +- **Что уже есть в BalDav** (frontend/js/main.js): `showRouteEditor` (тап по карте = точка, + тап по линии = вставка, тащить/удалять), `showRouteDetail` (предпросмотр + профиль высоты + `routeElevStats` + фуллскрин), `drawRoutePolyline`, «Сохранённые маршруты», топо/уклон-обводка. + Парсер `parseRouteGPX` уже читает GPX/``. +- **Чего не хватает:** оффлайн-роутера между опорными точками. Сейчас линия между тапами — прямая + (ручное рисование). BRouter вернёт дорожный GPX/GeoJSON, который **уже парсится** `parseRouteGPX`, + и дальше работает существующий предпросмотр/профиль высоты. +- То есть UI-обвязка в основном готова; предметная работа — вызов BRouter и подмена прямых отрезков + дорожным маршрутом (+ выбор профиля: trekking с `uphillcost` для «поменьше в горку»). + +## 8. Варианты интеграции и рекомендация + +| Вариант | Плюсы | Минусы | +|---|---|---| +| **A. Зависимость от приложения BRouter** (intent или localhost HTTP) | Быстро; роутинга в BalDav нет; BRouter сам качает/обновляет сегменты | Второе приложение ставить и настраивать; управление сегментами вне BalDav; связанность | +| **B. Встраивание движка** (jar в Android-модуль + Rust/JS-команда) | Самодостаточно, полностью оффлайн, один apk; сегменты кладём куда хотим | Бандлинг Java-движка; доставка `.rd5` в приложение; **проверить лицензию** (GitHub abrensch/brouter); управление хранилищем сегментов | +| **C. Порт на Rust/JS** | Нет внешних зависимостей | Огромный объём (движок + формат `.rd5` + интерпретатор профилей) — **отклонить** | + +**Решение — B (встраивание)** (подтверждено пользователем). Встраиваемость проверена по байткоду: +движок (150 классов) использует только `java.io/net/util/lang/text/security/zip` — ни AWT/Swing/ +RMI/ImageIO/servlet/sun.*, всё есть на Android ART. `RouteServer` — на голых `ServerSocket`/`Socket` +(контейнер не нужен). Значит в процессе можно звать напрямую `btools.router.RoutingEngine` +(без HTTP-сервера): дать каталог сегментов + профиль + опорные точки, получить GPX/GeoJSON. +Для инструментов `tools/track/` (анализ, не телефон) сразу годится **вариант (а)** — jar на компе. + +## 9. Решения и открытые вопросы + +Решено (2026-09-07): +1. **Лицензия — MIT** («Copyright (c) 2019 BRouter contributors», github.com/abrensch/brouter). + Встраивание разрешено без ограничений; при распространении сохранить копирайт-нотис MIT + (положить `LICENSE-brouter` в репозиторий рядом с движком). +2. **Интеграция — вариант B (встраивание движка)**. Код BalDav открыт, MIT это позволяет. +3. **Профиль — trekking** (для обеих идей). Идея 1 всё же считается `shortest` для чистого + кратчайшего пути (см. §6); trekking — для планирования (идея 2). +4. **Идея 1, порог хорды:** прокладывать по графу, НО если дорожная длина в разы больше хорды — + рисовать хорду (граф увёл не туда, напр. вокруг поля). Коэффициент подобрать на практике + (старт ~3×, вынести в конфиг/константу). +5. **«Крутилка» `uphillcost`** (см. §4) — пользователь про неё не знал. План: начать со + стандартного trekking; если маршруты слишком в горку — добавить настройку «избегать подъёмов» + (поднимать `uphillcost`). Пока не крутим. + +6. **Доставка сегментов — загрузка по проводу внутри BalDav** (решено). Экран в BalDav: дома на + Wi-Fi/проводе скачать готовые тайлы региона с brouter.de/segments4 в папку приложения + (app data dir, аналог seed-БД); в поле сеть не нужна. Тот же паттерн, что задумывался для DEM/ + прогноза. Свою сборку сегментов из OSM+SRTM не делаем. +7. **Встраиваемость подтверждена** (см. §8): движок без десктоп-зависимостей, зовём + `btools.router.RoutingEngine` в процессе из Kotlin. + +## 10. Проверка (PoC, отдельным шагом, по согласию) + +Требует JRE и загрузки сегментов региона (сеть) — вне текущей задачи. Когда разрешишь: +запустить `RouteServer` на компе с каталогом `.rd5` и `profiles2/`, дёрнуть +`GET /brouter?lonlats=...&profile=shortest&format=geojson` по паре точек из +`tools/steep_segments.js`, убедиться, что возвращается дорожный маршрут с `track-length`/`ascend`. diff --git a/docs/gps-model-findings.md b/docs/gps-model-findings.md new file mode 100644 index 0000000..bf9f629 --- /dev/null +++ b/docs/gps-model-findings.md @@ -0,0 +1,353 @@ +# Находки по расчётной модели GPS (2026-09-07) + +Получено при независимом разборе базы `baldav.db` (156 поездок, 366 тыс. точек) +сторонним инструментом `tools/track/`. Константы там взяты из `GPS.computeStats`, +поэтому расхождения означают разницу в модели, а не в настройках. + +Проверка сходимости: дистанция расходится с базой на **0.2%**, калории по формуле +приложения -- на **4%** (трек 4 сентября). То есть база и формула воспроизводятся, +и нижеперечисленное -- не ошибки чтения. + +Пункты про **нулевую отметку высоты** и **паузу на подъёме** сюда не включены: +они уже обсуждены отдельно. + +Файл состоит из двух частей. **Первая -- находки:** измеренные расхождения, +каждое с замером и по возможности с контрольной проверкой. **Вторая -- +предположения:** варианты отслеживания ветра, составленные по просьбе +пользователя, с вопросами к вам в конце. Смешивать их не стоит: первая часть +проверена на данных, вторая -- это перечень возможностей, а не рекомендация. + +--- + +## 1. Потолок качения 0.008 занижен втрое + +`crr_from_accel`: при `accel_rms > 7` возвращается 0.008 и выше не поднимается. +0.008 -- это разбитый асфальт. Реальные грунты дают втрое больше. + +**Замер.** Трек 6 сентября (`id 1788683393199`), километры 36.5-38.5: 1996 м, +ровно (уклон −0.1%), `accel_rms` медиана **15.1**, скорость 13.8 км/ч. +Пользователь описал место как траву и тракторную колею с ямами. +Обратное решение уравнения мощности относительно Crr: + +| если мощность была | требуемый Crr | +|---|---| +| 90 Вт | 0.0198 | +| 110 Вт | 0.0252 | +| 130 Вт | 0.0307 | + +Справочные значения: плотный грунт 0.012, щебень 0.020, трава и песок 0.035. +Замер попадает ровно в диапазон, соответствующий описанию. + +**Контрольная проверка обратным знаком.** Те же вычисления на километрах 9-11 +(25 км/ч, тряска 5.2) дают Crr отрицательным при 90-110 Вт -- значит там +мощность была около 150 Вт. Сплиты на тех километрах показывают 148-172 Вт. +Метод не завышает и не занижает систематически. + +**Предлагаемая шкала** (взята нижняя граница замера -- лучше недосчитать): + + < 3 -> 0.004 гладкий асфальт (как сейчас) + 3-7 -> 0.006 смешанное (как сейчас) + 7-11 -> 0.008 разбитый асфальт (как сейчас) + 11-15 -> 0.012 плотный грунт (новое) + > 15 -> 0.020 трава, колея, щебень (новое) + +**Влияние на трек 6 сентября:** средняя мощность 89 -> 108 Вт, +механическая работа 1233 -> 1585 кДж. То есть на грунтах модель +недосчитывала примерно четверть работы. + +## 2. `max(physics, MET)` никогда не складывает, и подъёмы от этого страдают + +На одних и тех же отрезках трека 6 сентября: + +| участки | физика | MET | MET/физика | +|---|---|---|---| +| вся поездка | 1318 | 1764 | 1.34 | +| равнина, \|уклон\| < 1% | 727 | 1344 | **1.85** | +| в горку круче 2% | 400 | 165 | **0.41** | + +Комментарий в коде говорит про «~2x занижение физики» -- на равнине это верно +(1.85), но по поездке в целом всего 1.34, потому что на подъёмах физика +выигрывает с большим запасом. + +Изъян в том, что оценки не складываются. Биологические накладные расходы +(размахивание ногами, равновесие, гашение тряски корпусом) никуда не деваются +на подъёме, но там берётся физика и табличная оценка отбрасывается целиком. +**Направление ошибки известно: подъёмы недосчитываются.** + +Осмысленная альтернатива, если решите менять: не максимум, а +`физика/КПД + накладные`, где накладные оцениваются табличным минимумом +для медленной езды. Требует калибровки, поэтому просто как направление. + +## 3. Ходьба с велосипедом засчитывается как езда + +На односкоростном передача даёт точный признак: 40/18 на колесе 24" -- +это 4.26 м за оборот шатунов. Скорость ниже **7.7 км/ч** означает каденс +ниже 30 об/мин, а на таком каденсе велосипед не едет, он падает. Значит +человек идёт и ведёт или несёт его. + +На треке 6 сентября таких кусков **0.66 км за 8:44 в движении** -- пользователь +подтвердил, что нёс велосипед руками в горку. Участок: км 56.31, длина 289 м, +набор 47.8 м, **уклон 16.6%**, 4.3 км/ч. + +Побочный эффект для статистики: если этот кусок не отделять, он склеивается +с последующим ездовым подъёмом (км 56.60, 624 м, 3.8%, 12.3 км/ч) в один +«подъём 915 м, 7.8%, 7.7 км/ч», которого в природе не было. + +Признак применим только когда `bikes.gear_count` пусто или 1. На многоскоростном +низкая скорость ничего не доказывает. + +**По акселерометру это не различается, проверено:** нести велосипед в гору 3.24, +ехать по гладкому асфальту 2.88, идти пешком (сессия walk) 3.98. `accel_rms` +показывает дорогу, а не походку. + +## 4. Набор высоты расходится с независимым пересчётом в обе стороны + +| трек | в базе | независимый пересчёт | +|---|---|---| +| 6 сентября | 328 м | 528 м | +| 4 сентября | 314 м | 264 м | + +Знак разный, значит это не простое смещение. Без модели рельефа проверить +нечем: попытка построить карту высот по своим же 156 поездкам провалилась -- +перекрытие маршрутов всего 26% ячеек, а разброс высоты между поездками +в одной и той же точке имеет медиану **10 метров**. + +**Поправка после уточнения у пользователя.** Изначально я счёл пустую +`altitude_srtm_m` (заполнена в одной сессии из 156) недоработкой. Это не так: +поле заполняется вручную кнопкой «уточнить высоты», которая ходит в GPXZ +и подобные сервисы, и пользователь жмёт её редко. Полагаться на сервисы +в поле нельзя -- РЭБ и РКН глушат, устойчиво работает преимущественно +проводной интернет. + +Отсюда следует не «починить SRTM», а вопрос по существу: **расхождение +в наборе высоты остаётся неразрешённым, и разрешить его без внешнего рельефа +нечем.** Если это важно -- имеет смысл думать в сторону предварительной +загрузки рельефа по району дома, по проводу, один раз. Если не важно -- +достаточно знать, что цифра набора имеет точность порядка десятков процентов, +и не строить на ней выводов. На расчёт мощности это влияет слабо: там работает +уклон, а он считается по окну и ограничен сверху. + +## 5. Пульса в точках нет, и это ожидаемо + +`gps_points.heart_rate` равен нулю во всех 156 сессиях. **Это не дефект +записи:** пользователь потерял браслет и пульсометр не носит, писать в поле +попросту нечего. `ble_hr_data.json` и запись устройства в `profile` +остались от прежнего использования. + +Упомянуто только затем, чтобы никто не искал ошибку там, где её нет, +и чтобы разбор треков не обещал анализ по пульсу. + +## 6. Ветер вычисляется из `bearing_deg` + +Побочная находка, в приложении такого нет. Ветер виден по тому, что на ровных +однотипных дорогах скорость зависит от курса. Берутся только точки с ровным +уклоном, невысокой тряской и в седле, считается медианная скорость по восьми +секторам курса, и подбирается ветер, при котором подразумеваемая мощность +во всех секторах одинакова. + +Трек 6 сентября: **6.3 км/ч из направления 345°**. Разброс мощности +по направлениям падает с 33% до 11%. Пользователь независимо подтвердил, +что ветер часто дул в лицо. + +Медианная скорость по курсу на этом треке -- 23.6 км/ч на юго-восток +против 15.7 км/ч на северо-запад, при одинаковых дорогах. + +Второй, независимый метод -- по встречным проездам одного места (758 пар) +-- даёт 3.6 км/ч из 325°. Направление сходится в пределах 20°, сила -- +в пределах множителя 1.8. Это и есть достижимая точность оценки ветра +без датчика. + +Разбор вариантов отслеживания ветра, включая идею пользователя про голосовые +отметки, -- во второй части этого файла. Там же перечислены вопросы, +по которым пользователь просит ваше мнение. + +## 7. Ловушка при отделении ходьбы: порог по длительности не нужен + +Найдено после замечания пользователя, что встречные проезды одного места +случались и пешком. + +Первая реализация признака ходьбы требовала, чтобы медленный кусок длился +дольше 30 секунд подряд. Это оказалось неверно. На треке 6 сентября всего +**14.7 минут** движения медленнее 7.7 км/ч, из них сплошными кусками -- +только 8.7 минуты. Оставшиеся **6 минут** -- короткие эпизоды, и они попадали +в статистику как педалирование. + +Видно это по корзине каденса: «0-40 об/мин» занимала 21 минуту, и **6.4 минуты +из неё приходилось на каденс ниже 30**, которого при езде не бывает вовсе. +После исправления корзина стала 9 минут, а средний каденс поднялся с 64 до 67. + +**Правильное разделение двух вопросов:** + +- *Исключать из статистики* нужно **любую** точку ниже порога, без оглядки + на длительность: на этой передаче ниже 30 об/мин не едут, и точка. Сюда же + попадут обычные торможения до нуля, но они короткие и маломощные, вреда нет. +- *Называть кусок ходьбой в отчёте* стоит только при длительности дольше + 30 секунд подряд -- иначе отчёт будет объявлять ходьбой каждое торможение + перед ямой. + +На оценку ветра эта примесь, к счастью, не повлияла: там отдельный порог +9 км/ч, и пешие точки не проходили. Проверено прямым сравнением -- с ними +3.5 км/ч из 326°, без них 3.6 км/ч из 325°. + + +--- +--- + +# ЧАСТЬ ВТОРАЯ: предложения по отслеживанию ветра + +Ниже -- **не находки, а предположения**, составленные по просьбе пользователя. +Это перечень способов с замерами там, где замеры удалось сделать. +Решение принимает сессия разработки. + +## Зачем + +Ветер -- крупнейший неучтённый источник ошибки в расчёте мощности на равнине. +На треке 6 сентября медианная скорость на одинаковых дорогах составила +**23.6 км/ч на юго-восток против 15.7 км/ч на северо-запад**. Разброс +подразумеваемой мощности по направлениям -- **33%**. Пока ветра в модели нет, +эти 33% списываются на «просел» и «разогнался». + +## Ограничения, названные пользователем + +- **Сетевые сервисы в поле недоступны.** РЭБ и РКН глушат, устойчиво работает + преимущественно проводной интернет. Любая схема, которой нужна сеть во время + поездки, нерабочая. +- **Метеостанция меряет в другой точке.** Стандартное измерение -- на высоте + 10 м в открытом месте, усреднение за 10 минут. Велосипедист едет на высоте + 1.5 м среди лесополос, домов и насыпей, где ветер и слабее, и порывистее. + Среднее по области пользователю не поможет. + +Оба возражения справедливы и отсекают наивное «дёргать погодный API». + +## Вариант 1. Считать ветер из самого трека (без железа и без сети) + +Реализовано и проверено в `tools/track/track.py`. Два независимых метода. + +**1а. Подбор по секторам курса.** Берутся только точки на ровном участке, +с невысокой тряской, в седле. Медианная скорость считается по восьми секторам +направления. Подбирается такой ветер, при котором подразумеваемая мощность +во всех секторах одинакова. + +**1б. Встречные проезды одного места.** Ищутся пары точек в одной ячейке 30 м, +разнесённые по времени, с противоположными курсами, одинаковым покрытием +и зеркальным уклоном. На одной и той же дороге качение и уклон сокращаются, +и разница скоростей при равной мощности задаёт составляющую ветра вдоль дороги. +Составляющие по разным дорогам сводятся в вектор методом наименьших квадратов. + +**Результат на треке 6 сентября:** + +| метод | скорость | направление | +|---|---|---| +| по секторам курса | 6.3 км/ч | 345° | +| по встречным проездам (758 пар) | 3.6 км/ч | 325° | + +Направление сходится в пределах 20°, сила -- в пределах множителя 1.8. + +**Это и есть достижимая точность способа без железа: направление уверенно, +сила -- с точностью до двух раз.** Любой вариант с датчиком должен +эту планку превосходить, иначе он не нужен. + +Ограничения: работает только задним числом, требует разнообразия курсов +(кольцевой маршрут или «туда-обратно» -- идеально, прямая в одну сторону -- +бесполезно), и предполагает, что ветер за поездку не менялся. Последнее +лечится подгонкой в скользящем окне 20-30 минут, но точность падает. + +## Вариант 2. Прогноз, скачанный ЗАРАНЕЕ по проводу + +Обходит запрет на сеть в поле: перед выездом, на домашнем проводном интернете, +скачивается почасовой прогноз ветра по району и кладётся в базу. В поездке сеть +не нужна вообще. + +Прогноз при этом используется **не как истина, а как начальное приближение** +для варианта 1: он задаёт правдоподобный диапазон, а трек его уточняет. +Возражение про «меряют в другой точке» остаётся в силе, но начальное +приближение с известным смещением лучше, чем поиск вслепую. + +Спорный момент: прогноз может оказаться хуже, чем ничего, если приземный ветер +в лесополосах отличается от станционного в разы. Стоит проверить на нескольких +треках, прежде чем закладывать. + +## Вариант 3. Трубка Пито на руле (единственный способ мерить по-настоящему) + +Так устроены настоящие аэродинамические измерители для велосипеда (Notio, +Aeropod). Трубка, направленная вперёд, плюс датчик разности давлений дают +**скорость набегающего воздуха напрямую**, с частотой в десятки герц. + +Разность между воздушной скоростью и путевой скоростью с GPS, вместе с курсом, +даёт вектор ветра непрерывно, включая порывы. Сети не требуется вообще. + +- датчик разности давлений класса MPXV7002DP плюс микроконтроллер с BLE +- порядок цены комплектующих -- полторы-три тысячи рублей +- BLE в приложении уже есть, канал знакомый +- нужна калибровка (сравнением с вариантом 1 на кольцевом маршруте в штиль) + и защита от дождя и грязи +- трубка на руле уязвима при падении и при переноске велосипеда + +**Это единственный из перечисленных способов, который измеряет, а не оценивает.** +И единственный, который видит порывы, а не среднее. + +## Вариант 4. Флюгер на руле + +Дешевле Пито: измеряется только **угол** набегающего потока относительно +велосипеда, обычным поворотным датчиком. Скорости ветра не даёт, но сильно +сужает решение в варианте 1 -- направление перестаёт быть неизвестным, +остаётся подобрать одну величину вместо двух. + +На велосипеде хрупок и чувствителен к завихрениям от самого седока. + +## Вариант 5. Голосовой ввод по словам-триггерам (идея пользователя) + +Седок произносит «в лицо», «в спину», «боковой», «порыв», приложение ставит +отметку времени. Распознавание на Android умеет работать без сети. + +**Замечание, которое считаю важным.** Как измерение это слабо: оценка +субъективна, отметки редкие, а говорить на тяжёлом дыхании и в шуме ветра +неудобно -- причём шум ветра в микрофоне мешает именно тогда, когда ветер +и надо отметить. + +Но у этого есть куда более сильное применение: **не как измерение, +а как разметка для проверки автоматической оценки.** Десяток отметок +«в лицо» и «в спину» за поездку -- это готовый ответ, по которому можно +проверить и откалибровать вариант 1, не покупая железа. Если оценка по треку +совпадает с отметками -- ей можно верить и без отметок. + +При таком применении редкость и субъективность отметок почти не мешают: +проверяется знак и порядок величины, а не точное значение. + +## Вариант 6. Кнопка вместо голоса + +То же самое, но нажатием: выносная кнопка на руле по BLE либо кнопка +на гарнитуре. Надёжнее голоса на тяжёлом дыхании и в шуме, но выражает меньше +-- реально различимы два-три состояния, не больше. + +## Вариант 7. Шум ветра в микрофоне + +Обдув микрофона даёт характерный низкочастотный шум, растущий со скоростью +потока. Теоретически из него извлекается воздушная скорость. + +Практически: в кармане бесполезно, нужен вынесенный микрофон; шум дороги +и шин мешает; калибровка своя для каждого телефона и чехла. Дёшево проверить, +но рассчитывать не стоит. Упомянуто для полноты. + +--- + +## О чём хотелось бы услышать мнение сессии разработки + +1. **Стоит ли вообще ветер в модели**, или проще честно писать «мощность + на равнине оценена с точностью ±30%» и не усложнять. Разброс 33% измерен, + вопрос в том, окупается ли его устранение. +2. **Вариант 5 в роли разметки** (а не измерения) -- насколько это ложится + на текущий UI и на запись событий с отметкой времени. По цене внедрения + это самый дешёвый из осмысленных шагов, и он не требует решать заранее, + покупать ли датчик. +3. **Оправдан ли вариант 3.** Планка задана: без железа выходит направление + с точностью около 20° и сила с точностью до двух раз. Датчик за + несколько тысяч рублей должен дать заметно больше, иначе он не нужен. +4. **Не ломает ли вариант 2 принцип автономности.** Скачивание заранее + по проводу формально сеть в поле не требует, но привязывает точность + расчёта к тому, вспомнил ли пользователь нажать кнопку перед выездом. + Это тот же изъян, что и у кнопки «уточнить высоты». + +Готовый код обоих методов варианта 1 -- в `tools/track/track.py` +(функция `wind_by_passes` и секция «ветер» в `report`), выше описан +алгоритмически. diff --git a/docs/session-logs/2026-09-07_brouter-findings.md b/docs/session-logs/2026-09-07_brouter-findings.md new file mode 100644 index 0000000..bfbeafa --- /dev/null +++ b/docs/session-logs/2026-09-07_brouter-findings.md @@ -0,0 +1,39 @@ +# Сессия 2026-09-07: разбор BRouter под две идеи + +## Контекст +Пользователь спросил, разбирал ли я brouter apk. Не разбирал. В дереве оказался +`brouter-1.6.3.zip` (внутри два apk `btools.routingapp`, движок `brouter-1.6.3-all.jar`, +профили, доки) и `FitPro...apk` (не brouter). Цель разбора (уточнена пользователем): понять, +как BRouter строит маршруты с малым набором высоты, ради двух идей — +1) заполнять пропажу GPS кратчайшим путём по дороге; 2) оффлайн-планирование маршрута по точкам +в BalDav (замена онлайн-BRouter). + +## Действия +Работали по утверждённому плану `~/.claude/plans/merry-discovering-dream.md` (сохранён смысл ниже; +файл планов ротируется). Разбор read-only: листинг архива, чтение доков/профилей через stdout, +инспекция jar в памяти (python zipfile из BytesIO), извлечение строк байткода — распаковки на диск +и запуска Java не было. + +Выяснено: где дорога — сегменты `.rd5` (тайлы 5×5°, OSM в битстрим по lookups.dat, высоты из +SRTM-90м); роутинг — `btools.router.RoutingEngine` (matchWaypointsToNodes → поиск по графу, +стоимость из профиля `btools.expressions`); малый набор высоты — параметры профиля +uphillcost/downhillcost/cutoff + кинематика (totalMass/S_C_x=CdA/C_r/bikerPower, аналог модели +мощности BalDav); `shortest.brf` — чистый кратчайший путь (под идею 1). Вызов оффлайн: jar +`RouteServer ` + HTTP +`/brouter?lonlats=..&profile=..&format=geojson`; приложение BRouter (Server-Mode HTTP или intent); +встраивание jar (356 КБ) в Android-модуль BalDav. + +## Результат +Создан `docs/brouter-findings.md` — полный разбор: состав, данные, алгоритм, малый набор высоты, +3 способа вызова + встраивание, обе идеи со стыком к существующему коду (computeStats ветка isGap; +showRouteEditor/showRouteDetail/parseRouteGPX/routeElevStats в main.js), таблица вариантов +интеграции с рекомендацией (целевой — встраивание движка; сначала проверить ценность на +установленном приложении BRouter), открытые вопросы (лицензия abrensch/brouter, сегменты +качать/строить, хранилище на телефоне, профили). Реализацию идей НЕ делали — отдельные фичи. + +README не трогал: пользовательской фичи пока нет, это анализ. PROJECT_MAP — добавлен раздел +«Разборы (docs/)» с указателями на gps-model-findings и brouter-findings. + +## Следующие шаги +- Ответы пользователя на открытые вопросы §9 разбора → планировать идею 1 и/или идею 2. +- Опционально PoC: RouteServer на компе + сегменты региона (нужен JRE + загрузка, по согласию). diff --git a/frontend/index.html b/frontend/index.html index a9d2326..8170a98 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -23,6 +23,7 @@ + diff --git a/frontend/js/router.js b/frontend/js/router.js new file mode 100644 index 0000000..b18f935 --- /dev/null +++ b/frontend/js/router.js @@ -0,0 +1,20 @@ +// Offline routing via the embedded BRouter engine. +// JS → Rust command `brouter_route` → Kotlin (btools.router) → GPX back. +// BRouter.route(points, profile): +// points — array of [lon, lat] pairs (BRouter order; NOT [lat, lon]) +// profile — "trekking" (planning) | "shortest" (gap fill); default "trekking" +// Returns a GPX string (parse with parseRouteGPX) or throws with the engine's error. +// Needs the region .rd5 segments present on device (files/brouter/segments4). +window.BRouter = { + async route(points, profile) { + let lonlats = JSON.stringify((points || []).map(p => [p[0], p[1]])); + let raw = await window.__TAURI__.core.invoke("brouter_route", { + lonlats, + profile: profile || "trekking", + }); + let res; + try { res = JSON.parse(raw); } catch (e) { throw new Error("brouter: bad result: " + raw); } + if (!res.ok) throw new Error("brouter: " + (res.error || "unknown error")); + return res.gpx; + }, +}; diff --git a/src-tauri/gen/android/app/build.gradle.kts b/src-tauri/gen/android/app/build.gradle.kts new file mode 100644 index 0000000..d2b3818 --- /dev/null +++ b/src-tauri/gen/android/app/build.gradle.kts @@ -0,0 +1,77 @@ +import java.util.Properties + +plugins { + id("com.android.application") + id("org.jetbrains.kotlin.android") + id("rust") +} + +val tauriProperties = Properties().apply { + val propFile = file("tauri.properties") + if (propFile.exists()) { + propFile.inputStream().use { load(it) } + } +} + +android { + compileSdk = 36 + namespace = "dev.baldav.app" + defaultConfig { + manifestPlaceholders["usesCleartextTraffic"] = "false" + applicationId = "dev.baldav.app" + minSdk = 24 + targetSdk = 36 + versionCode = tauriProperties.getProperty("tauri.android.versionCode", "1").toInt() + versionName = tauriProperties.getProperty("tauri.android.versionName", "1.0") + } + buildTypes { + getByName("debug") { + manifestPlaceholders["usesCleartextTraffic"] = "true" + isDebuggable = true + isJniDebuggable = true + isMinifyEnabled = false + packaging { jniLibs.keepDebugSymbols.add("*/arm64-v8a/*.so") + jniLibs.keepDebugSymbols.add("*/armeabi-v7a/*.so") + jniLibs.keepDebugSymbols.add("*/x86/*.so") + jniLibs.keepDebugSymbols.add("*/x86_64/*.so") + } + } + getByName("release") { + isMinifyEnabled = true + proguardFiles( + *fileTree(".") { include("**/*.pro") } + .plus(getDefaultProguardFile("proguard-android-optimize.txt")) + .toList().toTypedArray() + ) + } + } + kotlinOptions { + jvmTarget = "1.8" + } + buildFeatures { + buildConfig = true + } +} + +rust { + rootDirRel = "../../../" +} + +dependencies { + // BRouter offline routing engine (MIT, github.com/abrensch/brouter) — embedded so + // routes are computed on-device without network. Called in-process from Kotlin + // (btools.router.RoutingEngine). Segments (.rd5) live in app data dir; profiles in assets. + implementation(files("libs/brouter-1.6.3-all.jar")) + implementation("androidx.webkit:webkit:1.14.0") + implementation("androidx.appcompat:appcompat:1.7.1") + implementation("androidx.activity:activity-ktx:1.10.1") + implementation("com.google.android.material:material:1.12.0") + // Optional fused location provider (opt-in via settings). Guarded at runtime so + // the app still works if Google Play services are absent — see GpsRecorderService. + implementation("com.google.android.gms:play-services-location:21.3.0") + testImplementation("junit:junit:4.13.2") + androidTestImplementation("androidx.test.ext:junit:1.1.4") + androidTestImplementation("androidx.test.espresso:espresso-core:3.5.0") +} + +apply(from = "tauri.build.gradle.kts") \ No newline at end of file diff --git a/src-tauri/gen/android/app/libs/brouter-1.6.3-all.jar b/src-tauri/gen/android/app/libs/brouter-1.6.3-all.jar new file mode 100644 index 0000000000000000000000000000000000000000..4310c1c940633fdf84840616cd3174d543a767be GIT binary patch literal 356201 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 =+1bMCMK` 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

KAYUw9(|pC;%E=a7WTse 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 +highway;0000000046 toll_bridge +highway;0000000037 city_entry +highway;0000002967 traffic_mirror +highway;0000001724 priority + +barrier;0000606512 gate +barrier;0000164120 bollard +barrier;0000112184 lift_gate +barrier;0000046779 stile +barrier;0000046255 cycle_barrier +barrier;0000038597 entrance +barrier;0000027579 block +barrier;0000023074 toll_booth +barrier;0000016782 cattle_grid +barrier;0000016154 kissing_gate +barrier;0000003182 turnstile +barrier;0000003160 fence +barrier;0000002701 border_control +barrier;0000002536 sally_port +barrier;0000002504 chain +barrier;0000002470 door +barrier;0000002089 swing_gate +barrier;0000001912 bump_gate +barrier;0000001856 yes +barrier;0000001683 hampshire_gate +barrier;0000000445 wall +barrier;0000000440 bus_trap +barrier;0000000435 ditch +barrier;0000000420 debris +barrier;0000000381 log +barrier;0000000336 chicane +barrier;0000000316 kerb +barrier;0000000270 sump_buster +barrier;0000000268 obstacle +barrier;0000000223 no +barrier;0000000213 horse_stile +barrier;0000000210 full-height_turnstile +barrier;0000000176 windfall +barrier;0000000168 spikes +barrier;0000000168 checkpoint +barrier;0000000166 hedge +barrier;0000000164 footgate +barrier;0000000141 tree +barrier;0000000133 guard_rail +barrier;0000000129 bar +barrier;0000000124 fallen_tree +barrier;0000000118 jersey_barrier +barrier;0000000114 motorcycle_barrier +barrier;0000000114 barrier +barrier;0000000108 rope +barrier;0000000095 stone +barrier;0000000069 traffic_crossing_pole + + +access;0000078544 private +access;0000014933 yes public +access;0000014456 no +access;0000008670 permissive +access;0000006316 destination customers +access;0000000973 agricultural forestry +access;0000000942 designated official + +foot;0000272169 yes +foot;0000036271 no +foot;0000001118 designated official +foot;0000000960 private +foot;0000000833 permissive +foot;0000000127 destination + +bicycle;0000267569 yes +bicycle;0000067796 no +bicycle;0000004075 designated official +bicycle;0000002596 dismount +bicycle;0000000498 permissive +bicycle;0000000359 private +bicycle;0000000075 destination + +motorcar;0000038901 yes +motorcar;0000009323 no +motorcar;0000000895 private +motorcar;0000000216 destination +motorcar;0000000214 permissive +motorcar;0000000093 agricultural forestry +motorcar;0000000084 designated official + +motor_vehicle;0000000066 yes +motor_vehicle;0000000001 permissive +motor_vehicle;0000000000 designated official +motor_vehicle;0000000030 destination +motor_vehicle;0000000073 agricultural forestry +motor_vehicle;0000000136 private +motor_vehicle;0000000469 no + +motorcycle;0000028697 yes +motorcycle;0000007061 no +motorcycle;0000000243 private +motorcycle;0000000237 designated +motorcycle;0000000117 destination +motorcycle;0000000080 permissive +motorcycle;0000000029 agricultural forestry + +vehicle;0000002176 no +vehicle;0000000576 yes +vehicle;0000000556 private +vehicle;0000000262 destination +vehicle;0000000138 agricultural forestry +vehicle;0000000105 permissive +vehicle;0000000003 designated official + +horse;0000021837 yes +horse;0000010811 no +horse;0000000105 private +horse;0000000065 permissive +horse;0000000053 designated official +horse;0000000009 critical +horse;0000000007 destination + +wheelchair;0000203478 yes true +wheelchair;0000100082 no false +wheelchair;0000080430 limited +wheelchair;0000002769 designated official +wheelchair;0000000005 private +wheelchair;0000000005 permissive +wheelchair;0000000139 bad +wheelchair;0000000031 half +wheelchair;0000000005 partial + +hgv;0000001141 no +hgv;0000000359 yes true +hgv;0000000111 destination +hgv;0000000108 designated official +hgv;0000000065 private +hgv;0000000053 delivery +hgv;0000000016 agricultural forestry +hgv;0000000010 permissive + +crossing;0000251032 uncontrolled +crossing;0000200387 traffic_signals +crossing;0000029717 unmarked +crossing;0000022119 island +crossing;0000006981 zebra +crossing;0000003897 no +crossing;0000002166 yes + +railway;0000312710 level_crossing +railway;0000078746 station +railway;0000067876 buffer_stop +railway;0000056184 switch +railway;0000049600 crossing +railway;0000037871 tram_stop +railway;0000024038 halt +railway;0000014285 subway_entrance +railway;0000010890 signal + +waterway;0000004698 weir +waterway;0000001647 lock_gate +waterway;0000000425 waterfall +waterway;0000000337 take_right_side +waterway;0000000332 take_left_side +waterway;0000000219 milestone +waterway;0000000187 depth +waterway;0000000170 lock + +noexit;0000195286 yes + +entrance;0000301732 yes +entrance;0000159853 main +entrance;0000025621 staircase +entrance;0000006666 home +entrance;0000005428 service +entrance;0000001853 emergency +entrance;0000001144 exit +entrance;0000000953 residence +entrance;0000000620 garage +entrance;0000000558 entrance +entrance;0000000504 main_entrance +entrance;0000000439 secondary_entrance +entrance;0000000285 shop +entrance;0000000258 private + +traffic_calming;0000045987 bump bump;choker +traffic_calming;0000040022 hump hump;choker +traffic_calming;0000012499 table table;choker +traffic_calming;0000006808 yes * +traffic_calming;0000005754 cushion cushion;choker +traffic_calming;0000005466 choker choker;cushion choker;hump choker;table choker;bump +traffic_calming;0000005305 island +traffic_calming;0000004686 chicane +traffic_calming;0000004032 rumble_strip +traffic_calming;0000000847 speed_bump +traffic_calming;0000000186 dip + +ford;0000037927 yes +ford;0000000310 stepping_stones + +direction;0000274642 forward +direction;0000249637 backward +direction;0000021634 both + +traffic_signals:direction;0000062645 forward +traffic_signals:direction;0000033961 backward +traffic_signals:direction;0000007309 both diff --git a/src-tauri/gen/android/app/src/main/assets/brouter/profiles2/shortest.brf b/src-tauri/gen/android/app/src/main/assets/brouter/profiles2/shortest.brf new file mode 100644 index 0000000..a4cc7f3 --- /dev/null +++ b/src-tauri/gen/android/app/src/main/assets/brouter/profiles2/shortest.brf @@ -0,0 +1,149 @@ +---context:global # following code refers to global config + +# the elevation parameters + +assign downhillcost 0 +assign downhillcutoff 1.5 +assign uphillcost 0 +assign uphillcutoff 1.5 + +assign turnInstructionMode = 1 # 0=none, 1=auto-choose, 2=locus-style, 3=osmand-style, 4=comment-style, 5=gpsies-style, 6=orux-style +assign validForFoot 1 + +---context:way # following code refers to way-tags + +assign any_cycleroute or route_bicycle_icn=yes or route_bicycle_ncn=yes or route_bicycle_rcn=yes route_bicycle_lcn=yes +assign nodeaccessgranted or any_cycleroute lcn=yes + +assign turncost 0 + +assign initialclassifier = + if route=ferry then 1 + else 0 + +assign initialcost switch route=ferry 10000 0 + +# +# implicit access here just from the motorroad tag +# (implicit access rules from highway tag handled elsewhere) +# +assign defaultaccess + switch access= + not motorroad=yes + switch or access=private access=no + 0 + 1 + +# +# calculate logical bike access +# +assign bikeaccess + or any_cycleroute + switch bicycle= + switch bicycle_road=yes + 1 + switch vehicle= + defaultaccess + switch or vehicle=private vehicle=no + 0 + 1 + not or bicycle=private or bicycle=no bicycle=dismount + +# +# calculate logical foot access +# +assign footaccess + or bikeaccess + or bicycle=dismount + switch foot= + defaultaccess + not or foot=private foot=no + +assign accesspenalty switch or bikeaccess footaccess 0 100000 + +assign costfactor + add accesspenalty + + switch and highway= not route=ferry 100000 + + switch route=ferry 5.67 + switch or highway=motorway highway=motorway_link 100000 + switch or highway=proposed highway=abandoned 100000 + 1 + +# way priorities used for voice hint generation + +assign isresidentialorliving = or highway=residential|living_street living_street=yes + +assign priorityclassifier = + + if ( highway=motorway ) then 30 + else if ( highway=motorway_link ) then 29 + else if ( highway=trunk ) then 28 + else if ( highway=trunk_link ) then 27 + else if ( highway=primary ) then 26 + else if ( highway=primary_link ) then 25 + else if ( highway=secondary ) then 24 + else if ( highway=secondary_link ) then 23 + else if ( highway=tertiary ) then 22 + else if ( highway=tertiary_link ) then 21 + else if ( highway=unclassified ) then 20 + else if ( isresidentialorliving ) then 6 + else if ( highway=service ) then 6 + else if ( highway=cycleway ) then 6 + else if ( or bicycle=designated bicycle_road=yes ) then 6 + else if ( highway=track ) then if tracktype=grade1 then 6 else 4 + else if ( highway=bridleway|road|path|footway ) then 4 + else if ( highway=steps ) then 2 + else if ( highway=pedestrian ) then 2 + else 0 + +# some more classifying bits used for voice hint generation... + +assign isroundabout = junction=roundabout +assign islinktype = highway=motorway_link|trunk_link|primary_link|secondary_link|tertiary_link +assign isgoodforcars = if greater priorityclassifier 6 then true + else if ( or isresidentialorliving highway=service ) then true + else if ( and highway=track tracktype=grade1 ) then true + else false + + +# ... encoded into a bitmask + +assign classifiermask add multiply isroundabout 4 + add multiply islinktype 8 + multiply isgoodforcars 16 + +# include `smoothness=` tags in the response's WayTags for track analysis +assign dummyUsage = smoothness= + +---context:node # following code refers to node tags + +assign defaultaccess + switch access= + 1 # add default barrier restrictions here! + switch or access=private access=no + 0 + 1 + +assign bikeaccess + or nodeaccessgranted=yes + switch bicycle= + switch vehicle= + defaultaccess + switch or vehicle=private vehicle=no + 0 + 1 + switch or bicycle=private or bicycle=no bicycle=dismount + 0 + 1 + +assign footaccess + or bicycle=dismount + switch foot= + defaultaccess + switch or foot=private foot=no + 0 + 1 + +assign initialcost switch or bikeaccess footaccess 0 1000000 diff --git a/src-tauri/gen/android/app/src/main/assets/brouter/profiles2/trekking.brf b/src-tauri/gen/android/app/src/main/assets/brouter/profiles2/trekking.brf new file mode 100644 index 0000000..8a4b94d --- /dev/null +++ b/src-tauri/gen/android/app/src/main/assets/brouter/profiles2/trekking.brf @@ -0,0 +1,330 @@ +# *** The trekking profile is for slow travel +# *** and avoiding car traffic, but still with +# *** a focus on approaching your destination +# *** efficiently. + +---context:global # following code refers to global config + +# Bike profile +assign validForBikes = true + +# Use the following switches to change behaviour +assign allow_steps = true # %allow_steps% | Set to false to disallow steps | boolean +assign allow_ferries = true # %allow_ferries% | set to false to disallow ferries | boolean +assign ignore_cycleroutes = false # %ignore_cycleroutes% | Set to true for better elevation results | boolean +assign stick_to_cycleroutes = false # %stick_to_cycleroutes% | Set to true to just follow cycleroutes | boolean +assign avoid_unsafe = false # %avoid_unsafe% | Set to true to avoid standard highways | boolean +assign considerTurnRestrictions = true # %considerTurnRestrictions% | Set to true to take turn restrictions into account | boolean +assign processUnusedTags = false # %processUnusedTags% | Set to true to output unused tags in data tab | boolean + +# Change elevation parameters +assign consider_elevation = true # %consider_elevation% | Set to false to ignore elevation in routing | boolean +assign downhillcost = 60 # %downhillcost% | Cost for going downhill | number +assign downhillcutoff = 1.5 # %downhillcutoff% | Gradients below this value in percents are not counted. | number +assign uphillcost = 0 # %uphillcost% | Cost for going uphill | number +assign uphillcutoff = 1.5 # %uphillcutoff% | Gradients below this value in percents are not counted. | number + +assign downhillcost = if consider_elevation then downhillcost else 0 +assign uphillcost = if consider_elevation then uphillcost else 0 + +# Kinematic model parameters (travel time computation) +assign totalMass = 90 # %totalMass% | Mass (in kg) of the bike + biker, for travel time computation | number +assign maxSpeed = 45 # %maxSpeed% | Absolute maximum speed (in km/h), for travel time computation | number +assign S_C_x = 0.225 # %S_C_x% | Drag coefficient times the reference area (in m^2), for travel time computation | number +assign C_r = 0.01 # %C_r% | Rolling resistance coefficient (dimensionless), for travel time computation | number +assign bikerPower = 100 # %bikerPower% | Average power (in W) provided by the biker, for travel time computation | number + +# Turn instructions settings +assign turnInstructionMode = 1 # %turnInstructionMode% | Mode for the generated turn instructions | [0=none, 1=auto-choose, 2=locus-style, 3=osmand-style, 4=comment-style, 5=gpsies-style, 6=orux-style] +assign turnInstructionCatchingRange = 40 # %turnInstructionCatchingRange% | Within this distance (in m) several turning instructions are combined into one and the turning angles are better approximated to the general direction | number +assign turnInstructionRoundabouts = true # %turnInstructionRoundabouts% | Set to "false" to avoid generating special turning instructions for roundabouts | boolean + + +---context:way # following code refers to way-tags + +# classifier constants +assign classifier_none = 1 +assign classifier_ferry = 2 + +# +# pre-calculate some logical expressions +# + +assign any_cycleroute = + if route_bicycle_icn=yes then true + else if route_bicycle_ncn=yes then true + else if route_bicycle_rcn=yes then true + else if route_bicycle_lcn=yes then true + else false + +assign nodeaccessgranted = + if any_cycleroute then true + else lcn=yes + +assign is_ldcr = + if ignore_cycleroutes then false + else any_cycleroute + +assign isbike = or bicycle_road=yes or bicycle=yes or or bicycle=permissive bicycle=designated lcn=yes +assign ispaved = surface=paved|asphalt|concrete|paving_stones|sett +assign isunpaved = not or surface= or ispaved surface=fine_gravel|cobblestone +assign probablyGood = or ispaved and ( or isbike highway=footway ) not isunpaved + + +# +# this is the cost (in Meter) for a 90-degree turn +# The actual cost is calculated as turncost*cos(angle) +# (Suppressing turncost while following longdistance-cycleways +# makes them a little bit more magnetic) +# +assign turncost = if is_ldcr then 0 + else if junction=roundabout then 0 + else 90 + + +# +# for any change in initialclassifier, initialcost is added once +# +assign initialclassifier = + if route=ferry then classifier_ferry + else classifier_none + + +# +# calculate the initial cost +# this is added to the total cost each time the costfactor +# changed +# +assign initialcost = + if ( equal initialclassifier classifier_ferry ) then 10000 + else 0 + +# +# implicit access here just from the motorroad tag +# (implicit access rules from highway tag handled elsewhere) +# +assign defaultaccess = + if access= then not motorroad=yes + else if access=private|no then false + else true + +# +# calculate logical bike access +# +assign bikeaccess = + if any_cycleroute then true + else if bicycle= then + ( + if bicycle_road=yes then true + else if vehicle= then ( if highway=footway then false else defaultaccess ) + else not vehicle=private|no + ) + else not bicycle=private|no|dismount|use_sidepath + +# +# calculate logical foot access +# +assign footaccess = + if bikeaccess then true + else if bicycle=dismount then true + else if foot= then defaultaccess + else not foot=private|no + +# +# if not bike-, but foot-acess, just a moderate penalty, +# otherwise access is forbidden +# +assign accesspenalty = + if bikeaccess then 0 + else if footaccess then 4 + else 10000 + +# +# handle one-ways. On primary roads, wrong-oneways should +# be close to forbidden, while on other ways we just add +# 4 to the costfactor (making it at least 5 - you are allowed +# to push your bike) +# +assign badoneway = + if reversedirection=yes then + if oneway:bicycle=yes then true + else if oneway= then junction=roundabout + else oneway=yes|true|1 + else oneway=-1 + +assign onewaypenalty = + if ( badoneway ) then + ( + if ( cycleway=opposite|opposite_lane|opposite_track ) then 0 + else if ( oneway:bicycle=no ) then 0 + else if ( highway=primary|primary_link ) then 50 + else if ( highway=secondary|secondary_link ) then 30 + else if ( highway=tertiary|tertiary_link ) then 20 + else 4.0 + ) + else 0.0 + +# +# calculate the cost-factor, which is the factor +# by which the distance of a way-segment is multiplied +# to calculate the cost of that segment. The costfactor +# must be >=1 and it's supposed to be close to 1 for +# the type of way the routing profile is searching for +# +assign isresidentialorliving = or highway=residential|living_street living_street=yes +assign costfactor + + # + # exclude rivers, rails etc. + # + if ( and highway= not route=ferry ) then 10000 + + # + # exclude motorways and proposed roads + # + else if ( highway=motorway|motorway_link ) then 10000 + else if ( highway=proposed|abandoned ) then 10000 + + # + # all other exclusions below (access, steps, ferries,..) + # should not be deleted by the decoder, to be available + # in voice-hint-processing + # + else min 9999 + + # + # apply oneway-and access-penalties + # + add max onewaypenalty accesspenalty + + # + # steps and ferries are special. Note this is handled + # before the cycleroute-switch, to be able + # to really exlude them be setting cost to infinity + # + if ( highway=steps ) then ( if allow_steps then 40 else 10000 ) + else if ( route=ferry ) then ( if allow_ferries then 5.67 else 10000 ) + + # + # handle long-distance cycle-routes. + # + else if ( is_ldcr ) then 1 # always treated as perfect (=1) + else + add ( if stick_to_cycleroutes then 0.5 else 0.05 ) # everything else somewhat up + + # + # some other highway types + # + if ( highway=pedestrian ) then 3 + else if ( highway=bridleway ) then 5 + else if ( highway=cycleway ) then 1 + else if ( isresidentialorliving ) then ( if isunpaved then 1.5 else 1.1 ) + else if ( highway=service ) then ( if isunpaved then 1.6 else 1.3 ) + + # + # tracks and track-like ways are rated mainly be tracktype/grade + # But note that if no tracktype is given (mainly for road/path/footway) + # it can be o.k. if there's any other hint for quality + # + else if ( highway=track|road|path|footway ) then + ( + if ( tracktype=grade1 ) then ( if probablyGood then 1.0 else 1.3 ) + else if ( tracktype=grade2 ) then ( if probablyGood then 1.1 else 2.0 ) + else if ( tracktype=grade3 ) then ( if probablyGood then 1.5 else 3.0 ) + else if ( tracktype=grade4 ) then ( if probablyGood then 2.0 else 5.0 ) + else if ( tracktype=grade5 ) then ( if probablyGood then 3.0 else 5.0 ) + else ( if probablyGood then 1.0 else 5.0 ) + ) + + # + # When avoiding unsafe ways, avoid highways without a bike hint + # + else add ( if ( and avoid_unsafe not isbike ) then 2 else 0 ) + + # + # actuals roads are o.k. if we have a bike hint + # + if ( highway=trunk|trunk_link ) then ( if isbike then 1.5 else 10 ) + else if ( highway=primary|primary_link ) then ( if isbike then 1.2 else 3 ) + else if ( highway=secondary|secondary_link ) then ( if isbike then 1.1 else 1.6 ) + else if ( highway=tertiary|tertiary_link ) then ( if isbike then 1.0 else 1.4 ) + else if ( highway=unclassified ) then ( if isbike then 1.0 else 1.3 ) + + # + # default for any other highway type not handled above + # + else 2.0 + + +# way priorities used for voice hint generation + +assign priorityclassifier = + + if ( highway=motorway ) then 30 + else if ( highway=motorway_link ) then 29 + else if ( highway=trunk ) then 28 + else if ( highway=trunk_link ) then 27 + else if ( highway=primary ) then 26 + else if ( highway=primary_link ) then 25 + else if ( highway=secondary ) then 24 + else if ( highway=secondary_link ) then 23 + else if ( highway=tertiary ) then 22 + else if ( highway=tertiary_link ) then 21 + else if ( highway=unclassified ) then 20 + else if ( isresidentialorliving ) then 6 + else if ( highway=service ) then 6 + else if ( highway=cycleway ) then 6 + else if ( or bicycle=designated bicycle_road=yes ) then 6 + else if ( highway=track ) then if tracktype=grade1 then 6 else 4 + else if ( highway=bridleway|road|path|footway ) then 4 + else if ( highway=steps ) then 2 + else if ( highway=pedestrian ) then 2 + else 0 + +# some more classifying bits used for voice hint generation... + +assign isbadoneway = not equal onewaypenalty 0 +assign isgoodoneway = if reversedirection=yes then oneway=-1 + else if oneway= then junction=roundabout else oneway=yes|true|1 +assign isroundabout = junction=roundabout +assign islinktype = highway=motorway_link|trunk_link|primary_link|secondary_link|tertiary_link +assign isgoodforcars = if greater priorityclassifier 6 then true + else if ( or isresidentialorliving highway=service ) then true + else if ( and highway=track tracktype=grade1 ) then true + else false + +# ... encoded into a bitmask + +assign classifiermask add isbadoneway + add multiply isgoodoneway 2 + add multiply isroundabout 4 + add multiply islinktype 8 + multiply isgoodforcars 16 + +# include `smoothness=` tags in the response's WayTags for track analysis +assign dummyUsage = smoothness= + +---context:node # following code refers to node tags + +assign defaultaccess = + if ( access= ) then true # add default barrier restrictions here! + else if ( access=private|no ) then false + else true + +assign bikeaccess = + if nodeaccessgranted=yes then true + else if bicycle= then + ( + if vehicle= then defaultaccess + else not vehicle=private|no + ) + else not bicycle=private|no|dismount + +assign footaccess = + if bicycle=dismount then true + else if foot= then defaultaccess + else not foot=private|no + +assign initialcost = + if bikeaccess then 0 + else ( if footaccess then 100 else 1000000 ) diff --git a/src-tauri/gen/android/app/src/main/java/dev/baldav/app/MainActivity.kt b/src-tauri/gen/android/app/src/main/java/dev/baldav/app/MainActivity.kt index fb0a005..0469e4f 100644 --- a/src-tauri/gen/android/app/src/main/java/dev/baldav/app/MainActivity.kt +++ b/src-tauri/gen/android/app/src/main/java/dev/baldav/app/MainActivity.kt @@ -104,10 +104,26 @@ class MainActivity : TauriActivity() { if (!cmdFile.exists()) cmdFile.createNewFile() val bleCmdFile = File(appDataDir, "ble_command.txt") if (!bleCmdFile.exists()) bleCmdFile.createNewFile() + val brouterCmdFile = File(appDataDir, "brouter_command.txt") + if (!brouterCmdFile.exists()) brouterCmdFile.createNewFile() + + // Copy BRouter routing profiles (+ lookups.dat) from assets to files/brouter/profiles2. + // The embedded engine (btools.router) reads them by path alongside the segments. + try { + val profDir = File(filesDir, "brouter/profiles2") + profDir.mkdirs() + for (f in (assets.list("brouter/profiles2") ?: arrayOf())) { + assets.open("brouter/profiles2/$f").use { i -> File(profDir, f).outputStream().use { o -> i.copyTo(o) } } + } + Log.d("BalDav", "BRouter profiles copied to ${profDir.absolutePath}") + } catch (e: Exception) { + Log.e("BalDav", "Failed to copy BRouter profiles", e) + } setupCommandWatcher(appDataDir) processGpsCommand(appDataDir) processBleCommand(appDataDir) + processBrouterCommand(appDataDir) Log.d("BalDav", "Command watcher started on ${appDataDir.absolutePath}") // Diagnostic HTTP endpoint on localhost — GET /gps makes the app request a live @@ -161,6 +177,8 @@ class MainActivity : TauriActivity() { processGpsCommand(appDataDir) processBleCommand(appDataDir) } + } else if (path == "brouter_command.txt") { + runOnUiThread { processBrouterCommand(appDataDir) } } } } @@ -168,6 +186,69 @@ class MainActivity : TauriActivity() { Log.d("BalDav", "FileObserver started on ${appDataDir.absolutePath}") } + // Offline routing via the embedded BRouter engine (btools.router). Request/response + // over files like the GPS bridge: Rust writes brouter_request.json + brouter_command.txt + // ("route:"), we route on a background thread (routing is heavy — never the UI + // thread) and write brouter_result_.json ({ok, gpx} | {ok:false, error}). + private fun processBrouterCommand(appDataDir: File) { + val cmdFile = File(appDataDir, "brouter_command.txt") + if (!cmdFile.exists()) return + val cmd = cmdFile.readText().trim() + if (cmd.isEmpty()) return + cmdFile.writeText("") + if (!cmd.startsWith("route:")) return + val id = cmd.substringAfter("route:") + Thread { + val resultFile = File(appDataDir, "brouter_result_$id.json") + val out = org.json.JSONObject() + try { + val req = org.json.JSONObject(File(appDataDir, "brouter_request.json").readText()) + val profile = req.getString("profile") + val arr = req.getJSONArray("lonlats") + val pts = ArrayList() + for (i in 0 until arr.length()) { + val pair = arr.getJSONArray(i) + pts.add(doubleArrayOf(pair.getDouble(0), pair.getDouble(1))) + } + val profilePath = File(filesDir, "brouter/profiles2/$profile.brf").absolutePath + val segmentsDir = File(filesDir, "brouter/segments4") + val gpx = routeBrouter(segmentsDir, profilePath, pts) + out.put("ok", true) + out.put("gpx", gpx) + } catch (e: Exception) { + Log.e("BalDav", "BRouter route failed", e) + out.put("ok", false) + out.put("error", e.message ?: e.toString()) + } + try { resultFile.writeText(out.toString()) } catch (e: Exception) { Log.e("BalDav", "brouter result write failed", e) } + }.start() + } + + // Minimal embedding recipe (mirrors btools.server.request.ServerHandler): build a + // RoutingContext pointing at the profile (.brf; the engine parses it via ProfileCache + // and loads lookups.dat from the same dir), waypoints as OsmNodeNamed (ilon/ilat are + // micro-degrees), run the engine, return the track as GPX. + private fun routeBrouter(segmentsDir: File, profilePath: String, pts: List): String { + val rc = btools.router.RoutingContext() + rc.memoryclass = 128 + rc.localFunction = profilePath + rc.setAlternativeIdx(0) + val wps = ArrayList() + for (p in pts) { + val n = btools.router.OsmNodeNamed() + n.ilon = ((p[0] + 180.0) * 1000000.0 + 0.5).toInt() + n.ilat = ((p[1] + 90.0) * 1000000.0 + 0.5).toInt() + n.name = "wp" + wps.add(n) + } + val re = btools.router.RoutingEngine(null, null, segmentsDir, wps, rc) + re.doRun(0) + val err = re.getErrorMessage() + if (err != null && err.isNotEmpty()) throw RuntimeException(err) + val track = re.getFoundTrack() ?: throw RuntimeException("no track found") + return track.formatAsGpx() + } + private fun processGpsCommand(appDataDir: File) { val cmdFile = File(appDataDir, "gps_command.txt") if (!cmdFile.exists()) return diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 84a9229..c7a6db0 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -393,6 +393,48 @@ fn gps_service_command(app: tauri::AppHandle, cmd: String) -> Result" command where MainActivity's +// FileObserver watches, then poll for brouter_result_.json. `lonlats` is a JSON +// array of [lon,lat] pairs; returns the Kotlin result JSON ({ok,gpx}|{ok:false,error}). +#[tauri::command] +fn brouter_route(app: tauri::AppHandle, lonlats: String, profile: String) -> Result { + let data_dir = app.path().app_data_dir().map_err(|e| e.to_string())?; + std::fs::create_dir_all(&data_dir).ok(); + let id = std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH).map_err(|e| e.to_string())? + .as_millis().to_string(); + let req = format!( + "{{\"profile\":{},\"lonlats\":{}}}", + serde_json::to_string(&profile).map_err(|e| e.to_string())?, + lonlats + ); + let result_name = format!("brouter_result_{}.json", id); + // Write request + command to app_data_dir AND app root (where Kotlin watches). + let root = data_dir.parent().and_then(|p| p.parent()).map(|p| p.to_path_buf()); + let write_both = |name: &str, content: &str| { + let _ = std::fs::write(data_dir.join(name), content); + if let Some(r) = &root { let _ = std::fs::write(r.join(name), content); } + }; + write_both("brouter_request.json", &req); + write_both("brouter_command.txt", &format!("route:{}", id)); + // Poll for the result (routing can take a few seconds; cap ~60s). + let mut candidates = vec![data_dir.join(&result_name)]; + if let Some(r) = &root { candidates.push(r.join(&result_name)); } + for _ in 0..600 { + for p in &candidates { + if p.exists() { + if let Ok(s) = std::fs::read_to_string(p) { + let _ = std::fs::remove_file(p); + return Ok(s); + } + } + } + std::thread::sleep(std::time::Duration::from_millis(100)); + } + Err("brouter: timeout waiting for result".into()) +} + // Read GPS points from service's JSONL file #[tauri::command] fn gps_service_read_points(app: tauri::AppHandle) -> Result { @@ -904,7 +946,7 @@ pub fn run() { .add_migrations("sqlite:baldav.db", migrations) .build(), ) - .invoke_handler(tauri::generate_handler![get_safe_insets, import_seed_products, import_tiles, download_file, get_points_filename, delete_points_file, gps_set_session_id, list_points_files, read_points_file, pick_file_open, get_picked_file, debug_native_paths, rebuild_roads, get_road_points, get_app_info, gps_service_command, gps_service_read_points, save_file, get_update_info, http_request, chzn_http, ble::ble_scan, ble::ble_scan_results, ble::ble_connect, ble::ble_disconnect, ble::ble_get_hr, ble::ble_is_connected, ble::ble_check_bluetooth, ble::ble_save_device, ble::ble_clear_hr]) + .invoke_handler(tauri::generate_handler![get_safe_insets, import_seed_products, import_tiles, download_file, get_points_filename, delete_points_file, gps_set_session_id, list_points_files, read_points_file, pick_file_open, get_picked_file, debug_native_paths, rebuild_roads, get_road_points, get_app_info, gps_service_command, gps_service_read_points, brouter_route, save_file, get_update_info, http_request, chzn_http, ble::ble_scan, ble::ble_scan_results, ble::ble_connect, ble::ble_disconnect, ble::ble_get_hr, ble::ble_is_connected, ble::ble_check_bluetooth, ble::ble_save_device, ble::ble_clear_hr]) .run(tauri::generate_context!()) .expect("error while running tauri application"); }