Barmaja-PyArduino 2.0.0__py3-none-any.whl
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.
- Barmaja_PyArduino/BARMAJA_PyArduino.ico +0 -0
- Barmaja_PyArduino/__init__.py +528 -0
- Barmaja_PyArduino/__init__.pyi +331 -0
- Barmaja_PyArduino/__main__.py +2 -0
- Barmaja_PyArduino/adapters/__init__.py +35 -0
- Barmaja_PyArduino/api_registry.py +459 -0
- Barmaja_PyArduino/backend/__init__.py +3 -0
- Barmaja_PyArduino/backend/uno_cpp.py +1680 -0
- Barmaja_PyArduino/board.py +80 -0
- Barmaja_PyArduino/cli.py +223 -0
- Barmaja_PyArduino/compiler.py +1721 -0
- Barmaja_PyArduino/console.py +217 -0
- Barmaja_PyArduino/device_packs.py +367 -0
- Barmaja_PyArduino/device_packs_builtin/Button/arduino/Barmaja_Button/library.properties +9 -0
- Barmaja_PyArduino/device_packs_builtin/Button/arduino/Barmaja_Button/src/Barmaja_Button.h +18 -0
- Barmaja_PyArduino/device_packs_builtin/Button/example.py +10 -0
- Barmaja_PyArduino/device_packs_builtin/Button/pack.json +40 -0
- Barmaja_PyArduino/device_packs_builtin/ClockDS3231/arduino/Barmaja_ClockDS3231/library.properties +9 -0
- Barmaja_PyArduino/device_packs_builtin/ClockDS3231/arduino/Barmaja_ClockDS3231/src/Barmaja_ClockDS3231.h +20 -0
- Barmaja_PyArduino/device_packs_builtin/ClockDS3231/example.py +8 -0
- Barmaja_PyArduino/device_packs_builtin/ClockDS3231/pack.json +136 -0
- Barmaja_PyArduino/device_packs_builtin/DistanceVL53L0X/arduino/Barmaja_DistanceVL53L0X/library.properties +9 -0
- Barmaja_PyArduino/device_packs_builtin/DistanceVL53L0X/arduino/Barmaja_DistanceVL53L0X/src/Barmaja_DistanceVL53L0X.h +12 -0
- Barmaja_PyArduino/device_packs_builtin/DistanceVL53L0X/example.py +8 -0
- Barmaja_PyArduino/device_packs_builtin/DistanceVL53L0X/pack.json +48 -0
- Barmaja_PyArduino/device_packs_builtin/LCDParallel/arduino/Barmaja_LCDParallel/library.properties +9 -0
- Barmaja_PyArduino/device_packs_builtin/LCDParallel/arduino/Barmaja_LCDParallel/src/Barmaja_LCDParallel.h +17 -0
- Barmaja_PyArduino/device_packs_builtin/LCDParallel/example.py +10 -0
- Barmaja_PyArduino/device_packs_builtin/LCDParallel/pack.json +137 -0
- Barmaja_PyArduino/device_packs_builtin/LoadCellHX711/arduino/Barmaja_LoadCellHX711/library.properties +9 -0
- Barmaja_PyArduino/device_packs_builtin/LoadCellHX711/arduino/Barmaja_LoadCellHX711/src/Barmaja_LoadCellHX711.h +16 -0
- Barmaja_PyArduino/device_packs_builtin/LoadCellHX711/example.py +11 -0
- Barmaja_PyArduino/device_packs_builtin/LoadCellHX711/pack.json +74 -0
- Barmaja_PyArduino/device_packs_builtin/NeoPixelStrip/arduino/Barmaja_NeoPixelStrip/library.properties +9 -0
- Barmaja_PyArduino/device_packs_builtin/NeoPixelStrip/arduino/Barmaja_NeoPixelStrip/src/Barmaja_NeoPixelStrip.h +15 -0
- Barmaja_PyArduino/device_packs_builtin/NeoPixelStrip/example.py +13 -0
- Barmaja_PyArduino/device_packs_builtin/NeoPixelStrip/pack.json +114 -0
- Barmaja_PyArduino/device_packs_builtin/OLEDText/arduino/Barmaja_OLEDText/library.properties +9 -0
- Barmaja_PyArduino/device_packs_builtin/OLEDText/arduino/Barmaja_OLEDText/src/Barmaja_OLEDText.h +21 -0
- Barmaja_PyArduino/device_packs_builtin/OLEDText/example.py +9 -0
- Barmaja_PyArduino/device_packs_builtin/OLEDText/pack.json +103 -0
- Barmaja_PyArduino/device_packs_builtin/PressureBMP280/arduino/Barmaja_PressureBMP280/library.properties +9 -0
- Barmaja_PyArduino/device_packs_builtin/PressureBMP280/arduino/Barmaja_PressureBMP280/src/Barmaja_PressureBMP280.h +16 -0
- Barmaja_PyArduino/device_packs_builtin/PressureBMP280/example.py +8 -0
- Barmaja_PyArduino/device_packs_builtin/PressureBMP280/pack.json +92 -0
- Barmaja_PyArduino/device_packs_builtin/RotaryEncoder/arduino/Barmaja_RotaryEncoder/library.properties +9 -0
- Barmaja_PyArduino/device_packs_builtin/RotaryEncoder/arduino/Barmaja_RotaryEncoder/src/Barmaja_RotaryEncoder.h +18 -0
- Barmaja_PyArduino/device_packs_builtin/RotaryEncoder/example.py +10 -0
- Barmaja_PyArduino/device_packs_builtin/RotaryEncoder/pack.json +44 -0
- Barmaja_PyArduino/device_packs_builtin/ServoDriverPCA9685/arduino/Barmaja_ServoDriverPCA9685/library.properties +9 -0
- Barmaja_PyArduino/device_packs_builtin/ServoDriverPCA9685/arduino/Barmaja_ServoDriverPCA9685/src/Barmaja_ServoDriverPCA9685.h +15 -0
- Barmaja_PyArduino/device_packs_builtin/ServoDriverPCA9685/example.py +10 -0
- Barmaja_PyArduino/device_packs_builtin/ServoDriverPCA9685/pack.json +117 -0
- Barmaja_PyArduino/device_packs_builtin/ShiftRegister595/arduino/Barmaja_ShiftRegister595/library.properties +9 -0
- Barmaja_PyArduino/device_packs_builtin/ShiftRegister595/arduino/Barmaja_ShiftRegister595/src/Barmaja_ShiftRegister595.h +14 -0
- Barmaja_PyArduino/device_packs_builtin/ShiftRegister595/example.py +9 -0
- Barmaja_PyArduino/device_packs_builtin/ShiftRegister595/pack.json +83 -0
- Barmaja_PyArduino/device_packs_builtin/TemperatureDS18B20/arduino/Barmaja_TemperatureDS18B20/library.properties +9 -0
- Barmaja_PyArduino/device_packs_builtin/TemperatureDS18B20/arduino/Barmaja_TemperatureDS18B20/src/Barmaja_TemperatureDS18B20.h +16 -0
- Barmaja_PyArduino/device_packs_builtin/TemperatureDS18B20/example.py +8 -0
- Barmaja_PyArduino/device_packs_builtin/TemperatureDS18B20/pack.json +63 -0
- Barmaja_PyArduino/doctor.py +406 -0
- Barmaja_PyArduino/environment.py +595 -0
- Barmaja_PyArduino/errors.py +166 -0
- Barmaja_PyArduino/flow.py +754 -0
- Barmaja_PyArduino/frontend.py +611 -0
- Barmaja_PyArduino/installer.py +151 -0
- Barmaja_PyArduino/ir.py +660 -0
- Barmaja_PyArduino/library_adder.py +440 -0
- Barmaja_PyArduino/live.py +859 -0
- Barmaja_PyArduino/lowering.py +596 -0
- Barmaja_PyArduino/numeric.py +748 -0
- Barmaja_PyArduino/pack_builder.py +544 -0
- Barmaja_PyArduino/py.typed +0 -0
- Barmaja_PyArduino/serial_monitor.py +172 -0
- Barmaja_PyArduino/source.py +184 -0
- Barmaja_PyArduino/stubgen.py +148 -0
- Barmaja_PyArduino/symbols.py +646 -0
- Barmaja_PyArduino/target.py +1631 -0
- Barmaja_PyArduino/toolchain.py +506 -0
- Barmaja_PyArduino/typesys.py +917 -0
- Barmaja_PyArduino/workflow.py +213 -0
- barmaja_pyarduino-2.0.0.dist-info/METADATA +39 -0
- barmaja_pyarduino-2.0.0.dist-info/RECORD +87 -0
- barmaja_pyarduino-2.0.0.dist-info/WHEEL +5 -0
- barmaja_pyarduino-2.0.0.dist-info/licenses/LICENSE.txt +7 -0
- barmaja_pyarduino-2.0.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
import shutil
|
|
5
|
+
import sys
|
|
6
|
+
import zipfile
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
from .environment import ensure_runtime_dirs, pictoblox_module_dirs, run_text
|
|
11
|
+
|
|
12
|
+
@dataclass(frozen=True)
|
|
13
|
+
class InstallTarget:
|
|
14
|
+
kind: str
|
|
15
|
+
path: Path
|
|
16
|
+
label: str
|
|
17
|
+
|
|
18
|
+
@dataclass(frozen=True)
|
|
19
|
+
class InstallResult:
|
|
20
|
+
target: InstallTarget
|
|
21
|
+
ok: bool
|
|
22
|
+
message: str
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def discover_install_targets() -> tuple[InstallTarget, ...]:
|
|
26
|
+
targets = [InstallTarget("python", Path(sys.executable), f"Python {sys.version_info.major}.{sys.version_info.minor}")]
|
|
27
|
+
for p in pictoblox_module_dirs():
|
|
28
|
+
targets.append(InstallTarget("pictoblox", p, "PictoBlox"))
|
|
29
|
+
return tuple(targets)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def _extract_pure_python_wheel(wheel: Path, target_dir: Path) -> None:
|
|
33
|
+
with zipfile.ZipFile(wheel) as z:
|
|
34
|
+
names = z.namelist()
|
|
35
|
+
if any(".data/" in n or n.endswith((".pyd", ".so", ".dll", ".dylib")) for n in names):
|
|
36
|
+
raise ValueError("PictoBlox offline installation only accepts the Barmaja pure-Python wheel.")
|
|
37
|
+
target_dir.mkdir(parents=True, exist_ok=True)
|
|
38
|
+
# Replace, never merge: stale modules from an older version must not survive.
|
|
39
|
+
existing = target_dir / "Barmaja_PyArduino"
|
|
40
|
+
if existing.exists():
|
|
41
|
+
shutil.rmtree(existing)
|
|
42
|
+
for member in names:
|
|
43
|
+
if member.startswith("Barmaja_PyArduino/"):
|
|
44
|
+
z.extract(member, target_dir)
|
|
45
|
+
if not (target_dir / "Barmaja_PyArduino" / "__init__.py").exists():
|
|
46
|
+
raise ValueError("Wheel does not contain Barmaja_PyArduino package files.")
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def install_offline_wheel(wheel: str | Path, target: InstallTarget) -> InstallResult:
|
|
50
|
+
wheel = Path(wheel).resolve()
|
|
51
|
+
if not wheel.exists():
|
|
52
|
+
return InstallResult(target, False, f"wheel not found: {wheel}")
|
|
53
|
+
try:
|
|
54
|
+
if target.kind == "python":
|
|
55
|
+
cp = run_text([str(target.path), "-m", "pip", "install", "--no-index", "--no-deps", str(wheel)], timeout=120)
|
|
56
|
+
if cp.returncode != 0:
|
|
57
|
+
return InstallResult(target, False, (cp.stderr or cp.stdout).strip() or "pip install failed")
|
|
58
|
+
return InstallResult(target, True, "installed")
|
|
59
|
+
if target.kind == "pictoblox":
|
|
60
|
+
_extract_pure_python_wheel(wheel, target.path)
|
|
61
|
+
return InstallResult(target, True, "installed into PictoBlox python_modules")
|
|
62
|
+
return InstallResult(target, False, "unsupported install target")
|
|
63
|
+
except Exception as e:
|
|
64
|
+
return InstallResult(target, False, str(e))
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
PINNED_LIBRARY_FOLDERS = {
|
|
68
|
+
"Servo": "1.3.0",
|
|
69
|
+
"Ultrasonic": "3.0.0",
|
|
70
|
+
"DHT sensor library": "1.4.7",
|
|
71
|
+
"Adafruit Unified Sensor": "1.1.15",
|
|
72
|
+
"LiquidCrystal I2C": "1.1.4",
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def install_private_arduino_libraries(source_dir: str | Path) -> tuple[str, ...]:
|
|
77
|
+
"""Install bundled pinned Arduino libraries into Barmaja's private library dir.
|
|
78
|
+
|
|
79
|
+
This avoids modifying or overwriting the user's Arduino IDE libraries.
|
|
80
|
+
"""
|
|
81
|
+
source = Path(source_dir)
|
|
82
|
+
dest_root = ensure_runtime_dirs()["root"] / "arduino-libraries"
|
|
83
|
+
dest_root.mkdir(parents=True, exist_ok=True)
|
|
84
|
+
installed=[]
|
|
85
|
+
for child in sorted(source.iterdir()) if source.exists() else []:
|
|
86
|
+
if not child.is_dir():
|
|
87
|
+
continue
|
|
88
|
+
props = child / "library.properties"
|
|
89
|
+
if not props.exists():
|
|
90
|
+
continue
|
|
91
|
+
text = props.read_text(encoding="utf-8", errors="replace")
|
|
92
|
+
if "name=" not in text:
|
|
93
|
+
continue
|
|
94
|
+
dest = dest_root / child.name
|
|
95
|
+
if dest.exists(): shutil.rmtree(dest)
|
|
96
|
+
shutil.copytree(child, dest)
|
|
97
|
+
installed.append(child.name)
|
|
98
|
+
return tuple(installed)
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def install_bundled_runtime(source_dir: str | Path) -> Path:
|
|
102
|
+
source = Path(source_dir)
|
|
103
|
+
root = ensure_runtime_dirs()["root"]
|
|
104
|
+
dest = root / "runtime"
|
|
105
|
+
if dest.exists():
|
|
106
|
+
shutil.rmtree(dest)
|
|
107
|
+
shutil.copytree(source, dest)
|
|
108
|
+
|
|
109
|
+
# The Full Pack is relocatable at install time. Rebuild the Arduino CLI
|
|
110
|
+
# config with the actual destination instead of shipping machine-specific
|
|
111
|
+
# absolute paths.
|
|
112
|
+
data = dest / "arduino-data"
|
|
113
|
+
user = dest / "arduino-user"
|
|
114
|
+
downloads = dest / "downloads"
|
|
115
|
+
for folder in (data, user, downloads):
|
|
116
|
+
folder.mkdir(parents=True, exist_ok=True)
|
|
117
|
+
build_cache = root / "build-cache"
|
|
118
|
+
build_cache.mkdir(parents=True, exist_ok=True)
|
|
119
|
+
def q(path: Path) -> str:
|
|
120
|
+
return '"' + str(path).replace("\\", "/").replace('"', '\\"') + '"'
|
|
121
|
+
config = (
|
|
122
|
+
"board_manager:\n"
|
|
123
|
+
" additional_urls: []\n"
|
|
124
|
+
"build_cache:\n"
|
|
125
|
+
f" path: {q(build_cache)}\n"
|
|
126
|
+
"directories:\n"
|
|
127
|
+
f" data: {q(data)}\n"
|
|
128
|
+
f" downloads: {q(downloads)}\n"
|
|
129
|
+
f" user: {q(user)}\n"
|
|
130
|
+
"locale: en\n"
|
|
131
|
+
"logging:\n"
|
|
132
|
+
" format: text\n"
|
|
133
|
+
" level: warn\n"
|
|
134
|
+
"metrics:\n"
|
|
135
|
+
" enabled: false\n"
|
|
136
|
+
"output:\n"
|
|
137
|
+
" no_color: true\n"
|
|
138
|
+
"updater:\n"
|
|
139
|
+
" enable_notification: false\n"
|
|
140
|
+
)
|
|
141
|
+
(dest / "arduino-cli.yaml").write_text(config, encoding="utf-8")
|
|
142
|
+
return dest
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def install_offline_package(wheel: str | Path, *, include_pictoblox: bool = True) -> tuple[InstallResult, ...]:
|
|
146
|
+
results=[]
|
|
147
|
+
for target in discover_install_targets():
|
|
148
|
+
if target.kind == "pictoblox" and not include_pictoblox:
|
|
149
|
+
continue
|
|
150
|
+
results.append(install_offline_wheel(wheel, target))
|
|
151
|
+
return tuple(results)
|