bluer-ugv 7.353.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.353.1/bluer_ugv.egg-info → bluer_ugv-7.421.1}/PKG-INFO +2 -2
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/README.md +1 -1
- {bluer_ugv-7.353.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.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow.sh +1 -1
- {bluer_ugv-7.353.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.353.1 → bluer_ugv-7.421.1}/bluer_ugv/__init__.py +1 -1
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/config.env +4 -2
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/env.py +2 -0
- {bluer_ugv-7.353.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.353.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.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/classes.py +11 -16
- bluer_ugv-7.421.1/bluer_ugv/swallow/session/classical/ultrasonic_sensor/detection_list.py +45 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/log.py +22 -16
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/pack.py +16 -4
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/testing.py +2 -2
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1/bluer_ugv.egg-info}/PKG-INFO +2 -2
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv.egg-info/SOURCES.txt +20 -1
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/setup.py +5 -0
- bluer_ugv-7.353.1/bluer_ugv/swallow/session/classical/screen.py +0 -11
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/LICENSE +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/MANIFEST.in +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/abcli.sh +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/actions.sh +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/aka.sh +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/alias.sh +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/bluer_ugv.sh +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/dataset/combine.sh +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/dataset/download.sh +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/dataset/edit.sh +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/dataset/list.sh +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/dataset/upload.sh +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/debug.sh +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/env/cp.sh +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/env/list.sh +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/env/set.sh +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/env.sh +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/keyboard/test.sh +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/keyboard.sh +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/select_target.sh +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/session.sh +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/ultrasonic/review.sh +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/ultrasonic/test.sh +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/ultrasonic.sh +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/tests/README.sh +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/tests/swallow_dataset_combine.sh +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/tests/swallow_dataset_combine_explicit.sh +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/tests/swallow_dataset_combine_sequence.sh +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/tests/swallow_dataset_download_upload.sh +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/tests/swallow_dataset_edit.sh +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/tests/swallow_dataset_list.sh +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/tests/ultrasonic_sensor_review.sh +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/tests/version.sh +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/ugv/git.sh +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/__init__.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/alias.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/arzhang/__init__.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/arzhang/algo.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/arzhang/consts.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/arzhang/design.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/arzhang/flag.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/arzhang/items.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/beast.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/build.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/consts.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/eagle/__init__.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/eagle/consts.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/eagle/items.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/fire/__init__.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/fire/consts.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/fire/items.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/items.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/rangin/__init__.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/rangin/consts.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/rangin/items.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ravin/__init__.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ravin/consts.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ravin/items.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/releases.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/root.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/shield/__init__.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/shield/box.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/shield/docs.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/shield/pcb.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/shield/schematics.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/shield/testing.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/shortcuts.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/swallow/__init__.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/swallow/analog.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/swallow/consts.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/swallow/digital/__init__.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/swallow/digital/algo/__init__.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/swallow/digital/algo/navigation.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/swallow/digital/algo/yolo.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/swallow/digital/design/__init__.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/swallow/digital/design/mechanical.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/swallow/digital/design/ultrasonic_sensor.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/swallow/items.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/__init__.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/__init__.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/build.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/DYI.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/__init__.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/classes.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/concealment.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/control.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/cost.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/db.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/payload.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/ps.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/range.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/sanction_proof.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/size.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/speed.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/swarm.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/uv_delivery.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/references/__init__.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/references/classes.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/references/db.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/ugvs/__init__.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/ugvs/classes.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/ugvs/db.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/db.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/docs.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/__main__.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/assets/comparison.html +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/designs/__init__.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/designs/eagle/__init__.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/designs/eagle/parts.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/designs/fire/__init__.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/designs/fire/parts.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/designs/rangin/__init__.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/designs/rangin/parts.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/designs/ravin/__init__.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/designs/ravin/ravin3/__init__.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/designs/ravin/ravin3/parts.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/designs/ravin/ravin4/__init__.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/designs/ravin/ravin4/parts.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/help/__init__.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/help/__main__.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/help/functions.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/help/git.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/help/swallow/dataset.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/help/swallow/debug.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/help/swallow/env.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/help/swallow/keyboard.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/help/swallow/select_target.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/help/swallow/ultrasonic_sensor.py +0 -0
- {bluer_ugv-7.353.1/bluer_ugv/swallow → bluer_ugv-7.421.1/bluer_ugv/help/swallow/video}/__init__.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/host.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/logger.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/sample.env +0 -0
- {bluer_ugv-7.353.1/bluer_ugv/swallow/dataset → bluer_ugv-7.421.1/bluer_ugv/swallow}/__init__.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/__main__.py +0 -0
- {bluer_ugv-7.353.1/bluer_ugv/swallow/session → bluer_ugv-7.421.1/bluer_ugv/swallow/dataset}/__init__.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/dataset/__main__.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/dataset/combination.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/debug.py +0 -0
- {bluer_ugv-7.353.1/bluer_ugv/swallow/session/classical → bluer_ugv-7.421.1/bluer_ugv/swallow/session}/__init__.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/__main__.py +0 -0
- {bluer_ugv-7.353.1/bluer_ugv/swallow/session/classical/keyboard → bluer_ugv-7.421.1/bluer_ugv/swallow/session/classical}/__init__.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/camera/__init__.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/camera/generic.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/camera/navigation.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/camera/tracking.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/camera/yolo.py +0 -0
- {bluer_ugv-7.353.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.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/keyboard/__main__.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/keyboard/classes.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/keyboard/keys.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/keyboard/testing.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/leds.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/mode.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/motor/__init__.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/motor/generic.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/motor/left.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/motor/rear.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/motor/right.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/motor/steering.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/mousepad.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/position.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/push_button.py +0 -0
- {bluer_ugv-7.353.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.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/setpoint/classes.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/setpoint/steering.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/__main__.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/consts.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/detection.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/review.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/sensor.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/functions.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/targeting.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/urls.py +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv.egg-info/dependency_links.txt +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv.egg-info/requires.txt +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv.egg-info/top_level.txt +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/pyproject.toml +0 -0
- {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/requirements.txt +0 -0
- {bluer_ugv-7.353.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
|
+
}
|
|
@@ -18,7 +18,7 @@ BLUER_UGV_SWALLOW_YOLO_MODEL=coco128-model-2025-09-16-meb4if
|
|
|
18
18
|
|
|
19
19
|
BLUER_UGV_SWALLOW_YOLO_DATASET_LIST=swallow-yolo-dataset-list-v1
|
|
20
20
|
|
|
21
|
-
BLUER_UGV_ULTRASONIC_SENSOR_TEST_OBJECT=ultrasonic-test-2025-
|
|
21
|
+
BLUER_UGV_ULTRASONIC_SENSOR_TEST_OBJECT=ultrasonic-test-2025-11-18-12-38-22-j4t7wl
|
|
22
22
|
|
|
23
23
|
BLUER_UGV_ULTRASONIC_SENSOR_WARNING_THRESHOLD=400
|
|
24
24
|
BLUER_UGV_ULTRASONIC_SENSOR_DANGER_THRESHOLD=200
|
|
@@ -27,4 +27,6 @@ BLUER_UGV_ULTRASONIC_SENSOR_MAX_M=0.8
|
|
|
27
27
|
|
|
28
28
|
BLUER_UGV_ULTRASONIC_SENSOR_KEEP_LOG=1
|
|
29
29
|
|
|
30
|
-
BLUER_UGV_ULTRASONIC_SENSOR_LOG=0
|
|
30
|
+
BLUER_UGV_ULTRASONIC_SENSOR_LOG=0
|
|
31
|
+
|
|
32
|
+
RANGIN_VIDEO_LIST_OBJECT=rangin-video-list-1
|
|
@@ -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
|