AskaEth
e4fe499bef
refine: TCP client mode handled by plugin itself
2026-07-27 19:12:19 +08:00
AskaEth
759d35bc93
feat: TCP server/client mode config, protocol display in settings
2026-07-27 19:09:53 +08:00
AskaEth
f715cb85e6
feat: TCP listener + protocol field in manifest, dual UDP/TCP support
2026-07-27 19:04:16 +08:00
AskaEth
16537a6f49
refactor: scenes use manifest.json (same structure as dashboards)
2026-07-27 11:39:42 +08:00
AskaEth
5665c86eb3
fix: restore game_id and author in scene publish-local
2026-07-27 10:34:18 +08:00
AskaEth
977ca89965
fix: restore manifest_id for scene publish
2026-07-27 10:31:10 +08:00
AskaEth
003c303231
fix: remove manifest_id from scene publish (field not in collection)
2026-07-27 10:29:54 +08:00
AskaEth
2960d132ef
feat: publish-from-local with builtin/market filter, file picker modal
2026-07-27 10:11:00 +08:00
AskaEth
49db12910d
fix: require token for upload prefix generation
2026-07-27 09:49:31 +08:00
AskaEth
7e5e5f4afa
feat: prefix manifest_id with user token hash to prevent ID collisions
2026-07-27 09:48:49 +08:00
AskaEth
b8f07c0cba
feat: auto-generate UUID if manifest.json lacks id
2026-07-27 09:45:34 +08:00
AskaEth
ba2481139b
fix: hardcode market_url fallback to turbosu.yeij.top
2026-07-27 09:25:04 +08:00
AskaEth
76d9cc3975
fix: match installed by manifest_id only, add manifest_id field
2026-07-27 08:54:52 +08:00
AskaEth
c65ae4035b
fix: realistic G-force test data with jitter and vertical bounce
2026-07-27 08:20:45 +08:00
AskaEth
8c78393fb5
fix: add acceleration values to test packet for G-force dashboard
2026-07-27 08:15:19 +08:00
AskaEth
93d4ec308a
fix: remove -created sort, field not in base collection
2026-07-26 22:52:12 +08:00
AskaEth
f9256a564b
feat: my tab shows time/version/status, restore -created sort
2026-07-26 22:26:43 +08:00
AskaEth
5e3d565b38
fix: remove -created sort (field doesnt exist), use -name
2026-07-26 22:05:29 +08:00
AskaEth
b434be2fd1
fix: dashb_pending boolean as string for form data
2026-07-26 21:54:42 +08:00
AskaEth
b9359b3b47
feat: '我的' tab - user content management with update/delete
2026-07-26 21:46:24 +08:00
AskaEth
59887d7d46
feat: PWA icon + download count increment on market install
2026-07-26 21:43:14 +08:00
AskaEth
47341f1f76
feat: market scenes tab - upload/install with dependency check
2026-07-26 21:37:24 +08:00
AskaEth
e6344b1916
feat: validate .tsd on upload, auto-extract manifest metadata
2026-07-26 21:34:36 +08:00
AskaEth
605830ac34
feat: username field in market registration
2026-07-26 21:25:33 +08:00
AskaEth
f4a0869af5
fix: market auth error handling, identity field forwarding
2026-07-26 21:16:16 +08:00
AskaEth
273bb8f7fb
fix: use dashb_pending field name for upload approval
2026-07-26 20:57:07 +08:00
AskaEth
91ee54c2c5
fix: market upload sets status=pending by default
2026-07-26 20:54:37 +08:00
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
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
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
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
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
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
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
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
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
eeb9ef68a6
fix: eliminate log spam crash - use plugin parser on start, silence noisy fallback warnings
2026-07-25 18:49:25 +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
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
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
Yei.J. (AskaEth)
d61bb61a83
feat: TurboSu initial release - racing telemetry dashboard
2026-07-25 15:23:40 +08:00