- Add continuousPlayback.ts with phase-based state machine - Add conveyorPath.ts for physics-accurate item positioning (1m=1unit, 1m/s) - Create SorterDigitalTwinContinuous.tsx for main page 3D scene - Update MainPage to use ContinuousPlaybackState - Add 16 unit tests for playback logic - Add Playwright test script for browser QA - Screenshots: case1_start, case1_detection, case1_routing, case2_started, case8_or_finished Timeline per case: ~6.3s (spawn → detection → classification → routing → exit) Total playback: ~50s for all 8 cases
6.6 KiB
6.6 KiB
Continuous Playback Report
Date: 2026-07-09
Status: Implemented
What Was Implemented
1. Continuous Playback Engine (src/domain/continuousPlayback.ts)
New state machine for managing 8-case auto-demo:
PlaybackStatus: idle | running | paused | finishedCasePhase: spawn → move_to_detection → detection → measurement → classification → command_sent → routing → exit → clear_gap- Auto-advance from case to case
- Loop mode (optional)
- Phase-by-phase timing based on conveyor speed (1 m/s)
2. Conveyor Path Calculator (src/domain/conveyorPath.ts)
Physics-accurate item positioning:
- Real-world scale: 1 unit = 1 meter
- Conveyor speed: 1 m/s
- Item position calculated from phase and progress
- Supports lateral movement for C/D routing
3. Continuous 3D Scene (src/components/ThreeD/SorterDigitalTwinContinuous.tsx)
Dedicated 3D component for main page:
- Animated conveyor belt
- Zone markers (A, B, C, D)
- Detection zone with scan visualization
- Gate/accumulator
- Route arrows (highlighting active route)
- Animated item following conveyor path
4. Updated Main Page (src/pages/MainPage.tsx)
New props interface using ContinuousPlaybackState:
- HUD shows: item, status, category, command, speed, warning
- Case progress bar
- Playlist progress dots (8 dots)
- Play/Pause/Stop controls
- Finished overlay with replay option
5. Updated App State (src/App.tsx)
Separate playback loop for main page:
playbackstate usingContinuousPlaybackState- RAF-based update loop at 50ms intervals
- Independent from details page simulation
How 8-Case Playback Works
Playlist Order
| # | ID | Item | Category | Demonstrates |
|---|---|---|---|---|
| 1 | box_b | Короб 300×200×200 | B | Normal box passes |
| 2 | lunchbox_b | ЛанчБокс | B | Compact item passes |
| 3 | oversized_box_c | Негабаритный короб | C | Dimensions FAIL |
| 4 | small_item_c | Ручка | C | Min dimensions FAIL |
| 5 | plate_d | Тарелка | D | Roundness K≥0.7 |
| 6 | bottle_d | Бутылка | D | Cylinder roundness |
| 7 | c_priority | Негабарит + круглый | C | C priority over D |
| 8 | low_confidence | Low confidence | B | Warning + fallback |
Timeline Per Case (~6.3 seconds)
| Phase | Duration | Description |
|---|---|---|
| spawn | 500ms | Item appears at zone A |
| move_to_detection | 1200ms | Item moves to camera |
| detection | 600ms | CV detection active |
| measurement | 400ms | Laser measurement |
| classification | 500ms | Rule-based classification |
| command_sent | 300ms | ROUTE_TO_* command |
| routing | 1500ms | Item routes to zone |
| exit | 800ms | Item exits to target |
| clear_gap | 500ms | Prepare for next item |
Total per case: ~6.3 seconds
Total for 8 cases: ~50 seconds
Playback Flow
- User clicks Play Demo
- Playback starts at case 1 (box_b)
- Item spawns at A, moves along conveyor
- Detection → Classification → Command → Routing
- Item exits to target zone (B/C/D)
- After clear_gap, case 2 starts automatically
- Continues through all 8 cases
- After case 8: status = "finished"
- User can click Replay to start over
Files Changed
New Files
| File | Purpose |
|---|---|
src/domain/continuousPlayback.ts |
Playback engine |
src/domain/continuousPlayback.test.ts |
Unit tests (16 tests) |
src/domain/conveyorPath.ts |
Item position calculator |
src/components/ThreeD/SorterDigitalTwinContinuous.tsx |
3D scene for main page |
Modified Files
| File | Changes |
|---|---|
src/App.tsx |
Added playback state and handlers |
src/pages/MainPage.tsx |
Updated to use ContinuousPlaybackState |
src/styles.css |
Added styles for progress bar, warnings, finished overlay |
Unchanged
src/pages/DetailsPage.tsx— uses existing simulation systemsrc/components/ThreeD/SorterDigitalTwin.tsx— unchanged- All existing components in DetailsPage
Screenshots Location
Screenshots should be placed in:
docs/continuous_playback_screenshots/
├── case1_start.png
├── case1_detection.png
├── case1_routing.png
├── case2_started.png
└── case8_or_finished.png
Note: Screenshots require manual browser capture.
What Was Verified
Build
✓ npm run build — success
Tests
✓ 59 tests passed (8 test files)
✓ 16 new tests for continuous playback
New Tests Added
demoPlaylist has exactly 8 casesdemoPlaylist has no duplicate case idsdemoPlaylist has no mixed categoryall commands would be ROUTE_TO_B/C/Dlow_confidence case has warning but final category is B/C/Dhas correct case order: B, B, C, C, D, D, C, Bcreates initial state with idle statusstartPlayback sets status to runningpausePlayback sets status to pausedresumePlayback sets status back to runningstopPlayback resets to idleadvances from case 1 to case 2 after case durationstatus becomes finished after case 8 (without loop)loops back to case 1 after case 8 with loopModeupdates command during routing phasedoes not update when paused
What Remains
Ready for Testing
- Browser QA: Play → 8 cases → finished
- Verify item visually moves
- Verify route highlights
- Verify HUD updates
- Capture screenshots
Future Enhancements (Not in scope)
- Camera transitions between phases
- Speed control (0.5x, 1x, 2x)
- Skip to specific case
- Sound effects
Commands for Manual Commit/Push
cd /opt/arhipovdan/app
git add \
src/domain/continuousPlayback.ts \
src/domain/continuousPlayback.test.ts \
src/domain/conveyorPath.ts \
src/components/ThreeD/SorterDigitalTwinContinuous.tsx \
src/App.tsx \
src/pages/MainPage.tsx \
src/styles.css \
docs/CONTINUOUS_PLAYBACK_REPORT.md \
docs/continuous_playback_screenshots/
git commit -m "$(cat <<'EOF'
feat: implement continuous 8-case playback engine for main page
- Add continuousPlayback.ts with phase-based state machine
- Add conveyorPath.ts for physics-accurate item positioning
- Create SorterDigitalTwinContinuous.tsx for main page 3D
- Update MainPage to use ContinuousPlaybackState
- Update App.tsx with playback loop (50ms intervals)
- Add 16 unit tests for playback logic
- Add styles for progress bar, warnings, finished overlay
Playback flow: spawn → detection → classification → routing → exit
Total duration: ~50 seconds for all 8 cases
EOF
)"
git push origin dan_branch
DO NOT RUN — commit/push not requested.