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
df8f33dcca
fix: market tab styles + my items layout
2026-07-26 22:23:23 +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
98440099a8
fix: market tab active state inline style update
2026-07-26 21:39:54 +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
c4675f7a15
feat: persistent registration toast, click to dismiss
2026-07-26 21:32:01 +08:00
AskaEth
605830ac34
feat: username field in market registration
2026-07-26 21:25:33 +08:00
AskaEth
6cb0759630
fix: remove hardcoded email placeholder
2026-07-26 21:23:13 +08:00
AskaEth
93776c7d98
refactor: market as standalone sidebar page, removed from dashboard
2026-07-26 21:20:27 +08:00
AskaEth
f4a0869af5
fix: market auth error handling, identity field forwarding
2026-07-26 21:16:16 +08:00
AskaEth
5735602f7d
refactor: separate market from categories in sub-sidebar
2026-07-26 21:11:40 +08:00
AskaEth
242e451ca7
feat: CHANGELOG.json as single source of truth
2026-07-26 21:07:15 +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
70df32bb07
feat: market login/logout/upload flow with UI state management
2026-07-26 20:44:11 +08:00
AskaEth
3bb4de6de6
fix: PageRecord.init() missing in app.js
2026-07-26 20:41:15 +08:00
AskaEth
1303529d31
chore: add favicon
2026-07-26 20:37:01 +08:00
AskaEth
8da69b5ef8
feat: custom SVG logo in sidebar and topbar
2026-07-26 20:35:31 +08:00
AskaEth
e7e93d9664
style: 极速中枢 display name in WebUI
2026-07-26 20:25:59 +08:00
AskaEth
3db849b681
chore: market_url to production https://turbosu.yeij.top
2026-07-26 20:14:33 +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
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