AskaEth
683e573e9a
feat: marketplace integration via backend proxy
...
- market_url config (server-side only, never exposed to frontend)
- /api/market/* proxy endpoints to PocketBase
- Dashboard page: 'Market' tab in sub-sidebar
- Market list: browse/install community dashboards
- Login/register modal, upload to market
- PocketBase API fully proxied, zero credentials in frontend
2026-07-26 19:52:00 +08:00
AskaEth
06042a93a2
chore: add project URL to about section
2026-07-26 19:12:29 +08:00
AskaEth
7e9211507b
refactor: move record/playback to dedicated page, restore test mode in settings
...
- New '录制回放' page with sidebar nav entry
- Recording: start/stop/auto, file list with play/export/delete
- Playback: visual bar indicator, opens dashboards to see replayed data
- Settings: restored dev tools section with test mode toggle
2026-07-26 19:10:48 +08:00
AskaEth
3514612f7a
feat: #8 i18n support (zh/en toggle)
2026-07-26 18:45:23 +08:00
AskaEth
71d039ba82
feat: #4 shift lights + #5 phone dash + #6 PWA support
2026-07-26 18:43:59 +08:00
AskaEth
ea32fa841e
feat: #3 tire temperature matrix dashboard (FL/FR/RL/RR heatmap)
2026-07-26 18:42:36 +08:00
AskaEth
a2e7141338
feat: #2 G-force circle dashboard + .tsr export/import
...
- g_force dashboard: acceleration vector on 2G ring, lat/long G readout
- .tsr files export/import via API and UI
- Composite dashboard reverted (G-force is standalone)
2026-07-26 18:41:35 +08:00
AskaEth
a9bd35baa8
feat: #1 telemetry record/playback with auto-race detection
...
- TelemetryRecorder: manual + auto mode (IsRaceOn edge detection)
- TelemetryPlayer: timed packet replay into _handle_packet pipeline
- .tsr format: [uint32 elapsed_ms][uint32 len][bytes]
- Settings UI: start/stop, auto toggle, recording list, play button
- API: /record/*, /playback/*, /recordings
2026-07-26 18:40:09 +08:00
AskaEth
4bba4b850d
fix: settings nav uses onclick scroll instead of hash (avoid router conflict)
2026-07-26 18:37:03 +08:00
AskaEth
e97d6ee36f
fix: RPM unit label to 'rpm' matching displayed value
2026-07-26 18:34:08 +08:00
AskaEth
222b89e717
feat: settings sub-sidebar for section navigation
2026-07-26 18:33:11 +08:00
AskaEth
b44241c666
feat: restart button in settings via atexit+execv
2026-07-26 18:32:16 +08:00
AskaEth
2daa4d48f1
feat: .tsb backup import/restore functionality
2026-07-26 18:31:04 +08:00
AskaEth
02ffa33298
style: Miuix switch for all checkboxes in settings (unified port, forward toggles)
2026-07-26 18:30:25 +08:00
AskaEth
1d702103f1
fix: suppress WebSocket keepalive timeout tracebacks from stderr
2026-07-26 18:28:45 +08:00
AskaEth
9f009a02f5
fix: single log file per startup - singleton handler shared across all modules
2026-07-26 18:27:24 +08:00
AskaEth
cd2106dbf8
fix: auto-start test mode on boot if config says on; Miuix toggle switch style
2026-07-26 18:26:29 +08:00
AskaEth
ff0abce5c0
fix: untrack old turbosu.log
2026-07-26 18:22:31 +08:00
AskaEth
5d5af6b6a7
feat: timestamped log files per startup, auto-cleanup to 20 max
2026-07-26 18:22:22 +08:00
AskaEth
16ada23d61
fix: timestamp overflow in test packet (uint32) - use & 0xFFFFFFFF
2026-07-26 18:21:17 +08:00
AskaEth
3b7edc4f14
fix: game plugin cache + test mode NullPointer crash on shutdown
...
- game_manager: add _scanned cache, _ensure_scanned() avoids re-scanning on every API call
- test_mode: fix AttributeError when stop_test_mode called before start
- listener: safe stop_test_mode with null check
2026-07-26 18:19:03 +08:00
AskaEth
90ab5f9c0b
chore: increase log rotation to 20 backup files
2026-07-26 18:12:22 +08:00
AskaEth
69b73e8ce0
refactor: extract test data generator to server/test_mode.py
...
- TestDataGenerator class: builds 324-byte Forza packets, runs async loop at 30fps
- Simulated data passes through _handle_packet (parser -> WS -> forwarder)
- Listener delegates to test_mode.get_generator()
- Cleaner separation: listener.py no longer contains test logic
2026-07-26 18:07:19 +08:00
AskaEth
5690d792a5
fix: use struct.pack_into for safe 324-byte test packet construction
2026-07-26 17:59:22 +08:00
AskaEth
37d9f94505
fix: test mode forward proper 324-byte Forza-format packet to downstream devices
2026-07-26 17:57:59 +08:00
AskaEth
58ebb42f8c
fix: settings.js syntax error causing blank webUI, rewrite clean
2026-07-26 17:54:44 +08:00
AskaEth
b00e59d5bf
feat: UI test mode + per-game port configuration
...
- Settings: UI test mode toggle generates simulated telemetry data (speed/RPM/gear/laps...)
- Simulated data broadcasts via WebSocket and forwards to downstream devices
- game_ports config: per-game independent port overrides (shown when unified port off)
- Settings UI: game port list with save button, hidden when unified port enabled
- Sidebar: switch game reads game_ports[gameId] fallback to default_port
2026-07-26 17:49:18 +08:00
AskaEth
bbaef43cfd
feat: #5 - live telemetry cards on home page (speed/RPM/gear on top)
2026-07-26 17:32:36 +08:00
AskaEth
a08120c568
feat: 2,3,7,8,9 - search/sort, Docker, log viewer, .tsb backup
...
- Dashboard browser: search box + sort dropdown (name/category/author)
- Dockerfile + docker-compose.yml
- Debug page: log viewer button (/api/logs)
- Settings: .tsb full backup export (dashboards+scenes+config)
- F1 composite dashboard previously included
2026-07-26 17:32:09 +08:00
AskaEth
9091f2133d
feat: 1,4,6 - scene canvas editor, systemd service, F1 composite dashboard
...
- Scene editor: drag-drop dashboards from sidebar to canvas, reposition, delete placements, save/load
- Systemd service: turbosu.service with frpc dependency, restart on failure
- F1 composite: speed/RPM/lap/gear/throttle/brake/fuel/DRS, 16:9, NEXT ART font
2026-07-26 17:30:19 +08:00
AskaEth
e28be26ab3
fix: 7 bug fixes + port config with auto-restart
...
- HTTPException import added (was causing 500 on missing dashboard)
- game_manager.remove_plugin() restored (was AttributeError)
- api.js checks HTTP status codes, fails fast on errors
- sidebar game highlight only matches selected gameId
- scene resize handler uses stored canvas dims (was NaN)
- forwarder socket properly closed on listener stop
- telemetry port: use_unified_port toggle, off = per-game port, auto-restart on switch
2026-07-26 17:23:14 +08:00
AskaEth
41da7c03d5
fix: default gear N, defer initial draw until canvas sized
2026-07-26 13:37:29 +08:00
AskaEth
a51cec79c1
fix: suppress noisy WS keepalive timeout tracebacks
2026-07-25 21:26:58 +08:00
AskaEth
7bafe73d6d
fix: sidebar toggle always accessible when collapsed
2026-07-25 21:24:53 +08:00
AskaEth
5854b4cc57
fix: add debounce to theme toggle to prevent flash-back
2026-07-25 21:22:34 +08:00
AskaEth
7ca1053175
fix: reduce vw% for better scaling at small window sizes
2026-07-25 19:12:35 +08:00
AskaEth
4843c61841
fix: 8k mark label above gauge line instead of below
2026-07-25 19:10:05 +08:00
AskaEth
3040878e96
style: RPM right by half char more
2026-07-25 19:00:00 +08:00
AskaEth
d524f5273c
style: RPM number right by one character width
2026-07-25 18:59:15 +08:00
AskaEth
f9afec786c
style: RPM number higher and righter
2026-07-25 18:58:20 +08:00
AskaEth
c121a902f9
style: wider pedals area
2026-07-25 18:57:01 +08:00
AskaEth
545b06d427
style: move pedals left to avoid clipping
2026-07-25 18:56:02 +08:00
AskaEth
3ad223f8d6
style: 2x throttle/brake labels and bars
2026-07-25 18:55:10 +08:00
AskaEth
ae70608db0
style: RPM number up, gear 2x, scale marks outward
2026-07-25 18:53:12 +08:00
AskaEth
eeb9ef68a6
fix: eliminate log spam crash - use plugin parser on start, silence noisy fallback warnings
2026-07-25 18:49:25 +08:00
AskaEth
e42ad901d4
style: 2x all fonts in composite dashboard
2026-07-25 18:47:28 +08:00
AskaEth
3822f85b95
fix: theme toggle double-click bug - remove duplicate listener
2026-07-25 18:15:06 +08:00
AskaEth
858a5b4b93
feat: UDP data forwarding to multiple downstream devices
...
- DataForwarder class in listener: sends raw packets to all enabled targets
- REST API: GET/PUT /api/forward for managing targets
- Settings page: add/remove/edit forward targets with host/port/name/enabled
- Status endpoint includes forward_active count
- Config persisted in data/config.json via forward_targets array
2026-07-25 18:07:48 +08:00
AskaEth
8d7cf09bb5
style: RPM number moved higher to sy-210
2026-07-25 17:59:18 +08:00
AskaEth
4ff874bd97
style: increase gap between RPM number and unit label
2026-07-25 17:58:47 +08:00
AskaEth
acc698c1cb
style: larger NEXT ART font for RPM display
2026-07-25 17:52:58 +08:00
AskaEth
27161ca842
style: larger right-side gauges and text
2026-07-25 17:51:57 +08:00
AskaEth
63e368415f
fix: #content background matches dark navy
2026-07-25 17:51:21 +08:00
AskaEth
9c264c88f3
style: background to dark navy blue
2026-07-25 17:51:11 +08:00
AskaEth
478a665447
style: speed up, right-side data further inward
2026-07-25 17:50:22 +08:00
AskaEth
a0be805efb
style: move speed right to align with shifted RPM gauge
2026-07-25 17:49:04 +08:00
AskaEth
206b4b172a
style: gear left 12%, 2x larger font; pedals/status narrower
2026-07-25 17:48:06 +08:00
AskaEth
f2f9565436
fix: arc scale marks use same path-distance angle as progress
2026-07-25 17:46:32 +08:00
AskaEth
20fd2964b2
fix: scale marks and progress both on full arc+line path, aligned
2026-07-25 17:42:22 +08:00
AskaEth
86d8120a10
fix: progress fills arc only, matching scale marks on arc
2026-07-25 17:40:59 +08:00
AskaEth
21d57884c2
fix: move arc center right to 360 to prevent left overflow
2026-07-25 17:37:48 +08:00
AskaEth
7f529bcfc6
fix: move arc center left, shorten line to 82% to prevent overflow
2026-07-25 17:36:45 +08:00
AskaEth
7eb1ef4b81
fix: canvas ctx.font uses NEXT ART font
2026-07-25 17:36:16 +08:00
AskaEth
e719127305
fix: move @font-face inside <style> tag
2026-07-25 17:34:51 +08:00
AskaEth
9c634277e5
feat: NEXT ART Heavy font for composite dashboard, local at static/fonts/
2026-07-25 17:33:46 +08:00
AskaEth
a0d41bfdaf
fix: progress arc also needs false (was true, drawing near-complete circle)
2026-07-25 17:30:30 +08:00
AskaEth
b9b2d51601
fix: remove lineJoin round, skip progress for very low RPM to prevent artifacts
2026-07-25 17:27:20 +08:00
AskaEth
2aabd54d50
fix: remove lineCap round to eliminate solid circle artifacts
2026-07-25 17:25:45 +08:00
AskaEth
aedbcced58
fix: arc direction - use clockwise for 90° short arc (╭ shape)
2026-07-25 17:24:42 +08:00
AskaEth
9d34f30daf
refactor: continuous arc+line stroke for seamless gauge (no visible tick gaps)
2026-07-25 17:21:56 +08:00
AskaEth
6b810e3290
style: roundRect ticks for smoother gauge appearance
2026-07-25 17:19:07 +08:00
AskaEth
77a19ef29d
style: 2x thicker gauge overall (108x36px base)
2026-07-25 17:17:47 +08:00
AskaEth
a14ca6a607
style: arc ticks taper from 2x at bottom to 1x at top
2026-07-25 17:17:02 +08:00
AskaEth
7f65dd2fd2
style: restore line length to 93%
2026-07-25 17:15:43 +08:00
AskaEth
2e59b45f70
style: triple gauge tick thickness (54x18px)
2026-07-25 17:15:21 +08:00
AskaEth
8e58e96d78
style: shorter top line, thicker gauge tick marks
2026-07-25 17:14:37 +08:00
AskaEth
501aea49a7
style: enlarge RPM number, move up half screen height
2026-07-25 17:11:19 +08:00
AskaEth
f2fccf09b4
style: enlarge all fonts and bars in composite dashboard
2026-07-25 17:02:01 +08:00
AskaEth
fb0e83d2df
fix: adjust RPM arc center to keep left side on screen
2026-07-25 16:55:50 +08:00
AskaEth
59623d7cf5
fix: rewrite composite RPM gauge with Canvas, segmented ticks for accurate ╭ shape
2026-07-25 16:51:23 +08:00
AskaEth
67ac9a57fe
fix: composite dashboard RPM gauge - ╭ shape (left 90° arc + top straight line)
2026-07-25 16:48:05 +08:00
AskaEth
77815f36a0
style: simplify all dashboards to minimal flat design, remove Miuix decorations
2026-07-25 16:43:12 +08:00
AskaEth
cd08e793e1
refactor: merge FH4+FH5 into 'forza_horizon', add separate FH6 game plugin
2026-07-25 16:40:03 +08:00
AskaEth
7226d58a7a
fix: correct Forza gear mapping - 0=N, 1-10=gears, 11=R, 21=P; update gear indicator and composite dashboard
2026-07-25 16:38:19 +08:00
AskaEth
09ac4f8e11
docs: update README with 5 dashboards, add Forza data format reference
2026-07-25 16:36:01 +08:00
AskaEth
29f1ec1666
feat: Forza composite dashboard - RPM arc + gear + speed + pedals + fuel/temp, 16:9
2026-07-25 16:35:03 +08:00
AskaEth
7959d911e6
feat: WS sends selected_game_id on connect, gear indicator auto-adapts to game mapping (Forza/AC/iRacing)
2026-07-25 16:29:00 +08:00
AskaEth
636801b6a3
feat: universal gear indicator with R/N/1-8 display, configurable gear_style mapping
2026-07-25 16:23:42 +08:00
AskaEth
b8fa14fc67
fix: Forza Horizon gear display - 0=R, 1-8=actual gear (not N)
2026-07-25 16:20:35 +08:00
AskaEth
1649f91318
fix: correct Forza FH5/FH6 UDP packet parser offsets per official spec
...
- Speed: offset 256 (m/s * 3.6 = km/h), was incorrectly at 244 (PositionX)
- Gear: offset 319 (U8), was at 264/298
- Throttle/Brake: offsets 315/316 (U8, 0-255)
- Steering: offset 320 (S8, -127~127)
- RPM: offset 16 ✓, MaxRPM: offset 8 ✓
- Lap times: BestLap=296, LastLap=300, CurrentLap=304
- LapNumber: offset 312 (U16)
- Boost: 284, Fuel: 288, Position: 244/248/252
- Updated all Forza parsers (FH4, FH5) and fallback parser
- Ref: Forza Data Out official format (324 bytes)
2026-07-25 16:19:53 +08:00
AskaEth
0d50ba2177
chore: comprehensive .gitignore for Python, IDE, OS, runtime data
2026-07-25 15:45:06 +08:00
AskaEth
2177e65fb4
feat: dashboard manifest supports 'supported_games' field, frontend filters by selected game
...
- DashboardTheme model adds supported_games (default: 'all')
- Built-in dashboards declare game compatibility:
speedometer/tachometer/gear_indicator -> all
lap_timer -> forza_horizon_5,forza_horizon_4,forza_motorsport,f1_24
- Dashboard browser filters themes by selected game
- Card shows '全' (all) or '限' (limited) badge
- Updated DASHBOARD_DEV.md with supported_games spec
2026-07-25 15:41:55 +08:00
AskaEth
5e177f4514
docs: add dedicated DASHBOARD_DEV.md and PLUGIN_DEV.md, simplify README & CONTRIBUTING
2026-07-25 15:38:24 +08:00
AskaEth
a46e5d786d
docs: update README and CONTRIBUTING for new folder structure and .tsd/.tss/.tsp formats
2026-07-25 15:36:36 +08:00
AskaEth
63e3c8d607
refactor: standalone dashboard folders with index.html, zip-based import/export (.tsd/.tss/.tsp)
...
- Each dashboard is now a self-contained folder: manifest.json + index.html
- Auto-scan dashboards/ and data/dashboards/ on startup
- Export: .tsd (dashboards), .tss (scenes), .tsp (game plugins) - all zip format
- Dashboard index.html is complete standalone page (WS + data binding)
- Aspect ratio constraints handled in each dashboard's own JS
- Removed template-based dashboard rendering in favor of static serve
- Import via file upload endpoints, export via direct file download
2026-07-25 15:35:08 +08:00