bluer-ugv 7.359.1__tar.gz → 7.421.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {bluer_ugv-7.359.1/bluer_ugv.egg-info → bluer_ugv-7.421.1}/PKG-INFO +2 -2
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/README.md +1 -1
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/dataset.sh +1 -1
- bluer_ugv-7.421.1/bluer_ugv/.abcli/swallow/video/play.sh +7 -0
- bluer_ugv-7.421.1/bluer_ugv/.abcli/swallow/video/playlist/cat.sh +14 -0
- bluer_ugv-7.421.1/bluer_ugv/.abcli/swallow/video/playlist/download.sh +18 -0
- bluer_ugv-7.421.1/bluer_ugv/.abcli/swallow/video/playlist/edit.sh +14 -0
- bluer_ugv-7.421.1/bluer_ugv/.abcli/swallow/video/playlist/upload.sh +9 -0
- bluer_ugv-7.421.1/bluer_ugv/.abcli/swallow/video/playlist.sh +15 -0
- bluer_ugv-7.421.1/bluer_ugv/.abcli/swallow/video.sh +15 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow.sh +1 -1
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/tests/help.sh +8 -0
- bluer_ugv-7.421.1/bluer_ugv/.abcli/tests/swallow_video_play.sh +11 -0
- bluer_ugv-7.421.1/bluer_ugv/.abcli/tests/swallow_video_playlist.sh +45 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/__init__.py +1 -1
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/config.env +3 -1
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/env.py +2 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/help/swallow/__init__.py +2 -0
- bluer_ugv-7.421.1/bluer_ugv/help/swallow/video/functions.py +41 -0
- bluer_ugv-7.421.1/bluer_ugv/help/swallow/video/playlist.py +89 -0
- bluer_ugv-7.421.1/bluer_ugv/swallow/session/classical/screen/classes.py +42 -0
- bluer_ugv-7.421.1/bluer_ugv/swallow/session/classical/screen/video/__init__.py +0 -0
- bluer_ugv-7.421.1/bluer_ugv/swallow/session/classical/screen/video/__main__.py +99 -0
- bluer_ugv-7.421.1/bluer_ugv/swallow/session/classical/screen/video/engine.py +125 -0
- bluer_ugv-7.421.1/bluer_ugv/swallow/session/classical/screen/video/player.py +117 -0
- bluer_ugv-7.421.1/bluer_ugv/swallow/session/classical/screen/video/playlist.py +116 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/session.py +11 -7
- bluer_ugv-7.421.1/bluer_ugv/swallow/session/classical/setpoint/__init__.py +0 -0
- bluer_ugv-7.421.1/bluer_ugv/swallow/session/classical/ultrasonic_sensor/__init__.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/log.py +3 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1/bluer_ugv.egg-info}/PKG-INFO +2 -2
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv.egg-info/SOURCES.txt +19 -1
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/setup.py +5 -0
- bluer_ugv-7.359.1/bluer_ugv/swallow/session/classical/screen.py +0 -11
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/LICENSE +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/MANIFEST.in +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/abcli.sh +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/actions.sh +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/aka.sh +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/alias.sh +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/bluer_ugv.sh +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/dataset/combine.sh +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/dataset/download.sh +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/dataset/edit.sh +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/dataset/list.sh +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/dataset/upload.sh +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/debug.sh +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/env/cp.sh +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/env/list.sh +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/env/set.sh +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/env.sh +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/keyboard/test.sh +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/keyboard.sh +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/select_target.sh +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/session.sh +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/ultrasonic/review.sh +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/ultrasonic/test.sh +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/ultrasonic.sh +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/tests/README.sh +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/tests/swallow_dataset_combine.sh +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/tests/swallow_dataset_combine_explicit.sh +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/tests/swallow_dataset_combine_sequence.sh +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/tests/swallow_dataset_download_upload.sh +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/tests/swallow_dataset_edit.sh +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/tests/swallow_dataset_list.sh +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/tests/ultrasonic_sensor_review.sh +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/tests/version.sh +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/ugv/git.sh +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/__init__.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/alias.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/arzhang/__init__.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/arzhang/algo.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/arzhang/consts.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/arzhang/design.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/arzhang/flag.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/arzhang/items.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/beast.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/build.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/consts.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/eagle/__init__.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/eagle/consts.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/eagle/items.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/fire/__init__.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/fire/consts.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/fire/items.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/items.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/rangin/__init__.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/rangin/consts.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/rangin/items.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ravin/__init__.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ravin/consts.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ravin/items.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/releases.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/root.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/shield/__init__.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/shield/box.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/shield/docs.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/shield/pcb.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/shield/schematics.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/shield/testing.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/shortcuts.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/swallow/__init__.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/swallow/analog.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/swallow/consts.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/swallow/digital/__init__.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/swallow/digital/algo/__init__.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/swallow/digital/algo/navigation.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/swallow/digital/algo/yolo.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/swallow/digital/design/__init__.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/swallow/digital/design/mechanical.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/swallow/digital/design/ultrasonic_sensor.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/swallow/items.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/__init__.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/__init__.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/build.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/DYI.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/__init__.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/classes.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/concealment.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/control.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/cost.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/db.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/payload.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/ps.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/range.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/sanction_proof.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/size.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/speed.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/swarm.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/uv_delivery.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/references/__init__.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/references/classes.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/references/db.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/ugvs/__init__.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/ugvs/classes.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/ugvs/db.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/db.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/docs.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/__main__.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/assets/comparison.html +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/designs/__init__.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/designs/eagle/__init__.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/designs/eagle/parts.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/designs/fire/__init__.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/designs/fire/parts.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/designs/rangin/__init__.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/designs/rangin/parts.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/designs/ravin/__init__.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/designs/ravin/ravin3/__init__.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/designs/ravin/ravin3/parts.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/designs/ravin/ravin4/__init__.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/designs/ravin/ravin4/parts.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/help/__init__.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/help/__main__.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/help/functions.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/help/git.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/help/swallow/dataset.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/help/swallow/debug.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/help/swallow/env.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/help/swallow/keyboard.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/help/swallow/select_target.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/help/swallow/ultrasonic_sensor.py +0 -0
- {bluer_ugv-7.359.1/bluer_ugv/swallow → bluer_ugv-7.421.1/bluer_ugv/help/swallow/video}/__init__.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/host.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/logger.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/sample.env +0 -0
- {bluer_ugv-7.359.1/bluer_ugv/swallow/dataset → bluer_ugv-7.421.1/bluer_ugv/swallow}/__init__.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/__main__.py +0 -0
- {bluer_ugv-7.359.1/bluer_ugv/swallow/session → bluer_ugv-7.421.1/bluer_ugv/swallow/dataset}/__init__.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/dataset/__main__.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/dataset/combination.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/debug.py +0 -0
- {bluer_ugv-7.359.1/bluer_ugv/swallow/session/classical → bluer_ugv-7.421.1/bluer_ugv/swallow/session}/__init__.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/__main__.py +0 -0
- {bluer_ugv-7.359.1/bluer_ugv/swallow/session/classical/keyboard → bluer_ugv-7.421.1/bluer_ugv/swallow/session/classical}/__init__.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/camera/__init__.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/camera/generic.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/camera/navigation.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/camera/tracking.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/camera/yolo.py +0 -0
- {bluer_ugv-7.359.1/bluer_ugv/swallow/session/classical/setpoint → bluer_ugv-7.421.1/bluer_ugv/swallow/session/classical/keyboard}/__init__.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/keyboard/__main__.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/keyboard/classes.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/keyboard/keys.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/keyboard/testing.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/leds.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/mode.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/motor/__init__.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/motor/generic.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/motor/left.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/motor/rear.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/motor/right.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/motor/steering.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/mousepad.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/position.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/push_button.py +0 -0
- {bluer_ugv-7.359.1/bluer_ugv/swallow/session/classical/ultrasonic_sensor → bluer_ugv-7.421.1/bluer_ugv/swallow/session/classical/screen}/__init__.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/setpoint/classes.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/setpoint/steering.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/__main__.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/classes.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/consts.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/detection.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/detection_list.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/pack.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/review.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/sensor.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/testing.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/functions.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/targeting.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv/urls.py +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv.egg-info/dependency_links.txt +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv.egg-info/requires.txt +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/bluer_ugv.egg-info/top_level.txt +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/pyproject.toml +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/requirements.txt +0 -0
- {bluer_ugv-7.359.1 → bluer_ugv-7.421.1}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: bluer_ugv
|
|
3
|
-
Version: 7.
|
|
3
|
+
Version: 7.421.1
|
|
4
4
|
Summary: 🐬 AI x UGV.
|
|
5
5
|
Home-page: https://github.com/kamangir/bluer-ugv
|
|
6
6
|
Author: Arash Abadpour (Kamangir)
|
|
@@ -64,7 +64,7 @@ pip install bluer_ugv
|
|
|
64
64
|
|
|
65
65
|
[](https://github.com/kamangir/bluer-ugv/actions/workflows/pylint.yml) [](https://github.com/kamangir/bluer-ugv/actions/workflows/pytest.yml) [](https://github.com/kamangir/bluer-ugv/actions/workflows/bashtest.yml) [](https://pypi.org/project/bluer-ugv/) [](https://pypistats.org/packages/bluer-ugv)
|
|
66
66
|
|
|
67
|
-
built by 🌀 [`bluer README`](https://github.com/kamangir/bluer-objects/tree/main/bluer_objects/README), based on 🐬 [`bluer_ugv-7.
|
|
67
|
+
built by 🌀 [`bluer README`](https://github.com/kamangir/bluer-objects/tree/main/bluer_objects/README), based on 🐬 [`bluer_ugv-7.421.1`](https://github.com/kamangir/bluer-ugv).
|
|
68
68
|
|
|
69
69
|
|
|
70
70
|
built by 🌀 [`blueness-3.118.1`](https://github.com/kamangir/blueness).
|
|
@@ -35,5 +35,5 @@ pip install bluer_ugv
|
|
|
35
35
|
|
|
36
36
|
[](https://github.com/kamangir/bluer-ugv/actions/workflows/pylint.yml) [](https://github.com/kamangir/bluer-ugv/actions/workflows/pytest.yml) [](https://github.com/kamangir/bluer-ugv/actions/workflows/bashtest.yml) [](https://pypi.org/project/bluer-ugv/) [](https://pypistats.org/packages/bluer-ugv)
|
|
37
37
|
|
|
38
|
-
built by 🌀 [`bluer README`](https://github.com/kamangir/bluer-objects/tree/main/bluer_objects/README), based on 🐬 [`bluer_ugv-7.
|
|
38
|
+
built by 🌀 [`bluer README`](https://github.com/kamangir/bluer-objects/tree/main/bluer_objects/README), based on 🐬 [`bluer_ugv-7.421.1`](https://github.com/kamangir/bluer-ugv).
|
|
39
39
|
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#! /usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
function bluer_ugv_swallow_video_playlist_cat() {
|
|
4
|
+
local options=$1
|
|
5
|
+
local do_download=$(bluer_ai_option_int "$options" download 0)
|
|
6
|
+
|
|
7
|
+
[[ "$do_download" == 1 ]] &&
|
|
8
|
+
bluer_ugv_swallow_video_playlist_download \
|
|
9
|
+
filename=void \
|
|
10
|
+
$RANGIN_VIDEO_LIST_OBJECT
|
|
11
|
+
|
|
12
|
+
bluer_ai_cat \
|
|
13
|
+
$ABCLI_OBJECT_ROOT/$RANGIN_VIDEO_LIST_OBJECT/metadata.yaml
|
|
14
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#! /usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
function bluer_ugv_swallow_video_playlist_download() {
|
|
4
|
+
local options=${1:-policy=doesnt_exist}
|
|
5
|
+
|
|
6
|
+
[[ "$abcli_is_rpi" == true ]] &&
|
|
7
|
+
sudo chown pi:pi \
|
|
8
|
+
$ABCLI_OBJECT_ROOT/$RANGIN_VIDEO_LIST_OBJECT
|
|
9
|
+
|
|
10
|
+
bluer_objects_download \
|
|
11
|
+
filename=metadata.yaml \
|
|
12
|
+
$RANGIN_VIDEO_LIST_OBJECT
|
|
13
|
+
[[ $? -ne 0 ]] && return 1
|
|
14
|
+
|
|
15
|
+
bluer_objects_download \
|
|
16
|
+
,$options \
|
|
17
|
+
$RANGIN_VIDEO_LIST_OBJECT
|
|
18
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#! /usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
function bluer_ugv_swallow_video_playlist_edit() {
|
|
4
|
+
local options=$1
|
|
5
|
+
local do_download=$(bluer_ai_option_int "$options" download 0)
|
|
6
|
+
|
|
7
|
+
[[ "$do_download" == 1 ]] &&
|
|
8
|
+
bluer_ugv_swallow_video_playlist_download \
|
|
9
|
+
filename=void \
|
|
10
|
+
$RANGIN_VIDEO_LIST_OBJECT
|
|
11
|
+
|
|
12
|
+
bluer_ai_code \
|
|
13
|
+
$ABCLI_OBJECT_ROOT/$RANGIN_VIDEO_LIST_OBJECT/metadata.yaml
|
|
14
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#! /usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
function bluer_ugv_swallow_video_playlist() {
|
|
4
|
+
local task=$1
|
|
5
|
+
|
|
6
|
+
local function_name=bluer_ugv_swallow_video_playlist_$task
|
|
7
|
+
if [[ $(type -t $function_name) == "function" ]]; then
|
|
8
|
+
$function_name "${@:2}"
|
|
9
|
+
return
|
|
10
|
+
fi
|
|
11
|
+
|
|
12
|
+
python3 -m bluer_ugv.swallow.session.classical.screen.video "$@"
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
bluer_ai_source_caller_suffix_path /playlist
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#! /usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
function bluer_ugv_swallow_video() {
|
|
4
|
+
local task=$1
|
|
5
|
+
|
|
6
|
+
local function_name=bluer_ugv_swallow_video_$task
|
|
7
|
+
if [[ $(type -t $function_name) == "function" ]]; then
|
|
8
|
+
$function_name "${@:2}"
|
|
9
|
+
return
|
|
10
|
+
fi
|
|
11
|
+
|
|
12
|
+
python3 -m bluer_ugv.swallow.session.classical.screen.video "$@"
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
bluer_ai_source_caller_suffix_path /video
|
|
@@ -29,6 +29,14 @@ function test_bluer_ugv_help() {
|
|
|
29
29
|
"@swallow ultrasonic review" \
|
|
30
30
|
"@swallow ultrasonic test" \
|
|
31
31
|
\
|
|
32
|
+
"@swallow video" \
|
|
33
|
+
"@swallow video play" \
|
|
34
|
+
"@swallow video playlist" \
|
|
35
|
+
"@swallow video playlist cat" \
|
|
36
|
+
"@swallow video playlist download" \
|
|
37
|
+
"@swallow video playlist edit" \
|
|
38
|
+
"@swallow video playlist upload" \
|
|
39
|
+
\
|
|
32
40
|
"@ugv" \
|
|
33
41
|
\
|
|
34
42
|
"@ugv git" \
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
#! /usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
function test_swallow_video_playlist_cat() {
|
|
4
|
+
local options=$1
|
|
5
|
+
|
|
6
|
+
bluer_ai_eval ,$options \
|
|
7
|
+
bluer_ugv \
|
|
8
|
+
swallow \
|
|
9
|
+
video \
|
|
10
|
+
playlist \
|
|
11
|
+
cat
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function test_swallow_video_playlist_download_upload() {
|
|
15
|
+
local options=$1
|
|
16
|
+
|
|
17
|
+
bluer_ai_eval ,$options \
|
|
18
|
+
bluer_ugv \
|
|
19
|
+
swallow \
|
|
20
|
+
video \
|
|
21
|
+
playlist \
|
|
22
|
+
download \
|
|
23
|
+
policy=doesnt_exist
|
|
24
|
+
[[ $? -ne 0 ]] && return 1
|
|
25
|
+
|
|
26
|
+
bluer_ai_eval ,$options \
|
|
27
|
+
bluer_ugv \
|
|
28
|
+
swallow \
|
|
29
|
+
video \
|
|
30
|
+
playlist \
|
|
31
|
+
upload \
|
|
32
|
+
filename=metadata.yaml
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function test_swallow_video_playlist_edit() {
|
|
36
|
+
local options=$1
|
|
37
|
+
|
|
38
|
+
bluer_ai_eval ,$options \
|
|
39
|
+
bluer_ugv \
|
|
40
|
+
swallow \
|
|
41
|
+
video \
|
|
42
|
+
playlist \
|
|
43
|
+
edit \
|
|
44
|
+
download
|
|
45
|
+
}
|
|
@@ -6,6 +6,7 @@ from bluer_ugv.help.swallow.select_target import help_select_target
|
|
|
6
6
|
from bluer_ugv.help.swallow.ultrasonic_sensor import (
|
|
7
7
|
help_functions as help_ultrasonic_sensor,
|
|
8
8
|
)
|
|
9
|
+
from bluer_ugv.help.swallow.video.functions import help_functions as help_video
|
|
9
10
|
|
|
10
11
|
help_functions = {
|
|
11
12
|
"dataset": help_dataset,
|
|
@@ -14,4 +15,5 @@ help_functions = {
|
|
|
14
15
|
"keyboard": help_keyboard,
|
|
15
16
|
"select_target": help_select_target,
|
|
16
17
|
"ultrasonic": help_ultrasonic_sensor,
|
|
18
|
+
"video": help_video,
|
|
17
19
|
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
from typing import List
|
|
2
|
+
|
|
3
|
+
from bluer_options.terminal import show_usage, xtra
|
|
4
|
+
|
|
5
|
+
from bluer_ugv import env
|
|
6
|
+
from bluer_ugv.help.swallow.video.playlist import help_functions as help_playlist
|
|
7
|
+
from bluer_ugv.swallow.session.classical.screen.video.engine import VideoEngine
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def help_play(
|
|
11
|
+
tokens: List[str],
|
|
12
|
+
mono: bool,
|
|
13
|
+
) -> str:
|
|
14
|
+
args = [
|
|
15
|
+
"[--dryrun 1]",
|
|
16
|
+
"[--download 0]",
|
|
17
|
+
"[--engine {}]".format(
|
|
18
|
+
" | ".join(sorted([engine.name.lower() for engine in VideoEngine]))
|
|
19
|
+
),
|
|
20
|
+
"[--loop 0]",
|
|
21
|
+
f"[--object_name <{env.RANGIN_VIDEO_LIST_OBJECT}>]",
|
|
22
|
+
"[--timeout <-1 | 10>]",
|
|
23
|
+
"[--video <loading|1>]",
|
|
24
|
+
]
|
|
25
|
+
|
|
26
|
+
return show_usage(
|
|
27
|
+
[
|
|
28
|
+
"@swallow",
|
|
29
|
+
"video",
|
|
30
|
+
"play",
|
|
31
|
+
]
|
|
32
|
+
+ args,
|
|
33
|
+
"play <object-name>/<video>.",
|
|
34
|
+
mono=mono,
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
help_functions = {
|
|
39
|
+
"play": help_play,
|
|
40
|
+
"playlist": help_playlist,
|
|
41
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
from typing import List
|
|
2
|
+
|
|
3
|
+
from bluer_options.terminal import show_usage, xtra
|
|
4
|
+
from bluer_objects.help.download import options as download_options
|
|
5
|
+
from bluer_objects.help.upload import options as upload_options
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def help_cat(
|
|
9
|
+
tokens: List[str],
|
|
10
|
+
mono: bool,
|
|
11
|
+
) -> str:
|
|
12
|
+
options = xtra("download", mono=mono)
|
|
13
|
+
|
|
14
|
+
return show_usage(
|
|
15
|
+
[
|
|
16
|
+
"@swallow",
|
|
17
|
+
"video",
|
|
18
|
+
"playlist",
|
|
19
|
+
"cat",
|
|
20
|
+
f"[{options}]",
|
|
21
|
+
],
|
|
22
|
+
"cat swallow playlist.",
|
|
23
|
+
mono=mono,
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def help_download(
|
|
28
|
+
tokens: List[str],
|
|
29
|
+
mono: bool,
|
|
30
|
+
) -> str:
|
|
31
|
+
options = download_options(mono=mono)
|
|
32
|
+
|
|
33
|
+
return show_usage(
|
|
34
|
+
[
|
|
35
|
+
"@swallow",
|
|
36
|
+
"video",
|
|
37
|
+
"playlist",
|
|
38
|
+
"download",
|
|
39
|
+
f"[{options}]",
|
|
40
|
+
],
|
|
41
|
+
"download swallow playlist.",
|
|
42
|
+
mono=mono,
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def help_edit(
|
|
47
|
+
tokens: List[str],
|
|
48
|
+
mono: bool,
|
|
49
|
+
) -> str:
|
|
50
|
+
options = xtra("download", mono=mono)
|
|
51
|
+
|
|
52
|
+
return show_usage(
|
|
53
|
+
[
|
|
54
|
+
"@swallow",
|
|
55
|
+
"video",
|
|
56
|
+
"playlist",
|
|
57
|
+
"edit",
|
|
58
|
+
f"[{options}]",
|
|
59
|
+
],
|
|
60
|
+
"edit swallow playlist.",
|
|
61
|
+
mono=mono,
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def help_upload(
|
|
66
|
+
tokens: List[str],
|
|
67
|
+
mono: bool,
|
|
68
|
+
) -> str:
|
|
69
|
+
options = upload_options(mono=mono)
|
|
70
|
+
|
|
71
|
+
return show_usage(
|
|
72
|
+
[
|
|
73
|
+
"@swallow",
|
|
74
|
+
"video",
|
|
75
|
+
"playlist",
|
|
76
|
+
"upload",
|
|
77
|
+
f"[{options}]",
|
|
78
|
+
],
|
|
79
|
+
"upload swallow playlist.",
|
|
80
|
+
mono=mono,
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
help_functions = {
|
|
85
|
+
"cat": help_cat,
|
|
86
|
+
"download": help_download,
|
|
87
|
+
"edit": help_edit,
|
|
88
|
+
"upload": help_upload,
|
|
89
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
from bluer_options.host.functions import is_headless
|
|
2
|
+
|
|
3
|
+
from bluer_ugv import env
|
|
4
|
+
from bluer_ugv.swallow.session.classical.screen.video.player import VideoPlayer
|
|
5
|
+
from bluer_ugv.swallow.session.classical.screen.video.playlist import PlayList
|
|
6
|
+
from bluer_ugv.logger import logger
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class ClassicalScreen:
|
|
10
|
+
def __init__(self):
|
|
11
|
+
self.video_player = None if is_headless() else VideoPlayer()
|
|
12
|
+
|
|
13
|
+
self.playlist = PlayList(env.RANGIN_VIDEO_LIST_OBJECT)
|
|
14
|
+
|
|
15
|
+
logger.info(f"{self.__class__.__name__} created.")
|
|
16
|
+
|
|
17
|
+
def cleanup(self):
|
|
18
|
+
logger.info(f"{self.__class__.__name__}.cleanup")
|
|
19
|
+
self.video_player.stop()
|
|
20
|
+
|
|
21
|
+
def initialize(self) -> bool:
|
|
22
|
+
if self.video_player is None:
|
|
23
|
+
return True
|
|
24
|
+
|
|
25
|
+
return self.video_player.play(
|
|
26
|
+
self.playlist.get("loading"),
|
|
27
|
+
loop=True,
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
def update(self) -> bool:
|
|
31
|
+
if self.video_player is None:
|
|
32
|
+
return True
|
|
33
|
+
|
|
34
|
+
if self.video_player.process:
|
|
35
|
+
return True
|
|
36
|
+
|
|
37
|
+
self.playlist.next()
|
|
38
|
+
|
|
39
|
+
return self.video_player.play(
|
|
40
|
+
self.playlist.get(self.playlist.index),
|
|
41
|
+
loop=False,
|
|
42
|
+
)
|
|
File without changes
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import argparse
|
|
2
|
+
import time
|
|
3
|
+
|
|
4
|
+
from blueness import module
|
|
5
|
+
from blueness.argparse.generic import sys_exit
|
|
6
|
+
from bluer_options.host import is_rpi, is_headless
|
|
7
|
+
from bluer_options import string
|
|
8
|
+
|
|
9
|
+
from bluer_ugv import NAME, env
|
|
10
|
+
from bluer_ugv.swallow.session.classical.screen.video.playlist import PlayList
|
|
11
|
+
from bluer_ugv.swallow.session.classical.screen.video.player import VideoPlayer
|
|
12
|
+
from bluer_ugv.swallow.session.classical.screen.video.engine import VideoEngine
|
|
13
|
+
from bluer_ugv.logger import logger
|
|
14
|
+
|
|
15
|
+
NAME = module.name(__file__, NAME)
|
|
16
|
+
|
|
17
|
+
parser = argparse.ArgumentParser(NAME)
|
|
18
|
+
parser.add_argument(
|
|
19
|
+
"task",
|
|
20
|
+
type=str,
|
|
21
|
+
help="play",
|
|
22
|
+
)
|
|
23
|
+
parser.add_argument(
|
|
24
|
+
"--download",
|
|
25
|
+
type=int,
|
|
26
|
+
default=1,
|
|
27
|
+
help="0|1",
|
|
28
|
+
)
|
|
29
|
+
parser.add_argument(
|
|
30
|
+
"--dryrun",
|
|
31
|
+
type=int,
|
|
32
|
+
default=int(not is_rpi() or is_headless()),
|
|
33
|
+
help="0|1",
|
|
34
|
+
)
|
|
35
|
+
parser.add_argument(
|
|
36
|
+
"--engine",
|
|
37
|
+
type=str,
|
|
38
|
+
default=VideoEngine.VLC.name.lower(),
|
|
39
|
+
help=" | ".join(sorted([engine.name.lower() for engine in VideoEngine])),
|
|
40
|
+
)
|
|
41
|
+
parser.add_argument(
|
|
42
|
+
"--loop",
|
|
43
|
+
type=int,
|
|
44
|
+
default=1,
|
|
45
|
+
help="0|1",
|
|
46
|
+
)
|
|
47
|
+
parser.add_argument(
|
|
48
|
+
"--object_name",
|
|
49
|
+
type=str,
|
|
50
|
+
default=env.RANGIN_VIDEO_LIST_OBJECT,
|
|
51
|
+
)
|
|
52
|
+
parser.add_argument(
|
|
53
|
+
"--timeout",
|
|
54
|
+
type=int,
|
|
55
|
+
default=-1,
|
|
56
|
+
help="in seconds, -1: never",
|
|
57
|
+
)
|
|
58
|
+
parser.add_argument(
|
|
59
|
+
"--video",
|
|
60
|
+
type=str,
|
|
61
|
+
default="loading",
|
|
62
|
+
)
|
|
63
|
+
args = parser.parse_args()
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
success = False
|
|
67
|
+
if args.task == "play":
|
|
68
|
+
playlist = PlayList(
|
|
69
|
+
args.object_name,
|
|
70
|
+
download=args.download == 1,
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
video_player = VideoPlayer(
|
|
74
|
+
args.dryrun == 1,
|
|
75
|
+
engine=VideoEngine[args.engine.upper()],
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
success = video_player.play(
|
|
79
|
+
filename=playlist.get(args.video),
|
|
80
|
+
loop=args.loop == 1,
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
if success and args.timeout > 0:
|
|
84
|
+
logger.info(
|
|
85
|
+
"waiting for {}".format(
|
|
86
|
+
string.pretty_duration(
|
|
87
|
+
args.timeout,
|
|
88
|
+
)
|
|
89
|
+
)
|
|
90
|
+
)
|
|
91
|
+
time.sleep(args.timeout)
|
|
92
|
+
success = video_player.stop()
|
|
93
|
+
|
|
94
|
+
logger.info('💡 type in "reset" if the prompt is invisible.')
|
|
95
|
+
|
|
96
|
+
else:
|
|
97
|
+
success = None
|
|
98
|
+
|
|
99
|
+
sys_exit(logger, NAME, args.task, success)
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import shlex
|
|
2
|
+
from enum import Enum, auto
|
|
3
|
+
import subprocess
|
|
4
|
+
import time
|
|
5
|
+
import socket
|
|
6
|
+
|
|
7
|
+
from bluer_objects.graphics.screen import get_size
|
|
8
|
+
from bluer_ugv.logger import logger
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class VideoEngine(Enum):
|
|
12
|
+
MPV = auto()
|
|
13
|
+
VLC = auto()
|
|
14
|
+
|
|
15
|
+
def pause(self, process: subprocess.Popen):
|
|
16
|
+
# MPV: use stdin
|
|
17
|
+
if self == VideoEngine.MPV:
|
|
18
|
+
try:
|
|
19
|
+
if not process.stdin:
|
|
20
|
+
logger.error("mpv pause failed: no stdin")
|
|
21
|
+
return False
|
|
22
|
+
process.stdin.write(b"p")
|
|
23
|
+
process.stdin.flush()
|
|
24
|
+
except Exception as e:
|
|
25
|
+
logger.error(f"mpv pause exception: {e}")
|
|
26
|
+
return False
|
|
27
|
+
return True
|
|
28
|
+
|
|
29
|
+
# VLC: use RC TCP
|
|
30
|
+
if self == VideoEngine.VLC:
|
|
31
|
+
try:
|
|
32
|
+
s = socket.create_connection(("127.0.0.1", 41940), 0.5)
|
|
33
|
+
s.sendall(b"pause\n")
|
|
34
|
+
s.close()
|
|
35
|
+
return True
|
|
36
|
+
except Exception as e:
|
|
37
|
+
logger.error(f"vlc pause failed: {e}")
|
|
38
|
+
return False
|
|
39
|
+
|
|
40
|
+
logger.error(f"{self}: unknown video engine.")
|
|
41
|
+
return False
|
|
42
|
+
|
|
43
|
+
def play_command(
|
|
44
|
+
self,
|
|
45
|
+
filename: str,
|
|
46
|
+
fullscreen: bool = True,
|
|
47
|
+
loop: bool = False,
|
|
48
|
+
audio: bool = False,
|
|
49
|
+
) -> str:
|
|
50
|
+
screen_height, screen_width = get_size()
|
|
51
|
+
logger.info("screen size: {}x{}".format(screen_height, screen_width))
|
|
52
|
+
|
|
53
|
+
if self == VideoEngine.MPV:
|
|
54
|
+
logger.info('press "q" to quit mpv.')
|
|
55
|
+
|
|
56
|
+
return " ".join(
|
|
57
|
+
[
|
|
58
|
+
"mpv",
|
|
59
|
+
"--no-border",
|
|
60
|
+
"--background=black", # FIXED
|
|
61
|
+
"--keepaspect=yes",
|
|
62
|
+
"--no-keepaspect-window",
|
|
63
|
+
"--geometry=0:0",
|
|
64
|
+
(f"--autofit={screen_width}x{screen_height}" if fullscreen else ""),
|
|
65
|
+
"--loop" if loop else "",
|
|
66
|
+
"--no-audio" if not audio else "",
|
|
67
|
+
shlex.quote(filename),
|
|
68
|
+
]
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
if self == VideoEngine.VLC:
|
|
72
|
+
logger.info('press "Enter" to quit vlc.')
|
|
73
|
+
|
|
74
|
+
return " ".join(
|
|
75
|
+
[
|
|
76
|
+
"sudo -u pi",
|
|
77
|
+
"cvlc",
|
|
78
|
+
"--fullscreen",
|
|
79
|
+
"--no-video-title-show",
|
|
80
|
+
"--video-on-top",
|
|
81
|
+
"--no-osd",
|
|
82
|
+
"--loop" if loop else "",
|
|
83
|
+
"--no-audio" if not audio else "",
|
|
84
|
+
"--extraintf",
|
|
85
|
+
"rc",
|
|
86
|
+
"--rc-host=127.0.0.1:41940",
|
|
87
|
+
shlex.quote(filename),
|
|
88
|
+
]
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
return "this-should-not-happen"
|
|
92
|
+
|
|
93
|
+
def stop(
|
|
94
|
+
self,
|
|
95
|
+
process: subprocess.Popen,
|
|
96
|
+
) -> bool:
|
|
97
|
+
if self == VideoEngine.MPV:
|
|
98
|
+
try:
|
|
99
|
+
if process.stdin:
|
|
100
|
+
process.stdin.write(b"q")
|
|
101
|
+
process.stdin.flush()
|
|
102
|
+
except Exception as e:
|
|
103
|
+
logger.error(f"mpv quit failed: {e}")
|
|
104
|
+
return False
|
|
105
|
+
|
|
106
|
+
if self == VideoEngine.VLC:
|
|
107
|
+
try:
|
|
108
|
+
s = socket.create_connection(("127.0.0.1", 41940), 0.5)
|
|
109
|
+
s.sendall(b"quit\n")
|
|
110
|
+
s.close()
|
|
111
|
+
logger.info("vlc: sent 'quit' via TCP RC.")
|
|
112
|
+
except Exception as e:
|
|
113
|
+
logger.error(f"vlc rc quit failed: {e}")
|
|
114
|
+
return False
|
|
115
|
+
|
|
116
|
+
time.sleep(0.3)
|
|
117
|
+
|
|
118
|
+
try:
|
|
119
|
+
if process.poll() is None:
|
|
120
|
+
process.kill()
|
|
121
|
+
except Exception as e:
|
|
122
|
+
logger.warning(f"process.kill failed: {e}")
|
|
123
|
+
return False
|
|
124
|
+
|
|
125
|
+
return True
|