Mathieu Moran
ed2b3aacfc
feat: downloads tab + public Movies/yaris-obd/ folder
...
- Downloads now go to Movies/yaris-obd/ (visible in file managers)
- New Downloads tab: list downloaded files, tap to play (system player),
delete button
- FileProvider added for video playback intent
- Downloaded files auto-refresh after each download
2026-08-12 01:56:18 -04:00
Mathieu Moran
e30b85d218
feat: portal-wide device selector — session-based, all pages now use selected device
...
- _portal_device_id() reads from session, falls back to DEVICE_NAME env var
- GET/POST /api/v1/portal/select-device for selector data + set
- Dropdown in server base.html topbar, JS populates from API, page reloads on change
- All portal pages (overview, trips, dashcam, DTC, device settings) now use selected device
2026-08-12 01:40:51 -04:00
Mathieu Moran
1556c65131
fix: delete uses @HTTP hasBody + JsonObject return type
...
- Retrofit @DELETE doesn't support @Body — switched to @HTTP(method=DELETE, hasBody=true)
- Return type changed from Map<String,Any?> to JsonObject (kotlinx-serialization
can't deserialize untyped maps)
- Fixed double-slash in download URL (baseUrl trailing slash)
- Cleaned up download progress tracking (emit outside withContext(IO))
2026-08-12 01:35:11 -04:00
Mathieu Moran
3916f9879e
feat: FEAT-05 — DTC history sync to remote server
...
- Server: dtc_events table (migrate_phase27_dtc.sql), db.py helpers
(upsert_dtc_snapshot, list_dtc_events, delete_dtc_event)
- Server API: POST /api/v1/dtc/batch (device auth), GET/DELETE /api/v1/portal/dtc
- Server portal: /dtc page with code, description, MIL, status, timestamps, delete
- Server nav: DTC history in sidebar + mobile bottom nav
- Pi: _upload_dtc_snapshot() in app_upload.py — uploads when snapshot changes,
skips when OBD disconnected or unchanged
2026-08-12 01:23:23 -04:00
Mathieu Moran
13cb8b4361
docs: Phase 27 DONE (3 shipped) — odometer sync, trip ID, hotspot docs; FEAT-08 shipped, FEAT-09 wontfix
2026-08-12 01:16:53 -04:00
Mathieu Moran
22bbee3b30
feat: Phase 28.2 — dashcam video browser + WiFi download
...
- DashcamScreen: LazyColumn of imported Pi videos with thumbnails (Coil),
file size, date, upload status, converting progress
- DashcamViewModel: Retrofit-backed video list + download to phone storage
+ delete local copy
- PiApi extended: listVideos, getVideoFile (streaming), getThumbnail, deleteVideo
- DTOs: VideoListResponse, VideoFile, ConvertProgress
- Bottom nav: Dashcam tab + Test tab
- Verified: video list loads from real Pi over yaris 911 hotspot
2026-08-12 01:14:20 -04:00
Mathieu Moran
348bfdc48c
feat: Phase 28.1 gate passed — dual-network test works
...
- Simplified to single OkHttpClient — Android OS routes correctly:
10.42.0.1 → WiFi (Pi hotspot subnet)
yaris.ceaf.dev → cellular (WiFi has no internet)
- Removed NetworkBinder-based per-socket binding (EPERM on Pixel,
OS-routed approach works better for this use case)
- Verified on real Pixel: Pi GPS + server health both return 200
simultaneously while connected to "yaris 911" hotspot
2026-08-12 01:09:13 -04:00
Mathieu Moran
f1606ad1f6
fix: remove runBlocking(Dispatchers.Main) deadlock — app now starts
...
- NetworkBinder functions were suspend but never actually suspended
(ConnectivityManager calls are synchronous) — made them plain fun
- MainActivity.discoverNetworks() now calls them directly, no coroutine
- Wrapped in try/catch so network discovery failure doesn't crash Activity
- Removed unused awaitNetwork() extension + coroutine imports
2026-08-12 00:54:27 -04:00
Mathieu Moran
40f92d8703
feat: Phase 28.1 — gradle wrapper + debug APK builds successfully
...
- gradlew + gradle-wrapper.jar (Gradle 8.11.1)
- Fixed manifest icon to @android:mipmap/sym_def_app_icon (no custom asset needed yet)
- Added adaptive icon XML + colors for future custom icon
- Removed deprecated buildfeatures.buildconfig from gradle.properties
- 17MB debug APK builds: ./gradlew assembleDebug
- local.properties auto-ignored (contains SDK path)
2026-08-12 00:48:05 -04:00
Mathieu Moran
8d64b1e8b0
feat: Phase 28.1.2 — dual-network binding + OkHttp clients
...
- NetworkBinder: discovers Pi hotspot WiFi (no-internet) and cellular networks
via ConnectivityManager, creates per-network socket-bound OkHttpClients
- DualNetworkTestScreen: real OkHttp calls to 10.42.0.1/api/gps/status and
yaris.ceaf.dev/health, simultaneous "Test Both" gate button
- MainActivity: discovers networks at startup, passes bound clients to screen
- Retrofit interfaces (PiApi, ServerApi) + DTOs (GpsStatus, HealthResponse)
- Uncommented OkHttp/Retrofit/kotlinx-serialization deps in build.gradle.kts
2026-08-12 00:34:41 -04:00
Mathieu Moran
f1c83a2ee7
init: android project scaffold (Phase 28.1)
...
- Kotlin DSL build with version catalog (AGP 8.7, Kotlin 2.1, Compose BOM 2025.01)
- app module: Compose + Material 3, dark theme, network security config
- DualNetworkTestScreen — Phase 28.1 gate screen (buttons wired in 28.1.2)
- YarisApp, MainActivity, YarisOBDTheme
- ProGuard rules for Retrofit/OkHttp/Kotlinx Serialization/Coil/MapLibre/Room
- cleartext allowed for 10.42.0.1 + yaris.local
- gradle wrapper properties (needs Android Studio to generate wrapper jar)
2026-08-12 00:26:54 -04:00
Mathieu Moran
69109762a8
fix: always send device config on save — sync toggle now works both ways
2026-08-12 00:16:57 -04:00
Mathieu Moran
79222c8bb5
fix: disabling sync via settings page no longer returns spurious error 400
2026-08-12 00:02:54 -04:00
Mathieu Moran
0fea9718bc
fix: prevent sync from overwriting Pi odometer — odometer is Pi→Server only
2026-08-11 23:53:42 -04:00
Mathieu Moran
0b2162a595
style: odometer field uses plaintext display — no stepper arrows, grey background
2026-08-11 23:44:05 -04:00
Mathieu Moran
d35cea367f
fix: odometer sync is Pi→Server only — portal displays read-only value from DB
2026-08-11 22:14:46 -04:00
Mathieu Moran
7de8948e08
docs: update Hardware and Architecture sections — dual-radio, GPIO power, 4G modem, phone hotspot uplink
2026-08-11 22:06:05 -04:00
Mathieu Moran
44cd8bd192
feat: odometer_baseline field on server portal device settings page
2026-08-11 19:52:51 -04:00
Mathieu Moran
32de77131c
feat: odometer baseline syncs to server — push on save, pull on sync, +/api/device-config/push endpoint
2026-08-11 19:31:52 -04:00
Mathieu Moran
878ba4a958
fix: skip device config save when sync is enabled — prevents 'Invalid device config' blocking settings save
2026-08-11 18:57:40 -04:00
Mathieu Moran
34253b3ffb
feat: manual odometer baseline — Settings field computes baseline + trip distance, Dashboard shows (manual) label
2026-08-11 18:51:11 -04:00
Mathieu Moran
887a001723
docs: Phase 27 started — 7 feature candidates ready
2026-08-11 18:40:35 -04:00
Mathieu Moran
19c538389b
docs: Phase 26 rewritten — all 12 bugs documented consistently. Phase 27/28 cleaned up.
2026-08-11 18:29:03 -04:00
Mathieu Moran
9ebfea8be3
docs: readme updated, BUGS.md cleaned — all 12 bugs in Resolved, Open section empty
2026-08-11 18:25:07 -04:00
Mathieu Moran
f017a301f3
docs: Phase 26 complete, Phase 27 ready — 7 feature candidates
2026-08-11 18:20:07 -04:00
Mathieu Moran
341437c2d4
docs: Phase 26 COMPLETE — BUG-02 closed, all 12 bugs resolved. GPS has 7 sats, needs clear sky for fix.
2026-08-11 18:17:31 -04:00
Mathieu Moran
0f6d9b20a2
docs: Phase 26 DONE — BUG-01 closed, all 11 bugs resolved. BUG-06/12 moved to Resolved.
2026-08-11 17:19:42 -04:00
Mathieu Moran
e54391b5c9
docs: FEAT-06/07/08/09 — trip ID column, hotspot auto-connect, predictable IP, mDNS
2026-08-11 17:17:12 -04:00
Mathieu Moran
4704bb79f1
docs: BUG-01 test steps documented, FEAT-07 phone-hotspot auto-connect shipped
2026-08-11 17:11:34 -04:00
Mathieu Moran
b4d622827a
docs: revert BUG-01 — AP tested but phone-hotspot uplink not yet verified
2026-08-11 17:06:39 -04:00
Mathieu Moran
ea47cff489
docs: BUG-01 closed — tested on iOS + Android, yaris.local resolves, Phase 26 DONE
2026-08-11 17:04:20 -04:00
Mathieu Moran
675ee67260
docs: revert BUG-01 to IN PROGRESS — needs owner test before closing
2026-08-11 16:47:58 -04:00
Mathieu Moran
dc1c1e5f06
docs: BUG-01 closed — dual-radio bench-verified, Phase 26 DONE (11 closed, 1 hardware)
2026-08-11 16:46:57 -04:00
Mathieu Moran
0f76ae3f84
docs: Phase 26 updated — 10 closed, BUG-11/12 and GPS lat/lon fix documented
2026-08-11 16:43:06 -04:00
Mathieu Moran
a4a92cc69b
fix: Socket gps_location now passes lat/lon to renderGpsStatus, preventing overwrite with blanks
2026-08-11 16:37:01 -04:00
Mathieu Moran
e8156bc39a
docs: BUG-12 closed — OBD API fallback fixes dashboard blank state, GPS toFixed crash fixed
2026-08-11 16:32:15 -04:00
Mathieu Moran
91281b1e55
fix: add /api/obd/status endpoint, dashboard OBD fallback on page load, fix GPS string-to-number crash
2026-08-11 16:26:30 -04:00
Mathieu Moran
e223a43170
docs: BUG-11 closed — GPS lat/lon from API, 30s staleness aligned across pages
2026-08-11 16:18:59 -04:00
Mathieu Moran
3202045654
fix: restore separate checkbox+ID cells, add matching headers (8 columns server)
2026-08-11 15:25:29 -04:00
Mathieu Moran
e8c5bfec9a
fix: put checkbox inside date cell — both Pi and server now share same 6-column layout
2026-08-11 15:22:05 -04:00
Mathieu Moran
22f4ae2e69
fix: merge ID into date cell, add empty checkbox header — columns now align
2026-08-11 15:17:51 -04:00
Mathieu Moran
5713417f4f
Server: restore checkbox + batch-delete. Conditional ID (server only) and checkbox via data-show-id/data-batch-delete-url.
2026-08-11 15:11:12 -04:00
Mathieu Moran
2ee4862edd
Remove checkbox column and batch-delete from trip history
2026-08-11 15:05:40 -04:00
Mathieu Moran
23ac6c218b
feat: add trip ID column ( #18517 ) to history table on Pi and server
2026-08-11 14:58:25 -04:00
Mathieu Moran
f6a50b6bc1
docs: BUG-06 closed — migration shifted 3593 rows +4h EDT, recomputed 43 trips, times now correct
2026-08-11 14:53:18 -04:00
Mathieu Moran
7ce2a1e5f5
fix: BUG-06 — convert naive Pi timestamps to TZ-aware before upload so Postgres TIMESTAMPTZ stores correct instant
2026-08-11 14:47:37 -04:00
Mathieu Moran
9733036510
fix: BUG-11 — Dashboard GPS now shows lat/lon from API when stale, Status page uses same 30s staleness threshold
2026-08-11 14:36:58 -04:00
Mathieu Moran
7a6de8b589
docs: BUG-07 closed — history.js rewrite verified on Pi and server
2026-08-11 14:33:38 -04:00
Mathieu Moran
fa93384a8e
Rewrite history.js: loading spinner, active-row highlight, unified state, 300ms debounce, signal guards throughout trip loader
2026-08-11 05:37:15 -04:00
Mathieu Moran
3d6955f20f
fix(phase26): fix broken click handler, remove replay button, row click only
2026-08-11 05:11:09 -04:00
Mathieu Moran
90edc73735
fix(phase26): debounce trip clicks, guard against stale renders
2026-08-11 05:07:35 -04:00
Mathieu Moran
cdb3fc19c7
fix(phase26): abort preload fetches when switching trips to prevent server freeze
2026-08-11 05:01:18 -04:00
Mathieu Moran
ad56380e23
fix(phase26): revert batch geocode, use rate-limited concurrent requests to avoid server freeze
2026-08-11 04:57:44 -04:00
Mathieu Moran
5018c6c531
fix(phase26): batch geocode endpoint for faster server trip scrubber
2026-08-11 04:44:37 -04:00
Mathieu Moran
bdc7a9afb7
fix(phase26): server trip delete persists across recompute + batch delete with checkboxes
2026-08-11 04:18:58 -04:00
Mathieu Moran
e6bc488e84
docs: update Phase 26 with dual-radio + trip fix details
2026-08-11 03:57:06 -04:00
Mathieu Moran
cf096744d1
fix(phase26): BUG-10 side effect — preserve trips when OBD never connected
2026-08-11 03:56:00 -04:00
Mathieu Moran
ae7f6358b2
docs: update BUG-01 dual-radio fix status
2026-08-11 03:46:18 -04:00
Mathieu Moran
592e049f59
fix(phase26): dual-radio — wlan0 permanent AP, wlan1 internet uplink (BUG-01)
2026-08-11 03:44:01 -04:00
Mathieu Moran
89bbc4fdb8
fix(phase26): skip netwatch AP scan when clients connected (BUG-01)
2026-08-11 03:11:13 -04:00
Mathieu Moran
f9d967e71c
docs: update Phase 26 bug count in PLAN.md
2026-08-11 03:02:02 -04:00
Mathieu Moran
e83e5eaa7c
docs: tighten features list in readme
2026-08-11 03:00:35 -04:00
Mathieu Moran
6355869a8d
docs: fix bug count in readme project status
2026-08-11 02:58:01 -04:00
Mathieu Moran
f7d305a036
docs: update Phase 26, simplify readme project status, de-emoji
2026-08-11 02:57:01 -04:00
Mathieu Moran
1487fd3478
docs: bold feature names, clean up readme
2026-08-11 02:55:27 -04:00
Mathieu Moran
e733ab1ac1
docs: update Phase 26 progress, de-emoji readme, refresh status
2026-08-11 02:50:57 -04:00
Mathieu Moran
936064e963
docs: move BUG-09/10 from Open to Resolved
2026-08-11 02:47:26 -04:00
Mathieu Moran
7beb882136
docs: restructure BUGS.md, close BUG-09/10 (already deployed)
2026-08-11 02:45:40 -04:00
Mathieu Moran
5a3be5347a
docs: close BUG-09/10, update resolved section
2026-08-11 02:41:12 -04:00
Mathieu Moran
7e913558f6
fix(phase26): geocode pre-caching (BUG-09) + gate trips on OBD presence (BUG-10)
2026-08-11 02:38:00 -04:00
Mathieu Moran
a709517973
docs: close BUG-04 server trip merge (verified in prod)
2026-08-11 02:31:13 -04:00
Mathieu Moran
96fb8971eb
fix(phase26): server trip detection mirrors Pi motion-aware logic (BUG-04)
2026-08-11 02:27:17 -04:00
Mathieu Moran
447d73bbe5
fix(phase26): close BUG-08 Pi trip deletion (verified in prod)
2026-08-11 02:12:40 -04:00
Mathieu Moran
c5c478bef6
fix(phase26): add Pi trip deletion (BUG-08)
2026-08-11 02:07:59 -04:00
Mathieu Moran
786d5b8f3e
docs: close BUG-03/05, add Phase 27 features + renumber Android to Phase 28
2026-08-11 02:04:55 -04:00
Mathieu Moran
aa1f247d80
docs(bugs): record Phase 26 deploy/verify status for BUG-03 and BUG-05
...
Amend the Phase 26 progress note: BUG-03 was deployed to the Pi (pulled to
4f975ad , service active, /api/health ok) and real in-car behavior verification
is still pending; BUG-05 is code-ready but the unraid/server side is not yet
deployed (needs docker compose build api && docker compose up -d api).
2026-08-11 01:23:39 -04:00
Mathieu Moran
4f975ad079
docs(bugs): mark BUG-03 and BUG-05 FIXED ( e2f2314) + update PLAN Phase 26
...
BUGS.md: BUG-03 and BUG-05 status -> FIXED with commit ref and fix summary.
PLAN.md: Phase 26 items 3 and 5 marked FIXED; add progress note.
2026-08-11 00:48:05 -04:00
Mathieu Moran
e2f2314318
fix(phase26): persist DTC/MIL state + server speed_source (BUG-03, BUG-05)
...
BUG-03: DTC/MIL codes were never persisted; lost on OBD disconnect or reboot.
- Add new dtc table schema (code, description, MIL, first/last seen, IS_SET)
and a migration that rebuilds the original unused NAME/STATUS/DTC_ID table.
- Persist MIL + codes to SQLite on each successful OBD poll (_persist_dtc_state).
- /api/dtc falls back to the last-persisted snapshot when OBD is offline/stale.
- Fix get_overview_stats to count the real dtc table (was querying non-existent
dtc_codes table).
- Add cleared/since tracking via IS_SET + FIRST_SEEN_AT/LAST_SEEN_AT.
BUG-05: server trip replay hardcoded speed_source:'gps'; mirror Pi's
'obd if speed>0 else gps' logic in server get_trip_route.
Adds tests/test_dtc_persistence.py (7 tests).
2026-08-11 00:38:05 -04:00
Mathieu Moran
cd0583ac84
docs: add FEAT-04 4G LTE modem (Huawei E3372h-153) to replace SIM868 2G hat
2026-08-11 00:03:15 -04:00
Mathieu Moran
bd43003a7e
docs: rename features.md to FEATURES.md (all caps)
2026-08-10 23:46:43 -04:00
Mathieu Moran
ef3a9510ab
docs: add features.md tracker with odometer-fallback idea
2026-08-10 23:45:52 -04:00
Mathieu Moran
3e626830d5
docs: sign off Phase 25 road test, add BUGS.md, renumber Android to Phase 27
2026-08-10 23:42:39 -04:00
Mathieu Moran and Copilot
d216aac97e
Refresh docs and reorder roadmap
...
Co-authored-by: Copilot <[email protected] >
2026-08-10 18:48:59 -04:00
Mathieu Moran and Copilot
457e3dcc08
Record dashboard card order swap
...
Co-authored-by: Copilot <[email protected] >
2026-08-10 18:43:46 -04:00
Mathieu Moran and Copilot
b815e0aaaa
Swap dashboard map and overview
...
Co-authored-by: Copilot <[email protected] >
2026-08-10 18:43:01 -04:00
Mathieu Moran and Copilot
6ee6215662
Record status action verification
...
Co-authored-by: Copilot <[email protected] >
2026-08-10 18:41:34 -04:00
Mathieu Moran and Copilot
8907c51016
Add status page quick actions
...
Co-authored-by: Copilot <[email protected] >
2026-08-10 18:40:22 -04:00
Mathieu Moran and Copilot
ef38ec92b4
Record status page verification
...
Co-authored-by: Copilot <[email protected] >
2026-08-10 18:38:16 -04:00
Mathieu Moran and Copilot
5406935bf5
Add Pi status page
...
Co-authored-by: Copilot <[email protected] >
2026-08-10 18:37:26 -04:00
Mathieu Moran and Copilot
a7302229d1
Tighten Pi dashboard layout
...
Co-authored-by: Copilot <[email protected] >
2026-08-10 18:25:30 -04:00
Mathieu Moran and Copilot
f6de658a88
docs: record live Pi GPS status check
...
- note that GPS thread is alive on the Pi but has no current fix
- clarify that missing live updates are currently due to absent GNSS fix data
Co-authored-by: Copilot <[email protected] >
2026-08-10 18:18:50 -04:00
Mathieu Moran and Copilot
be40bbc15f
feat: add GPS status endpoint and dashboard indicator
...
- add /api/gps/status for thread/fix-age visibility
- surface GPS status in Pi health and live GPS cards
- add tests for app_gps status snapshots
Co-authored-by: Copilot <[email protected] >
2026-08-10 18:18:14 -04:00
Mathieu Moran and Copilot
675bffb4a4
feat: add server-side device deletion
...
- add portal API and UI action to delete non-default devices
- protect the configured portal default device from deletion
- document that trip/history pages still scope to the single DEVICE_NAME
Co-authored-by: Copilot <[email protected] >
2026-08-10 18:09:15 -04:00
Mathieu Moran and Copilot
690cf0a5d4
docs: record live Phase 25.5c deployment validation
...
- mark Phase 25.5c complete in PLAN
- record unraid migration/deploy and Pi API smoke tests
- note sync-ack metadata and temp provisioning helper validation
Co-authored-by: Copilot <[email protected] >
2026-08-10 18:05:39 -04:00
Mathieu Moran and Copilot
ba682fbf3a
feat: add multi-device provisioning and local remote-config UI
...
- add multi-device portal device management, key rotation, and sync request APIs
- add Pi settings UI for remote server URL, device name, and API key
- add local test-connection and sync-now actions
- make upload and config sync reuse dynamic shared credentials
- add Phase 25.5c migration and docs updates
Co-authored-by: Copilot <[email protected] >
2026-08-10 18:02:09 -04:00
Mathieu Moran and Copilot
fbc41a5db5
docs: record live Phase 25.5b sync verification
...
- update plan with live portal route deployment status
- document fixed Pi sync blockers and successful round-trip test
- refresh passing test count after runtime sync coverage additions
Co-authored-by: Copilot <[email protected] >
2026-08-10 17:48:42 -04:00
Mathieu Moran and Copilot
a114939914
fix: authenticate device config sync like upload client
...
- send X-Device-Name and X-Api-Key to /api/device-config
- require YARIS_DEVICE_NAME alongside shared upload creds
- fix server create_device output to match actual Pi env names
- document shared upload/config sync credential requirements
Co-authored-by: Copilot <[email protected] >
2026-08-10 17:42:40 -04:00
Mathieu Moran and Copilot
5a5058adca
fix: reuse upload credentials for device config sync
...
- load server sync creds from db/upload_creds.env like uploads do
- fall back from YARIS_DEVICE_KEY to existing YARIS_API_KEY
- document shared credential flow for server-synced identity
- add test coverage for sync credential fallback
Co-authored-by: Copilot <[email protected] >
2026-08-10 17:37:52 -04:00
Mathieu Moran and Copilot
585da18225
feat: add remote device settings portal and Pi hot reload
...
- add /settings/device portal page and portal device-config GET endpoint
- add portal navigation and client-side device settings editor UI
- hot-reload Account/Car display config after local saves and server syncs
- document portal workflow and Phase 25.5b completion
- add runtime reload tests for account, car, and sync callback
Co-authored-by: Copilot <[email protected] >
2026-08-10 17:34:22 -04:00
Mathieu Moran and Copilot
c4ccc3efb9
docs: record verified Pi and unraid deployment state
...
- note verified Pi IP after WiFi card change
- record successful 2026-08-10 Pi/unraid rollout
- document unraid checkout divergence and temp-clone deploy workaround
Co-authored-by: Copilot <[email protected] >
2026-08-10 17:26:17 -04:00