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.
Files changed (217) hide show
  1. {bluer_ugv-7.353.1/bluer_ugv.egg-info → bluer_ugv-7.421.1}/PKG-INFO +2 -2
  2. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/README.md +1 -1
  3. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/dataset.sh +1 -1
  4. bluer_ugv-7.421.1/bluer_ugv/.abcli/swallow/video/play.sh +7 -0
  5. bluer_ugv-7.421.1/bluer_ugv/.abcli/swallow/video/playlist/cat.sh +14 -0
  6. bluer_ugv-7.421.1/bluer_ugv/.abcli/swallow/video/playlist/download.sh +18 -0
  7. bluer_ugv-7.421.1/bluer_ugv/.abcli/swallow/video/playlist/edit.sh +14 -0
  8. bluer_ugv-7.421.1/bluer_ugv/.abcli/swallow/video/playlist/upload.sh +9 -0
  9. bluer_ugv-7.421.1/bluer_ugv/.abcli/swallow/video/playlist.sh +15 -0
  10. bluer_ugv-7.421.1/bluer_ugv/.abcli/swallow/video.sh +15 -0
  11. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow.sh +1 -1
  12. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/tests/help.sh +8 -0
  13. bluer_ugv-7.421.1/bluer_ugv/.abcli/tests/swallow_video_play.sh +11 -0
  14. bluer_ugv-7.421.1/bluer_ugv/.abcli/tests/swallow_video_playlist.sh +45 -0
  15. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/__init__.py +1 -1
  16. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/config.env +4 -2
  17. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/env.py +2 -0
  18. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/help/swallow/__init__.py +2 -0
  19. bluer_ugv-7.421.1/bluer_ugv/help/swallow/video/functions.py +41 -0
  20. bluer_ugv-7.421.1/bluer_ugv/help/swallow/video/playlist.py +89 -0
  21. bluer_ugv-7.421.1/bluer_ugv/swallow/session/classical/screen/classes.py +42 -0
  22. bluer_ugv-7.421.1/bluer_ugv/swallow/session/classical/screen/video/__init__.py +0 -0
  23. bluer_ugv-7.421.1/bluer_ugv/swallow/session/classical/screen/video/__main__.py +99 -0
  24. bluer_ugv-7.421.1/bluer_ugv/swallow/session/classical/screen/video/engine.py +125 -0
  25. bluer_ugv-7.421.1/bluer_ugv/swallow/session/classical/screen/video/player.py +117 -0
  26. bluer_ugv-7.421.1/bluer_ugv/swallow/session/classical/screen/video/playlist.py +116 -0
  27. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/session.py +11 -7
  28. bluer_ugv-7.421.1/bluer_ugv/swallow/session/classical/setpoint/__init__.py +0 -0
  29. bluer_ugv-7.421.1/bluer_ugv/swallow/session/classical/ultrasonic_sensor/__init__.py +0 -0
  30. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/classes.py +11 -16
  31. bluer_ugv-7.421.1/bluer_ugv/swallow/session/classical/ultrasonic_sensor/detection_list.py +45 -0
  32. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/log.py +22 -16
  33. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/pack.py +16 -4
  34. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/testing.py +2 -2
  35. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1/bluer_ugv.egg-info}/PKG-INFO +2 -2
  36. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv.egg-info/SOURCES.txt +20 -1
  37. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/setup.py +5 -0
  38. bluer_ugv-7.353.1/bluer_ugv/swallow/session/classical/screen.py +0 -11
  39. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/LICENSE +0 -0
  40. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/MANIFEST.in +0 -0
  41. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/abcli.sh +0 -0
  42. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/actions.sh +0 -0
  43. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/aka.sh +0 -0
  44. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/alias.sh +0 -0
  45. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/bluer_ugv.sh +0 -0
  46. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/dataset/combine.sh +0 -0
  47. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/dataset/download.sh +0 -0
  48. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/dataset/edit.sh +0 -0
  49. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/dataset/list.sh +0 -0
  50. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/dataset/upload.sh +0 -0
  51. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/debug.sh +0 -0
  52. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/env/cp.sh +0 -0
  53. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/env/list.sh +0 -0
  54. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/env/set.sh +0 -0
  55. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/env.sh +0 -0
  56. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/keyboard/test.sh +0 -0
  57. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/keyboard.sh +0 -0
  58. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/select_target.sh +0 -0
  59. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/session.sh +0 -0
  60. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/ultrasonic/review.sh +0 -0
  61. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/ultrasonic/test.sh +0 -0
  62. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/swallow/ultrasonic.sh +0 -0
  63. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/tests/README.sh +0 -0
  64. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/tests/swallow_dataset_combine.sh +0 -0
  65. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/tests/swallow_dataset_combine_explicit.sh +0 -0
  66. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/tests/swallow_dataset_combine_sequence.sh +0 -0
  67. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/tests/swallow_dataset_download_upload.sh +0 -0
  68. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/tests/swallow_dataset_edit.sh +0 -0
  69. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/tests/swallow_dataset_list.sh +0 -0
  70. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/tests/ultrasonic_sensor_review.sh +0 -0
  71. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/tests/version.sh +0 -0
  72. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/.abcli/ugv/git.sh +0 -0
  73. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/__init__.py +0 -0
  74. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/alias.py +0 -0
  75. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/arzhang/__init__.py +0 -0
  76. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/arzhang/algo.py +0 -0
  77. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/arzhang/consts.py +0 -0
  78. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/arzhang/design.py +0 -0
  79. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/arzhang/flag.py +0 -0
  80. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/arzhang/items.py +0 -0
  81. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/beast.py +0 -0
  82. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/build.py +0 -0
  83. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/consts.py +0 -0
  84. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/eagle/__init__.py +0 -0
  85. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/eagle/consts.py +0 -0
  86. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/eagle/items.py +0 -0
  87. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/fire/__init__.py +0 -0
  88. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/fire/consts.py +0 -0
  89. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/fire/items.py +0 -0
  90. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/items.py +0 -0
  91. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/rangin/__init__.py +0 -0
  92. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/rangin/consts.py +0 -0
  93. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/rangin/items.py +0 -0
  94. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ravin/__init__.py +0 -0
  95. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ravin/consts.py +0 -0
  96. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ravin/items.py +0 -0
  97. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/releases.py +0 -0
  98. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/root.py +0 -0
  99. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/shield/__init__.py +0 -0
  100. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/shield/box.py +0 -0
  101. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/shield/docs.py +0 -0
  102. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/shield/pcb.py +0 -0
  103. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/shield/schematics.py +0 -0
  104. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/shield/testing.py +0 -0
  105. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/shortcuts.py +0 -0
  106. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/swallow/__init__.py +0 -0
  107. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/swallow/analog.py +0 -0
  108. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/swallow/consts.py +0 -0
  109. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/swallow/digital/__init__.py +0 -0
  110. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/swallow/digital/algo/__init__.py +0 -0
  111. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/swallow/digital/algo/navigation.py +0 -0
  112. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/swallow/digital/algo/yolo.py +0 -0
  113. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/swallow/digital/design/__init__.py +0 -0
  114. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/swallow/digital/design/mechanical.py +0 -0
  115. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/swallow/digital/design/ultrasonic_sensor.py +0 -0
  116. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/swallow/items.py +0 -0
  117. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/__init__.py +0 -0
  118. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/__init__.py +0 -0
  119. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/build.py +0 -0
  120. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/DYI.py +0 -0
  121. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/__init__.py +0 -0
  122. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/classes.py +0 -0
  123. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/concealment.py +0 -0
  124. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/control.py +0 -0
  125. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/cost.py +0 -0
  126. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/db.py +0 -0
  127. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/payload.py +0 -0
  128. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/ps.py +0 -0
  129. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/range.py +0 -0
  130. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/sanction_proof.py +0 -0
  131. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/size.py +0 -0
  132. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/speed.py +0 -0
  133. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/swarm.py +0 -0
  134. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/features/uv_delivery.py +0 -0
  135. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/references/__init__.py +0 -0
  136. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/references/classes.py +0 -0
  137. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/references/db.py +0 -0
  138. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/ugvs/__init__.py +0 -0
  139. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/ugvs/classes.py +0 -0
  140. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/comparison/ugvs/db.py +0 -0
  141. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/db.py +0 -0
  142. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/README/ugvs/docs.py +0 -0
  143. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/__main__.py +0 -0
  144. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/assets/comparison.html +0 -0
  145. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/designs/__init__.py +0 -0
  146. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/designs/eagle/__init__.py +0 -0
  147. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/designs/eagle/parts.py +0 -0
  148. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/designs/fire/__init__.py +0 -0
  149. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/designs/fire/parts.py +0 -0
  150. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/designs/rangin/__init__.py +0 -0
  151. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/designs/rangin/parts.py +0 -0
  152. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/designs/ravin/__init__.py +0 -0
  153. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/designs/ravin/ravin3/__init__.py +0 -0
  154. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/designs/ravin/ravin3/parts.py +0 -0
  155. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/designs/ravin/ravin4/__init__.py +0 -0
  156. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/designs/ravin/ravin4/parts.py +0 -0
  157. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/help/__init__.py +0 -0
  158. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/help/__main__.py +0 -0
  159. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/help/functions.py +0 -0
  160. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/help/git.py +0 -0
  161. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/help/swallow/dataset.py +0 -0
  162. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/help/swallow/debug.py +0 -0
  163. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/help/swallow/env.py +0 -0
  164. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/help/swallow/keyboard.py +0 -0
  165. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/help/swallow/select_target.py +0 -0
  166. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/help/swallow/ultrasonic_sensor.py +0 -0
  167. {bluer_ugv-7.353.1/bluer_ugv/swallow → bluer_ugv-7.421.1/bluer_ugv/help/swallow/video}/__init__.py +0 -0
  168. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/host.py +0 -0
  169. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/logger.py +0 -0
  170. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/sample.env +0 -0
  171. {bluer_ugv-7.353.1/bluer_ugv/swallow/dataset → bluer_ugv-7.421.1/bluer_ugv/swallow}/__init__.py +0 -0
  172. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/__main__.py +0 -0
  173. {bluer_ugv-7.353.1/bluer_ugv/swallow/session → bluer_ugv-7.421.1/bluer_ugv/swallow/dataset}/__init__.py +0 -0
  174. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/dataset/__main__.py +0 -0
  175. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/dataset/combination.py +0 -0
  176. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/debug.py +0 -0
  177. {bluer_ugv-7.353.1/bluer_ugv/swallow/session/classical → bluer_ugv-7.421.1/bluer_ugv/swallow/session}/__init__.py +0 -0
  178. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/__main__.py +0 -0
  179. {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
  180. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/camera/__init__.py +0 -0
  181. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/camera/generic.py +0 -0
  182. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/camera/navigation.py +0 -0
  183. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/camera/tracking.py +0 -0
  184. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/camera/yolo.py +0 -0
  185. {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
  186. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/keyboard/__main__.py +0 -0
  187. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/keyboard/classes.py +0 -0
  188. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/keyboard/keys.py +0 -0
  189. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/keyboard/testing.py +0 -0
  190. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/leds.py +0 -0
  191. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/mode.py +0 -0
  192. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/motor/__init__.py +0 -0
  193. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/motor/generic.py +0 -0
  194. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/motor/left.py +0 -0
  195. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/motor/rear.py +0 -0
  196. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/motor/right.py +0 -0
  197. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/motor/steering.py +0 -0
  198. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/mousepad.py +0 -0
  199. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/position.py +0 -0
  200. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/push_button.py +0 -0
  201. {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
  202. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/setpoint/classes.py +0 -0
  203. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/setpoint/steering.py +0 -0
  204. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/__main__.py +0 -0
  205. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/consts.py +0 -0
  206. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/detection.py +0 -0
  207. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/review.py +0 -0
  208. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/sensor.py +0 -0
  209. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/session/functions.py +0 -0
  210. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/swallow/targeting.py +0 -0
  211. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv/urls.py +0 -0
  212. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv.egg-info/dependency_links.txt +0 -0
  213. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv.egg-info/requires.txt +0 -0
  214. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/bluer_ugv.egg-info/top_level.txt +0 -0
  215. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/pyproject.toml +0 -0
  216. {bluer_ugv-7.353.1 → bluer_ugv-7.421.1}/requirements.txt +0 -0
  217. {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.353.1
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
  [![pylint](https://github.com/kamangir/bluer-ugv/actions/workflows/pylint.yml/badge.svg)](https://github.com/kamangir/bluer-ugv/actions/workflows/pylint.yml) [![pytest](https://github.com/kamangir/bluer-ugv/actions/workflows/pytest.yml/badge.svg)](https://github.com/kamangir/bluer-ugv/actions/workflows/pytest.yml) [![bashtest](https://github.com/kamangir/bluer-ugv/actions/workflows/bashtest.yml/badge.svg)](https://github.com/kamangir/bluer-ugv/actions/workflows/bashtest.yml) [![PyPI version](https://img.shields.io/pypi/v/bluer-ugv.svg)](https://pypi.org/project/bluer-ugv/) [![PyPI - Downloads](https://img.shields.io/pypi/dd/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.353.1`](https://github.com/kamangir/bluer-ugv).
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
  [![pylint](https://github.com/kamangir/bluer-ugv/actions/workflows/pylint.yml/badge.svg)](https://github.com/kamangir/bluer-ugv/actions/workflows/pylint.yml) [![pytest](https://github.com/kamangir/bluer-ugv/actions/workflows/pytest.yml/badge.svg)](https://github.com/kamangir/bluer-ugv/actions/workflows/pytest.yml) [![bashtest](https://github.com/kamangir/bluer-ugv/actions/workflows/bashtest.yml/badge.svg)](https://github.com/kamangir/bluer-ugv/actions/workflows/bashtest.yml) [![PyPI version](https://img.shields.io/pypi/v/bluer-ugv.svg)](https://pypi.org/project/bluer-ugv/) [![PyPI - Downloads](https://img.shields.io/pypi/dd/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.353.1`](https://github.com/kamangir/bluer-ugv).
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
 
@@ -9,7 +9,7 @@ function bluer_ugv_swallow_dataset() {
9
9
  return
10
10
  fi
11
11
 
12
- python3 - bluer_ugv.swallow.dataset "$@"
12
+ python3 -m bluer_ugv.swallow.dataset "$@"
13
13
  }
14
14
 
15
15
  bluer_ai_source_caller_suffix_path /dataset
@@ -0,0 +1,7 @@
1
+ #! /usr/bin/env bash
2
+
3
+ function bluer_ugv_swallow_video_play() {
4
+ python3 -m bluer_ugv.swallow.session.classical.screen.video \
5
+ play \
6
+ "$@"
7
+ }
@@ -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,9 @@
1
+ #! /usr/bin/env bash
2
+
3
+ function bluer_ugv_swallow_video_playlist_upload() {
4
+ local options=${1:-filename=metadata.yaml}
5
+
6
+ bluer_objects_upload \
7
+ ,$options \
8
+ $RANGIN_VIDEO_LIST_OBJECT
9
+ }
@@ -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
@@ -9,7 +9,7 @@ function bluer_ugv_swallow() {
9
9
  return
10
10
  fi
11
11
 
12
- python3 - bluer_ugv.swallow "$@"
12
+ python3 -m bluer_ugv.swallow "$@"
13
13
  }
14
14
 
15
15
  bluer_ai_source_caller_suffix_path /swallow
@@ -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,11 @@
1
+ #! /usr/bin/env bash
2
+
3
+ function test_swallow_video_play() {
4
+ local options=$1
5
+
6
+ bluer_ai_eval ,$options \
7
+ bluer_ugv \
8
+ swallow \
9
+ video \
10
+ play
11
+ }
@@ -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
+ }
@@ -4,7 +4,7 @@ ICON = "🐬"
4
4
 
5
5
  DESCRIPTION = f"{ICON} AI x UGV."
6
6
 
7
- VERSION = "7.353.1"
7
+ VERSION = "7.421.1"
8
8
 
9
9
  REPO_NAME = "bluer-ugv"
10
10
 
@@ -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-09-30-17-54-43-96l9ps
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
@@ -81,3 +81,5 @@ BLUER_UGV_ULTRASONIC_SENSOR_LOG = get_env(
81
81
  "BLUER_UGV_ULTRASONIC_SENSOR_LOG",
82
82
  1,
83
83
  )
84
+
85
+ RANGIN_VIDEO_LIST_OBJECT = get_env("RANGIN_VIDEO_LIST_OBJECT")
@@ -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
+ )
@@ -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