bluer-sbc 8.130.1__tar.gz → 8.151.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.

Potentially problematic release.


This version of bluer-sbc might be problematic. Click here for more details.

Files changed (107) hide show
  1. {bluer_sbc-8.130.1/bluer_sbc.egg-info → bluer_sbc-8.151.1}/PKG-INFO +2 -2
  2. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/README.md +1 -1
  3. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/alias.sh +3 -1
  4. bluer_sbc-8.130.1/bluer_sbc/.abcli/seed.sh → bluer_sbc-8.151.1/bluer_sbc/.abcli/seed/headless_rpi.sh +6 -39
  5. bluer_sbc-8.151.1/bluer_sbc/.abcli/seed/headless_rpi_64_bit.sh +38 -0
  6. bluer_sbc-8.130.1/bluer_sbc/.abcli/ROS/seed.sh → bluer_sbc-8.151.1/bluer_sbc/.abcli/seed/headless_ubuntu_rpi.sh +2 -0
  7. bluer_sbc-8.151.1/bluer_sbc/.abcli/seed/jetson.sh +31 -0
  8. bluer_sbc-8.151.1/bluer_sbc/.abcli/seed/rpi.sh +31 -0
  9. bluer_sbc-8.151.1/bluer_sbc/.abcli/seed/swallow_raspbian.sh +13 -0
  10. bluer_sbc-8.151.1/bluer_sbc/.abcli/seed.sh +3 -0
  11. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/tests/seed.sh +3 -1
  12. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/__init__.py +1 -1
  13. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/config.env +1 -0
  14. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/env.py +1 -0
  15. bluer_sbc-8.151.1/bluer_sbc/imager/camera/__init__.py +11 -0
  16. bluer_sbc-8.151.1/bluer_sbc/imager/camera/generic.py +208 -0
  17. bluer_sbc-8.151.1/bluer_sbc/imager/camera/rpi.py +112 -0
  18. bluer_sbc-8.151.1/bluer_sbc/imager/camera/rpi_64_bit.py +49 -0
  19. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/session/classes.py +12 -1
  20. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1/bluer_sbc.egg-info}/PKG-INFO +2 -2
  21. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc.egg-info/SOURCES.txt +9 -4
  22. bluer_sbc-8.130.1/bluer_sbc/.abcli/ROS.sh +0 -3
  23. bluer_sbc-8.130.1/bluer_sbc/.abcli/install/rpi.sh +0 -65
  24. bluer_sbc-8.130.1/bluer_sbc/imager/camera/__init__.py +0 -3
  25. bluer_sbc-8.130.1/bluer_sbc/imager/camera/classes.py +0 -259
  26. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/LICENSE +0 -0
  27. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/MANIFEST.in +0 -0
  28. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/abcli.sh +0 -0
  29. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/actions.sh +0 -0
  30. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/adafruit_rgb_matrix.sh +0 -0
  31. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/blue_sbc.sh +0 -0
  32. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/camera.sh +0 -0
  33. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/grove.sh +0 -0
  34. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/hat.sh +0 -0
  35. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/install/adafruit_rgb_matrix.sh +0 -0
  36. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/install/grove.sh +0 -0
  37. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/install/lepton.sh +0 -0
  38. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/install/scroll_phat_hd.sh +0 -0
  39. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/install/sparkfun_top_phat.sh +0 -0
  40. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/install/template.sh +0 -0
  41. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/install/unicorn_16x16.sh +0 -0
  42. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/lepton.sh +0 -0
  43. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/scroll_phat_hd.sh +0 -0
  44. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/session.sh +0 -0
  45. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/sparkfun_top_phat.sh +0 -0
  46. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/tests/README.sh +0 -0
  47. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/tests/camera.sh +0 -0
  48. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/tests/help.sh +0 -0
  49. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/tests/version.sh +0 -0
  50. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/.abcli/unicorn_16x16.sh +0 -0
  51. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/README.py +0 -0
  52. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/ROS/__init__.py +0 -0
  53. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/__main__.py +0 -0
  54. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/algo/__init__.py +0 -0
  55. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/algo/diff.py +0 -0
  56. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/designs/__init__.py +0 -0
  57. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/designs/blue_bracket.py +0 -0
  58. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/designs/bluer_swallow.py +0 -0
  59. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/designs/bryce.py +0 -0
  60. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/hardware/__init__.py +0 -0
  61. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/hardware/adafruit_rgb_matrix.py +0 -0
  62. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/hardware/display.py +0 -0
  63. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/hardware/grove.py +0 -0
  64. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/hardware/hardware.py +0 -0
  65. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/hardware/hat/__init__.py +0 -0
  66. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/hardware/hat/__main__.py +0 -0
  67. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/hardware/hat/abstract.py +0 -0
  68. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/hardware/hat/prototype.py +0 -0
  69. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/hardware/screen.py +0 -0
  70. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/hardware/scroll_phat_hd.py +0 -0
  71. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/hardware/sparkfun_top_phat/__init__.py +0 -0
  72. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/hardware/sparkfun_top_phat/__main__.py +0 -0
  73. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/hardware/sparkfun_top_phat/classes.py +0 -0
  74. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/hardware/unicorn_16x16.py +0 -0
  75. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/help/__init__.py +0 -0
  76. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/help/__main__.py +0 -0
  77. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/help/adafruit_rgb_matrix.py +0 -0
  78. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/help/camera.py +0 -0
  79. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/help/functions.py +0 -0
  80. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/help/grove.py +0 -0
  81. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/help/hat.py +0 -0
  82. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/help/lepton.py +0 -0
  83. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/help/scroll_phat_hd.py +0 -0
  84. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/help/sparkfun_top_phat.py +0 -0
  85. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/help/unicorn_16x16.py +0 -0
  86. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/host.py +0 -0
  87. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/imager/__init__.py +0 -0
  88. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/imager/camera/__main__.py +0 -0
  89. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/imager/camera/constants.py +0 -0
  90. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/imager/classes.py +0 -0
  91. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/imager/lepton/__init__.py +0 -0
  92. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/imager/lepton/__main__.py +0 -0
  93. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/imager/lepton/classes.py +0 -0
  94. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/imager/lepton/python2.py +0 -0
  95. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/logger.py +0 -0
  96. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/sample.env +0 -0
  97. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/session/__init__.py +0 -0
  98. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/session/__main__.py +0 -0
  99. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/session/functions.py +0 -0
  100. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc/urls.py +0 -0
  101. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc.egg-info/dependency_links.txt +0 -0
  102. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc.egg-info/requires.txt +0 -0
  103. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/bluer_sbc.egg-info/top_level.txt +0 -0
  104. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/pyproject.toml +0 -0
  105. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/requirements.txt +0 -0
  106. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/setup.cfg +0 -0
  107. {bluer_sbc-8.130.1 → bluer_sbc-8.151.1}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bluer_sbc
3
- Version: 8.130.1
3
+ Version: 8.151.1
4
4
  Summary: 🌀 AI for single board computers.
5
5
  Home-page: https://github.com/kamangir/bluer-sbc
6
6
  Author: Arash Abadpour (Kamangir)
@@ -50,7 +50,7 @@ pip install bluer_sbc
50
50
 
51
51
  [![pylint](https://github.com/kamangir/bluer-sbc/actions/workflows/pylint.yml/badge.svg)](https://github.com/kamangir/bluer-sbc/actions/workflows/pylint.yml) [![pytest](https://github.com/kamangir/bluer-sbc/actions/workflows/pytest.yml/badge.svg)](https://github.com/kamangir/bluer-sbc/actions/workflows/pytest.yml) [![bashtest](https://github.com/kamangir/bluer-sbc/actions/workflows/bashtest.yml/badge.svg)](https://github.com/kamangir/bluer-sbc/actions/workflows/bashtest.yml) [![PyPI version](https://img.shields.io/pypi/v/bluer-sbc.svg)](https://pypi.org/project/bluer-sbc/) [![PyPI - Downloads](https://img.shields.io/pypi/dd/bluer-sbc)](https://pypistats.org/packages/bluer-sbc)
52
52
 
53
- built by 🌀 [`bluer README`](https://github.com/kamangir/bluer-objects/tree/main/bluer_objects/README), based on 🌀 [`bluer_sbc-8.130.1`](https://github.com/kamangir/bluer-sbc).
53
+ built by 🌀 [`bluer README`](https://github.com/kamangir/bluer-objects/tree/main/bluer_objects/README), based on 🌀 [`bluer_sbc-8.151.1`](https://github.com/kamangir/bluer-sbc).
54
54
 
55
55
 
56
56
  built by 🌀 [`blueness-3.118.1`](https://github.com/kamangir/blueness).
@@ -45,5 +45,5 @@ graph LR
45
45
 
46
46
  [![pylint](https://github.com/kamangir/bluer-sbc/actions/workflows/pylint.yml/badge.svg)](https://github.com/kamangir/bluer-sbc/actions/workflows/pylint.yml) [![pytest](https://github.com/kamangir/bluer-sbc/actions/workflows/pytest.yml/badge.svg)](https://github.com/kamangir/bluer-sbc/actions/workflows/pytest.yml) [![bashtest](https://github.com/kamangir/bluer-sbc/actions/workflows/bashtest.yml/badge.svg)](https://github.com/kamangir/bluer-sbc/actions/workflows/bashtest.yml) [![PyPI version](https://img.shields.io/pypi/v/bluer-sbc.svg)](https://pypi.org/project/bluer-sbc/) [![PyPI - Downloads](https://img.shields.io/pypi/dd/bluer-sbc)](https://pypistats.org/packages/bluer-sbc)
47
47
 
48
- built by 🌀 [`bluer README`](https://github.com/kamangir/bluer-objects/tree/main/bluer_objects/README), based on 🌀 [`bluer_sbc-8.130.1`](https://github.com/kamangir/bluer-sbc).
48
+ built by 🌀 [`bluer README`](https://github.com/kamangir/bluer-objects/tree/main/bluer_objects/README), based on 🌀 [`bluer_sbc-8.151.1`](https://github.com/kamangir/bluer-sbc).
49
49
 
@@ -1,5 +1,7 @@
1
1
  #! /usr/bin/env bash
2
2
 
3
- alias @sbc=bluer_sbc
3
+ alias @camera=bluer_sbc_camera
4
4
 
5
5
  alias grove=bluer_sbc_grove
6
+
7
+ alias @sbc=bluer_sbc
@@ -3,18 +3,6 @@
3
3
  # internal function to bluer_ai_seed.
4
4
  # seed is NOT local
5
5
  function bluer_ai_seed_headless_rpi() {
6
- bluer_sbc_seed "$@"
7
- }
8
- function bluer_ai_seed_jetson() {
9
- bluer_sbc_seed "$@"
10
- }
11
- function bluer_ai_seed_rpi() {
12
- bluer_sbc_seed "$@"
13
- }
14
-
15
- function bluer_sbc_seed() {
16
- local target=$1
17
-
18
6
  bluer_ai_seed add_kaggle
19
7
 
20
8
  bluer_ai_seed add_ssh_key sudo
@@ -30,17 +18,17 @@ function bluer_sbc_seed() {
30
18
  seed="${seed}sudo apt install -y cmake build-essential$delim"
31
19
  seed="${seed}sudo apt install -y libjpeg-dev zlib1g-dev libfreetype6-dev liblcms2-dev libopenjpeg-dev libtiff-dev libwebp-dev$delim"
32
20
  seed="${seed}sudo apt-get install libopenblas-base$delim"
21
+
33
22
  seed="${seed}sudo apt-get --yes --force-yes install git$delim_section"
34
23
 
35
24
  bluer_ai_seed add_repo
36
25
 
37
- if [[ "$target" == "headless_rpi" ]]; then
38
- seed="${seed}mkdir -pv ~/storage/temp/ignore$delim"
39
- seed="${seed}touch ~/storage/temp/ignore/headless$delim_section"
40
- fi
26
+ seed="${seed}mkdir -pv ~/storage/temp/ignore$delim"
27
+ seed="${seed}touch ~/storage/temp/ignore/headless$delim_section"
41
28
 
42
29
  bluer_ai_seed add_bluer_ai_env
43
30
 
31
+ seed="${seed}sudo apt install -y python3-pip$delim"
44
32
  seed="${seed}pip3 install --upgrade pip --no-input$delim"
45
33
  seed="${seed}pip3 install \"pandas<2.1\"$delim"
46
34
  seed="${seed}pip3 install pillow$delim"
@@ -53,32 +41,11 @@ function bluer_sbc_seed() {
53
41
  bluer_ai_seed add_repo repo=bluer-sbc
54
42
  seed="${seed}pip3 install -e .$delim_section"
55
43
 
56
- if [[ "$target" == "headless_rpi" ]]; then
57
- seed="${seed}pip3 install opencv-python-headless$delim"
58
- seed="${seed}sudo apt install -y libopenjp2-7 libavcodec58 libavformat58 libswscale5 libblas3 libatlas3-base$delim_section"
59
- fi
44
+ seed="${seed}pip3 install opencv-python-headless$delim_section"
45
+ seed="${seed}sudo apt install -y libopenjp2-7 libavcodec58 libavformat58 libswscale5 libblas3 libatlas3-base$delim_section"
60
46
 
61
47
  seed="${seed}cd; cd git; cd bluer-ai$delim"
62
48
  seed="${seed}source ./bluer_ai/.abcli/bluer_ai.sh$delim_section"
63
49
 
64
50
  seed="${seed}source ~/.bashrc$delim_section"
65
-
66
- if [[ ! -z "$env_name" ]]; then
67
- seed="${seed}bluer_ai_env dot copy $env_name$delim"
68
- seed="${seed}bluer_ai init$delim_section"
69
- fi
70
- }
71
-
72
- function bluer_ai_seed_swallow_raspbian() {
73
- bluer_ai_seed add_repo repo=bluer-ugv
74
- seed="${seed}pip3 install -e .$delim_section"
75
-
76
- seed="${seed}sudo apt install -y libopenblas-dev$delim"
77
-
78
- seed="${seed}cd$delim"
79
- seed="${seed}wget https://github.com/nmilosev/pytorch-arm-builds/releases/download/v1.13.0/torch-1.13.0-cp39-cp39-linux_armv7l.whl$delim"
80
- seed="${seed}pip3 install torch-1.13.0-cp39-cp39-linux_armv7l.whl$delim_section"
81
-
82
- bluer_ai_seed add_repo repo=bluer-algo
83
- seed="${seed}pip3 install -e .$delim_section"
84
51
  }
@@ -0,0 +1,38 @@
1
+ #! /usr/bin/env bash
2
+
3
+ # internal function to bluer_ai_seed.
4
+ # seed is NOT local
5
+ function bluer_ai_seed_headless_rpi_64_bit() {
6
+ bluer_ai_seed add_kaggle
7
+
8
+ bluer_ai_seed add_ssh_key sudo
9
+
10
+ seed="${seed}sudo apt-get --yes --force-yes install git$delim_section"
11
+
12
+ bluer_ai_seed add_repo
13
+
14
+ seed="${seed}mkdir -pv ~/storage/temp/ignore$delim"
15
+ seed="${seed}touch ~/storage/temp/ignore/headless$delim_section"
16
+
17
+ bluer_ai_seed add_bluer_ai_env_ssp
18
+
19
+ local ssp="--break-system-packages"
20
+
21
+ seed="${seed}sudo apt update$delim"
22
+ seed="${seed}sudo apt install -y python3-pip$delim"
23
+ seed="${seed}pip3 install $ssp -e .$delim_section"
24
+
25
+ bluer_ai_seed add_repo repo=bluer-objects
26
+ seed="${seed}pip3 install $ssp -e .$delim_section"
27
+ seed="${seed}$(bluer_ai_seed add_file $abcli_path_git/bluer-objects/.env \$HOME/git/bluer-objects/.env)$delim_section"
28
+
29
+ bluer_ai_seed add_repo repo=bluer-sbc
30
+ seed="${seed}pip3 install $ssp -e .$delim_section"
31
+
32
+ seed="${seed}pip3 install $ssp opencv-python-headless$delim"
33
+ seed="${seed}sudo apt install -y python3-picamera2$delim"
34
+ seed="${seed}pip3 install --force-reinstall --no-cache-dir simplejpeg$delim_section"
35
+
36
+ seed="${seed}cd; cd git; cd bluer-ai$delim"
37
+ seed="${seed}source ./bluer_ai/.abcli/bluer_ai.sh$delim_section"
38
+ }
@@ -16,6 +16,8 @@ function bluer_ai_seed_headless_ubuntu_rpi() {
16
16
  seed="${seed}sudo apt install -y wireless-tools$delim"
17
17
  seed="${seed}sudo apt install -y gcc python3-dev$delim"
18
18
  seed="${seed}sudo apt install -y gcc-aarch64-linux-gnu$delim"
19
+ seed="${seed}sudo apt install -y v4l-utils$delim"
20
+ seed="${seed}sudo apt install -y ffmpeg$delim"
19
21
  seed="${seed}sudo apt install -y python3-venv$delim_section"
20
22
 
21
23
  seed="${seed}sudo mkdir -p /etc/systemd/system/getty@tty1.service.d$delim"
@@ -0,0 +1,31 @@
1
+ #! /usr/bin/env bash
2
+
3
+ # internal function to bluer_ai_seed.
4
+ # seed is NOT local
5
+ function bluer_ai_seed_jetson() {
6
+ bluer_ai_seed add_kaggle
7
+
8
+ bluer_ai_seed add_ssh_key sudo
9
+
10
+ seed="${seed}sudo apt-get --yes --force-yes install git$delim_section"
11
+
12
+ bluer_ai_seed add_repo
13
+
14
+ bluer_ai_seed add_bluer_ai_env
15
+
16
+ seed="${seed}sudo apt install -y python3-pip$delim"
17
+ seed="${seed}pip3 install --upgrade pip --no-input$delim"
18
+ seed="${seed}pip3 install -e .$delim_section"
19
+
20
+ bluer_ai_seed add_repo repo=bluer-objects
21
+ seed="${seed}pip3 install -e .$delim_section"
22
+ seed="${seed}$(bluer_ai_seed add_file $abcli_path_git/bluer-objects/.env \$HOME/git/bluer-objects/.env)$delim_section"
23
+
24
+ bluer_ai_seed add_repo repo=bluer-sbc
25
+ seed="${seed}pip3 install -e .$delim_section"
26
+
27
+ seed="${seed}cd; cd git; cd bluer-ai$delim"
28
+ seed="${seed}source ./bluer_ai/.abcli/bluer_ai.sh$delim_section"
29
+
30
+ seed="${seed}source ~/.bashrc$delim_section"
31
+ }
@@ -0,0 +1,31 @@
1
+ #! /usr/bin/env bash
2
+
3
+ # internal function to bluer_ai_seed.
4
+ # seed is NOT local
5
+ function bluer_ai_seed_rpi() {
6
+ bluer_ai_seed add_kaggle
7
+
8
+ bluer_ai_seed add_ssh_key sudo
9
+
10
+ seed="${seed}sudo apt-get --yes --force-yes install git$delim_section"
11
+
12
+ bluer_ai_seed add_repo
13
+
14
+ bluer_ai_seed add_bluer_ai_env
15
+
16
+ seed="${seed}sudo apt install -y python3-pip$delim"
17
+ seed="${seed}pip3 install --upgrade pip --no-input$delim"
18
+ seed="${seed}pip3 install -e .$delim_section"
19
+
20
+ bluer_ai_seed add_repo repo=bluer-objects
21
+ seed="${seed}pip3 install -e .$delim_section"
22
+ seed="${seed}$(bluer_ai_seed add_file $abcli_path_git/bluer-objects/.env \$HOME/git/bluer-objects/.env)$delim_section"
23
+
24
+ bluer_ai_seed add_repo repo=bluer-sbc
25
+ seed="${seed}pip3 install -e .$delim_section"
26
+
27
+ seed="${seed}cd; cd git; cd bluer-ai$delim"
28
+ seed="${seed}source ./bluer_ai/.abcli/bluer_ai.sh$delim_section"
29
+
30
+ seed="${seed}source ~/.bashrc$delim_section"
31
+ }
@@ -0,0 +1,13 @@
1
+ #! /usr/bin/env bash
2
+
3
+ # internal function to bluer_ai_seed.
4
+ # seed is NOT local
5
+ function bluer_ai_seed_swallow_raspbian() {
6
+ local ssp="--break-system-packages"
7
+
8
+ bluer_ai_seed add_repo repo=bluer-ugv
9
+ seed="${seed}pip3 install $ssp -e .$delim_section"
10
+
11
+ bluer_ai_seed add_repo repo=bluer-algo
12
+ seed="${seed}pip3 install $ssp -e .$delim_section"
13
+ }
@@ -0,0 +1,3 @@
1
+ #! /usr/bin/env bash
2
+
3
+ bluer_ai_source_caller_suffix_path /seed
@@ -6,9 +6,11 @@ function test_bluer_sbc_seed() {
6
6
  local target
7
7
  for target in \
8
8
  headless_rpi \
9
+ headless_rpi_64_bit \
9
10
  headless_ubuntu_rpi \
10
11
  jetson \
11
- rpi; do
12
+ rpi \
13
+ swallow_raspbian; do
12
14
  bluer_ai_eval ,$options \
13
15
  bluer_ai_seed $target screen
14
16
  [[ $? -ne 0 ]] && return 1
@@ -4,7 +4,7 @@ ICON = "🌀"
4
4
 
5
5
  DESCRIPTION = f"{ICON} AI for single board computers."
6
6
 
7
- VERSION = "8.130.1"
7
+ VERSION = "8.151.1"
8
8
 
9
9
  REPO_NAME = "bluer-sbc"
10
10
 
@@ -2,6 +2,7 @@ BLUER_SBC_CAMERA_HI_RES=1
2
2
  BLUER_SBC_CAMERA_WIDTH=728
3
3
  BLUER_SBC_CAMERA_HEIGHT=600
4
4
  BLUER_SBC_CAMERA_ROTATION=0
5
+ BLUER_SBC_CAMERA_KEEP_OPEN=0
5
6
 
6
7
  BLUER_SBC_DISPLAY_FULLSCREEN=1
7
8
 
@@ -7,6 +7,7 @@ BLUER_SBC_CAMERA_HI_RES = get_env("BLUER_SBC_CAMERA_HI_RES", True)
7
7
  BLUER_SBC_CAMERA_WIDTH = get_env("BLUER_SBC_CAMERA_WIDTH", 728)
8
8
  BLUER_SBC_CAMERA_HEIGHT = get_env("BLUER_SBC_CAMERA_HEIGHT", 600)
9
9
  BLUER_SBC_CAMERA_ROTATION = get_env("BLUER_SBC_CAMERA_ROTATION", 0)
10
+ BLUER_SBC_CAMERA_KEEP_OPEN = get_env("BLUER_SBC_CAMERA_KEEP_OPEN", 0)
10
11
 
11
12
  BLUER_SBC_DISPLAY_FULLSCREEN = get_env("BLUER_SBC_DISPLAY_FULLSCREEN", True)
12
13
 
@@ -0,0 +1,11 @@
1
+ from bluer_options import host
2
+
3
+ if host.is_rpi():
4
+ if host.is_64bit():
5
+ from bluer_sbc.imager.camera.rpi_64_bit import RPI_64_bit_Camera as Camera
6
+ else:
7
+ from bluer_sbc.imager.camera.rpi import RPI_Camera as Camera
8
+ else:
9
+ from bluer_sbc.imager.camera.generic import Camera
10
+
11
+ instance = Camera()
@@ -0,0 +1,208 @@
1
+ import cv2
2
+ from typing import Tuple, List, Union
3
+ import numpy as np
4
+
5
+ from blueness import module
6
+ from bluer_options import string
7
+ from bluer_options import host
8
+ from bluer_options.timer import Timer
9
+ from bluer_options.logger import crash_report
10
+ from bluer_objects import file, objects
11
+
12
+ from bluer_sbc import env
13
+ from bluer_sbc.hardware import hardware
14
+ from bluer_sbc.imager.classes import Imager
15
+ from bluer_sbc.logger import logger
16
+
17
+
18
+ class Camera(Imager):
19
+ def __init__(self):
20
+ self.device = None
21
+ self.resolution = []
22
+
23
+ def capture(
24
+ self,
25
+ close_after: bool = True,
26
+ log: bool = True,
27
+ open_before: bool = True,
28
+ filename: str = "",
29
+ object_name: str = "",
30
+ ) -> Tuple[bool, np.ndarray]:
31
+ success = False
32
+ image = np.ones((1, 1, 3), dtype=np.uint8) * 127
33
+
34
+ if open_before:
35
+ if not self.open():
36
+ return success, image
37
+
38
+ if self.device is None:
39
+ return success, image
40
+
41
+ success, image = self.capture_function()
42
+ if not success:
43
+ logger.warning("capture failed.")
44
+ elif log:
45
+ logger.info(
46
+ "{}.capture(): {}".format(
47
+ self.__class__.__name__,
48
+ string.pretty_shape_of_matrix(image),
49
+ )
50
+ )
51
+
52
+ if close_after:
53
+ self.close()
54
+
55
+ if success and filename:
56
+ success = file.save_image(
57
+ filename=objects.path_of(
58
+ object_name=object_name,
59
+ filename=filename,
60
+ ),
61
+ image=image,
62
+ log=log,
63
+ )
64
+
65
+ return success, image
66
+
67
+ def capture_function(self) -> Tuple[bool, np.ndarray]:
68
+ success = False
69
+ image = np.ones((1, 1, 3), dtype=np.uint8) * 127
70
+
71
+ try:
72
+ success, image = self.device.read()
73
+
74
+ if success:
75
+ image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
76
+
77
+ except Exception as e:
78
+ crash_report(e)
79
+
80
+ return success, image
81
+
82
+ # https://projects.raspberrypi.org/en/projects/getting-started-with-picamera/6
83
+ def capture_video(
84
+ self,
85
+ filename: str,
86
+ object_name: str,
87
+ length: int = 10, # in seconds
88
+ preview: bool = True,
89
+ pulse: bool = True,
90
+ resolution=None,
91
+ ) -> bool:
92
+ logger.error(f"{self.__class__.__name__}.capture_video(): not implemented.")
93
+ return False
94
+
95
+ def close(self, log: bool = True) -> bool:
96
+ if self.device is None:
97
+ logger.warning(
98
+ "{}.close(): device is {}, failed.".format(
99
+ self.__class__.__name__,
100
+ self.device,
101
+ )
102
+ )
103
+ return False
104
+
105
+ try:
106
+ self.close_function()
107
+ except Exception as e:
108
+ crash_report(e)
109
+ return False
110
+
111
+ self.device = None
112
+
113
+ if log:
114
+ logger.info(f"{self.__class__.__name__}.close().")
115
+
116
+ return True
117
+
118
+ def close_function(self):
119
+ self.device.release()
120
+
121
+ def get_resolution(self) -> List[int]:
122
+ try:
123
+ resolution = self.get_resolution_function()
124
+ except Exception as e:
125
+ crash_report(e)
126
+ return []
127
+
128
+ return resolution
129
+
130
+ def get_resolution_function(self) -> Tuple[int, int]:
131
+ return [
132
+ int(self.device.get(const))
133
+ for const in [cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FRAME_WIDTH]
134
+ ]
135
+
136
+ def open(
137
+ self,
138
+ log: bool = True,
139
+ resolution: Union[List[int], None] = None,
140
+ ) -> bool:
141
+ try:
142
+ self.open_function(resolution=resolution)
143
+
144
+ self.resolution = self.get_resolution()
145
+
146
+ if log:
147
+ logger.info(
148
+ "{}.open({})".format(
149
+ self.__class__.__name__,
150
+ string.pretty_shape(self.resolution),
151
+ )
152
+ )
153
+
154
+ return True
155
+ except Exception as e:
156
+ crash_report(e)
157
+ return False
158
+
159
+ def open_function(
160
+ self,
161
+ resolution=Union[List[int], None],
162
+ ):
163
+ self.device = cv2.VideoCapture(0)
164
+
165
+ # https://stackoverflow.com/a/31464688
166
+ self.device.set(cv2.CAP_PROP_FRAME_WIDTH, env.BLUER_SBC_CAMERA_WIDTH)
167
+ self.device.set(cv2.CAP_PROP_FRAME_HEIGHT, env.BLUER_SBC_CAMERA_HEIGHT)
168
+
169
+ def preview(
170
+ self,
171
+ length: float = -1,
172
+ ) -> bool:
173
+ logger.info(
174
+ "{}.preview{} ... | press q or e to quit ...".format(
175
+ self.__class__.__name__,
176
+ "[{}]".format("" if length == -1 else string.pretty_duration(length)),
177
+ )
178
+ )
179
+
180
+ hardware.sign_images = False
181
+ timer = Timer(length, "preview")
182
+ try:
183
+ self.open(
184
+ log=True,
185
+ resolution=(320, 240),
186
+ )
187
+
188
+ while not hardware.pressed("qe"):
189
+ _, image = self.capture(
190
+ close_after=False,
191
+ log=False,
192
+ open_before=False,
193
+ )
194
+ hardware.update_screen(image, None, [])
195
+
196
+ if timer.tick(wait=True):
197
+ logger.info(
198
+ "{} is up, quitting.".format(string.pretty_duration(length))
199
+ )
200
+ break
201
+
202
+ except KeyboardInterrupt:
203
+ logger.info("Ctrl+C, stopping.")
204
+
205
+ finally:
206
+ self.close(log=True)
207
+
208
+ return True
@@ -0,0 +1,112 @@
1
+ from typing import Tuple, Union, List
2
+ import numpy as np
3
+ from time import sleep
4
+
5
+ from bluer_options.logger import crash_report
6
+ from bluer_options import string
7
+ from bluer_objects import file, objects
8
+
9
+ from bluer_sbc.imager.camera.generic import Camera
10
+ from bluer_sbc.hardware import hardware
11
+ from bluer_sbc import env
12
+ from bluer_sbc.logger import logger
13
+
14
+
15
+ class RPI_Camera(Camera):
16
+ def capture_function(self) -> Tuple[bool, np.ndarray]:
17
+ success = False
18
+ image = np.ones((1, 1, 3), dtype=np.uint8) * 127
19
+
20
+ temp = file.auxiliary("camera", "png")
21
+ try:
22
+ self.device.capture(temp)
23
+ success = True
24
+ except Exception as e:
25
+ crash_report(e)
26
+
27
+ if success:
28
+ success, image = file.load_image(temp)
29
+
30
+ return success, image
31
+
32
+ # https://projects.raspberrypi.org/en/projects/getting-started-with-picamera/6
33
+ def capture_video(
34
+ self,
35
+ filename: str,
36
+ object_name: str,
37
+ length: int = 10, # in seconds
38
+ preview: bool = True,
39
+ pulse: bool = True,
40
+ resolution=None,
41
+ ) -> bool:
42
+ if not self.open(resolution=resolution):
43
+ return False
44
+
45
+ full_filename = objects.path_of(
46
+ object_name=object_name,
47
+ filename=filename,
48
+ )
49
+
50
+ success = True
51
+ try:
52
+ if preview:
53
+ self.device.start_preview()
54
+
55
+ self.device.start_recording(full_filename)
56
+ if pulse:
57
+ for _ in range(int(10 * length)):
58
+ hardware.pulse("outputs")
59
+ sleep(0.1)
60
+ else:
61
+ sleep(length)
62
+ self.device.stop_recording()
63
+
64
+ if preview:
65
+ self.device.stop_preview()
66
+ except Exception as e:
67
+ crash_report(e)
68
+ success = False
69
+
70
+ if not self.close():
71
+ return False
72
+
73
+ if success:
74
+ logger.info(
75
+ "{}.capture_video(): {} -{}-> {}".format(
76
+ self.__class__.__name__,
77
+ string.pretty_duration(length),
78
+ string.pretty_bytes(file.size(full_filename)),
79
+ filename,
80
+ )
81
+ )
82
+
83
+ return success
84
+
85
+ def close_function(self):
86
+ self.device.close()
87
+
88
+ def get_resolution_function(self) -> Tuple[int, int]:
89
+ return [value for value in self.device.resolution]
90
+
91
+ def open_function(
92
+ self,
93
+ resolution=Union[List[int], None],
94
+ ):
95
+ from picamera import PiCamera
96
+
97
+ self.device = PiCamera()
98
+ self.device.rotation = env.BLUER_SBC_CAMERA_ROTATION
99
+
100
+ # https://projects.raspberrypi.org/en/projects/getting-started-with-picamera/7
101
+ self.device.resolution = (
102
+ (
103
+ (2592, 1944)
104
+ if env.BLUER_SBC_CAMERA_HI_RES
105
+ else (
106
+ env.BLUER_SBC_CAMERA_WIDTH,
107
+ env.BLUER_SBC_CAMERA_HEIGHT,
108
+ )
109
+ )
110
+ if resolution is None
111
+ else resolution
112
+ )
@@ -0,0 +1,49 @@
1
+ from typing import Tuple, Union, List
2
+ import numpy as np
3
+
4
+ from bluer_options.logger import crash_report
5
+
6
+ from bluer_sbc.imager.camera.generic import Camera
7
+ from bluer_sbc import env
8
+
9
+
10
+ class RPI_64_bit_Camera(Camera):
11
+ def capture_function(self) -> Tuple[bool, np.ndarray]:
12
+ success = False
13
+ image = np.ones((1, 1, 3), dtype=np.uint8) * 127
14
+
15
+ try:
16
+ image = self.device.capture_array()
17
+ success = True
18
+ except Exception as e:
19
+ crash_report(e)
20
+
21
+ return success, image
22
+
23
+ def close_function(self):
24
+ self.device.stop()
25
+ del self.device
26
+
27
+ def get_resolution_function(self) -> Tuple[int, int]:
28
+ width, height = self.device.stream_configuration("main")["size"]
29
+ return [height, width]
30
+
31
+ def open_function(
32
+ self,
33
+ resolution=Union[List[int], None],
34
+ ):
35
+ from picamera2 import Picamera2
36
+
37
+ self.device = Picamera2()
38
+
39
+ config = self.device.create_still_configuration(
40
+ main={
41
+ "size": (
42
+ env.BLUER_SBC_CAMERA_WIDTH,
43
+ env.BLUER_SBC_CAMERA_HEIGHT,
44
+ )
45
+ }
46
+ )
47
+ self.device.configure(config)
48
+
49
+ self.device.start()