bluer-ugv 7.176.1__tar.gz → 7.196.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 (165) hide show
  1. {bluer_ugv-7.176.1/bluer_ugv.egg-info → bluer_ugv-7.196.1}/PKG-INFO +2 -2
  2. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/README.md +1 -1
  3. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/.abcli/swallow/env/set.sh +2 -0
  4. bluer_ugv-7.196.1/bluer_ugv/.abcli/swallow/keyboard/test.sh +9 -0
  5. bluer_ugv-7.196.1/bluer_ugv/.abcli/swallow/keyboard.sh +17 -0
  6. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/.abcli/tests/help.sh +5 -1
  7. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/README/swallow/digital/design/__init__.py +7 -1
  8. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/__init__.py +1 -1
  9. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/help/swallow/__init__.py +2 -0
  10. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/help/swallow/env.py +2 -1
  11. bluer_ugv-7.196.1/bluer_ugv/help/swallow/keyboard.py +33 -0
  12. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/swallow/session/classical/camera/generic.py +1 -1
  13. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/swallow/session/classical/camera/navigation.py +1 -1
  14. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/swallow/session/classical/camera/tracking.py +1 -1
  15. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/swallow/session/classical/camera/yolo.py +1 -1
  16. bluer_ugv-7.196.1/bluer_ugv/swallow/session/classical/keyboard/__main__.py +31 -0
  17. bluer_ugv-7.176.1/bluer_ugv/swallow/session/classical/keyboard.py → bluer_ugv-7.196.1/bluer_ugv/swallow/session/classical/keyboard/classes.py +24 -35
  18. bluer_ugv-7.196.1/bluer_ugv/swallow/session/classical/keyboard/keys.py +81 -0
  19. bluer_ugv-7.196.1/bluer_ugv/swallow/session/classical/keyboard/testing.py +22 -0
  20. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/swallow/session/classical/session.py +1 -1
  21. bluer_ugv-7.196.1/bluer_ugv/swallow/session/classical/ultrasonic_sensor/__init__.py +0 -0
  22. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/classes.py +1 -1
  23. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1/bluer_ugv.egg-info}/PKG-INFO +2 -2
  24. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv.egg-info/SOURCES.txt +8 -1
  25. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/setup.py +1 -0
  26. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/LICENSE +0 -0
  27. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/MANIFEST.in +0 -0
  28. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/.abcli/abcli.sh +0 -0
  29. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/.abcli/actions.sh +0 -0
  30. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/.abcli/aka.sh +0 -0
  31. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/.abcli/alias.sh +0 -0
  32. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/.abcli/bluer_ugv.sh +0 -0
  33. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/.abcli/swallow/dataset/combine.sh +0 -0
  34. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/.abcli/swallow/dataset/download.sh +0 -0
  35. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/.abcli/swallow/dataset/edit.sh +0 -0
  36. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/.abcli/swallow/dataset/list.sh +0 -0
  37. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/.abcli/swallow/dataset/upload.sh +0 -0
  38. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/.abcli/swallow/dataset.sh +0 -0
  39. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/.abcli/swallow/debug.sh +0 -0
  40. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/.abcli/swallow/env/cp.sh +0 -0
  41. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/.abcli/swallow/env/list.sh +0 -0
  42. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/.abcli/swallow/env.sh +0 -0
  43. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/.abcli/swallow/select_target.sh +0 -0
  44. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/.abcli/swallow/session.sh +0 -0
  45. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/.abcli/swallow/ultrasonic/review.sh +0 -0
  46. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/.abcli/swallow/ultrasonic/test.sh +0 -0
  47. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/.abcli/swallow/ultrasonic.sh +0 -0
  48. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/.abcli/swallow.sh +0 -0
  49. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/.abcli/tests/README.sh +0 -0
  50. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/.abcli/tests/swallow_dataset_combine.sh +0 -0
  51. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/.abcli/tests/swallow_dataset_combine_explicit.sh +0 -0
  52. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/.abcli/tests/swallow_dataset_combine_sequence.sh +0 -0
  53. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/.abcli/tests/swallow_dataset_download_upload.sh +0 -0
  54. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/.abcli/tests/swallow_dataset_edit.sh +0 -0
  55. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/.abcli/tests/swallow_dataset_list.sh +0 -0
  56. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/.abcli/tests/ultrasonic_sensor_review.sh +0 -0
  57. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/.abcli/tests/version.sh +0 -0
  58. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/.abcli/ugv/git.sh +0 -0
  59. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/README/UGVs.py +0 -0
  60. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/README/__init__.py +0 -0
  61. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/README/alias.py +0 -0
  62. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/README/arzhang/__init__.py +0 -0
  63. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/README/arzhang/algo.py +0 -0
  64. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/README/arzhang/consts.py +0 -0
  65. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/README/arzhang/design.py +0 -0
  66. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/README/arzhang/flag.py +0 -0
  67. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/README/arzhang/items.py +0 -0
  68. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/README/beast.py +0 -0
  69. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/README/build.py +0 -0
  70. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/README/consts.py +0 -0
  71. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/README/eagle/__init__.py +0 -0
  72. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/README/eagle/consts.py +0 -0
  73. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/README/eagle/items.py +0 -0
  74. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/README/fire/__init__.py +0 -0
  75. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/README/fire/consts.py +0 -0
  76. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/README/fire/items.py +0 -0
  77. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/README/items.py +0 -0
  78. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/README/rangin/__init__.py +0 -0
  79. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/README/rangin/consts.py +0 -0
  80. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/README/rangin/items.py +0 -0
  81. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/README/ravin/__init__.py +0 -0
  82. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/README/ravin/consts.py +0 -0
  83. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/README/ravin/items.py +0 -0
  84. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/README/root.py +0 -0
  85. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/README/shield.py +0 -0
  86. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/README/shortcuts.py +0 -0
  87. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/README/swallow/__init__.py +0 -0
  88. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/README/swallow/analog.py +0 -0
  89. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/README/swallow/consts.py +0 -0
  90. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/README/swallow/digital/__init__.py +0 -0
  91. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/README/swallow/digital/algo/__init__.py +0 -0
  92. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/README/swallow/digital/algo/navigation.py +0 -0
  93. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/README/swallow/digital/algo/yolo.py +0 -0
  94. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/README/swallow/digital/design/mechanical.py +0 -0
  95. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/README/swallow/digital/design/ultrasonic_sensor.py +0 -0
  96. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/README/swallow/items.py +0 -0
  97. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/__main__.py +0 -0
  98. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/config.env +0 -0
  99. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/designs/__init__.py +0 -0
  100. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/designs/arzhang/__init__.py +0 -0
  101. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/designs/arzhang/parts.py +0 -0
  102. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/designs/eagle/__init__.py +0 -0
  103. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/designs/eagle/parts.py +0 -0
  104. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/designs/fire/__init__.py +0 -0
  105. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/designs/fire/parts.py +0 -0
  106. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/designs/rangin/__init__.py +0 -0
  107. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/designs/rangin/parts.py +0 -0
  108. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/designs/ravin/__init__.py +0 -0
  109. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/designs/ravin/ravin3/__init__.py +0 -0
  110. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/designs/ravin/ravin3/parts.py +0 -0
  111. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/designs/ravin/ravin4/__init__.py +0 -0
  112. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/designs/ravin/ravin4/parts.py +0 -0
  113. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/env.py +0 -0
  114. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/help/__init__.py +0 -0
  115. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/help/__main__.py +0 -0
  116. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/help/functions.py +0 -0
  117. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/help/git.py +0 -0
  118. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/help/swallow/dataset.py +0 -0
  119. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/help/swallow/debug.py +0 -0
  120. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/help/swallow/select_target.py +0 -0
  121. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/help/swallow/ultrasonic_sensor.py +0 -0
  122. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/host.py +0 -0
  123. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/logger.py +0 -0
  124. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/sample.env +0 -0
  125. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/swallow/__init__.py +0 -0
  126. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/swallow/__main__.py +0 -0
  127. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/swallow/dataset/__init__.py +0 -0
  128. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/swallow/dataset/__main__.py +0 -0
  129. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/swallow/dataset/combination.py +0 -0
  130. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/swallow/debug.py +0 -0
  131. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/swallow/session/__init__.py +0 -0
  132. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/swallow/session/__main__.py +0 -0
  133. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/swallow/session/classical/__init__.py +0 -0
  134. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/swallow/session/classical/camera/__init__.py +0 -0
  135. {bluer_ugv-7.176.1/bluer_ugv/swallow/session/classical/setpoint → bluer_ugv-7.196.1/bluer_ugv/swallow/session/classical/keyboard}/__init__.py +0 -0
  136. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/swallow/session/classical/leds.py +0 -0
  137. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/swallow/session/classical/mode.py +0 -0
  138. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/swallow/session/classical/motor/__init__.py +0 -0
  139. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/swallow/session/classical/motor/generic.py +0 -0
  140. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/swallow/session/classical/motor/left.py +0 -0
  141. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/swallow/session/classical/motor/rear.py +0 -0
  142. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/swallow/session/classical/motor/right.py +0 -0
  143. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/swallow/session/classical/motor/steering.py +0 -0
  144. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/swallow/session/classical/mousepad.py +0 -0
  145. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/swallow/session/classical/push_button.py +0 -0
  146. {bluer_ugv-7.176.1/bluer_ugv/swallow/session/classical/ultrasonic_sensor → bluer_ugv-7.196.1/bluer_ugv/swallow/session/classical/setpoint}/__init__.py +0 -0
  147. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/swallow/session/classical/setpoint/classes.py +0 -0
  148. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/swallow/session/classical/setpoint/steering.py +0 -0
  149. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/__main__.py +0 -0
  150. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/consts.py +0 -0
  151. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/detection.py +0 -0
  152. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/log.py +0 -0
  153. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/pack.py +0 -0
  154. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/review.py +0 -0
  155. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/sensor.py +0 -0
  156. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/swallow/session/classical/ultrasonic_sensor/testing.py +0 -0
  157. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/swallow/session/functions.py +0 -0
  158. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/swallow/targeting.py +0 -0
  159. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv/urls.py +0 -0
  160. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv.egg-info/dependency_links.txt +0 -0
  161. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv.egg-info/requires.txt +0 -0
  162. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/bluer_ugv.egg-info/top_level.txt +0 -0
  163. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/pyproject.toml +0 -0
  164. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/requirements.txt +0 -0
  165. {bluer_ugv-7.176.1 → bluer_ugv-7.196.1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bluer_ugv
3
- Version: 7.176.1
3
+ Version: 7.196.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.176.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.196.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.176.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.196.1`](https://github.com/kamangir/bluer-ugv).
39
39
 
@@ -5,6 +5,8 @@ function bluer_ugv_swallow_env_set() {
5
5
 
6
6
  if [[ "$var_name" == "steering" ]]; then
7
7
  var_name=BLUER_SBC_SWALLOW_HAS_STEERING
8
+ elif [[ "$var_name" == "full_keyboard" ]]; then
9
+ var_name=BLUER_SBC_SWALLOW_HAS_FULL_KEYBOARD
8
10
  else
9
11
  bluer_ai_log_error "$var_name: var not found."
10
12
  return 1
@@ -0,0 +1,9 @@
1
+ #! /usr/bin/env bash
2
+
3
+ function bluer_ugv_swallow_keyboard_test() {
4
+ bluer_ai_eval ,$1 \
5
+ sudo -E $(which python3) \
6
+ -m bluer_ugv.swallow.session.classical.keyboard \
7
+ test \
8
+ "${@:2}"
9
+ }
@@ -0,0 +1,17 @@
1
+ #! /usr/bin/env bash
2
+
3
+ function bluer_ugv_swallow_keyboard() {
4
+ local task=$1
5
+
6
+ local function_name=bluer_ugv_swallow_keyboard_$task
7
+ if [[ $(type -t $function_name) == "function" ]]; then
8
+ $function_name "${@:2}"
9
+ return
10
+ fi
11
+
12
+ sudo -E $(which python3) \
13
+ -m bluer_ugv.swallow.session.classical.keyboard \
14
+ "$@"
15
+ }
16
+
17
+ bluer_ai_source_caller_suffix_path /keyboard
@@ -13,12 +13,16 @@ function test_bluer_ugv_help() {
13
13
  "@swallow dataset list" \
14
14
  "@swallow dataset upload" \
15
15
  \
16
+ "@swallow debug" \
17
+ \
16
18
  "@swallow env" \
17
19
  "@swallow env cp" \
18
20
  "@swallow env list" \
19
21
  "@swallow env set" \
20
22
  \
21
- "@swallow debug" \
23
+ "@swallow keyboard" \
24
+ "@swallow keyboard test" \
25
+ \
22
26
  "@swallow select_target" \
23
27
  \
24
28
  "@swallow ultrasonic" \
@@ -8,6 +8,7 @@ from bluer_ugv.README.swallow.consts import (
8
8
  )
9
9
  from bluer_ugv.designs.swallow.parts import dict_of_parts
10
10
  from bluer_ugv.README.swallow.digital.design import mechanical, ultrasonic_sensor
11
+ from bluer_ugv.swallow.session.classical.keyboard.keys import ControlKeys
11
12
 
12
13
 
13
14
  docs = (
@@ -20,11 +21,16 @@ docs = (
20
21
  },
21
22
  {
22
23
  "path": "../docs/swallow/digital/design/operation.md",
24
+ "cols": 2,
23
25
  "items": ImageItems(
24
26
  {
25
- f"{swallow_assets2}/20251005_113232.jpg": "",
27
+ f"{swallow_assets2}/20251019_121811.jpg": "",
28
+ f"{swallow_assets2}/20251019_121842.jpg": "",
26
29
  }
27
30
  ),
31
+ "macros": {
32
+ "keys:::": ControlKeys.as_table(),
33
+ },
28
34
  },
29
35
  {
30
36
  "path": "../docs/swallow/digital/design/parts.md",
@@ -4,7 +4,7 @@ ICON = "🐬"
4
4
 
5
5
  DESCRIPTION = f"{ICON} AI x UGV."
6
6
 
7
- VERSION = "7.176.1"
7
+ VERSION = "7.196.1"
8
8
 
9
9
  REPO_NAME = "bluer-ugv"
10
10
 
@@ -1,6 +1,7 @@
1
1
  from bluer_ugv.help.swallow.dataset import help_functions as help_dataset
2
2
  from bluer_ugv.help.swallow.debug import help_debug
3
3
  from bluer_ugv.help.swallow.env import help_functions as help_env
4
+ from bluer_ugv.help.swallow.keyboard import help_functions as help_keyboard
4
5
  from bluer_ugv.help.swallow.select_target import help_select_target
5
6
  from bluer_ugv.help.swallow.ultrasonic_sensor import (
6
7
  help_functions as help_ultrasonic_sensor,
@@ -10,6 +11,7 @@ help_functions = {
10
11
  "dataset": help_dataset,
11
12
  "debug": help_debug,
12
13
  "env": help_env,
14
+ "keyboard": help_keyboard,
13
15
  "select_target": help_select_target,
14
16
  "ultrasonic": help_ultrasonic_sensor,
15
17
  }
@@ -43,11 +43,12 @@ def help_set(
43
43
  "@swallow",
44
44
  "env",
45
45
  "set",
46
- "steering",
46
+ "full_keyboard | steering",
47
47
  "0 | 1",
48
48
  ],
49
49
  "set env.",
50
50
  {
51
+ "full_keyboard: BLUER_SBC_SWALLOW_HAS_FULL_KEYBOARD": "",
51
52
  "steering: BLUER_SBC_SWALLOW_HAS_STEERING": "",
52
53
  },
53
54
  mono=mono,
@@ -0,0 +1,33 @@
1
+ from typing import List
2
+
3
+ from bluer_options.terminal import show_usage, xtra
4
+
5
+ from bluer_ugv import env
6
+
7
+
8
+ def help_test(
9
+ tokens: List[str],
10
+ mono: bool,
11
+ ) -> str:
12
+ options = xtra("dryrun", mono=mono)
13
+
14
+ args = [
15
+ "[--keys 1234567890-+/.]",
16
+ ]
17
+
18
+ return show_usage(
19
+ [
20
+ "@swallow",
21
+ "keyboard",
22
+ "test",
23
+ f"[{options}]",
24
+ ]
25
+ + args,
26
+ "test keyboard.",
27
+ mono=mono,
28
+ )
29
+
30
+
31
+ help_functions = {
32
+ "test": help_test,
33
+ }
@@ -4,7 +4,7 @@ from bluer_algo.socket.classes import SocketComm, DEV_HOST
4
4
  from bluer_sbc.imager.camera import instance as camera
5
5
  from bluer_sbc.env import BLUER_SBC_ENV
6
6
 
7
- from bluer_ugv.swallow.session.classical.keyboard import ClassicalKeyboard
7
+ from bluer_ugv.swallow.session.classical.keyboard.classes import ClassicalKeyboard
8
8
  from bluer_ugv.swallow.session.classical.leds import ClassicalLeds
9
9
  from bluer_ugv.swallow.session.classical.setpoint.classes import ClassicalSetPoint
10
10
  from bluer_ugv.logger import logger
@@ -13,7 +13,7 @@ from bluer_algo.image_classifier.model.predictor import ImageClassifierPredictor
13
13
 
14
14
  from bluer_ugv import env
15
15
  from bluer_ugv.swallow.session.classical.camera.generic import ClassicalCamera
16
- from bluer_ugv.swallow.session.classical.keyboard import ClassicalKeyboard
16
+ from bluer_ugv.swallow.session.classical.keyboard.classes import ClassicalKeyboard
17
17
  from bluer_ugv.swallow.session.classical.leds import ClassicalLeds
18
18
  from bluer_ugv.swallow.session.classical.setpoint.classes import ClassicalSetPoint
19
19
  from bluer_ugv.swallow.session.classical.mode import OperationMode
@@ -10,7 +10,7 @@ from bluer_sbc.imager.camera import instance as camera
10
10
  from bluer_ugv import env
11
11
  from bluer_ugv.swallow.session.classical.camera.generic import ClassicalCamera
12
12
  from bluer_ugv.swallow.session.classical.camera.generic import ClassicalCamera
13
- from bluer_ugv.swallow.session.classical.keyboard import ClassicalKeyboard
13
+ from bluer_ugv.swallow.session.classical.keyboard.classes import ClassicalKeyboard
14
14
  from bluer_ugv.swallow.session.classical.leds import ClassicalLeds
15
15
  from bluer_ugv.swallow.session.classical.setpoint.classes import ClassicalSetPoint
16
16
  from bluer_ugv.swallow.session.classical.mode import OperationMode
@@ -13,7 +13,7 @@ from bluer_algo.yolo.model.predictor import YoloPredictor
13
13
 
14
14
  from bluer_ugv import env
15
15
  from bluer_ugv.swallow.session.classical.camera.generic import ClassicalCamera
16
- from bluer_ugv.swallow.session.classical.keyboard import ClassicalKeyboard
16
+ from bluer_ugv.swallow.session.classical.keyboard.classes import ClassicalKeyboard
17
17
  from bluer_ugv.swallow.session.classical.leds import ClassicalLeds
18
18
  from bluer_ugv.swallow.session.classical.setpoint.classes import ClassicalSetPoint
19
19
  from bluer_ugv.swallow.session.classical.mode import OperationMode
@@ -0,0 +1,31 @@
1
+ import argparse
2
+
3
+ from blueness import module
4
+ from blueness.argparse.generic import sys_exit
5
+
6
+ from bluer_ugv import NAME
7
+ from bluer_ugv.swallow.session.classical.keyboard.testing import test
8
+ from bluer_ugv.logger import logger
9
+
10
+ NAME = module.name(__file__, NAME)
11
+
12
+ parser = argparse.ArgumentParser(NAME)
13
+ parser.add_argument(
14
+ "task",
15
+ type=str,
16
+ help="test",
17
+ )
18
+ parser.add_argument(
19
+ "--keys",
20
+ type=str,
21
+ default=" ",
22
+ )
23
+ args = parser.parse_args()
24
+
25
+ success = False
26
+ if args.task == "test":
27
+ success = test(args.keys)
28
+ else:
29
+ success = None
30
+
31
+ sys_exit(logger, NAME, args.task, success)
@@ -5,19 +5,13 @@ from typing import Any, Dict
5
5
  from bluer_sbc.session.functions import reply_to_bash
6
6
  from bluer_algo.socket.classes import DEV_HOST
7
7
 
8
- from bluer_ugv.swallow.session.classical.setpoint.classes import ClassicalSetPoint
9
- from bluer_ugv.swallow.session.classical.mode import OperationMode
8
+ from bluer_ugv.swallow.session.classical.keyboard.keys import ControlKeys
10
9
  from bluer_ugv.swallow.session.classical.leds import ClassicalLeds
10
+ from bluer_ugv.swallow.session.classical.mode import OperationMode
11
+ from bluer_ugv.swallow.session.classical.setpoint.classes import ClassicalSetPoint
11
12
  from bluer_ugv import env
12
13
  from bluer_ugv.logger import logger
13
14
 
14
- bash_keys = {
15
- "i": "exit",
16
- "o": "shutdown",
17
- "p": "reboot",
18
- "u": "update",
19
- }
20
-
21
15
 
22
16
  class ClassicalKeyboard:
23
17
  def __init__(
@@ -25,14 +19,9 @@ class ClassicalKeyboard:
25
19
  leds: ClassicalLeds,
26
20
  setpoint: ClassicalSetPoint,
27
21
  ):
28
- logger.info(
29
- "{}: {}".format(
30
- self.__class__.__name__,
31
- ", ".join(
32
- [f"{key}:{action}" for key, action in bash_keys.items()],
33
- ),
34
- )
35
- )
22
+ logger.info(self.__class__.__name__)
23
+
24
+ self.keys = ControlKeys()
36
25
 
37
26
  self.leds = leds
38
27
 
@@ -62,20 +51,20 @@ class ClassicalKeyboard:
62
51
 
63
52
  # bash keys
64
53
  if self.special_key:
65
- for key, event in bash_keys.items():
54
+ for key, event in self.keys.special_keys.items():
66
55
  if keyboard.is_pressed(key):
67
56
  reply_to_bash(event)
68
57
  return False
69
58
 
70
59
  # other keys
71
60
  for key, func in {
72
- " ": self.setpoint.stop,
61
+ self.keys.get("stop"): self.setpoint.stop,
73
62
  "x": self.setpoint.start,
74
- "s": lambda: self.setpoint.put(
63
+ self.keys.get("speed backward"): lambda: self.setpoint.put(
75
64
  what="speed",
76
65
  value=self.setpoint.get(what="speed") - 10,
77
66
  ),
78
- "w": lambda: self.setpoint.put(
67
+ self.keys.get("speed forward"): lambda: self.setpoint.put(
79
68
  what="speed",
80
69
  value=self.setpoint.get(what="speed") + 10,
81
70
  ),
@@ -85,14 +74,14 @@ class ClassicalKeyboard:
85
74
  func()
86
75
 
87
76
  # steering
88
- if keyboard.is_pressed("a"):
77
+ if keyboard.is_pressed(self.keys.get("steer left")):
89
78
  self.special_key = False
90
79
  self.last_key = "a"
91
80
  self.setpoint.put(
92
81
  what="steering",
93
82
  value=env.BLUER_UGV_SWALLOW_STEERING_SETPOINT,
94
83
  )
95
- elif keyboard.is_pressed("d"):
84
+ elif keyboard.is_pressed(self.keys.get("steer right")):
96
85
  self.special_key = False
97
86
  self.last_key = "d"
98
87
  self.setpoint.put(
@@ -103,12 +92,12 @@ class ClassicalKeyboard:
103
92
  self.setpoint.check_steering_expiry()
104
93
 
105
94
  # debug mode
106
- if keyboard.is_pressed("b"):
95
+ if keyboard.is_pressed(self.keys.get("debug on")):
107
96
  self.special_key = False
108
97
  self.set("debug_mode", True)
109
98
  logger.info(f'debug enabled, run "@swallow debug" on {DEV_HOST}.')
110
99
 
111
- if keyboard.is_pressed("v"):
100
+ if keyboard.is_pressed(self.keys.get("debug off")):
112
101
  self.special_key = False
113
102
  self.set("debug_mode", False)
114
103
  logger.info("debug disabled.")
@@ -116,33 +105,33 @@ class ClassicalKeyboard:
116
105
  # mode
117
106
  mode = self.get("mode", OperationMode.NONE)
118
107
  updated_mode = mode
119
- if keyboard.is_pressed("y"):
108
+ if keyboard.is_pressed(self.keys.get("mode = none")):
120
109
  updated_mode = OperationMode.NONE
121
110
 
122
- if keyboard.is_pressed("t"):
123
- updated_mode = OperationMode.TRAINING
124
-
125
- if keyboard.is_pressed("g"):
111
+ if keyboard.is_pressed(self.keys.get("mode = action")):
126
112
  updated_mode = OperationMode.ACTION
127
113
 
114
+ if keyboard.is_pressed(self.keys.get("mode = training")):
115
+ updated_mode = OperationMode.TRAINING
116
+
128
117
  if mode != updated_mode:
129
118
  self.set("mode", updated_mode)
130
119
  logger.info("mode: {}.".format(updated_mode.name.lower()))
131
120
  self.special_key = False
132
121
 
133
122
  # ultrasound
134
- if keyboard.is_pressed("n"):
123
+ if keyboard.is_pressed(self.keys.get("ultrasonic off")):
135
124
  self.set("ultrasound_enabled", False)
136
- logger.info("ultrasound: disabled")
125
+ logger.info("ultrasound: off")
137
126
  self.special_key = False
138
127
 
139
- if keyboard.is_pressed("m"):
128
+ if keyboard.is_pressed(self.keys.get("ultrasonic on")):
140
129
  self.set("ultrasound_enabled", True)
141
- logger.info("ultrasound: enabled")
130
+ logger.info("ultrasound: on")
142
131
  self.special_key = False
143
132
 
144
133
  # special key
145
- if keyboard.is_pressed("z") and not self.special_key:
134
+ if keyboard.is_pressed(self.keys.get("special key")) and not self.special_key:
146
135
  self.special_key = True
147
136
  logger.info("🪄 special key enabled.")
148
137
 
@@ -0,0 +1,81 @@
1
+ from typing import Dict, Tuple
2
+
3
+ from bluer_sbc.env import BLUER_SBC_SWALLOW_HAS_FULL_KEYBOARD
4
+
5
+ from bluer_ugv.logger import logger
6
+
7
+
8
+ class ControlKeys:
9
+ def __init__(
10
+ self,
11
+ is_numpad: bool = BLUER_SBC_SWALLOW_HAS_FULL_KEYBOARD == 0,
12
+ ):
13
+ self.is_numpad = is_numpad
14
+ logger.info(
15
+ "{}: {}".format(
16
+ self.__class__.__name__,
17
+ "numpad" if self.is_numpad else "full",
18
+ )
19
+ )
20
+
21
+ self._keys: Dict[str, Tuple[str, str]] = {
22
+ "ultrasonic off": ("n", "-"),
23
+ "ultrasonic on": ("m", "+"),
24
+ "debug off": ("v", "9"),
25
+ "debug on": ("b", "7"),
26
+ "mode = none": ("y", "5"),
27
+ "mode = action": ("g", "1"),
28
+ "mode = training": ("t", "3"),
29
+ "special key": ("z", "."),
30
+ "speed backward": ("s", "2"),
31
+ "speed forward": ("w", "8"),
32
+ "steer left": ("a", "4"),
33
+ "steer right": ("d", "6"),
34
+ "stop": (" ", "0"),
35
+ }
36
+
37
+ @staticmethod
38
+ def as_table():
39
+ keys = ControlKeys()
40
+ table = keys._keys.copy() # pylint: disable=protected-access
41
+
42
+ for is_numpad in [False, True]:
43
+ keys.is_numpad = is_numpad
44
+
45
+ special_keys = keys.special_keys
46
+ for key, event in special_keys.items():
47
+ if event not in table:
48
+ table[event] = ["", ""]
49
+
50
+ table[event][int(is_numpad)] = f"*{key}"
51
+
52
+ return [
53
+ "| event | full keyboard | numpad |",
54
+ "|-|-|-|",
55
+ ] + sorted(
56
+ [
57
+ " | ".join(["", event] + list(keys) + [""])
58
+ for event, keys in table.items()
59
+ ]
60
+ )
61
+
62
+ def get(self, event: str) -> str:
63
+ return self._keys[event][int(self.is_numpad)]
64
+
65
+ @property
66
+ def special_keys(self) -> Dict[str, str]:
67
+ return (
68
+ {
69
+ "7": "exit",
70
+ "9": "shutdown",
71
+ "5": "reboot",
72
+ "1": "update",
73
+ }
74
+ if self.is_numpad
75
+ else {
76
+ "i": "exit",
77
+ "o": "shutdown",
78
+ "p": "reboot",
79
+ "u": "update",
80
+ }
81
+ )
@@ -0,0 +1,22 @@
1
+ import keyboard
2
+
3
+ from blueness import module
4
+
5
+ from bluer_ugv import NAME
6
+ from bluer_ugv.logger import logger
7
+
8
+ NAME = module.name(__file__, NAME)
9
+
10
+
11
+ def test(list_of_keys: str = "") -> bool:
12
+ logger.info("{}.testing({}): ^C to stop".format(NAME, list_of_keys))
13
+
14
+ try:
15
+ while True:
16
+ for key in list_of_keys:
17
+ if keyboard.is_pressed(key):
18
+ logger.info(f"{key} is pressed.")
19
+ except KeyboardInterrupt:
20
+ logger.info("^C detected.")
21
+
22
+ return True
@@ -13,7 +13,7 @@ from bluer_ugv.swallow.session.classical.camera import (
13
13
  ClassicalYoloCamera,
14
14
  )
15
15
  from bluer_ugv.swallow.session.classical.push_button import ClassicalPushButton
16
- from bluer_ugv.swallow.session.classical.keyboard import ClassicalKeyboard
16
+ from bluer_ugv.swallow.session.classical.keyboard.classes import ClassicalKeyboard
17
17
  from bluer_ugv.swallow.session.classical.leds import ClassicalLeds
18
18
  from bluer_ugv.swallow.session.classical.mousepad import ClassicalMousePad
19
19
  from bluer_ugv.swallow.session.classical.motor import (
@@ -13,7 +13,7 @@ from bluer_ugv.swallow.session.classical.ultrasonic_sensor.detection import (
13
13
  from bluer_ugv.swallow.session.classical.ultrasonic_sensor.log import (
14
14
  UltrasonicSensorDetectionLog,
15
15
  )
16
- from bluer_ugv.swallow.session.classical.keyboard import ClassicalKeyboard
16
+ from bluer_ugv.swallow.session.classical.keyboard.classes import ClassicalKeyboard
17
17
  from bluer_ugv.swallow.session.classical.setpoint.classes import ClassicalSetPoint
18
18
  from bluer_ugv.logger import logger
19
19
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bluer_ugv
3
- Version: 7.176.1
3
+ Version: 7.196.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.176.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.196.1`](https://github.com/kamangir/bluer-ugv).
68
68
 
69
69
 
70
70
  built by 🌀 [`blueness-3.118.1`](https://github.com/kamangir/blueness).
@@ -27,6 +27,7 @@ bluer_ugv/.abcli/swallow.sh
27
27
  bluer_ugv/.abcli/swallow/dataset.sh
28
28
  bluer_ugv/.abcli/swallow/debug.sh
29
29
  bluer_ugv/.abcli/swallow/env.sh
30
+ bluer_ugv/.abcli/swallow/keyboard.sh
30
31
  bluer_ugv/.abcli/swallow/select_target.sh
31
32
  bluer_ugv/.abcli/swallow/session.sh
32
33
  bluer_ugv/.abcli/swallow/ultrasonic.sh
@@ -38,6 +39,7 @@ bluer_ugv/.abcli/swallow/dataset/upload.sh
38
39
  bluer_ugv/.abcli/swallow/env/cp.sh
39
40
  bluer_ugv/.abcli/swallow/env/list.sh
40
41
  bluer_ugv/.abcli/swallow/env/set.sh
42
+ bluer_ugv/.abcli/swallow/keyboard/test.sh
41
43
  bluer_ugv/.abcli/swallow/ultrasonic/review.sh
42
44
  bluer_ugv/.abcli/swallow/ultrasonic/test.sh
43
45
  bluer_ugv/.abcli/tests/README.sh
@@ -112,6 +114,7 @@ bluer_ugv/help/swallow/__init__.py
112
114
  bluer_ugv/help/swallow/dataset.py
113
115
  bluer_ugv/help/swallow/debug.py
114
116
  bluer_ugv/help/swallow/env.py
117
+ bluer_ugv/help/swallow/keyboard.py
115
118
  bluer_ugv/help/swallow/select_target.py
116
119
  bluer_ugv/help/swallow/ultrasonic_sensor.py
117
120
  bluer_ugv/swallow/__init__.py
@@ -125,7 +128,6 @@ bluer_ugv/swallow/session/__init__.py
125
128
  bluer_ugv/swallow/session/__main__.py
126
129
  bluer_ugv/swallow/session/functions.py
127
130
  bluer_ugv/swallow/session/classical/__init__.py
128
- bluer_ugv/swallow/session/classical/keyboard.py
129
131
  bluer_ugv/swallow/session/classical/leds.py
130
132
  bluer_ugv/swallow/session/classical/mode.py
131
133
  bluer_ugv/swallow/session/classical/mousepad.py
@@ -136,6 +138,11 @@ bluer_ugv/swallow/session/classical/camera/generic.py
136
138
  bluer_ugv/swallow/session/classical/camera/navigation.py
137
139
  bluer_ugv/swallow/session/classical/camera/tracking.py
138
140
  bluer_ugv/swallow/session/classical/camera/yolo.py
141
+ bluer_ugv/swallow/session/classical/keyboard/__init__.py
142
+ bluer_ugv/swallow/session/classical/keyboard/__main__.py
143
+ bluer_ugv/swallow/session/classical/keyboard/classes.py
144
+ bluer_ugv/swallow/session/classical/keyboard/keys.py
145
+ bluer_ugv/swallow/session/classical/keyboard/testing.py
139
146
  bluer_ugv/swallow/session/classical/motor/__init__.py
140
147
  bluer_ugv/swallow/session/classical/motor/generic.py
141
148
  bluer_ugv/swallow/session/classical/motor/left.py
@@ -36,6 +36,7 @@ setup(
36
36
  f"{NAME}.swallow.session",
37
37
  f"{NAME}.swallow.session.classical",
38
38
  f"{NAME}.swallow.session.classical.camera",
39
+ f"{NAME}.swallow.session.classical.keyboard",
39
40
  f"{NAME}.swallow.session.classical.motor",
40
41
  f"{NAME}.swallow.session.classical.setpoint",
41
42
  f"{NAME}.swallow.session.classical.ultrasonic_sensor",
File without changes
File without changes
File without changes
File without changes