From efe847a1e4410c2acab129ed26dc0f1eda5a8840 Mon Sep 17 00:00:00 2001 From: csk6124 Date: Thu, 12 Feb 2026 18:08:39 +0900 Subject: [PATCH 1/5] feat: Add web/Pyodide support with optional dependencies - Refactor setup.py to use extras_require for optional dependencies - serial: pyserial for USB connection - ble: bleak for Bluetooth connection - all: full installation (USB + BLE) - Minimal install now works without pyserial/bleak - Add conditional imports in task/__init__.py and connection_util.py - HAS_SERIAL and HAS_BLE flags for runtime detection - Graceful fallback when dependencies are missing - Add task injection parameter to MODIPlus.__init__ - Enables custom communication layers (e.g., PostMessageTask) - Required for web/Pyodide integration - Update README with new installation instructions Related: LUXROBO/pymodi-plus#61 Co-Authored-By: Claude Opus 4.5 --- README.md | 28 +++++++++++++++++++++++-- modi_plus/modi_plus.py | 29 +++++++++++++++++++++++--- modi_plus/task/__init__.py | 34 +++++++++++++++++++++++++++++++ modi_plus/util/connection_util.py | 11 +++++++++- setup.py | 34 ++++++++++++++++++++++++++++--- 5 files changed, 127 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index ef7335c..9d344d1 100644 --- a/README.md +++ b/README.md @@ -59,9 +59,33 @@ conda activate pymodi_plus python --version ``` -Install the latest PyMODI+ if you haven't installed it yet: +Install the latest PyMODI+ with all features (USB + BLE): +```bash +pip install pymodi-plus[all] ``` -python -m pip install pymodi-plus --user --upgrade + +Or install with specific features: +```bash +# USB/Serial connection only +pip install pymodi-plus[serial] + +# BLE connection only +pip install pymodi-plus[ble] + +# Minimal install (for web/Pyodide environments) +pip install pymodi-plus +``` + +### Web/Pyodide Support + +For web browser environments using Pyodide, install [pymodi-plus-web](https://github.com/LUXROBO/pymodi-plus-web): +```python +# In Pyodide +import micropip +await micropip.install('pymodi-plus-web') + +from modi_plus_web import MODIPlusWeb +modi = MODIPlusWeb() ``` Usage diff --git a/modi_plus/modi_plus.py b/modi_plus/modi_plus.py index 8f0b872..291e6a3 100644 --- a/modi_plus/modi_plus.py +++ b/modi_plus/modi_plus.py @@ -2,6 +2,7 @@ import time import atexit +from typing import Optional from importlib import import_module as im @@ -21,6 +22,7 @@ from modi_plus.module.module import ModuleList from modi_plus._exe_thread import ExeThread from modi_plus.util.connection_util import get_platform, get_ble_task_path +from modi_plus.task import HAS_SERIAL, HAS_BLE, ConnectionTask class MODIPlus: @@ -37,9 +39,20 @@ def __call__(cls, *args, **kwargs): cls.network_uuids[network_uuid] = super(MODIPlus, cls).__call__(*args, **kwargs) return cls.network_uuids[network_uuid] - def __init__(self, connection_type="serialport", verbose=False, port=None, network_uuid=""): + def __init__( + self, + connection_type: str = "serialport", + verbose: bool = False, + port: Optional[str] = None, + network_uuid: str = "", + task: Optional[ConnectionTask] = None, + ): self._modules = list() - self._connection = self.__init_task(connection_type, verbose, port, network_uuid) + # 외부에서 task 주입 가능 (웹 버전용) + if task is not None: + self._connection = task + else: + self._connection = self.__init_task(connection_type, verbose, port, network_uuid) self._exe_thread = ExeThread(self._modules, self._connection) print("Start initializing connected MODI+ modules") @@ -59,15 +72,25 @@ def __init__(self, connection_type="serialport", verbose=False, port=None, netwo def __init_task(self, connection_type, verbose, port, network_uuid): if connection_type == "serialport": + if not HAS_SERIAL: + raise ImportError( + "Serial 통신을 사용하려면 pyserial이 필요합니다.\n" + "설치: pip install pymodi-plus[serial] 또는 pip install pymodi-plus[all]" + ) return im("modi_plus.task.serialport_task").SerialportTask(verbose, port) elif connection_type == "ble": + if not HAS_BLE: + raise ImportError( + "BLE 통신을 사용하려면 bleak이 필요합니다.\n" + "설치: pip install pymodi-plus[ble] 또는 pip install pymodi-plus[all]" + ) if not network_uuid: raise ValueError("Network UUID not specified!") self.network_uuids[network_uuid] = self os = get_platform() if os == "chrome" or os == "linux": - raise ValueError(f"{os} doen't supported for ble connection") + raise ValueError(f"{os} doesn't support ble connection") return im(get_ble_task_path()).BleTask(verbose, network_uuid) else: diff --git a/modi_plus/task/__init__.py b/modi_plus/task/__init__.py index e69de29..0152acc 100644 --- a/modi_plus/task/__init__.py +++ b/modi_plus/task/__init__.py @@ -0,0 +1,34 @@ +"""MODI+ Task module - 통신 레이어 + +조건부 import를 통해 pyserial/bleak 없이도 패키지 import 가능 +""" + +# 플래그 초기화 +HAS_SERIAL = False +HAS_BLE = False + +# Serial Task (pyserial 필요) +try: + from modi_plus.task.serialport_task import SerialportTask + HAS_SERIAL = True +except ImportError: + SerialportTask = None + +# BLE Task (bleak 필요) +try: + from modi_plus.util.connection_util import get_ble_task_path + from importlib import import_module + # BLE task는 플랫폼별로 다르므로 여기서 직접 import하지 않음 + HAS_BLE = True +except ImportError: + HAS_BLE = False + +# Connection Task (항상 사용 가능) +from modi_plus.task.connection_task import ConnectionTask + +__all__ = [ + 'ConnectionTask', + 'HAS_SERIAL', + 'HAS_BLE', + 'SerialportTask', +] diff --git a/modi_plus/util/connection_util.py b/modi_plus/util/connection_util.py index 9c130d7..b9a1da7 100644 --- a/modi_plus/util/connection_util.py +++ b/modi_plus/util/connection_util.py @@ -3,7 +3,13 @@ import platform from typing import List -import serial.tools.list_ports as stl +# 조건부 import - pyserial 없어도 기본 기능은 사용 가능 +try: + import serial.tools.list_ports as stl + HAS_SERIAL = True +except ImportError: + stl = None + HAS_SERIAL = False def list_modi_ports() -> List[str]: @@ -11,6 +17,9 @@ def list_modi_ports() -> List[str]: :return: List[ListPortInfo] """ + if not HAS_SERIAL: + return [] + info_list = [] def __is_modi_port(port): diff --git a/setup.py b/setup.py index 975d7de..e386ec0 100644 --- a/setup.py +++ b/setup.py @@ -19,9 +19,37 @@ def wrapper(): get_about = get_spec("./modi_plus/about.py", "d") get_readme = get_spec("README.md") get_history = get_spec("HISTORY.md") -get_requirements = get_spec("requirements.txt") get_requirements_dev = get_spec("requirements-dev.txt") +# 최소 의존성 (Pyodide 호환) +INSTALL_REQUIRES = [ + 'nest-asyncio>=1.5.4', + 'packaging>=21.3', +] + +# Optional 의존성 +EXTRAS_REQUIRE = { + 'serial': [ + 'pyserial>=3.5', + ], + 'ble': [ + 'bleak>=0.13.0; sys_platform == "win32"', + 'bleak>=0.13.0; sys_platform == "darwin"', + ], + 'websocket': [ + 'websocket-client>=1.2.3', + ], + 'all': [ + 'pyserial>=3.5', + 'bleak>=0.13.0; sys_platform == "win32"', + 'bleak>=0.13.0; sys_platform == "darwin"', + 'websocket-client>=1.2.3', + 'winusbcdc>=1.4; sys_platform == "win32"', + 'pexpect; sys_platform == "linux"', + ], +} +EXTRAS_REQUIRE['dev'] = get_requirements_dev() + about = get_about() setup( name=about["__title__"], @@ -31,8 +59,8 @@ def wrapper(): description=about["__summary__"], long_description=get_readme() + "\n" + get_history(), long_description_content_type="text/markdown", - install_requires=get_requirements(), - extras_require={"dev": get_requirements_dev()}, + install_requires=INSTALL_REQUIRES, + extras_require=EXTRAS_REQUIRE, license=about["__license__"], include_package_data=True, keywords=["python", "modi", "modi-plus", "modi_plus", "modi+"], From 31881bbf077b78f0055a28303f79404a8f59f1c5 Mon Sep 17 00:00:00 2001 From: csk6124 Date: Thu, 12 Feb 2026 18:42:56 +0900 Subject: [PATCH 2/5] feat: Migrate to monorepo structure with packages/core and packages/web - Add packages/core/ with existing pymodi-plus code - Add packages/web/ with pymodi-plus-web for Pyodide support - Update Makefile with monorepo commands (install-all, test-monorepo, build-all) - Add pyproject.toml for root configuration - Update README.md for monorepo documentation - All 115 tests passing (94 core + 21 web) Co-Authored-By: Claude Opus 4.5 --- Makefile | 52 +- README.md | 207 ++--- packages/core/HISTORY.md | 81 ++ packages/core/LICENSE | 21 + packages/core/MANIFEST.in | 15 + packages/core/README.md | 197 +++++ .../basic_usage_examples/active_error.py | 29 + .../basic_usage_examples/battery_example.py | 16 + .../basic_usage_examples/button_example.py | 22 + .../basic_usage_examples/dial_example.py | 16 + .../basic_usage_examples/display_example.py | 33 + .../basic_usage_examples/env_example.py | 16 + .../env_rgb_color_detection.py | 144 ++++ .../basic_usage_examples/env_rgb_example.py | 173 ++++ .../env_rgb_mixed_versions.py | 133 ++++ .../basic_usage_examples/env_rgb_stats.py | 332 ++++++++ .../examples/basic_usage_examples/error1.py | 23 + .../basic_usage_examples/imu_example.py | 23 + .../basic_usage_examples/joystick_example.py | 15 + .../basic_usage_examples/led_example.py | 30 + .../basic_usage_examples/motor_example.py | 22 + .../basic_usage_examples/speaker_example.py | 20 + .../basic_usage_examples/tof_example.py | 15 + .../core/examples/creation_examples/brush.py | 32 + .../core/examples/creation_examples/dodge.py | 58 ++ .../creation_examples/requirements.txt | 1 + .../multi_module_example.py | 26 + packages/core/modi_plus/__init__.py | 13 + packages/core/modi_plus/__main__.py | 130 +++ packages/core/modi_plus/_exe_thread.py | 28 + packages/core/modi_plus/about.py | 8 + .../assets/firmware/esp32/bootloader.bin | Bin 0 -> 14528 bytes .../modi_plus/assets/firmware/esp32/esp32.bin | Bin 0 -> 1042800 bytes .../firmware/esp32/modi_ota_factory.bin | Bin 0 -> 819664 bytes .../firmware/esp32/ota_data_initial.bin | 1 + .../assets/firmware/esp32/partitions.bin | Bin 0 -> 3072 bytes .../assets/firmware/modules/battery.bin | Bin 0 -> 44048 bytes .../assets/firmware/modules/button.bin | Bin 0 -> 44048 bytes .../assets/firmware/modules/dial.bin | Bin 0 -> 44048 bytes .../assets/firmware/modules/display.bin | Bin 0 -> 94224 bytes .../modi_plus/assets/firmware/modules/env.bin | Bin 0 -> 94224 bytes .../modi_plus/assets/firmware/modules/imu.bin | Bin 0 -> 44048 bytes .../assets/firmware/modules/joystick.bin | Bin 0 -> 44048 bytes .../modi_plus/assets/firmware/modules/led.bin | Bin 0 -> 44048 bytes .../assets/firmware/modules/motor.bin | Bin 0 -> 44048 bytes .../assets/firmware/modules/network.bin | Bin 0 -> 94224 bytes .../assets/firmware/modules/speaker.bin | Bin 0 -> 94224 bytes .../modi_plus/assets/firmware/modules/tof.bin | Bin 0 -> 44048 bytes packages/core/modi_plus/assets/version.txt | 21 + packages/core/modi_plus/modi_plus.py | 324 ++++++++ packages/core/modi_plus/module/__init__.py | 0 .../modi_plus/module/input_module/__init__.py | 0 .../modi_plus/module/input_module/button.py | 69 ++ .../modi_plus/module/input_module/dial.py | 38 + .../core/modi_plus/module/input_module/env.py | 409 ++++++++++ .../core/modi_plus/module/input_module/imu.py | 184 +++++ .../modi_plus/module/input_module/joystick.py | 66 ++ .../core/modi_plus/module/input_module/tof.py | 24 + packages/core/modi_plus/module/module.py | 388 +++++++++ .../module/output_module/__init__.py | 0 .../modi_plus/module/output_module/display.py | 347 ++++++++ .../modi_plus/module/output_module/led.py | 145 ++++ .../modi_plus/module/output_module/motor.py | 168 ++++ .../modi_plus/module/output_module/speaker.py | 311 ++++++++ .../modi_plus/module/setup_module/__init__.py | 0 .../modi_plus/module/setup_module/battery.py | 24 + .../modi_plus/module/setup_module/network.py | 395 ++++++++++ packages/core/modi_plus/task/__init__.py | 34 + .../core/modi_plus/task/ble_task/__init__.py | 0 .../modi_plus/task/ble_task/ble_task_linux.py | 29 + .../modi_plus/task/ble_task/ble_task_mac.py | 162 ++++ .../modi_plus/task/ble_task/ble_task_rpi.py | 182 +++++ .../modi_plus/task/ble_task/ble_task_win.py | 145 ++++ .../task/ble_task/change_interval.sh | 2 + .../core/modi_plus/task/connection_task.py | 54 ++ packages/core/modi_plus/task/exe_task.py | 217 +++++ .../core/modi_plus/task/serialport_task.py | 150 ++++ packages/core/modi_plus/util/__init__.py | 0 .../core/modi_plus/util/connection_util.py | 89 +++ .../core/modi_plus/util/inspection_util.py | 425 ++++++++++ packages/core/modi_plus/util/message_util.py | 101 +++ .../core/modi_plus/util/modi_serialport.py | 211 +++++ packages/core/modi_plus/util/tutorial_util.py | 357 +++++++++ packages/core/modi_plus/util/unittest_util.py | 98 +++ packages/core/modi_plus/util/usage_util.py | 308 ++++++++ packages/core/modi_plus/util/winusb.py | 560 +++++++++++++ packages/core/pytest.ini | 24 + packages/core/requirements-dev.txt | 4 + packages/core/requirements.txt | 15 + packages/core/setup.cfg | 15 + packages/core/setup.py | 89 +++ packages/core/tests/__init__.py | 9 + packages/core/tests/module/__init__.py | 0 .../tests/module/input_module/__init__.py | 0 .../tests/module/input_module/test_button.py | 65 ++ .../tests/module/input_module/test_dial.py | 45 ++ .../tests/module/input_module/test_env.py | 393 ++++++++++ .../tests/module/input_module/test_imu.py | 155 ++++ .../module/input_module/test_joystick.py | 55 ++ .../tests/module/input_module/test_tof.py | 35 + .../tests/module/output_module/__init__.py | 0 .../module/output_module/test_display.py | 148 ++++ .../tests/module/output_module/test_led.py | 149 ++++ .../tests/module/output_module/test_motor.py | 120 +++ .../module/output_module/test_speaker.py | 193 +++++ .../tests/module/setup_module/__init__.py | 0 .../tests/module/setup_module/test_battery.py | 35 + .../tests/module/setup_module/test_network.py | 222 ++++++ packages/core/tests/task/__init__.py | 0 packages/core/tests/task/test_conn_task.py | 21 + .../core/tests/task/test_serialport_task.py | 48 ++ packages/web/LICENSE | 21 + packages/web/README.md | 121 +++ packages/web/modi_plus_web/__init__.py | 13 + packages/web/modi_plus_web/modi_plus_web.py | 70 ++ packages/web/modi_plus_web/task/__init__.py | 5 + .../modi_plus_web/task/postmessage_task.py | 143 ++++ packages/web/pytest.ini | 5 + packages/web/setup.py | 36 + packages/web/test_pyodide.html | 742 ++++++++++++++++++ packages/web/tests/__init__.py | 1 + packages/web/tests/test_modi_plus_web.py | 93 +++ packages/web/tests/test_postmessage_task.py | 195 +++++ pyproject.toml | 28 + 124 files changed, 11137 insertions(+), 145 deletions(-) create mode 100644 packages/core/HISTORY.md create mode 100644 packages/core/LICENSE create mode 100644 packages/core/MANIFEST.in create mode 100644 packages/core/README.md create mode 100644 packages/core/examples/basic_usage_examples/active_error.py create mode 100644 packages/core/examples/basic_usage_examples/battery_example.py create mode 100644 packages/core/examples/basic_usage_examples/button_example.py create mode 100644 packages/core/examples/basic_usage_examples/dial_example.py create mode 100644 packages/core/examples/basic_usage_examples/display_example.py create mode 100644 packages/core/examples/basic_usage_examples/env_example.py create mode 100644 packages/core/examples/basic_usage_examples/env_rgb_color_detection.py create mode 100644 packages/core/examples/basic_usage_examples/env_rgb_example.py create mode 100644 packages/core/examples/basic_usage_examples/env_rgb_mixed_versions.py create mode 100644 packages/core/examples/basic_usage_examples/env_rgb_stats.py create mode 100644 packages/core/examples/basic_usage_examples/error1.py create mode 100644 packages/core/examples/basic_usage_examples/imu_example.py create mode 100644 packages/core/examples/basic_usage_examples/joystick_example.py create mode 100644 packages/core/examples/basic_usage_examples/led_example.py create mode 100644 packages/core/examples/basic_usage_examples/motor_example.py create mode 100644 packages/core/examples/basic_usage_examples/speaker_example.py create mode 100644 packages/core/examples/basic_usage_examples/tof_example.py create mode 100644 packages/core/examples/creation_examples/brush.py create mode 100644 packages/core/examples/creation_examples/dodge.py create mode 100644 packages/core/examples/creation_examples/requirements.txt create mode 100644 packages/core/examples/intermediate_usage_examples/multi_module_example.py create mode 100644 packages/core/modi_plus/__init__.py create mode 100644 packages/core/modi_plus/__main__.py create mode 100644 packages/core/modi_plus/_exe_thread.py create mode 100644 packages/core/modi_plus/about.py create mode 100644 packages/core/modi_plus/assets/firmware/esp32/bootloader.bin create mode 100644 packages/core/modi_plus/assets/firmware/esp32/esp32.bin create mode 100644 packages/core/modi_plus/assets/firmware/esp32/modi_ota_factory.bin create mode 100644 packages/core/modi_plus/assets/firmware/esp32/ota_data_initial.bin create mode 100644 packages/core/modi_plus/assets/firmware/esp32/partitions.bin create mode 100644 packages/core/modi_plus/assets/firmware/modules/battery.bin create mode 100644 packages/core/modi_plus/assets/firmware/modules/button.bin create mode 100644 packages/core/modi_plus/assets/firmware/modules/dial.bin create mode 100644 packages/core/modi_plus/assets/firmware/modules/display.bin create mode 100644 packages/core/modi_plus/assets/firmware/modules/env.bin create mode 100644 packages/core/modi_plus/assets/firmware/modules/imu.bin create mode 100644 packages/core/modi_plus/assets/firmware/modules/joystick.bin create mode 100644 packages/core/modi_plus/assets/firmware/modules/led.bin create mode 100644 packages/core/modi_plus/assets/firmware/modules/motor.bin create mode 100644 packages/core/modi_plus/assets/firmware/modules/network.bin create mode 100644 packages/core/modi_plus/assets/firmware/modules/speaker.bin create mode 100644 packages/core/modi_plus/assets/firmware/modules/tof.bin create mode 100644 packages/core/modi_plus/assets/version.txt create mode 100644 packages/core/modi_plus/modi_plus.py create mode 100644 packages/core/modi_plus/module/__init__.py create mode 100644 packages/core/modi_plus/module/input_module/__init__.py create mode 100644 packages/core/modi_plus/module/input_module/button.py create mode 100644 packages/core/modi_plus/module/input_module/dial.py create mode 100644 packages/core/modi_plus/module/input_module/env.py create mode 100644 packages/core/modi_plus/module/input_module/imu.py create mode 100644 packages/core/modi_plus/module/input_module/joystick.py create mode 100644 packages/core/modi_plus/module/input_module/tof.py create mode 100644 packages/core/modi_plus/module/module.py create mode 100644 packages/core/modi_plus/module/output_module/__init__.py create mode 100644 packages/core/modi_plus/module/output_module/display.py create mode 100644 packages/core/modi_plus/module/output_module/led.py create mode 100644 packages/core/modi_plus/module/output_module/motor.py create mode 100644 packages/core/modi_plus/module/output_module/speaker.py create mode 100644 packages/core/modi_plus/module/setup_module/__init__.py create mode 100644 packages/core/modi_plus/module/setup_module/battery.py create mode 100644 packages/core/modi_plus/module/setup_module/network.py create mode 100644 packages/core/modi_plus/task/__init__.py create mode 100644 packages/core/modi_plus/task/ble_task/__init__.py create mode 100644 packages/core/modi_plus/task/ble_task/ble_task_linux.py create mode 100644 packages/core/modi_plus/task/ble_task/ble_task_mac.py create mode 100644 packages/core/modi_plus/task/ble_task/ble_task_rpi.py create mode 100644 packages/core/modi_plus/task/ble_task/ble_task_win.py create mode 100644 packages/core/modi_plus/task/ble_task/change_interval.sh create mode 100644 packages/core/modi_plus/task/connection_task.py create mode 100644 packages/core/modi_plus/task/exe_task.py create mode 100644 packages/core/modi_plus/task/serialport_task.py create mode 100644 packages/core/modi_plus/util/__init__.py create mode 100644 packages/core/modi_plus/util/connection_util.py create mode 100644 packages/core/modi_plus/util/inspection_util.py create mode 100644 packages/core/modi_plus/util/message_util.py create mode 100644 packages/core/modi_plus/util/modi_serialport.py create mode 100644 packages/core/modi_plus/util/tutorial_util.py create mode 100644 packages/core/modi_plus/util/unittest_util.py create mode 100644 packages/core/modi_plus/util/usage_util.py create mode 100644 packages/core/modi_plus/util/winusb.py create mode 100644 packages/core/pytest.ini create mode 100644 packages/core/requirements-dev.txt create mode 100644 packages/core/requirements.txt create mode 100644 packages/core/setup.cfg create mode 100644 packages/core/setup.py create mode 100644 packages/core/tests/__init__.py create mode 100644 packages/core/tests/module/__init__.py create mode 100644 packages/core/tests/module/input_module/__init__.py create mode 100644 packages/core/tests/module/input_module/test_button.py create mode 100644 packages/core/tests/module/input_module/test_dial.py create mode 100644 packages/core/tests/module/input_module/test_env.py create mode 100644 packages/core/tests/module/input_module/test_imu.py create mode 100644 packages/core/tests/module/input_module/test_joystick.py create mode 100644 packages/core/tests/module/input_module/test_tof.py create mode 100644 packages/core/tests/module/output_module/__init__.py create mode 100644 packages/core/tests/module/output_module/test_display.py create mode 100644 packages/core/tests/module/output_module/test_led.py create mode 100644 packages/core/tests/module/output_module/test_motor.py create mode 100644 packages/core/tests/module/output_module/test_speaker.py create mode 100644 packages/core/tests/module/setup_module/__init__.py create mode 100644 packages/core/tests/module/setup_module/test_battery.py create mode 100644 packages/core/tests/module/setup_module/test_network.py create mode 100644 packages/core/tests/task/__init__.py create mode 100644 packages/core/tests/task/test_conn_task.py create mode 100644 packages/core/tests/task/test_serialport_task.py create mode 100644 packages/web/LICENSE create mode 100644 packages/web/README.md create mode 100644 packages/web/modi_plus_web/__init__.py create mode 100644 packages/web/modi_plus_web/modi_plus_web.py create mode 100644 packages/web/modi_plus_web/task/__init__.py create mode 100644 packages/web/modi_plus_web/task/postmessage_task.py create mode 100644 packages/web/pytest.ini create mode 100644 packages/web/setup.py create mode 100644 packages/web/test_pyodide.html create mode 100644 packages/web/tests/__init__.py create mode 100644 packages/web/tests/test_modi_plus_web.py create mode 100644 packages/web/tests/test_postmessage_task.py create mode 100644 pyproject.toml diff --git a/Makefile b/Makefile index b57976d..54fd712 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -.PHONY: help install install-dev install-editable reinstall test test-pytest-all test-all test-input test-output test-task test-verbose test-examples-syntax lint format clean clean-build clean-pyc clean-test coverage docs dist release examples +.PHONY: help install install-dev install-editable reinstall test test-pytest-all test-all test-input test-output test-task test-verbose test-examples-syntax lint format clean clean-build clean-pyc clean-test coverage docs dist release examples test-core test-web install-core install-web build-core build-web .DEFAULT_GOAL := help # Python interpreter detection @@ -223,3 +223,53 @@ release: dist ## Package and upload a release @echo "$(BLUE)Uploading to PyPI...$(NC)" twine upload dist/* @echo "$(GREEN)✓ Release uploaded$(NC)" + +##@ Monorepo - Core Package + +install-core: ## Install core package (packages/core) + @echo "$(BLUE)Installing core package...$(NC)" + cd packages/core && $(PYTHON) -m pip install -e . + @echo "$(GREEN)✓ Core package installed$(NC)" + +test-core: ## Run core package tests + $(call check_command,pytest) + @echo "$(BLUE)Running core package tests...$(NC)" + $(PYTHON) -m pytest packages/core/tests/task/ packages/core/tests/module/input_module/ packages/core/tests/module/output_module/ -v + @echo "$(GREEN)✓ Core tests completed$(NC)" + +build-core: ## Build core package distribution + @echo "$(BLUE)Building core package...$(NC)" + cd packages/core && $(PYTHON) -m pip install --upgrade build && $(PYTHON) -m build + @echo "$(GREEN)✓ Core package built$(NC)" + +##@ Monorepo - Web Package + +install-web: install-core ## Install web package (depends on core) + @echo "$(BLUE)Installing web package...$(NC)" + cd packages/web && $(PYTHON) -m pip install -e . + @echo "$(GREEN)✓ Web package installed$(NC)" + +test-web: ## Run web package tests + $(call check_command,pytest) + @echo "$(BLUE)Running web package tests...$(NC)" + $(PYTHON) -m pytest packages/web/tests/ -v + @echo "$(GREEN)✓ Web tests completed$(NC)" + +build-web: ## Build web package distribution + @echo "$(BLUE)Building web package...$(NC)" + cd packages/web && $(PYTHON) -m pip install --upgrade build && $(PYTHON) -m build + @echo "$(GREEN)✓ Web package built$(NC)" + +##@ Monorepo - All Packages + +install-all: install-core install-web ## Install all packages + @echo "$(GREEN)✓ All packages installed$(NC)" + +test-monorepo: test-core test-web ## Run all package tests + @echo "" + @echo "$(GREEN)========================================$(NC)" + @echo "$(GREEN)✓ All monorepo tests passed!$(NC)" + @echo "$(GREEN)========================================$(NC)" + +build-all: build-core build-web ## Build all packages + @echo "$(GREEN)✓ All packages built$(NC)" diff --git a/README.md b/README.md index 9d344d1..cd38b0a 100644 --- a/README.md +++ b/README.md @@ -5,193 +5,112 @@ [![Read the Docs (version)](https://img.shields.io/readthedocs/pymodi-plus/latest?style=flat-square)](https://pymodi-plus.readthedocs.io/en/latest/?badge=master) [![GitHub Workflow Status (Build)](https://img.shields.io/github/actions/workflow/status/LUXROBO/pymodi-plus/build.yml?branch=master)](https://github.com/LUXROBO/pymodi-plus/actions) [![GitHub LICENSE](https://img.shields.io/github/license/LUXROBO/pymodi-plus?style=flat-square&color=blue)](https://github.com/LUXROBO/pymodi-plus/blob/master/LICENSE) -[![Lines of Code](https://img.shields.io/tokei/lines/github/LUXROBO/pymodi-plus?style=flat-square)](https://github.com/LUXROBO/pymodi-plus/tree/master/modi_plus) -Description -=========== -> Python API for controlling modular electronics, MODI+. +# PyMODI+ Monorepo +> Python API for controlling modular electronics, MODI+ - Desktop and Web support -Features --------- -PyMODI+ provides a control of modular electronics. -* Platform agnostic control of modules through serial connection -* Utilities of wireless connection with BLE (Bluetooth Low Engery) +This monorepo contains two packages: -Build Status ------------- -|master|develop| -|:---:|:---:| -| [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/LUXROBO/pymodi-plus/build.yml?branch=master)](https://github.com/LUXROBO/pymodi-plus/actions) | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/LUXROBO/pymodi-plus/build.yml?branch=develop)](https://github.com/LUXROBO/pymodi-plus/actions) +| Package | Description | PyPI | +|---------|-------------|------| +| **[packages/core](./packages/core/)** | Core library for desktop (USB/BLE) | `pymodi-plus` | +| **[packages/web](./packages/web/)** | Web extension for Pyodide/Browser | `pymodi-plus-web` | -System Support --------------- -| System | 3.7 | 3.8 | 3.9 | 3.10 | 3.11 | -| :---: | :---: | :---: | :---: | :---: | :---: | -| Linux | [![GitHub Workflow Status (branch)](https://img.shields.io/github/actions/workflow/status/LUXROBO/pymodi-plus/unit_test_ubuntu.yml?branch=master)](https://github.com/LUXROBO/pymodi-plus/actions) | [![GitHub Workflow Status (branch)](https://img.shields.io/github/actions/workflow/status/LUXROBO/pymodi-plus/unit_test_ubuntu.yml?branch=master)](https://github.com/LUXROBO/pymodi-plus/actions) | [![GitHub Workflow Status (branch)](https://img.shields.io/github/actions/workflow/status/LUXROBO/pymodi-plus/unit_test_ubuntu.yml?branch=master)](https://github.com/LUXROBO/pymodi-plus/actions) | [![GitHub Workflow Status (branch)](https://img.shields.io/github/actions/workflow/status/LUXROBO/pymodi-plus/unit_test_ubuntu.yml?branch=master)](https://github.com/LUXROBO/pymodi-plus/actions) | [![GitHub Workflow Status (branch)](https://img.shields.io/github/actions/workflow/status/LUXROBO/pymodi-plus/unit_test_ubuntu.yml?branch=master)](https://github.com/LUXROBO/pymodi-plus/actions) -| Mac OS | [![GitHub Workflow Status (branch)](https://img.shields.io/github/actions/workflow/status/LUXROBO/pymodi-plus/unit_test_macos.yml?branch=master)](https://github.com/LUXROBO/pymodi-plus/actions) | [![GitHub Workflow Status (branch)](https://img.shields.io/github/actions/workflow/status/LUXROBO/pymodi-plus/unit_test_macos.yml?branch=master)](https://github.com/LUXROBO/pymodi-plus/actions) | [![GitHub Workflow Status (branch)](https://img.shields.io/github/actions/workflow/status/LUXROBO/pymodi-plus/unit_test_macos.yml?branch=master)](https://github.com/LUXROBO/pymodi-plus/actions) | [![GitHub Workflow Status (branch)](https://img.shields.io/github/actions/workflow/status/LUXROBO/pymodi-plus/unit_test_macos.yml?branch=master)](https://github.com/LUXROBO/pymodi-plus/actions) | [![GitHub Workflow Status (branch)](https://img.shields.io/github/actions/workflow/status/LUXROBO/pymodi-plus/unit_test_macos.yml?branch=master)](https://github.com/LUXROBO/pymodi-plus/actions) -| Windows | [![GitHub Workflow Status (branch)](https://img.shields.io/github/actions/workflow/status/LUXROBO/pymodi-plus/unit_test_windows.yml?branch=master)](https://github.com/LUXROBO/pymodi-plus/actions) | [![GitHub Workflow Status (branch)](https://img.shields.io/github/actions/workflow/status/LUXROBO/pymodi-plus/unit_test_windows.yml?branch=master)](https://github.com/LUXROBO/pymodi-plus/actions) | [![GitHub Workflow Status (branch)](https://img.shields.io/github/actions/workflow/status/LUXROBO/pymodi-plus/unit_test_windows.yml?branch=master)](https://github.com/LUXROBO/pymodi-plus/actions) | [![GitHub Workflow Status (branch)](https://img.shields.io/github/actions/workflow/status/LUXROBO/pymodi-plus/unit_test_windows.yml?branch=master)](https://github.com/LUXROBO/pymodi-plus/actions) | [![GitHub Workflow Status (branch)](https://img.shields.io/github/actions/workflow/status/LUXROBO/pymodi-plus/unit_test_windows.yml?branch=master)](https://github.com/LUXROBO/pymodi-plus/actions) +## Quick Start -Contribution Guidelines ------------------------ -We appreciate all contributions. If you are planning to report bugs, please do so [here](https://github.com/LUXROBO/pymodi/issues). Feel free to fork our repository to your local environment, and please send us feedback by filing an issue. +### Desktop Usage (USB/BLE) -If you want to contribute to pymodi, be sure to review the contribution guidelines. This project adheres to pymodi's code of conduct. By participating, you are expected to uphold this code. - -[![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-v2.0%20adopted-ff69b4.svg?style=flat-square)](CODE_OF_CONDUCT.md) - -Installation ------------- -> When installing PyMODI+ package, we highly recommend you to use Anaconda to manage the distribution. -> With Anaconda, you can use an isolated virtual environment, solely for PyMODI+. - -[Optional] Once you install [Anaconda](https://docs.anaconda.com/anaconda/install/), then: -``` -# Install new python environment for PyMODI+ package, choose python version >= 3.7 -conda create --name pymodi_plus python=3.7 - -# After you properly install the python environment, activate it -conda activate pymodi_plus - -# Ensure that your python version is compatible with PyMODI+ -python --version -``` - -Install the latest PyMODI+ with all features (USB + BLE): ```bash +# Install with all features pip install pymodi-plus[all] -``` -Or install with specific features: -```bash -# USB/Serial connection only -pip install pymodi-plus[serial] +# Or minimal install +pip install pymodi-plus +``` -# BLE connection only -pip install pymodi-plus[ble] +```python +import modi_plus -# Minimal install (for web/Pyodide environments) -pip install pymodi-plus +bundle = modi_plus.MODIPlus() +led = bundle.leds[0] +led.turn_on() ``` -### Web/Pyodide Support +### Web/Pyodide Usage -For web browser environments using Pyodide, install [pymodi-plus-web](https://github.com/LUXROBO/pymodi-plus-web): ```python -# In Pyodide +# In Pyodide environment import micropip await micropip.install('pymodi-plus-web') from modi_plus_web import MODIPlusWeb + modi = MODIPlusWeb() +modi.set_send_callback(js_send_function) +# ... use like regular MODIPlus ``` -Usage ------ -Import modi_plus package and create MODIPlus object (we call it "bundle", a bundle of MODI+ modules). -```python -# Import modi_plus package -import modi_plus +## Development -""" -Create MODIPlus object, make sure that you have connected your network module -to your machine while other modules are attached to the network module -""" -bundle = modi_plus.MODIPlus() -``` +```bash +# Install all packages in development mode +make install-all -[Optional] Specify how you would like to establish the connection between your machine and the network module. -```python -# 1. Serial connection (via USB), it's the default connection method -bundle = modi_plus.MODIPlus(connection_type="serialport") +# Run all tests +make test-monorepo -# 2. BLE (Bluetooth Low Energy) connection, it's wireless! But it can be slow :( -bundle = modi_plus.MODIPlus(conn_type="ble", network_uuid="YOUR_NETWORK_MODULE_UUID") +# Build all packages +make build-all ``` -List and create connected modules' object. -```python -# List connected modules -print(bundle.modules) +### Package-specific commands -# List connected leds -print(bundle.leds) +```bash +# Core package +make install-core +make test-core +make build-core -# Pick the first led object from the bundle -led = bundle.leds[0] +# Web package +make install-web +make test-web +make build-web ``` -Let's blink the LED 5 times. -```python -import time - -for _ in range(5): - # turn on for 0.5 second - led.turn_on() - time.sleep(0.5) - - # turn off for 0.5 second - led.turn_off() - time.sleep(0.5) -``` +## Architecture -If you are still not sure how to use PyMODI, you can play PyMODI tutorial over REPL: -``` -$ python -m modi_plus --tutorial -``` -As well as an interactive usage examples: ``` -$ python -m modi_plus --usage +pymodi-plus/ +├── packages/ +│ ├── core/ # pymodi-plus (PyPI) +│ │ ├── modi_plus/ # Core library +│ │ ├── tests/ +│ │ └── setup.py +│ └── web/ # pymodi-plus-web (PyPI) +│ ├── modi_plus_web/ +│ ├── tests/ +│ └── setup.py +├── docs/ # Documentation +├── Makefile # Monorepo commands +└── pyproject.toml # Root configuration ``` -Additional Usage ----------------- -To diagnose MODI+ modules (helpful to find existing malfunctioning modules), -``` -$ python -m modi_plus --inspect -``` +## Documentation -To initialize MODI+ modules implicitly (set `i` flag to enable REPL mode), -``` -$ python -im modi_plus --initialize -``` +- [Quick Start Guide](./docs/getting-started/QUICKSTART.md) +- [Env Module RGB Features](./docs/features/ENV_RGB_FEATURE.md) +- [Development Guide](./docs/development/MAKEFILE_GUIDE.md) +- [Web Package README](./packages/web/README.md) -To see what other commands are available, -``` -$ python -m modi_plus --help -``` +## Contributing -Documentation -------------- -📚 **Complete documentation is available in the [docs/](./docs/) folder.** - -### Quick Links -- 🚀 [Quick Start Guide](./docs/getting-started/QUICKSTART.md) - Get up and running quickly -- ✨ [Env Module RGB Features](./docs/features/ENV_RGB_FEATURE.md) - New RGB sensor support (v2.x+) -- 🛠️ [Development Guide](./docs/development/MAKEFILE_GUIDE.md) - Build, test, and contribute -- 📦 [Deployment Guide](./docs/deployment/DEPLOY_GUIDE_KOREAN.md) - Release to PyPI -- 🐛 [Troubleshooting](./docs/troubleshooting/) - Platform-specific issues and fixes - -### What's New in v0.4.0 -- ✅ **RGB Color Sensor Support** for Env module v2.x+ - - New properties: `red`, `green`, `blue`, `white`, `black` - - Color classification: `color_class` (0-5) - - Brightness measurement: `brightness` (0-100%) -- ✅ **Enhanced Testing** - 94 tests across all platforms -- ✅ **Python 3.8-3.13 Support** - Wide version compatibility -- ✅ **Improved CI/CD** - GitHub Actions enhancements - -See [Release History](./docs/project/HISTORY.md) for complete changelog. - -Contributing ------------- We welcome contributions! Please see: - [Contributing Guidelines](./docs/getting-started/CONTRIBUTING.md) - [Code of Conduct](./docs/getting-started/CODE_OF_CONDUCT.md) -- [Development Guide](./docs/development/TESTS_README.md) -License -------- +## License + This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. diff --git a/packages/core/HISTORY.md b/packages/core/HISTORY.md new file mode 100644 index 0000000..a98144e --- /dev/null +++ b/packages/core/HISTORY.md @@ -0,0 +1,81 @@ +History +== + +0.4.2 (2025-12-22) +-- +* Feature +1. Add RGB raw value properties for Env module v2.x+ + - New properties: `raw_red`, `raw_green`, `raw_blue`, `raw_white` (0-65535) + - New property: `raw_rgb` tuple (raw_red, raw_green, raw_blue, raw_white) +2. Add `set_rgb_mode(mode, duration)` method for Env module + - RGB mode constants: `RGB_MODE_AMBIENT`, `RGB_MODE_ON`, `RGB_MODE_DUALSHOT` +3. Code style fixes for flake8 compatibility + +0.4.0 (2025-11-19) +-- +* Feature +1. Add RGB support for Env module v2.x+ + - New properties: `red`, `green`, `blue`, `white`, `black` (0-100%) + - New property: `rgb` - returns tuple (red, green, blue) + - New property: `color_class` (0-5: unknown/red/green/blue/white/black) + - New property: `brightness` (0-100%) + - Automatic version detection via `_is_rgb_supported()` method + - Raises `AttributeError` when accessing RGB properties on v1.x modules +2. Enhanced GitHub Actions workflows + - Support Python 3.8-3.13 across all platforms + - Platform-specific compatibility fixes (macOS, Windows) + - Improved CI/CD with conditional linting (flake8 for 3.8-3.11, ruff for 3.12+) + +* Tests +1. Add 31 new RGB-related tests + - Version compatibility tests + - RGB property tests + - Data type validation tests + - Total: 94 tests (all passing) + +* Documentation +1. Complete RGB feature documentation +2. GitHub Actions compatibility guides +3. Branch protection setup guide + +0.3.0 (2023-01-19) +-- +* Feature +1. Add `draw_dot` function on display module + +* Patch +1. Fix `write_text` function error on display module if text length is 23 +2. Change module constructor argument from uuid to id + +0.2.1 (2022-12-02) +-- +* Patch +1. Refactor `write_text` input type on display module + +0.2.0 (2022-12-02) +-- +* Feature +1. Refactor getter/setter for each MODI+ module + +0.1.1 (2022-11-23) +-- +* Feature +1. Change python minimum version to 3.7 + +0.1.0 (2022-11-22) +-- +* Feature +1. Add creation examples (brush, dodge) +2. Add network, battery module functions +3. Fix `play_music` function on speaker module +4. Add preset resource on speaker and display module +5. Add search module time and timeout exception + +0.0.2 (2022-11-18) +-- +* Feature +1. Change python minimum version to 3.9 + +0.0.1 (2022-11-15) +-- +* Release initial version of the package on in-house GitHub diff --git a/packages/core/LICENSE b/packages/core/LICENSE new file mode 100644 index 0000000..1aeaadd --- /dev/null +++ b/packages/core/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018, LUXROBO + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/core/MANIFEST.in b/packages/core/MANIFEST.in new file mode 100644 index 0000000..2721a0a --- /dev/null +++ b/packages/core/MANIFEST.in @@ -0,0 +1,15 @@ +include HISTORY.md +include LICENSE +include README.md + +include requirements.txt +include requirements-dev.txt + +recursive-include modi_plus/assets * +recursive-include modi_plus/task/ble_task * + +recursive-include tests * +recursive-exclude * __pycache__ +recursive-exclude * *.py[co] + +recursive-include docs conf.py Makefile make.bat diff --git a/packages/core/README.md b/packages/core/README.md new file mode 100644 index 0000000..9d344d1 --- /dev/null +++ b/packages/core/README.md @@ -0,0 +1,197 @@ +
+ +[![Python Versions](https://img.shields.io/pypi/pyversions/pymodi-plus.svg?style=flat-square)](https://pypi.python.org/pypi/pymodi-plus) +[![PyPI Release (latest by date)](https://img.shields.io/github/v/release/LUXROBO/pymodi-plus?style=flat-square)](https://pypi.python.org/pypi/pymodi-plus) +[![Read the Docs (version)](https://img.shields.io/readthedocs/pymodi-plus/latest?style=flat-square)](https://pymodi-plus.readthedocs.io/en/latest/?badge=master) +[![GitHub Workflow Status (Build)](https://img.shields.io/github/actions/workflow/status/LUXROBO/pymodi-plus/build.yml?branch=master)](https://github.com/LUXROBO/pymodi-plus/actions) +[![GitHub LICENSE](https://img.shields.io/github/license/LUXROBO/pymodi-plus?style=flat-square&color=blue)](https://github.com/LUXROBO/pymodi-plus/blob/master/LICENSE) +[![Lines of Code](https://img.shields.io/tokei/lines/github/LUXROBO/pymodi-plus?style=flat-square)](https://github.com/LUXROBO/pymodi-plus/tree/master/modi_plus) + +
+ +Description +=========== +> Python API for controlling modular electronics, MODI+. + + +Features +-------- +PyMODI+ provides a control of modular electronics. +* Platform agnostic control of modules through serial connection +* Utilities of wireless connection with BLE (Bluetooth Low Engery) + +Build Status +------------ +|master|develop| +|:---:|:---:| +| [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/LUXROBO/pymodi-plus/build.yml?branch=master)](https://github.com/LUXROBO/pymodi-plus/actions) | [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/LUXROBO/pymodi-plus/build.yml?branch=develop)](https://github.com/LUXROBO/pymodi-plus/actions) + +System Support +-------------- +| System | 3.7 | 3.8 | 3.9 | 3.10 | 3.11 | +| :---: | :---: | :---: | :---: | :---: | :---: | +| Linux | [![GitHub Workflow Status (branch)](https://img.shields.io/github/actions/workflow/status/LUXROBO/pymodi-plus/unit_test_ubuntu.yml?branch=master)](https://github.com/LUXROBO/pymodi-plus/actions) | [![GitHub Workflow Status (branch)](https://img.shields.io/github/actions/workflow/status/LUXROBO/pymodi-plus/unit_test_ubuntu.yml?branch=master)](https://github.com/LUXROBO/pymodi-plus/actions) | [![GitHub Workflow Status (branch)](https://img.shields.io/github/actions/workflow/status/LUXROBO/pymodi-plus/unit_test_ubuntu.yml?branch=master)](https://github.com/LUXROBO/pymodi-plus/actions) | [![GitHub Workflow Status (branch)](https://img.shields.io/github/actions/workflow/status/LUXROBO/pymodi-plus/unit_test_ubuntu.yml?branch=master)](https://github.com/LUXROBO/pymodi-plus/actions) | [![GitHub Workflow Status (branch)](https://img.shields.io/github/actions/workflow/status/LUXROBO/pymodi-plus/unit_test_ubuntu.yml?branch=master)](https://github.com/LUXROBO/pymodi-plus/actions) +| Mac OS | [![GitHub Workflow Status (branch)](https://img.shields.io/github/actions/workflow/status/LUXROBO/pymodi-plus/unit_test_macos.yml?branch=master)](https://github.com/LUXROBO/pymodi-plus/actions) | [![GitHub Workflow Status (branch)](https://img.shields.io/github/actions/workflow/status/LUXROBO/pymodi-plus/unit_test_macos.yml?branch=master)](https://github.com/LUXROBO/pymodi-plus/actions) | [![GitHub Workflow Status (branch)](https://img.shields.io/github/actions/workflow/status/LUXROBO/pymodi-plus/unit_test_macos.yml?branch=master)](https://github.com/LUXROBO/pymodi-plus/actions) | [![GitHub Workflow Status (branch)](https://img.shields.io/github/actions/workflow/status/LUXROBO/pymodi-plus/unit_test_macos.yml?branch=master)](https://github.com/LUXROBO/pymodi-plus/actions) | [![GitHub Workflow Status (branch)](https://img.shields.io/github/actions/workflow/status/LUXROBO/pymodi-plus/unit_test_macos.yml?branch=master)](https://github.com/LUXROBO/pymodi-plus/actions) +| Windows | [![GitHub Workflow Status (branch)](https://img.shields.io/github/actions/workflow/status/LUXROBO/pymodi-plus/unit_test_windows.yml?branch=master)](https://github.com/LUXROBO/pymodi-plus/actions) | [![GitHub Workflow Status (branch)](https://img.shields.io/github/actions/workflow/status/LUXROBO/pymodi-plus/unit_test_windows.yml?branch=master)](https://github.com/LUXROBO/pymodi-plus/actions) | [![GitHub Workflow Status (branch)](https://img.shields.io/github/actions/workflow/status/LUXROBO/pymodi-plus/unit_test_windows.yml?branch=master)](https://github.com/LUXROBO/pymodi-plus/actions) | [![GitHub Workflow Status (branch)](https://img.shields.io/github/actions/workflow/status/LUXROBO/pymodi-plus/unit_test_windows.yml?branch=master)](https://github.com/LUXROBO/pymodi-plus/actions) | [![GitHub Workflow Status (branch)](https://img.shields.io/github/actions/workflow/status/LUXROBO/pymodi-plus/unit_test_windows.yml?branch=master)](https://github.com/LUXROBO/pymodi-plus/actions) + +Contribution Guidelines +----------------------- +We appreciate all contributions. If you are planning to report bugs, please do so [here](https://github.com/LUXROBO/pymodi/issues). Feel free to fork our repository to your local environment, and please send us feedback by filing an issue. + +If you want to contribute to pymodi, be sure to review the contribution guidelines. This project adheres to pymodi's code of conduct. By participating, you are expected to uphold this code. + +[![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-v2.0%20adopted-ff69b4.svg?style=flat-square)](CODE_OF_CONDUCT.md) + +Installation +------------ +> When installing PyMODI+ package, we highly recommend you to use Anaconda to manage the distribution. +> With Anaconda, you can use an isolated virtual environment, solely for PyMODI+. + +[Optional] Once you install [Anaconda](https://docs.anaconda.com/anaconda/install/), then: +``` +# Install new python environment for PyMODI+ package, choose python version >= 3.7 +conda create --name pymodi_plus python=3.7 + +# After you properly install the python environment, activate it +conda activate pymodi_plus + +# Ensure that your python version is compatible with PyMODI+ +python --version +``` + +Install the latest PyMODI+ with all features (USB + BLE): +```bash +pip install pymodi-plus[all] +``` + +Or install with specific features: +```bash +# USB/Serial connection only +pip install pymodi-plus[serial] + +# BLE connection only +pip install pymodi-plus[ble] + +# Minimal install (for web/Pyodide environments) +pip install pymodi-plus +``` + +### Web/Pyodide Support + +For web browser environments using Pyodide, install [pymodi-plus-web](https://github.com/LUXROBO/pymodi-plus-web): +```python +# In Pyodide +import micropip +await micropip.install('pymodi-plus-web') + +from modi_plus_web import MODIPlusWeb +modi = MODIPlusWeb() +``` + +Usage +----- +Import modi_plus package and create MODIPlus object (we call it "bundle", a bundle of MODI+ modules). +```python +# Import modi_plus package +import modi_plus + +""" +Create MODIPlus object, make sure that you have connected your network module +to your machine while other modules are attached to the network module +""" +bundle = modi_plus.MODIPlus() +``` + +[Optional] Specify how you would like to establish the connection between your machine and the network module. +```python +# 1. Serial connection (via USB), it's the default connection method +bundle = modi_plus.MODIPlus(connection_type="serialport") + +# 2. BLE (Bluetooth Low Energy) connection, it's wireless! But it can be slow :( +bundle = modi_plus.MODIPlus(conn_type="ble", network_uuid="YOUR_NETWORK_MODULE_UUID") +``` + +List and create connected modules' object. +```python +# List connected modules +print(bundle.modules) + +# List connected leds +print(bundle.leds) + +# Pick the first led object from the bundle +led = bundle.leds[0] +``` + +Let's blink the LED 5 times. +```python +import time + +for _ in range(5): + # turn on for 0.5 second + led.turn_on() + time.sleep(0.5) + + # turn off for 0.5 second + led.turn_off() + time.sleep(0.5) +``` + +If you are still not sure how to use PyMODI, you can play PyMODI tutorial over REPL: +``` +$ python -m modi_plus --tutorial +``` +As well as an interactive usage examples: +``` +$ python -m modi_plus --usage +``` + +Additional Usage +---------------- +To diagnose MODI+ modules (helpful to find existing malfunctioning modules), +``` +$ python -m modi_plus --inspect +``` + +To initialize MODI+ modules implicitly (set `i` flag to enable REPL mode), +``` +$ python -im modi_plus --initialize +``` + +To see what other commands are available, +``` +$ python -m modi_plus --help +``` + +Documentation +------------- +📚 **Complete documentation is available in the [docs/](./docs/) folder.** + +### Quick Links +- 🚀 [Quick Start Guide](./docs/getting-started/QUICKSTART.md) - Get up and running quickly +- ✨ [Env Module RGB Features](./docs/features/ENV_RGB_FEATURE.md) - New RGB sensor support (v2.x+) +- 🛠️ [Development Guide](./docs/development/MAKEFILE_GUIDE.md) - Build, test, and contribute +- 📦 [Deployment Guide](./docs/deployment/DEPLOY_GUIDE_KOREAN.md) - Release to PyPI +- 🐛 [Troubleshooting](./docs/troubleshooting/) - Platform-specific issues and fixes + +### What's New in v0.4.0 +- ✅ **RGB Color Sensor Support** for Env module v2.x+ + - New properties: `red`, `green`, `blue`, `white`, `black` + - Color classification: `color_class` (0-5) + - Brightness measurement: `brightness` (0-100%) +- ✅ **Enhanced Testing** - 94 tests across all platforms +- ✅ **Python 3.8-3.13 Support** - Wide version compatibility +- ✅ **Improved CI/CD** - GitHub Actions enhancements + +See [Release History](./docs/project/HISTORY.md) for complete changelog. + +Contributing +------------ +We welcome contributions! Please see: +- [Contributing Guidelines](./docs/getting-started/CONTRIBUTING.md) +- [Code of Conduct](./docs/getting-started/CODE_OF_CONDUCT.md) +- [Development Guide](./docs/development/TESTS_README.md) + +License +------- +This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. diff --git a/packages/core/examples/basic_usage_examples/active_error.py b/packages/core/examples/basic_usage_examples/active_error.py new file mode 100644 index 0000000..a117d48 --- /dev/null +++ b/packages/core/examples/basic_usage_examples/active_error.py @@ -0,0 +1,29 @@ +import modi_plus +import time +bundle=modi_plus.MODIPlus() + +led=bundle.leds[0] +time.sleep(3) +led.red=255 +time.sleep(3) +led.red=0 +time.sleep(1) + +led.green=100 +time.sleep(3) +led.green=0 +time.sleep(1) + +led.blue=100 +time.sleep(3) +led.blue=0 +time.sleep(1) + +led.turn_on() +time.sleep(2) +led.turn_off() +time.sleep(1) + +led.rgb=(100, 0, 100) +time.sleep(2) +led.turn_off() diff --git a/packages/core/examples/basic_usage_examples/battery_example.py b/packages/core/examples/basic_usage_examples/battery_example.py new file mode 100644 index 0000000..bb3fb49 --- /dev/null +++ b/packages/core/examples/basic_usage_examples/battery_example.py @@ -0,0 +1,16 @@ +import modi_plus +import time + +""" +Example script for the usage of battery module +Make sure you connect 1 battery module to your +network module +""" + +if __name__ == "__main__": + bundle = modi_plus.MODIPlus() + battery = bundle.batterys[0] + + while True: + print(f"level(%): {battery.level:<10}", end="\r") + time.sleep(0.02) diff --git a/packages/core/examples/basic_usage_examples/button_example.py b/packages/core/examples/basic_usage_examples/button_example.py new file mode 100644 index 0000000..e145a9d --- /dev/null +++ b/packages/core/examples/basic_usage_examples/button_example.py @@ -0,0 +1,22 @@ +import modi_plus +import time + +""" +Example script for the usage of button module +Make sure you connect 1 button module to your +network module +""" + +if __name__ == "__main__": + bundle = modi_plus.MODIPlus() + button = bundle.buttons[0] + + while True: + if button.pressed: + print("pressed ", end="\r") + else: + print("not pressed ", end="\r") + if button.double_clicked: + print("double clicked", end="\r") + break + time.sleep(0.02) diff --git a/packages/core/examples/basic_usage_examples/dial_example.py b/packages/core/examples/basic_usage_examples/dial_example.py new file mode 100644 index 0000000..1cdba74 --- /dev/null +++ b/packages/core/examples/basic_usage_examples/dial_example.py @@ -0,0 +1,16 @@ +import modi_plus +import time + +""" +Example script for the usage of dial module +Make sure you connect 1 dial module and 1 speaker module to your network module +""" + +if __name__ == "__main__": + bundle = modi_plus.MODIPlus() + dial = bundle.dials[0] + speak = bundle.speakers[0] + + while True: + speak.tune = "DO6", dial.turn + time.sleep(0.02) diff --git a/packages/core/examples/basic_usage_examples/display_example.py b/packages/core/examples/basic_usage_examples/display_example.py new file mode 100644 index 0000000..1460e20 --- /dev/null +++ b/packages/core/examples/basic_usage_examples/display_example.py @@ -0,0 +1,33 @@ +import modi_plus +import time + +""" +Example script for the usage of display module +Make sure you connect 1 display module to your network module +""" + +if __name__ == "__main__": + bundle = modi_plus.MODIPlus() + display = bundle.displays[0] + + display.text = "Bouncing ball simulation..." + time.sleep(3) + + vel = (1, 1) + pos = (20, 30) + + for i in range(500): + display.write_variable_xy(pos[0], pos[1], 0) + pos = (pos[0] + vel[0], pos[1] + vel[1]) + if pos[0] < 0 or pos[0] > 40: + vel = (-vel[0], vel[1]) + if pos[1] < 0 or pos[1] > 60: + vel = (vel[0], -vel[1]) + if pos[1] < 0: + pos = (pos[0], 0) + if pos[0] < 0: + pos = (0, pos[1]) + time.sleep(0.02) + + display.reset() + time.sleep(2) diff --git a/packages/core/examples/basic_usage_examples/env_example.py b/packages/core/examples/basic_usage_examples/env_example.py new file mode 100644 index 0000000..866f207 --- /dev/null +++ b/packages/core/examples/basic_usage_examples/env_example.py @@ -0,0 +1,16 @@ +import modi_plus +import time + +""" +Example script for the usage of env module +Make sure you connect 1 env module to your network module +""" + +if __name__ == "__main__": + bundle = modi_plus.MODIPlus() + env = bundle.envs[0] + + while True: + print(f"humidity(%): {env.humidity:<10} temperature(°C): {env.temperature:<10} " + f"illuminance(%): {env.illuminance:<10} Volume(%): {env.volume:<10}", end="\r") + time.sleep(0.02) diff --git a/packages/core/examples/basic_usage_examples/env_rgb_color_detection.py b/packages/core/examples/basic_usage_examples/env_rgb_color_detection.py new file mode 100644 index 0000000..491d86f --- /dev/null +++ b/packages/core/examples/basic_usage_examples/env_rgb_color_detection.py @@ -0,0 +1,144 @@ +"""Example: RGB Color Detection with multiple Env modules + +This example demonstrates color detection using RGB sensors. +Works with multiple Env modules simultaneously. +""" + +import modi_plus +import time + + +def detect_color(r, g, b, threshold=50): + """Detect dominant color from RGB values + + Args: + r, g, b: RGB values (0-255) + threshold: Minimum difference to consider dominant + + Returns: + Color name string + """ + # Calculate relative differences + colors = {'R': r, 'G': g, 'B': b} + max_color = max(colors, key=colors.get) + max_value = colors[max_color] + + # Check if dominant enough + other_values = [v for k, v in colors.items() if k != max_color] + if max_value - max(other_values) < threshold: + return "MIXED/GRAY" + + # Determine color + if max_color == 'R': + if g > 100 and b < 50: + return "YELLOW" + elif g < 50 and b < 50: + return "RED" + elif g > 100 and b > 100: + return "WHITE" + elif max_color == 'G': + if r < 50 and b < 50: + return "GREEN" + elif r > 100 and b > 100: + return "WHITE" + elif max_color == 'B': + if r < 50 and g < 50: + return "BLUE" + elif r > 100 and g < 50: + return "PURPLE" + elif r > 100 and g > 100: + return "WHITE" + + return "MIXED" + + +def get_rgb_modules(bundle): + """Get all RGB-capable Env modules""" + rgb_modules = [] + for i, env in enumerate(bundle.envs): + if hasattr(env, '_is_rgb_supported') and env._is_rgb_supported(): + rgb_modules.append({ + 'index': i, + 'env': env, + 'id': env.id, + 'version': env.app_version + }) + return rgb_modules + + +def color_detection_demo(rgb_modules): + """Run color detection on all RGB modules""" + print(f"\n{'=' * 70}") + print(f"Color Detection - {len(rgb_modules)} RGB Sensor(s)") + print("Press Ctrl+C to stop") + print(f"{'=' * 70}\n") + + try: + while True: + output_lines = [] + + for m in rgb_modules: + try: + m['env'].set_rgb_mode(m['env'].RGB_MODE_DUALSHOT) + # m['env'].set_rgb_mode(m['env'].RGB_MODE_ON) + # Ensure RGB mode is enabled + r, g, b = m['env'].rgb + color = detect_color(r, g, b) + + # Create color bar (simple ASCII visualization) + r_bar = '█' * (r // 10) + g_bar = '█' * (g // 10) + b_bar = '█' * (b // 10) + + output_lines.append( + f"Module #{m['index'] + 1} (0x{m['id']:X}): " + f"RGB=({r:3d}, {g:3d}, {b:3d}) -> {color:12s}" + ) + output_lines.append(f" R: {r_bar}") + output_lines.append(f" G: {g_bar}") + output_lines.append(f" B: {b_bar}") + output_lines.append("") + + except Exception as e: + output_lines.append(f"Module #{m['index'] + 1}: Error - {e}\n") + + # Clear and display + print("\033[2J\033[H", end="") # Clear screen + print(f"{'=' * 70}") + print("RGB Color Detection Monitor") + print(f"{'=' * 70}\n") + for line in output_lines: + print(line) + + time.sleep(0.2) + + except KeyboardInterrupt: + print("\n\nStopped by user") + + +if __name__ == "__main__": + bundle = modi_plus.MODIPlus() + + print("=" * 70) + print("RGB Color Detection Example") + print("=" * 70) + + # Find RGB-capable modules + print(f"\nScanning for RGB-capable Env modules...") + rgb_modules = get_rgb_modules(bundle) + + if not rgb_modules: + print("\nError: No RGB-capable Env modules found!") + print("This example requires Env module version 2.x or higher") + bundle.close() + exit(1) + + print(f"Found {len(rgb_modules)} RGB-capable module(s):") + for m in rgb_modules: + print(f" Module #{m['index'] + 1}: ID=0x{m['id']:X}, Version={m['version']}") + + # Start color detection + input("\nPress Enter to start color detection...") + color_detection_demo(rgb_modules) + + bundle.close() diff --git a/packages/core/examples/basic_usage_examples/env_rgb_example.py b/packages/core/examples/basic_usage_examples/env_rgb_example.py new file mode 100644 index 0000000..5f8cbef --- /dev/null +++ b/packages/core/examples/basic_usage_examples/env_rgb_example.py @@ -0,0 +1,173 @@ +"""Example of using Env module RGB and color properties + +This example demonstrates how to use the color sensor properties +of the Env module including: +- RGB (red, green, blue) values +- White and Black values +- Color class detection (red/green/blue/white/black/unknown) +- Brightness value + +Note: These properties are only available in version 2.x and above. +This example tests ALL connected Env modules. +""" + +import os +import sys + +import modi_plus +import time + +# --- OS 구분 --- +IS_WINDOWS = (os.name == "nt") + +if IS_WINDOWS: + import msvcrt +else: + import termios + import tty + import select + + +def get_key_nonblocking(): + """ + - 키가 눌리면: 1글자(str) 반환 + - 아무 키도 없으면: None 반환 + """ + if IS_WINDOWS: + # Windows: msvcrt 사용 + if msvcrt.kbhit(): + ch = msvcrt.getch() + try: + return ch.decode(errors="ignore") + except Exception: + return None + return None + else: + # macOS / Linux: select + cbreak 모드에서 stdin 읽기 + dr, _, _ = select.select([sys.stdin], [], [], 0) + if dr: + return sys.stdin.read(1) + return None + + +# --- macOS / Linux에서는 터미널 모드 변경 필요(cbreak) --- +if not IS_WINDOWS: + fd = sys.stdin.fileno() + old_term_attr = termios.tcgetattr(fd) + tty.setcbreak(fd) # Enter 없이 한 글자씩 읽히도록 + +def test_env_module(env, index): + """Test a single Env module for RGB support""" + print(f"\n{'=' * 60}") + print(f"Env Module #{index + 1} (ID: 0x{env.id:X})") + print(f"{'=' * 60}") + print(f"App Version: {env.app_version}") + + # Check if version supports RGB + if hasattr(env, '_is_rgb_supported') and env._is_rgb_supported(): + print("✓ RGB properties are supported!") + return True + else: + print("✗ RGB properties are NOT supported in this version") + print("Please upgrade firmware to version 2.x or above") + print("\nAvailable properties:") + print(f" - Temperature: {env.temperature}°C") + print(f" - Humidity: {env.humidity}%") + print(f" - Illuminance: {env.illuminance} lux") + print(f" - Volume: {env.volume} dB") + return False + + +if __name__ == "__main__": + bundle = modi_plus.MODIPlus() + + print("=" * 60) + print("Env Module Color Sensor Example - Multi-Module Support") + print("=" * 60) + + # Check how many Env modules are connected + num_envs = len(bundle.envs) + print(f"\nFound {num_envs} Env module(s)") + + if num_envs == 0: + print("Error: No Env modules found!") + bundle.close() + exit(1) + + # Test each Env module + rgb_supported_modules = [] + for i, env in enumerate(bundle.envs): + if test_env_module(env, i): + rgb_supported_modules.append((i, env)) + + stop_flag = False + + # If any module supports RGB, start continuous reading + if rgb_supported_modules: + print(f"\n{'=' * 60}") + print(f"Reading color sensor values from {len(rgb_supported_modules)} module(s)") + print("Press Ctrl+C to stop") + print(f"{'=' * 60}\n") + + # Color class 이름 매핑 + color_names = { + 0: "unknown", + 1: "red", + 2: "green", + 3: "blue", + 4: "white", + 5: "black" + } + + try: + while True: + ch = get_key_nonblocking() + if ch is not None: + ch = ch.lower() + if ch == 'q': + print("\n\nStop command received. Exiting...") + break + elif ch == 's': + stop_flag = not stop_flag + if stop_flag: + print("\nReading paused. Press 's' to resume.") + else: + print("\nReading resumed.") + + if stop_flag: + time.sleep(0.1) + continue + + # Read and display all color properties from all supported modules + for idx, env in rgb_supported_modules: + # env.set_rgb_mode(env.RGB_MODE_DUALSHOT) + env.set_rgb_mode(env.RGB_MODE_AMBIENT) + try: + r, g, b = env.rgb + white = env.white + black = env.black + color_class = env.color_class + brightness = env.brightness + color_name = color_names.get(color_class, "unknown") + + print(f"Module #{idx + 1}: ", end="") + print(f"RGB=({r:3d},{g:3d},{b:3d}) ", end="") + print(f"W={white:3d} B={black:3d} ", end="") + print(f"Bright={brightness:3d} ", end="") + print(f"Color={color_name:7s}", end=" ") + except Exception as e: + print(f"Module #{idx + 1}: Error - {e}", end=" ") + + print("\r", end="", flush=True) + time.sleep(0.1) + + except KeyboardInterrupt: + print("\n\nStopped by user") + + else: + print(f"\n{'=' * 60}") + print("No modules with RGB support found.") + print("All connected modules are version 1.x") + print(f"{'=' * 60}") + + bundle.close() diff --git a/packages/core/examples/basic_usage_examples/env_rgb_mixed_versions.py b/packages/core/examples/basic_usage_examples/env_rgb_mixed_versions.py new file mode 100644 index 0000000..4728567 --- /dev/null +++ b/packages/core/examples/basic_usage_examples/env_rgb_mixed_versions.py @@ -0,0 +1,133 @@ +"""Example: Mixed version Env modules (v1.x and v2.x together) + +This example shows how to handle multiple Env modules with different versions. +Some modules may support RGB (v2.x+) while others don't (v1.x). +""" + +import modi_plus +import time + + +def classify_env_modules(envs): + """Classify Env modules by RGB support""" + rgb_modules = [] + legacy_modules = [] + + for i, env in enumerate(envs): + module_info = { + 'index': i, + 'env': env, + 'id': env.id, + 'version': env.app_version + } + + if hasattr(env, '_is_rgb_supported') and env._is_rgb_supported(): + rgb_modules.append(module_info) + else: + legacy_modules.append(module_info) + + return rgb_modules, legacy_modules + + +def print_module_summary(rgb_modules, legacy_modules): + """Print summary of all connected modules""" + total = len(rgb_modules) + len(legacy_modules) + + print(f"\n{'=' * 70}") + print(f"Connected Env Modules Summary ({total} total)") + print(f"{'=' * 70}") + + if rgb_modules: + print(f"\n✓ RGB-capable modules (v2.x+): {len(rgb_modules)}") + for m in rgb_modules: + print(f" Module #{m['index'] + 1}: ID=0x{m['id']:X}, Version={m['version']}") + + if legacy_modules: + print(f"\n✗ Legacy modules (v1.x): {len(legacy_modules)}") + for m in legacy_modules: + print(f" Module #{m['index'] + 1}: ID=0x{m['id']:X}, Version={m['version']}") + + +def read_all_sensors(rgb_modules, legacy_modules): + """Read all available sensors from all modules""" + print(f"\n{'=' * 70}") + print("Reading sensor values from all modules (Press Ctrl+C to stop)") + print(f"{'=' * 70}\n") + + try: + while True: + output_lines = [] + + # Read RGB from v2.x modules + if rgb_modules: + output_lines.append("RGB Modules:") + for m in rgb_modules: + try: + r, g, b = m['env'].rgb + temp = m['env'].temperature + output_lines.append( + f" #{m['index'] + 1}: RGB=({r:3d},{g:3d},{b:3d}) " + f"Temp={temp:2d}°C" + ) + except Exception as e: + output_lines.append(f" #{m['index'] + 1}: Error - {e}") + + # Read sensors from v1.x modules + if legacy_modules: + output_lines.append("\nLegacy Modules:") + for m in legacy_modules: + try: + temp = m['env'].temperature + hum = m['env'].humidity + lux = m['env'].illuminance + output_lines.append( + f" #{m['index'] + 1}: Temp={temp:2d}°C " + f"Humidity={hum:2d}% Lux={lux:3d}" + ) + except Exception as e: + output_lines.append(f" #{m['index'] + 1}: Error - {e}") + + # Clear screen and print + print("\033[2J\033[H", end="") # Clear screen + print(f"{'=' * 70}") + print("Multi-Version Env Modules Monitor") + print(f"{'=' * 70}") + for line in output_lines: + print(line) + + time.sleep(0.2) + + except KeyboardInterrupt: + print("\n\nStopped by user") + + +if __name__ == "__main__": + bundle = modi_plus.MODIPlus() + + print("=" * 70) + print("Mixed Version Env Modules Example") + print("=" * 70) + + # Check connected modules + num_envs = len(bundle.envs) + print(f"\nDetecting Env modules... Found {num_envs} module(s)") + + if num_envs == 0: + print("Error: No Env modules found!") + bundle.close() + exit(1) + + # Classify by version + rgb_modules, legacy_modules = classify_env_modules(bundle.envs) + + # Print summary + print_module_summary(rgb_modules, legacy_modules) + + # Start reading + if rgb_modules or legacy_modules: + input("\nPress Enter to start monitoring...") + read_all_sensors(rgb_modules, legacy_modules) + else: + print("\nNo modules found!") + + bundle.close() diff --git a/packages/core/examples/basic_usage_examples/env_rgb_stats.py b/packages/core/examples/basic_usage_examples/env_rgb_stats.py new file mode 100644 index 0000000..b29616b --- /dev/null +++ b/packages/core/examples/basic_usage_examples/env_rgb_stats.py @@ -0,0 +1,332 @@ +"""Example of using Env module RGB and color properties + +This example demonstrates how to use the color sensor properties +of the Env module including: +- RGB (red, green, blue) values +- White and Black values +- Color class detection (red/green/blue/white/black/unknown) +- Brightness value + +Note: These properties are only available in version 2.x and above. +This example tests ALL connected Env modules. +""" + +import os +import sys + +from dataclasses import dataclass +from typing import Dict, Optional, Tuple + +import modi_plus +import time + +# --- OS 구분 --- +IS_WINDOWS = (os.name == "nt") + +if IS_WINDOWS: + import msvcrt +else: + import termios + import tty + import select + + +# --------------------------------------------------------------------------- +# Statistics helpers (refactored from globals -> class) +# --------------------------------------------------------------------------- + +@dataclass +class RunningStat: + """min/max/avg용 누적 통계""" + min: Optional[int] = None + max: Optional[int] = None + sum: int = 0 + count: int = 0 + + def update(self, value: int) -> None: + if self.min is None or value < self.min: + self.min = value + if self.max is None or value > self.max: + self.max = value + self.sum += int(value) + self.count += 1 + + @property + def avg(self) -> float: + return (self.sum / self.count) if self.count else 0.0 + + +class EnvStats: + """Env RGB/조도 측정값 + color_name count 통계를 관리""" + + def __init__(self, metric_names=None) -> None: + if metric_names is None: + metric_names = ("raw_r", "raw_g", "raw_b", "raw_w", "r", "g", "b", "white", "black", "brightness") + self._metric_names = tuple(metric_names) + self.reset() + + def reset(self) -> None: + # 숫자 통계 + self.metrics: Dict[str, RunningStat] = {n: RunningStat() for n in self._metric_names} + # color_name 통계 + self.color_counts: Dict[str, int] = {} + + def update_metric(self, name: str, value: int) -> None: + if name not in self.metrics: + # 오타/새 항목이 들어와도 안전하게 처리 + self.metrics[name] = RunningStat() + self.metrics[name].update(value) + + def update_color(self, color_name: Optional[str]) -> None: + if not color_name: + color_name = "None" + self.color_counts[color_name] = self.color_counts.get(color_name, 0) + 1 + + def top_color(self) -> Tuple[str, int]: + if not self.color_counts: + return ("N/A", 0) + name, cnt = max(self.color_counts.items(), key=lambda x: x[1]) + return (name, cnt) + + def print_stats(self) -> None: + """현재까지 누적된 통계 출력""" + print("\n\n=== Measurement Statistics ===") + for name in self._metric_names: + s = self.metrics[name] + if s.count == 0: + print(f"{name:10s}: no data") + else: + print(f"{name:10s} min={s.min:4d} max={s.max:4d} avg={s.avg:8.2f} (n={s.count})") + + # color_name 통계 + print("\n=== Color Name Counts ===") + if not self.color_counts: + print("no color data") + return + + sorted_colors = sorted(self.color_counts.items(), key=lambda x: -x[1]) + max_count = sorted_colors[0][1] if sorted_colors else 0 + top_color = sorted_colors[0][0] if sorted_colors else "N/A" + + for cname, cnt in sorted_colors: + line = f"{cname:10s}: {cnt:5d}" + if cnt == max_count: + line += " <== The top-ranked color" + print(line) + + # 요약 한줄 + raw_r = self.metrics["raw_r"].avg + raw_g = self.metrics["raw_g"].avg + raw_b = self.metrics["raw_b"].avg + raw_w = self.metrics["raw_w"].avg + + r = self.metrics["r"].avg + g = self.metrics["g"].avg + b = self.metrics["b"].avg + w = self.metrics["white"].avg + k = self.metrics["black"].avg + print("\n[Summary] RAW_R,RAW_G,RAW_B,RAW_W,R,G,B,W,K Avg,Top Color") + print(f"{raw_r:.1f},{raw_g:.1f},{raw_b:.1f},{raw_w:.1f},", end="") + print(f"{r:.1f},{g:.1f},{b:.1f},{w:.1f},{k:.1f},{top_color}") + + +# 통계 인스턴스 딕셔너리: module_idx -> EnvStats +# rgb_supported_modules 기준으로 동적 생성 +stats_by_module: Dict[int, EnvStats] = {} + + +def get_stats(module_idx: int) -> EnvStats: + """모듈 인덱스에 해당하는 EnvStats 반환 (없으면 생성)""" + if module_idx not in stats_by_module: + stats_by_module[module_idx] = EnvStats() + return stats_by_module[module_idx] + + +def reset_all_stats() -> None: + """모든 모듈의 통계 초기화""" + for s in stats_by_module.values(): + s.reset() + + +def print_all_stats() -> None: + """모든 모듈의 통계 출력""" + for module_idx, s in sorted(stats_by_module.items()): + print(f"\n{'#' * 60}") + print(f"# Module #{module_idx + 1} Statistics") + print(f"{'#' * 60}") + s.print_stats() +def get_key_nonblocking(): + """ + - 키가 눌리면: 1글자(str) 반환 + - 아무 키도 없으면: None 반환 + """ + if IS_WINDOWS: + # Windows: msvcrt 사용 + if msvcrt.kbhit(): + ch = msvcrt.getch() + try: + return ch.decode(errors="ignore") + except Exception: + return None + return None + else: + # macOS / Linux: select + cbreak 모드에서 stdin 읽기 + dr, _, _ = select.select([sys.stdin], [], [], 0) + if dr: + return sys.stdin.read(1) + return None + + +# --- macOS / Linux에서는 터미널 모드 변경 필요(cbreak) --- +if not IS_WINDOWS: + fd = sys.stdin.fileno() + old_term_attr = termios.tcgetattr(fd) + tty.setcbreak(fd) # Enter 없이 한 글자씩 읽히도록 + +def test_env_module(env, index): + """Test a single Env module for RGB support""" + print(f"\n{'=' * 60}") + print(f"Env Module #{index + 1} (ID: 0x{env.id:X})") + print(f"{'=' * 60}") + print(f"App Version: {env.app_version}") + + # Check if version supports RGB + if hasattr(env, '_is_rgb_supported') and env._is_rgb_supported(): + print("✓ RGB properties are supported!") + return True + else: + print("✗ RGB properties are NOT supported in this version") + print("Please upgrade firmware to version 2.x or above") + print("\nAvailable properties:") + print(f" - Temperature: {env.temperature}°C") + print(f" - Humidity: {env.humidity}%") + print(f" - Illuminance: {env.illuminance} lux") + print(f" - Volume: {env.volume} dB") + return False + + +if __name__ == "__main__": + bundle = modi_plus.MODIPlus() + + print("=" * 60) + print("Env Module Color Sensor Example - Multi-Module Support") + print("=" * 60) + + # Check how many Env modules are connected + num_envs = len(bundle.envs) + print(f"\nFound {num_envs} Env module(s)") + + if num_envs == 0: + print("Error: No Env modules found!") + bundle.close() + exit(1) + + # Test each Env module + rgb_supported_modules = [] + for i, env in enumerate(bundle.envs): + if test_env_module(env, i): + rgb_supported_modules.append((i, env)) + + stop_flag = False + + # If any module supports RGB, start continuous reading + if rgb_supported_modules: + print(f"\n{'=' * 60}") + print(f"Reading color sensor values from {len(rgb_supported_modules)} module(s)") + print("Press Ctrl+C to stop") + print(f"{'=' * 60}\n") + + # Color class 이름 매핑 + color_names = { + 0: "unknown", + 1: "red", + 2: "green", + 3: "blue", + 4: "white", + 5: "black" + } + + # 각 모듈별 통계 초기화 + for idx, env in rgb_supported_modules: + get_stats(idx).reset() + stats_count = 0 + try: + while True: + ch = get_key_nonblocking() + if ch is not None: + ch = ch.lower() + if ch == 'q': + print("\n\nStop command received. Exiting...") + break + elif ch == 's': + stop_flag = not stop_flag + if stop_flag: + print("\nReading paused. Press 's' to resume.") + print_all_stats() + reset_all_stats() + stats_count = 0 + else: + reset_all_stats() + stats_count = 0 + print("\nReading resumed.") + elif stats_count >= 100: + stop_flag = True + print_all_stats() + reset_all_stats() + stats_count = 0 + + if stop_flag: + time.sleep(0.1) + continue + + # Read and display all color properties from all supported modules + for idx, env in rgb_supported_modules: + # env.set_rgb_mode(env.RGB_MODE_DUALSHOT) + env.set_rgb_mode(env.RGB_MODE_ON, 300) + try: + r, g, b = env.rgb + raw_r, raw_g, raw_b, raw_w = env.raw_rgb + white = env.white + black = env.black + color_class = env.color_class + brightness = env.brightness + color_name = color_names.get(color_class, "unknown") + + # --- 모듈별 통계 갱신 --- + module_stats = get_stats(idx) + module_stats.update_metric("raw_r", raw_r) + module_stats.update_metric("raw_g", raw_g) + module_stats.update_metric("raw_b", raw_b) + module_stats.update_metric("raw_w", raw_w) + + module_stats.update_metric("r", r) + module_stats.update_metric("g", g) + module_stats.update_metric("b", b) + module_stats.update_metric("white", white) + module_stats.update_metric("black", black) + module_stats.update_metric("brightness", brightness) + module_stats.update_color(color_name) + + print(f"Module #{idx + 1}: ", end="") + print(f"RAW_RGB=({raw_r:5d},{raw_g:5d},{raw_b:5d},{raw_w:5d}) ", end="") + print(f"RGB=({r:3d},{g:3d},{b:3d}) ", end="") + print(f"W={white:3d} B={black:3d} ", end="") + print(f"Bright={brightness:3d} ", end="") + print(f"Color={color_name:7s}", end=" ") + stats_count += 1 + except Exception as e: + print(f"Module #{idx + 1}: Error - {e}", end=" ") + + print("\r", end="", flush=True) + time.sleep(0.1) + + except KeyboardInterrupt: + print("\n\nStopped by user") + + else: + print(f"\n{'=' * 60}") + print("No modules with RGB support found.") + print("All connected modules are version 1.x") + print(f"{'=' * 60}") + + bundle.close() \ No newline at end of file diff --git a/packages/core/examples/basic_usage_examples/error1.py b/packages/core/examples/basic_usage_examples/error1.py new file mode 100644 index 0000000..0b7dc9e --- /dev/null +++ b/packages/core/examples/basic_usage_examples/error1.py @@ -0,0 +1,23 @@ +import modi_plus +import time + +bundle = modi_plus.MODIPlus() + +button = bundle.buttons[0] +led = bundle.leds[0] + +mode = 0 +while True: + if button.double_clicked: + break + if button.clicked: + mode = mode + 1 + if mode == 1: + led.rgb = 20, 20, 20 + elif mode == 2: + led.rgb = 60, 60, 60 + elif mode == 3: + led.rgb = 100, 100, 100 + elif mode == 4: + led.rgb = 0, 0, 0 + mode = 0 diff --git a/packages/core/examples/basic_usage_examples/imu_example.py b/packages/core/examples/basic_usage_examples/imu_example.py new file mode 100644 index 0000000..24d8af8 --- /dev/null +++ b/packages/core/examples/basic_usage_examples/imu_example.py @@ -0,0 +1,23 @@ +import modi_plus +import time + +""" +Example script for the usage of imu module +Make sure you connect 1 imu module to your network module +""" + +if __name__ == "__main__": + bundle = modi_plus.MODIPlus() + imu = bundle.imus[0] + + while True: + print(f"Angle_y: {imu.angle_y:<10}" + f"Angle_x: {imu.angle_x:<10}" + f"Angle_z: {imu.angle_z:<10}" + f"Vel x: {imu.angular_vel_x:<10}" + f"Vel y: {imu.angular_vel_y:<10}" + f"Vel z: {imu.angular_vel_z:<10}" + f"Acc x: {imu.acceleration_x:<10}" + f"Acc y: {imu.acceleration_y:<10}" + f"Acc z: {imu.acceleration_z:<10}", end="\r") + time.sleep(0.02) diff --git a/packages/core/examples/basic_usage_examples/joystick_example.py b/packages/core/examples/basic_usage_examples/joystick_example.py new file mode 100644 index 0000000..8bbf9b4 --- /dev/null +++ b/packages/core/examples/basic_usage_examples/joystick_example.py @@ -0,0 +1,15 @@ +import modi_plus +import time + +""" +Example script for the usage of joystick module +Make sure you connect 1 joystick module to your network module +""" + +if __name__ == "__main__": + bundle = modi_plus.MODIPlus() + joystick = bundle.joysticks[0] + + while True: + print("x: {0:<10} y: {1:<10} direction: {2:<10}".format(joystick.x, joystick.y, joystick.direction), end="\r") + time.sleep(0.02) diff --git a/packages/core/examples/basic_usage_examples/led_example.py b/packages/core/examples/basic_usage_examples/led_example.py new file mode 100644 index 0000000..69e3adc --- /dev/null +++ b/packages/core/examples/basic_usage_examples/led_example.py @@ -0,0 +1,30 @@ +import modi_plus +import time + +""" +Example script for the usage of led module +Make sure you connect 1 led module to your network module +""" + +if __name__ == "__main__": + bundle = modi_plus.MODIPlus() + led = bundle.leds[0] + + led.blue = 100 + time.sleep(1) + led.blue = 0 + time.sleep(1) + led.green = 255 + time.sleep(1) + led.green = 0 + time.sleep(1) + led.red = 100 + time.sleep(1) + for c in range(100): + led.rgb = 100 - c, c, 0 + time.sleep(0.02) + + led.turn_on() + time.sleep(1) + led.turn_off() + time.sleep(1) diff --git a/packages/core/examples/basic_usage_examples/motor_example.py b/packages/core/examples/basic_usage_examples/motor_example.py new file mode 100644 index 0000000..324ca81 --- /dev/null +++ b/packages/core/examples/basic_usage_examples/motor_example.py @@ -0,0 +1,22 @@ +import modi_plus +import time + +""" +Example script for the usage of motor module +Make sure you connect 1 motor module to your network module +""" + +if __name__ == "__main__": + bundle = modi_plus.MODIPlus() + motor = bundle.motors[0] + + motor.angle = 0, 70 + time.sleep(3) + motor.angle = 50, 70 + time.sleep(3) + motor.speed = 50 + time.sleep(3) + motor.speed = 100 + time.sleep(3) + motor.speed = 0 + time.sleep(1) diff --git a/packages/core/examples/basic_usage_examples/speaker_example.py b/packages/core/examples/basic_usage_examples/speaker_example.py new file mode 100644 index 0000000..d8cf341 --- /dev/null +++ b/packages/core/examples/basic_usage_examples/speaker_example.py @@ -0,0 +1,20 @@ +import modi_plus +import time + +""" +Example script for the usage of speaker module +Make sure you connect 1 speaker module to your network module +""" + +if __name__ == "__main__": + bundle = modi_plus.MODIPlus() + speak = bundle.speakers[0] + + speak.tune = 800, 70 + time.sleep(3) + speak.frequency = 700 + time.sleep(3) + speak.volume = 100 + time.sleep(1) + speak.reset() + time.sleep(1) diff --git a/packages/core/examples/basic_usage_examples/tof_example.py b/packages/core/examples/basic_usage_examples/tof_example.py new file mode 100644 index 0000000..36a2807 --- /dev/null +++ b/packages/core/examples/basic_usage_examples/tof_example.py @@ -0,0 +1,15 @@ +import modi_plus +import time + +""" +Example script for the usage of tof module +Make sure you connect 1 tof module to your network module +""" + +if __name__ == "__main__": + bundle = modi_plus.MODIPlus() + tof = bundle.tofs[0] + + while True: + print(f"Distance(cm): {tof.distance:<10} ", end="\r") + time.sleep(0.02) diff --git a/packages/core/examples/creation_examples/brush.py b/packages/core/examples/creation_examples/brush.py new file mode 100644 index 0000000..cc2aa3b --- /dev/null +++ b/packages/core/examples/creation_examples/brush.py @@ -0,0 +1,32 @@ +import modi_plus +from playscii import GameManager, GameObject +from math import sin, radians + + +class BrushManager(GameManager): + def __init__(self, size, imu, button): + super().__init__(size) + self.cursor = Brush(pos=(size[0] // 2, size[1] // 2), render="o") + self.imu = imu + self.button = button + + def setup(self): + self.add_object(self.cursor) + + def update(self): + h, w = self.height // 2, self.width // 2 + self.cursor.y = h - h * sin(radians(-self.imu.angle_x)) + self.cursor.x = w - w * sin(radians(-self.imu.angle_y)) + if self.button.pressed: + self.add_object(Brush((self.cursor.x, self.cursor.y), "x")) + + +class Brush(GameObject): + def update(self): + pass + + +if __name__ == "__main__": + bundle = modi_plus.MODIPlus() + canvas = BrushManager((100, 20), bundle.imus[0], bundle.buttons[0]) + canvas.start() diff --git a/packages/core/examples/creation_examples/dodge.py b/packages/core/examples/creation_examples/dodge.py new file mode 100644 index 0000000..e283d2b --- /dev/null +++ b/packages/core/examples/creation_examples/dodge.py @@ -0,0 +1,58 @@ +import modi_plus +from playscii import GameManager, GameObject +from random import randint +import time + +""" +This example requires you to install playascii package +""" + +PLAYER_RENDER = " O \n" \ + "/|\\ \n" \ + "/ \\" +MODI_RENDER = "-------\n" \ + "|MODI+|\n" \ + "_______" + + +class DodgeManager(GameManager): + + def __init__(self, controller): + super().__init__((50, 20)) + + self.player = self.GameObject( + pos=(25, 2), + render=PLAYER_RENDER) + self.fire = self.GameObject(render=MODI_RENDER) + self.imu = controller.imus[0] + self.button = controller.buttons[0] + + def setup(self): + self.set_title("PyMODI+ Dodge") + self.add_object(self.player) + self.add_object(self.fire) + self.fire.x, self.fire.y = 25, 20 + + def update(self): + angle_y = -self.imu.angle_y + if angle_y < -5 and self.player.x < 48: + self.player.x += 30 * self.delta_time + elif angle_y > 5 and self.player.x > 0: + self.player.x -= 30 * self.delta_time + self.fire.y -= 15 * self.delta_time + if self.fire.y < 0: + self.fire.x, self.fire.y = randint(0, 40), 25 + if self.fire.y < 3 and (self.fire.x - 4 <= self.player.x <= self.fire.x + 4): + self.set_title("GAME OVER") + self.set_flag("quit", True) + + class GameObject(GameObject): + def update(self): + pass + + +if __name__ == "__main__": + bundle = modi_plus.MODIPlus() + game_manager = DodgeManager(bundle) + game_manager.start() + time.sleep(3) diff --git a/packages/core/examples/creation_examples/requirements.txt b/packages/core/examples/creation_examples/requirements.txt new file mode 100644 index 0000000..56dbca8 --- /dev/null +++ b/packages/core/examples/creation_examples/requirements.txt @@ -0,0 +1 @@ +pyplayscii diff --git a/packages/core/examples/intermediate_usage_examples/multi_module_example.py b/packages/core/examples/intermediate_usage_examples/multi_module_example.py new file mode 100644 index 0000000..5875ae0 --- /dev/null +++ b/packages/core/examples/intermediate_usage_examples/multi_module_example.py @@ -0,0 +1,26 @@ +import modi_plus + +""" +This example explains the convention that pymodi uses when multiple modules +with the same type are connected. + +When multiple modules are connected, the modules are sorted in ascending connected time. +""" + +# Let say you run the code below, then one of the four cases below will occur +if __name__ == "__main__": + bundle = modi_plus.MODIPlus() + led0 = bundle.leds[0] + led1 = bundle.leds[1] + +""" +It is also possible to access modules by there id or uuid. + +led0 = bundle.leds.get(0x881) +led1 = bundle.leds.get(0xA55) + +or + +led0 = bundle.led(0x881) +led1 = bundle.led(0xA55) +""" diff --git a/packages/core/modi_plus/__init__.py b/packages/core/modi_plus/__init__.py new file mode 100644 index 0000000..b84dd3c --- /dev/null +++ b/packages/core/modi_plus/__init__.py @@ -0,0 +1,13 @@ +"""Top-level package for pyMODI+.""" +from modi_plus import about +from modi_plus.modi_plus import ( + MODIPlus, +) + +__all__ = [ + "MODIPlus", +] + +__version__ = about.__version__ + +print(f"Running PyMODI+ (v{__version__})") diff --git a/packages/core/modi_plus/__main__.py b/packages/core/modi_plus/__main__.py new file mode 100644 index 0000000..e85a573 --- /dev/null +++ b/packages/core/modi_plus/__main__.py @@ -0,0 +1,130 @@ +import os +import sys +import time +import textwrap + +from getopt import getopt, GetoptError + +import modi_plus + +from modi_plus.util.usage_util import UsageInstructor +from modi_plus.util.tutorial_util import Tutor +from modi_plus.util.inspection_util import Inspector + +from modi_plus.util.message_util import parse_message, decode_message + + +def check_option(*options): + for o, a in opts: + if o in options: + return a if a else True + return False + + +if __name__ == "__main__": + usage = textwrap.dedent( + """ + Usage: python -m modi_plus - + Options: + -t, --tutorial: Interactive Tutorial + -h, --help: Print out help page + """.rstrip() + ) + + help_page = textwrap.dedent( + """ + Usage: python -m modi_plus - + Options: + -t, --tutorial: Interactive Tutorial + Usage: python -m modi_plus --tutorial + """.rstrip() + ) + + try: + # all commands should be defined here in advance + opts, args = getopt( + sys.argv[1:], "tahvpiu", + [ + "tutorial", + "initialize", + "help", + "verbose", + "performance", + "inspect", + "usage", + ] + ) + # exit program if an invalid option has been entered + except GetoptError as err: + print(str(err)) + print(usage) + os._exit(2) + + # Ensure that there is an option but argument + if len(sys.argv) == 1 or len(args) > 0: + print(usage) + os._exit(2) + + # Print help page + if check_option("-h", "--help"): + print(help_page) + os._exit(0) + + # Start interactive pymodi+ tutorial + if check_option("-t", "--tutorial"): + pymodi_tutor = Tutor() + pymodi_tutor.run_introduction() + os._exit(0) + + # Time message transfer between local machine and network module + if check_option("-p", "--performance"): + print("[PyMODI+ Performance Test]" + "\n" + "=" * 25) + init_time = time.time() + bundle = modi_plus.MODIPlus() + fin_time = time.time() + took = (fin_time - init_time) * 100 // 1 / 100 + print(f"Took {took} seconds to initialize") + req_tp_msg = parse_message(0x2A, 0, bundle.networks[0].id) + print(f"request message... {req_tp_msg}") + bundle._exe_thread.close() + init_time = time.perf_counter() + bundle.send(req_tp_msg) + msg = None + while True: + msg = bundle.recv() + if not msg: + continue + recv_cmd = decode_message(msg)[0] + if recv_cmd == 0x07: + break + fin_time = time.perf_counter() + took = fin_time - init_time + print(f"received message... {msg}") + print(f"Took {took / 2:.10f} seconds for message transfer") + os._exit(0) + + # Initialize modules implicitly + if check_option("-a", "--initialize"): + # TODO: Handle when there are more than one module with the same type + print(">>> bundle = modi_plus.MODIPlus()") + init_time = time.time() + bundle = modi_plus.MODIPlus(verbose=check_option("-v", "--verbose")) + fin_time = time.time() + print(f"Took {fin_time - init_time:.2f} seconds to init MODI+ modules") + + for module in bundle.modules: + module_name = module.module_type.lower() + print(">>> " + module_name + " = bundle." + module_name + "s[0]") + exec(module_name + " = module") + + # Run inspection mode + if check_option("-i", "--inspect"): + pymodi_inspector = Inspector() + pymodi_inspector.run_inspection() + os._exit(0) + + # Show each module usage + if check_option("-u", "--usage"): + usage = UsageInstructor() + usage.run_usage_manual() + os._exit(0) diff --git a/packages/core/modi_plus/_exe_thread.py b/packages/core/modi_plus/_exe_thread.py new file mode 100644 index 0000000..bd30853 --- /dev/null +++ b/packages/core/modi_plus/_exe_thread.py @@ -0,0 +1,28 @@ +import threading as th + +from modi_plus.task.exe_task import ExeTask + + +class ExeThread(th.Thread): + """ + :param dict() modules: dict() of module instance + """ + + def __init__(self, modules, connection_task): + super().__init__(daemon=True) + connection_task.open_connection() + self.__exe_task = ExeTask(modules, connection_task) + self.__kill_sig = False + + def close(self): + self.__kill_sig = True + + def run(self) -> None: + """ Run executor task + + :return: None + """ + while True: + self.__exe_task.run(delay=0.001) + if self.__kill_sig: + break diff --git a/packages/core/modi_plus/about.py b/packages/core/modi_plus/about.py new file mode 100644 index 0000000..a19d49e --- /dev/null +++ b/packages/core/modi_plus/about.py @@ -0,0 +1,8 @@ +__title__ = "pymodi-plus" +__version__ = "0.4.2" +__author__ = "LUXROBO" +__email__ = "module.dev@luxrobo.com" +__description__ = "Python API for controlling modular electronics, MODI+." +__url__ = "https://github.com/LUXROBO/pymodi-plus" +__license__ = "MIT" +__summary__ = "Python API for controlling modular electronics, MODI+." diff --git a/packages/core/modi_plus/assets/firmware/esp32/bootloader.bin b/packages/core/modi_plus/assets/firmware/esp32/bootloader.bin new file mode 100644 index 0000000000000000000000000000000000000000..7c5db03608c4d082010f80a91394919a19c0d274 GIT binary patch literal 14528 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
)b6_kTEn*QYz2st_WFKchUWKkwz0C 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 XV}Ae1@?UK`|EGVww8#6awtxA5!_-g5 literal 0 HcmV?d00001 diff --git a/packages/core/modi_plus/assets/firmware/esp32/esp32.bin b/packages/core/modi_plus/assets/firmware/esp32/esp32.bin new file mode 100644 index 0000000000000000000000000000000000000000..b22f61e90e816f91217761334bf9fd00b7294b2a GIT binary patch literal 1042800 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 z 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�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 literal 0 HcmV?d00001 diff --git a/packages/core/modi_plus/assets/firmware/modules/led.bin b/packages/core/modi_plus/assets/firmware/modules/led.bin new file mode 100644 index 0000000000000000000000000000000000000000..b9b4a740b60013841c591e05d7da7be7f9d05b4c GIT binary patch literal 44048 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 BPn-Y% literal 0 HcmV?d00001 diff --git a/packages/core/modi_plus/assets/firmware/modules/speaker.bin b/packages/core/modi_plus/assets/firmware/modules/speaker.bin new file mode 100644 index 0000000000000000000000000000000000000000..e91b7fa2290026e6a4ff93904010bb68989d4239 GIT binary patch literal 94224 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

?a$hQ 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 DL%`FP literal 0 HcmV?d00001 diff --git a/packages/core/modi_plus/assets/firmware/modules/tof.bin b/packages/core/modi_plus/assets/firmware/modules/tof.bin new file mode 100644 index 0000000000000000000000000000000000000000..c1cb1835552c3c7ec962913cf48fb4a6e4253185 GIT binary patch literal 44048 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 LH1K*#!T(B!?U literal 0 HcmV?d00001 diff --git a/packages/core/modi_plus/assets/version.txt b/packages/core/modi_plus/assets/version.txt new file mode 100644 index 0000000..274ed2c --- /dev/null +++ b/packages/core/modi_plus/assets/version.txt @@ -0,0 +1,21 @@ +{ + "battery": "v1.0.5", + "bootloader_e103": "v1.0.1", + "bootloader_e230": "v1.0.0", + "button": "v1.0.0", + "dial": "v1.0.3", + "display": "v1.3.0", + "env": "v1.0.2", + "esp32_app": "v4.3.0", + "esp32_ota": "v1.0.0", + "imu": "v1.1.3", + "joystick": "v1.1.1", + "led": "v1.0.0", + "motor": "v1.2.1", + "network": "v1.1.2", + "os_e103": "v1.3.0", + "os_e230": "v1.3.0", + "release": "v20220826", + "speaker": "v1.2.1", + "tof": "v1.1.2" +} \ No newline at end of file diff --git a/packages/core/modi_plus/modi_plus.py b/packages/core/modi_plus/modi_plus.py new file mode 100644 index 0000000..291e6a3 --- /dev/null +++ b/packages/core/modi_plus/modi_plus.py @@ -0,0 +1,324 @@ +"""Main MODI+ module.""" + +import time +import atexit +from typing import Optional + +from importlib import import_module as im + +from modi_plus.module.setup_module.network import Network +from modi_plus.module.setup_module.battery import Battery +from modi_plus.module.input_module.env import Env +from modi_plus.module.input_module.imu import Imu +from modi_plus.module.input_module.button import Button +from modi_plus.module.input_module.dial import Dial +from modi_plus.module.input_module.joystick import Joystick +from modi_plus.module.input_module.tof import Tof +from modi_plus.module.output_module.display import Display +from modi_plus.module.output_module.motor import Motor +from modi_plus.module.output_module.led import Led +from modi_plus.module.output_module.speaker import Speaker + +from modi_plus.module.module import ModuleList +from modi_plus._exe_thread import ExeThread +from modi_plus.util.connection_util import get_platform, get_ble_task_path +from modi_plus.task import HAS_SERIAL, HAS_BLE, ConnectionTask + + +class MODIPlus: + network_uuids = {} + + def __call__(cls, *args, **kwargs): + network_uuid = kwargs.get("network_uuid") + connection_type = kwargs.get("connection_type") + if connection_type != "ble": + return super(MODIPlus, cls).__call__(*args, **kwargs) + if not network_uuid: + raise ValueError("Should input a valid network uuid!") + if network_uuid not in cls.network_uuids: + cls.network_uuids[network_uuid] = super(MODIPlus, cls).__call__(*args, **kwargs) + return cls.network_uuids[network_uuid] + + def __init__( + self, + connection_type: str = "serialport", + verbose: bool = False, + port: Optional[str] = None, + network_uuid: str = "", + task: Optional[ConnectionTask] = None, + ): + self._modules = list() + # 외부에서 task 주입 가능 (웹 버전용) + if task is not None: + self._connection = task + else: + self._connection = self.__init_task(connection_type, verbose, port, network_uuid) + self._exe_thread = ExeThread(self._modules, self._connection) + + print("Start initializing connected MODI+ modules") + self._exe_thread.start() + + # check usb connected module + init_time = time.time() + while not self.__is_usb_connected(): + time.sleep(0.1) + if time.time() - init_time > 3: + print("MODI init timeout over. Check your module connection.") + break + + print("MODI+ modules are initialized!") + + atexit.register(self.close) + + def __init_task(self, connection_type, verbose, port, network_uuid): + if connection_type == "serialport": + if not HAS_SERIAL: + raise ImportError( + "Serial 통신을 사용하려면 pyserial이 필요합니다.\n" + "설치: pip install pymodi-plus[serial] 또는 pip install pymodi-plus[all]" + ) + return im("modi_plus.task.serialport_task").SerialportTask(verbose, port) + elif connection_type == "ble": + if not HAS_BLE: + raise ImportError( + "BLE 통신을 사용하려면 bleak이 필요합니다.\n" + "설치: pip install pymodi-plus[ble] 또는 pip install pymodi-plus[all]" + ) + if not network_uuid: + raise ValueError("Network UUID not specified!") + self.network_uuids[network_uuid] = self + + os = get_platform() + if os == "chrome" or os == "linux": + raise ValueError(f"{os} doesn't support ble connection") + + return im(get_ble_task_path()).BleTask(verbose, network_uuid) + else: + raise ValueError(f"Invalid connection type: {connection_type}") + + def open(self): + atexit.register(self.close) + self._exe_thread = ExeThread(self._modules, self._connection) + self._connection.open_connection() + self._exe_thread.start() + + def close(self): + atexit.unregister(self.close) + print("Closing MODI+ connection...") + self._exe_thread.close() + self._connection.close_connection() + + def send(self, message): + """Low level method to send json pkt directly to modules + + :param message: Json packet to send + :return: None + """ + self._connection.send_nowait(message) + + def recv(self): + """Low level method to receive json pkt directly from modules + + :return: Json msg received + :rtype: str if msg exists, else None + """ + return self._connection.recv() + + def __get_module_by_id(self, module_id): + for module in self._modules: + if module.id == module_id: + return module + return None + + def __is_usb_connected(self): + for module in self._modules: + if module.is_usb_connected: + return True + return False + + def __get_connected_module_by_id(self, id): + target = self.__get_module_by_id(id) + if target is None: + start_time = time.time() + while time.time() - start_time < 3: + target = self.__get_module_by_id(id) + if target is not None: + return target + time.sleep(0.1) + raise Exception("Module with given id does not exits!") + else: + return target + + def network(self, id: int) -> Network: + """Module Class of connected Network module. + """ + module = self.__get_connected_module_by_id(id) + if module.module_type != "network": + raise Exception(f"This module(0x{id:X}) is {module.module_type} not network!") + return module + + def battery(self, id: int) -> Battery: + """Module Class of connected Battery module. + """ + module = self.__get_connected_module_by_id(id) + if module.module_type != "battery": + raise Exception(f"This module(0x{id:X}) is {module.module_type} not battery!") + return module + + def env(self, id: int) -> Env: + """Module Class of connected Environment modules. + """ + module = self.__get_connected_module_by_id(id) + if module.module_type != "env": + raise Exception(f"This module(0x{id:X}) is {module.module_type} not env!") + return module + + def imu(self, id: int) -> Imu: + """Module Class of connected IMU modules. + """ + module = self.__get_connected_module_by_id(id) + if module.module_type != "imu": + raise Exception(f"This module(0x{id:X}) is {module.module_type} not imu!") + return module + + def button(self, id: int) -> Button: + """Module Class of connected Button modules. + """ + module = self.__get_connected_module_by_id(id) + if module.module_type != "button": + raise Exception(f"This module(0x{id:X}) is {module.module_type} not button!") + return module + + def dial(self, id: int) -> Dial: + """Module Class of connected Dial modules. + """ + module = self.__get_connected_module_by_id(id) + if module.module_type != "dial": + raise Exception(f"This module(0x{id:X}) is {module.module_type} not dial!") + return module + + def joystick(self, id: int) -> Joystick: + """Module Class of connected Joystick modules. + """ + module = self.__get_connected_module_by_id(id) + if module.module_type != "joystick": + raise Exception(f"This module(0x{id:X}) is {module.module_type} not joystick!") + return module + + def tof(self, id: int) -> Tof: + """Module Class of connected ToF modules. + """ + module = self.__get_connected_module_by_id(id) + if module.module_type != "tof": + raise Exception(f"This module(0x{id:X}) is {module.module_type} not tof!") + return module + + def display(self, id: int) -> Display: + """Module Class of connected Display modules. + """ + module = self.__get_connected_module_by_id(id) + if module.module_type != "display": + raise Exception(f"This module(0x{id:X}) is {module.module_type} not display!") + return module + + def motor(self, id: int) -> Motor: + """Module Class of connected Motor modules. + """ + module = self.__get_connected_module_by_id(id) + if module.module_type != "motor": + raise Exception(f"This module(0x{id:X}) is {module.module_type} not motor!") + return module + + def led(self, id: int) -> Led: + """Module Class of connected Led modules. + """ + module = self.__get_connected_module_by_id(id) + if module.module_type != "led": + raise Exception(f"This module(0x{id:X}) is {module.module_type} not led!") + return module + + def speaker(self, id: int) -> Speaker: + """Module Class of connected Speaker modules. + """ + module = self.__get_connected_module_by_id(id) + if module.module_type != "speaker": + raise Exception(f"This module(0x{id:X}) is {module.module_type} not speaker!") + return module + + @property + def modules(self) -> ModuleList: + """Module List of connected modules except network module. + """ + return ModuleList(self._modules) + + @property + def networks(self) -> ModuleList: + """Module List of connected Network modules. + """ + return ModuleList(self._modules, "network") + + @property + def batterys(self) -> ModuleList: + """Module List of connected Battery modules. + """ + return ModuleList(self._modules, "battery") + + @property + def envs(self) -> ModuleList: + """Module List of connected Environment modules. + """ + return ModuleList(self._modules, "env") + + @property + def imus(self) -> ModuleList: + """Module List of connected IMU modules. + """ + return ModuleList(self._modules, "imu") + + @property + def buttons(self) -> ModuleList: + """Module List of connected Button modules. + """ + return ModuleList(self._modules, "button") + + @property + def dials(self) -> ModuleList: + """Module List of connected Dial modules. + """ + return ModuleList(self._modules, "dial") + + @property + def joysticks(self) -> ModuleList: + """Module List of connected Joystick modules. + """ + return ModuleList(self._modules, "joystick") + + @property + def tofs(self) -> ModuleList: + """Module List of connected ToF modules. + """ + return ModuleList(self._modules, "tof") + + @property + def displays(self) -> ModuleList: + """Module List of connected Display modules. + """ + return ModuleList(self._modules, "display") + + @property + def motors(self) -> ModuleList: + """Module List of connected Motor modules. + """ + return ModuleList(self._modules, "motor") + + @property + def leds(self) -> ModuleList: + """Module List of connected Led modules. + """ + return ModuleList(self._modules, "led") + + @property + def speakers(self) -> ModuleList: + """Module List of connected Speaker modules. + """ + return ModuleList(self._modules, "speaker") diff --git a/packages/core/modi_plus/module/__init__.py b/packages/core/modi_plus/module/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/packages/core/modi_plus/module/input_module/__init__.py b/packages/core/modi_plus/module/input_module/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/packages/core/modi_plus/module/input_module/button.py b/packages/core/modi_plus/module/input_module/button.py new file mode 100644 index 0000000..f010ac6 --- /dev/null +++ b/packages/core/modi_plus/module/input_module/button.py @@ -0,0 +1,69 @@ +"""Button module.""" + +import struct +from modi_plus.module.module import InputModule + + +class Button(InputModule): + + STATE_TRUE = 100 + STATE_FALSE = 0 + + PROPERTY_BUTTON_STATE = 2 + + PROPERTY_OFFSET_CLICKED = 0 + PROPERTY_OFFSET_DOUBLE_CLICKED = 2 + PROPERTY_OFFSET_PRESSED = 4 + PROPERTY_OFFSET_TOGGLED = 6 + + @property + def clicked(self) -> bool: + """Returns true when button is clicked + + :return: `True` if clicked or `False`. + :rtype: bool + """ + + offset = Button.PROPERTY_OFFSET_CLICKED + raw = self._get_property(Button.PROPERTY_BUTTON_STATE) + data = struct.unpack("H", raw[offset:offset + 2])[0] + return data == Button.STATE_TRUE + + @property + def double_clicked(self) -> bool: + """Returns true when button is double clicked + + :return: `True` if double clicked or `False`. + :rtype: bool + """ + + offset = Button.PROPERTY_OFFSET_DOUBLE_CLICKED + raw = self._get_property(Button.PROPERTY_BUTTON_STATE) + data = struct.unpack("H", raw[offset:offset + 2])[0] + return data == Button.STATE_TRUE + + @property + def pressed(self) -> bool: + """Returns true while button is pressed + + :return: `True` if pressed or `False`. + :rtype: bool + """ + + offset = Button.PROPERTY_OFFSET_PRESSED + raw = self._get_property(Button.PROPERTY_BUTTON_STATE) + data = struct.unpack("H", raw[offset:offset + 2])[0] + return data == Button.STATE_TRUE + + @property + def toggled(self) -> bool: + """Returns true when button is toggled + + :return: `True` if toggled or `False`. + :rtype: bool + """ + + offset = Button.PROPERTY_OFFSET_TOGGLED + raw = self._get_property(Button.PROPERTY_BUTTON_STATE) + data = struct.unpack("H", raw[offset:offset + 2])[0] + return data == Button.STATE_TRUE diff --git a/packages/core/modi_plus/module/input_module/dial.py b/packages/core/modi_plus/module/input_module/dial.py new file mode 100644 index 0000000..02eaaa5 --- /dev/null +++ b/packages/core/modi_plus/module/input_module/dial.py @@ -0,0 +1,38 @@ +"""Dial module.""" + +import struct +from modi_plus.module.module import InputModule + + +class Dial(InputModule): + + PROPERTY_DIAL_STATE = 2 + + PROPERTY_OFFSET_TURN = 0 + PROPERTY_OFFSET_SPEED = 2 + + @property + def turn(self) -> int: + """Returns the angle of the dial between 0 and 100 + + :return: The dial's angle. + :rtype: int + """ + + offset = Dial.PROPERTY_OFFSET_TURN + raw = self._get_property(Dial.PROPERTY_DIAL_STATE) + data = struct.unpack("h", raw[offset:offset + 2])[0] + return data + + @property + def speed(self) -> int: + """Returns the turn speed of the dial between -100 and 100 + + :return: The dial's turn speed. + :rtype: int + """ + + offset = Dial.PROPERTY_OFFSET_SPEED + raw = self._get_property(Dial.PROPERTY_DIAL_STATE) + data = struct.unpack("h", raw[offset:offset + 2])[0] + return data diff --git a/packages/core/modi_plus/module/input_module/env.py b/packages/core/modi_plus/module/input_module/env.py new file mode 100644 index 0000000..ffc4fa7 --- /dev/null +++ b/packages/core/modi_plus/module/input_module/env.py @@ -0,0 +1,409 @@ +"""Env module.""" + +import struct +from modi_plus.module.module import InputModule + + +class Env(InputModule): + + # -- Property Numbers -- + PROPERTY_ENV_STATE = 2 + PROPERTY_RGB_STATE = 3 + PROPERTY_RAW_RGB_STATE = 4 + + PROPERTY_OFFSET_ILLUMINANCE = 0 + PROPERTY_OFFSET_TEMPERATURE = 2 + PROPERTY_OFFSET_HUMIDITY = 4 + PROPERTY_OFFSET_VOLUME = 6 + + # RGB property offsets (only available in version 2.x and above) + PROPERTY_OFFSET_RED = 0 + PROPERTY_OFFSET_GREEN = 2 + PROPERTY_OFFSET_BLUE = 4 + PROPERTY_OFFSET_WHITE = 6 + PROPERTY_OFFSET_BLACK = 8 + PROPERTY_OFFSET_COLOR_CLASS = 10 + PROPERTY_OFFSET_BRIGHTNESS = 11 + + PROPERTY_RAW_OFFSET_RED = 0 + PROPERTY_RAW_OFFSET_GREEN = 2 + PROPERTY_RAW_OFFSET_BLUE = 4 + PROPERTY_RAW_OFFSET_WHITE = 6 + + PROPERTY_ENV_SET_RECORD_VOICE = 16 + PROPERTY_ENV_SET_RGB_MODE = 17 + + RGB_MODE_AMBIENT = 0 + RGB_MODE_ON = 1 + RGB_MODE_DUALSHOT = 2 + + @property + def illuminance(self) -> int: + """Returns the value of illuminance between 0 and 100 + + :return: The environment's illuminance. + :rtype: int + """ + + offset = Env.PROPERTY_OFFSET_ILLUMINANCE + raw = self._get_property(Env.PROPERTY_ENV_STATE) + data = struct.unpack("h", raw[offset:offset + 2])[0] + return data + + @property + def temperature(self) -> int: + """Returns the value of temperature between -10 and 60 + + :return: The environment's temperature. + :rtype: int + """ + + offset = Env.PROPERTY_OFFSET_TEMPERATURE + raw = self._get_property(Env.PROPERTY_ENV_STATE) + data = struct.unpack("h", raw[offset:offset + 2])[0] + return data + + @property + def humidity(self) -> int: + """Returns the value of humidity between 0 and 100 + + :return: The environment's humidity. + :rtype: int + """ + + offset = Env.PROPERTY_OFFSET_HUMIDITY + raw = self._get_property(Env.PROPERTY_ENV_STATE) + data = struct.unpack("h", raw[offset:offset + 2])[0] + return data + + @property + def volume(self) -> int: + """Returns the value of volume between 0 and 100 + + :return: The environment's volume. + :rtype: int + """ + + offset = Env.PROPERTY_OFFSET_VOLUME + raw = self._get_property(Env.PROPERTY_ENV_STATE) + data = struct.unpack("h", raw[offset:offset + 2])[0] + return data + + def _is_rgb_supported(self) -> bool: + """Check if RGB properties are supported based on app version + + RGB is supported in app version 2.x and above. + Version 1.x does not support RGB. + + :return: True if RGB is supported, False otherwise + :rtype: bool + """ + if not hasattr(self, '_Module__app_version') or self._Module__app_version is None: + return False + + # Extract major version: version >> 13 + major_version = self._Module__app_version >> 13 + return major_version >= 2 + + @property + def red(self) -> int: + """Returns the red color value between 0 and 100 + + Note: This property is only available in Env module version 2.x and above. + Version 1.x does not support RGB properties. + + :return: The environment's red color value (0-100%). + :rtype: int + :raises AttributeError: If app version is 1.x (RGB not supported) + """ + if not self._is_rgb_supported(): + raise AttributeError( + "RGB properties are not supported in Env module version 1.x. " + "Please upgrade to version 2.x or above." + ) + + offset = Env.PROPERTY_OFFSET_RED + raw = self._get_property(Env.PROPERTY_RGB_STATE) + data = struct.unpack("H", raw[offset:offset + 2])[0] + return data + + @property + def green(self) -> int: + """Returns the green color value between 0 and 100 + + Note: This property is only available in Env module version 2.x and above. + Version 1.x does not support RGB properties. + + :return: The environment's green color value (0-100%). + :rtype: int + :raises AttributeError: If app version is 1.x (RGB not supported) + """ + if not self._is_rgb_supported(): + raise AttributeError( + "RGB properties are not supported in Env module version 1.x. " + "Please upgrade to version 2.x or above." + ) + + offset = Env.PROPERTY_OFFSET_GREEN + raw = self._get_property(Env.PROPERTY_RGB_STATE) + data = struct.unpack("H", raw[offset:offset + 2])[0] + return data + + @property + def blue(self) -> int: + """Returns the blue color value between 0 and 100 + + Note: This property is only available in Env module version 2.x and above. + Version 1.x does not support RGB properties. + + :return: The environment's blue color value (0-100%). + :rtype: int + :raises AttributeError: If app version is 1.x (RGB not supported) + """ + if not self._is_rgb_supported(): + raise AttributeError( + "RGB properties are not supported in Env module version 1.x. " + "Please upgrade to version 2.x or above." + ) + + offset = Env.PROPERTY_OFFSET_BLUE + raw = self._get_property(Env.PROPERTY_RGB_STATE) + data = struct.unpack("H", raw[offset:offset + 2])[0] + return data + + @property + def white(self) -> int: + """Returns the white color value between 0 and 100 + + Note: This property is only available in Env module version 2.x and above. + Version 1.x does not support RGB properties. + + :return: The environment's white color value (0-100%). + :rtype: int + :raises AttributeError: If app version is 1.x (RGB not supported) + """ + if not self._is_rgb_supported(): + raise AttributeError( + "RGB properties are not supported in Env module version 1.x. " + "Please upgrade to version 2.x or above." + ) + + offset = Env.PROPERTY_OFFSET_WHITE + raw = self._get_property(Env.PROPERTY_RGB_STATE) + data = struct.unpack("H", raw[offset:offset + 2])[0] + return data + + @property + def black(self) -> int: + """Returns the black color value between 0 and 100 + + Note: This property is only available in Env module version 2.x and above. + Version 1.x does not support RGB properties. + + :return: The environment's black color value (0-100%). + :rtype: int + :raises AttributeError: If app version is 1.x (RGB not supported) + """ + if not self._is_rgb_supported(): + raise AttributeError( + "RGB properties are not supported in Env module version 1.x. " + "Please upgrade to version 2.x or above." + ) + + offset = Env.PROPERTY_OFFSET_BLACK + raw = self._get_property(Env.PROPERTY_RGB_STATE) + data = struct.unpack("H", raw[offset:offset + 2])[0] + return data + + @property + def color_class(self) -> int: + """Returns the detected color class + + Note: This property is only available in Env module version 2.x and above. + Version 1.x does not support RGB properties. + + :return: The detected color class (0=unknown, 1=red, 2=green, 3=blue, 4=white, 5=black). + :rtype: int + :raises AttributeError: If app version is 1.x (RGB not supported) + """ + if not self._is_rgb_supported(): + raise AttributeError( + "RGB properties are not supported in Env module version 1.x. " + "Please upgrade to version 2.x or above." + ) + + offset = Env.PROPERTY_OFFSET_COLOR_CLASS + raw = self._get_property(Env.PROPERTY_RGB_STATE) + data = struct.unpack("B", raw[offset:offset + 1])[0] + return data + + @property + def brightness(self) -> int: + """Returns the brightness value between 0 and 100 + + Note: This property is only available in Env module version 2.x and above. + Version 1.x does not support RGB properties. + + :return: The environment's brightness value (0-100%). + :rtype: int + :raises AttributeError: If app version is 1.x (RGB not supported) + """ + if not self._is_rgb_supported(): + raise AttributeError( + "RGB properties are not supported in Env module version 1.x. " + "Please upgrade to version 2.x or above." + ) + + offset = Env.PROPERTY_OFFSET_BRIGHTNESS + raw = self._get_property(Env.PROPERTY_RGB_STATE) + data = struct.unpack("B", raw[offset:offset + 1])[0] + return data + + @property + def rgb(self) -> tuple: + """Returns the RGB color values as a tuple (red, green, blue) + + Note: This property is only available in Env module version 2.x and above. + Version 1.x does not support RGB properties. + + :return: Tuple of (red, green, blue) values, each between 0 and 100. + :rtype: tuple + :raises AttributeError: If app version is 1.x (RGB not supported) + """ + if not self._is_rgb_supported(): + raise AttributeError( + "RGB properties are not supported in Env module version 1.x. " + "Please upgrade to version 2.x or above." + ) + + return (self.red, self.green, self.blue) + + @property + def raw_red(self) -> int: + """Returns the raw red value between 0 and 65536 + + Note: This property is only available in Env module version 2.x and above. + Version 1.x does not support RGB properties. + + :return: The environment's red color value (0-100%). + :rtype: int + :raises AttributeError: If app version is 1.x (RGB not supported) + """ + if not self._is_rgb_supported(): + raise AttributeError( + "RGB properties are not supported in Env module version 1.x. " + "Please upgrade to version 2.x or above." + ) + + offset = Env.PROPERTY_RAW_OFFSET_RED + raw = self._get_property(Env.PROPERTY_RAW_RGB_STATE) + data = struct.unpack("H", raw[offset:offset + 2])[0] + return data + + @property + def raw_green(self) -> int: + """Returns the raw green value between 0 and 65536 + + Note: This property is only available in Env module version 2.x and above. + Version 1.x does not support RGB properties. + + :return: The environment's green color value (0-100%). + :rtype: int + :raises AttributeError: If app version is 1.x (RGB not supported) + """ + if not self._is_rgb_supported(): + raise AttributeError( + "RGB properties are not supported in Env module version 1.x. " + "Please upgrade to version 2.x or above." + ) + + offset = Env.PROPERTY_RAW_OFFSET_GREEN + raw = self._get_property(Env.PROPERTY_RAW_RGB_STATE) + data = struct.unpack("H", raw[offset:offset + 2])[0] + return data + + @property + def raw_blue(self) -> int: + """Returns the raw blue color between 0 and 65535 + + Note: This property is only available in Env module version 2.x and above. + Version 1.x does not support RGB properties. + + :return: The environment's blue color value (0-100%). + :rtype: int + :raises AttributeError: If app version is 1.x (RGB not supported) + """ + if not self._is_rgb_supported(): + raise AttributeError( + "RGB properties are not supported in Env module version 1.x. " + "Please upgrade to version 2.x or above." + ) + + offset = Env.PROPERTY_RAW_OFFSET_BLUE + raw = self._get_property(Env.PROPERTY_RAW_RGB_STATE) + data = struct.unpack("H", raw[offset:offset + 2])[0] + return data + + @property + def raw_white(self) -> int: + """Returns the raw white color between 0 and 65535 + + Note: This property is only available in Env module version 2.x and above. + Version 1.x does not support RGB properties. + + :return: The environment's white color value (0-100%). + :rtype: int + :raises AttributeError: If app version is 1.x (RGB not supported) + """ + if not self._is_rgb_supported(): + raise AttributeError( + "RGB properties are not supported in Env module version 1.x. " + "Please upgrade to version 2.x or above." + ) + + offset = Env.PROPERTY_RAW_OFFSET_WHITE + raw = self._get_property(Env.PROPERTY_RAW_RGB_STATE) + data = struct.unpack("H", raw[offset:offset + 2])[0] + return data + + @property + def raw_rgb(self) -> tuple: + """Returns the RGB color values as a tuple (raw_red, raw_green, raw_blue, raw_white) + + Note: This property is only available in Env module version 2.x and above. + Version 1.x does not support RGB properties. + + :return: Tuple of (red, green, blue) values, each between 0 and 100. + :rtype: tuple + :raises AttributeError: If app version is 1.x (RGB not supported) + """ + if not self._is_rgb_supported(): + raise AttributeError( + "RGB properties are not supported in Env module version 1.x. " + "Please upgrade to version 2.x or above." + ) + + return (self.raw_red, self.raw_green, self.raw_blue, self.raw_white) + + def set_rgb_mode(self, mode: int, duration: int = 3) -> None: + """Sets the RGB mode of the Env module + + Note: This method is only available in Env module version 2.x and above. + Version 1.x does not support RGB properties. + + :param mode: RGB mode to set (0=off, 1=on) + :type mode: int + :return: None + :raises AttributeError: If app version is 1.x (RGB not supported) + """ + if not self._is_rgb_supported(): + raise AttributeError( + "RGB properties are not supported in Env module version 1.x. " + "Please upgrade to version 2.x or above." + ) + + self._set_property( + destination_id=self.id, + property_num=Env.PROPERTY_ENV_SET_RGB_MODE, + property_values=(("u8", mode), + ("u16", duration), )) diff --git a/packages/core/modi_plus/module/input_module/imu.py b/packages/core/modi_plus/module/input_module/imu.py new file mode 100644 index 0000000..c469a76 --- /dev/null +++ b/packages/core/modi_plus/module/input_module/imu.py @@ -0,0 +1,184 @@ +"""Imu module.""" + +import struct +from typing import Tuple +from modi_plus.module.module import InputModule + + +class Imu(InputModule): + + PROPERTY_ANGLE_STATE = 2 + PROPERTY_ACC_STATE = 3 + PROPERTY_GYRO_STATE = 4 + PROPERTY_VIBRATION_STATE = 5 + + PROPERTY_OFFSET_ROLL = 0 + PROPERTY_OFFSET_PITCH = 4 + PROPERTY_OFFSET_YAW = 8 + PROPERTY_OFFSET_ACC_X = 0 + PROPERTY_OFFSET_ACC_Y = 4 + PROPERTY_OFFSET_ACC_Z = 8 + PROPERTY_OFFSET_GYRO_X = 0 + PROPERTY_OFFSET_GYRO_Y = 4 + PROPERTY_OFFSET_GYRO_Z = 8 + PROPERTY_OFFSET_VIBRATION = 0 + + @property + def angle_x(self) -> float: + """Returns the angle_x angle of the imu + + :return: The imu's angle_x angle. + :rtype: float + """ + + offset = Imu.PROPERTY_OFFSET_ROLL + raw = self._get_property(Imu.PROPERTY_ANGLE_STATE) + data = struct.unpack("f", raw[offset:offset + 4])[0] + return data + + @property + def angle_y(self) -> float: + """Returns the angle_y angle of the imu + + :return: The imu's angle_y angle. + :rtype: float + """ + + offset = Imu.PROPERTY_OFFSET_PITCH + raw = self._get_property(Imu.PROPERTY_ANGLE_STATE) + data = struct.unpack("f", raw[offset:offset + 4])[0] + return data + + @property + def angle_z(self) -> float: + """Returns the angle_zle_z angle of the imu + + :return: The imu's angle_z angle. + :rtype: float + """ + + offset = Imu.PROPERTY_OFFSET_YAW + raw = self._get_property(Imu.PROPERTY_ANGLE_STATE) + data = struct.unpack("f", raw[offset:offset + 4])[0] + return data + + @property + def angle(self) -> Tuple[float, float, float]: + """Returns the angle_x, angle_y and angle_z angle of the imu + + :return: The imu's angles of angle_x, angle_y and angle_z. + :rtype: tuple + """ + + return self.angle_x, self.angle_y, self.angle_z + + @property + def angular_vel_x(self) -> float: + """Returns the angle_x angle of the imu + + :return: The imu's angular velocity the about x-axis. + :rtype: float + """ + + offset = Imu.PROPERTY_OFFSET_GYRO_X + raw = self._get_property(Imu.PROPERTY_GYRO_STATE) + data = struct.unpack("f", raw[offset:offset + 4])[0] + return data + + @property + def angular_vel_y(self) -> float: + """Returns the angular velocity about y-axis + + :return: The imu's angular velocity the about y-axis. + :rtype: float + """ + + offset = Imu.PROPERTY_OFFSET_GYRO_Y + raw = self._get_property(Imu.PROPERTY_GYRO_STATE) + data = struct.unpack("f", raw[offset:offset + 4])[0] + return data + + @property + def angular_vel_z(self) -> float: + """Returns the angular velocity about z-axis + + :return: The imu's angular velocity the about z-axis. + :rtype: float + """ + + offset = Imu.PROPERTY_OFFSET_GYRO_Z + raw = self._get_property(Imu.PROPERTY_GYRO_STATE) + data = struct.unpack("f", raw[offset:offset + 4])[0] + return data + + @property + def angular_velocity(self) -> Tuple[float, float, float]: + """Returns the angular velocity about x, y and z axis + + :return: The imu's angular velocity the about x, y and z axis. + :rtype: tuple + """ + + return self.angular_vel_x, self.angular_vel_y, self.angular_vel_z + + @property + def acceleration_x(self) -> float: + """Returns the x component of the acceleration + + :return: The imu's x-axis acceleration. + :rtype: float + """ + + offset = Imu.PROPERTY_OFFSET_ACC_X + raw = self._get_property(Imu.PROPERTY_ACC_STATE) + data = struct.unpack("f", raw[offset:offset + 4])[0] + return data + + @property + def acceleration_y(self) -> float: + """Returns the y component of the acceleration + + :return: The imu's y-axis acceleration. + :rtype: float + """ + + offset = Imu.PROPERTY_OFFSET_ACC_Y + raw = self._get_property(Imu.PROPERTY_ACC_STATE) + data = struct.unpack("f", raw[offset:offset + 4])[0] + return data + + @property + def acceleration_z(self) -> float: + """Returns the z component of the acceleration + + :return: The imu's z-axis acceleration. + :rtype: float + """ + + offset = Imu.PROPERTY_OFFSET_ACC_Z + raw = self._get_property(Imu.PROPERTY_ACC_STATE) + data = struct.unpack("f", raw[offset:offset + 4])[0] + return data + + @property + def acceleration(self) -> Tuple[float, float, float]: + """Returns the acceleration about x, y and z axis + + :return: The imu's acceleration the about x, y and z axis. + :rtype: tuple + """ + + return self.acceleration_x, self.acceleration_y, self.acceleration_z + + @property + def vibration(self) -> float: + """Returns the vibration value + + :return: The imu's vibration. + :rtype: float + """ + + offset = Imu.PROPERTY_OFFSET_VIBRATION + raw = self._get_property(Imu.PROPERTY_VIBRATION_STATE) + data = struct.unpack("f", raw[offset:offset + 4])[0] + return data diff --git a/packages/core/modi_plus/module/input_module/joystick.py b/packages/core/modi_plus/module/input_module/joystick.py new file mode 100644 index 0000000..b6a404d --- /dev/null +++ b/packages/core/modi_plus/module/input_module/joystick.py @@ -0,0 +1,66 @@ +"""Joystick module.""" + +import struct +from modi_plus.module.module import InputModule + + +class Joystick(InputModule): + + STATE_UP = 100 + STATE_DOWN = -100 + STATE_LEFT = -50 + STATE_RIGHT = 50 + STATE_ORIGIN = 0 + + PROPERTY_POSITION_STATE = 2 + PROPERTY_DIRECTION_STATE = 3 + + PROPERTY_OFFSET_X = 0 + PROPERTY_OFFSET_Y = 2 + PROPERTY_OFFSET_DIRECTION = 0 + + @property + def x(self) -> int: + """Returns the x position of the joystick between -100 and 100 + + :return: The joystick's x position. + :rtype: int + """ + + offset = Joystick.PROPERTY_OFFSET_X + raw = self._get_property(Joystick.PROPERTY_POSITION_STATE) + data = struct.unpack("h", raw[offset:offset + 2])[0] + return data + + @property + def y(self) -> int: + """Returns the y position of the joystick between -100 and 100 + + :return: The joystick's y position. + :rtype: int + """ + + offset = Joystick.PROPERTY_OFFSET_Y + raw = self._get_property(Joystick.PROPERTY_POSITION_STATE) + data = struct.unpack("h", raw[offset:offset + 2])[0] + return data + + @property + def direction(self) -> str: + """Returns the direction of the joystick + + :return: 'up', 'down', 'left', 'right', 'origin' + :rtype: str + """ + + offset = Joystick.PROPERTY_OFFSET_DIRECTION + raw = self._get_property(Joystick.PROPERTY_DIRECTION_STATE) + data = struct.unpack("h", raw[offset:offset + 2])[0] + + return { + Joystick.STATE_UP: "up", + Joystick.STATE_DOWN: "down", + Joystick.STATE_LEFT: "left", + Joystick.STATE_RIGHT: "right", + Joystick.STATE_ORIGIN: "origin" + }.get(data) diff --git a/packages/core/modi_plus/module/input_module/tof.py b/packages/core/modi_plus/module/input_module/tof.py new file mode 100644 index 0000000..aabe970 --- /dev/null +++ b/packages/core/modi_plus/module/input_module/tof.py @@ -0,0 +1,24 @@ +"""Tof module.""" + +import struct +from modi_plus.module.module import InputModule + + +class Tof(InputModule): + + PROPERTY_DISTANCE_STATE = 2 + + PROPERTY_OFFSET_DISTANCE = 0 + + @property + def distance(self) -> float: + """Returns the distance of the object between 0cm and 100cm + + :return: The tof's distance to object. + :rtype: float + """ + + offset = Tof.PROPERTY_OFFSET_DISTANCE + raw = self._get_property(Tof.PROPERTY_DISTANCE_STATE) + data = struct.unpack("f", raw[offset:offset + 4])[0] + return data diff --git a/packages/core/modi_plus/module/module.py b/packages/core/modi_plus/module/module.py new file mode 100644 index 0000000..36a41e5 --- /dev/null +++ b/packages/core/modi_plus/module/module.py @@ -0,0 +1,388 @@ +"""Module module.""" + +import time +import json +from os import path +from typing import Tuple, Union +from importlib.util import find_spec + +from modi_plus.util.message_util import parse_get_property_message, parse_set_property_message + +BROADCAST_ID = 0xFFF + + +def get_module_type_from_uuid(uuid): + module_type_num = uuid >> 32 + module_type = { + # Setup modules + 0: "network", + 0x10: "battery", + + # Input modules + 0x2000: "env", + 0x2010: "imu", + 0x2030: "button", + 0x2040: "dial", + 0x2070: "joystick", + 0x2080: "tof", + + # Output modules + 0x4000: "display", + 0x4010: "motor", + 0x4011: "motor", + 0x4020: "led", + 0x4030: "speaker", + }.get(module_type_num) + return "network" if module_type is None else module_type + + +def get_module_from_name(module_type: str): + """ Find module type for module initialize + + :param module_type: Type of the module in string + :type module_type: str + :return: Module corresponding to the type + :rtype: Module + """ + + module_type = module_type[0].lower() + module_type[1:] + module_name = module_type[0].upper() + module_type[1:] + module_module = find_spec(f"modi_plus.module.input_module.{module_type}") + if not module_module: + module_module = find_spec(f"modi_plus.module.output_module.{module_type}") + if not module_module: + module_module = find_spec(f"modi_plus.module.setup_module.{module_type}") + module_module = module_module.loader.load_module(module_module.name) + return getattr(module_module, module_name) + + +def ask_modi_plus_device(devices): + if not devices: + raise ValueError( + "No MODI+ network module(s) available!\n" + "The network module that you\"re trying to connect, may in use." + ) + for idx, dev in enumerate(devices): + print(f"<{idx}>: {dev}") + i = input("Choose your device index (ex: 0) : ") + return devices[int(i)].lstrip("MODI+_") + + +class Module: + """ + :param int id_: The id of the module. + :param int uuid: The uuid of the module. + """ + + class Property: + def __init__(self): + self.value = None + self.last_update_time = time.time() + + class GetValueInitTimeout(Exception): + def __init__(self): + super().__init__("property initialization failed\nplease check the module connection") + + RUN = 0 + WARNING = 1 + FORCED_PAUSE = 2 + ERROR_STOP = 3 + UPDATE_FIRMWARE = 4 + UPDATE_FIRMWARE_READY = 5 + REBOOT = 6 + PNP_ON = 1 + PNP_OFF = 2 + + def __init__(self, id_, uuid, connection_task): + self._id = id_ + self._uuid = uuid + self._connection = connection_task + self.module_type = str() + + # property + self.prop_samp_freq = 91 # sampling_rate[ms] = (100 - property_sampling_frequency) * 11 + self.prop_request_period = 2 # [s] + self.__get_properties = dict() + self.__set_properties = dict() + self.__last_set_property_num = None + + self.is_connected = True + self.is_usb_connected = False + self.has_printed = False + self.last_updated_time = time.time() + self.first_connected_time = None + self.__app_version = None + self.__os_version = None + self._enable_get_property_timeout = True + + def __gt__(self, other): + if self.first_connected_time is not None: + if other.first_connected_time is not None: + return self.first_connected_time > other.first_connected_time + else: + return False + else: + if other.first_connected_time is not None: + return True + else: + return False + + def __lt__(self, other): + if self.first_connected_time is not None: + if other.first_connected_time is not None: + return self.first_connected_time < other.first_connected_time + else: + return True + else: + if other.first_connected_time is not None: + return False + else: + return True + + def __str__(self): + return f"{self.__class__.__name__}(0x{self._id:X})" + + @property + def app_version(self): + version_string = "" + version_string += str(self.__app_version >> 13) + "." + version_string += str(self.__app_version % (2 ** 13) >> 8) + "." + version_string += str(self.__app_version % (2 ** 8)) + return version_string + + @app_version.setter + def app_version(self, version_info): + self.__app_version = version_info + + @property + def os_version(self): + version_string = "" + version_string += str(self.__os_version >> 13) + "." + version_string += str(self.__os_version % (2 ** 13) >> 8) + "." + version_string += str(self.__os_version % (2 ** 8)) + return version_string + + @os_version.setter + def os_version(self, version_info): + self.__os_version = version_info + + @property + def id(self) -> int: + return self._id + + @property + def uuid(self) -> int: + return self._uuid + + @property + def is_up_to_date(self): + root_path = path.join(path.dirname(__file__), "..", "assets") + version_path = path.join(root_path, "version.txt") + + with open(version_path, "r") as version_file: + try: + version_info = json.loads(version_file.read()) + except Exception: + pass + + app_version_info = version_info[self.module_type].lstrip("v").rstrip("\n") + if self.module_type in ["env", "display", "speaker"]: + os_version_info = version_info["os_e103"].lstrip("v").rstrip("\n") + else: + os_version_info = version_info["os_e230"].lstrip("v").rstrip("\n") + + app_version_digits = [int(digit) for digit in app_version_info.split(".")] + os_version_digits = [int(digit) for digit in os_version_info.split(".")] + + latest_app_version = ( + app_version_digits[0] << 13 + | app_version_digits[1] << 8 + | app_version_digits[2] + ) + latest_os_version = ( + os_version_digits[0] << 13 + | os_version_digits[1] << 8 + | os_version_digits[2] + ) + + return latest_app_version <= self.__app_version or latest_os_version <= self.__os_version + + def _get_property(self, property_type: int) -> bytearray: + """ Get module property value and request + + :param property_type: Type of the requested property + :type property_type: int + """ + + # Register property if not exists + if property_type not in self.__get_properties: + self.__get_properties[property_type] = self.Property() + self.__request_property(self._id, property_type) + + # Request property value if not updated for 2 sec + last_update = self.__get_properties[property_type].last_update_time + if time.time() - last_update > self.prop_request_period: + self.__request_property(self._id, property_type) + + if self.__get_properties[property_type].value is None: + if self._enable_get_property_timeout: + first_request_time = time.time() + + # 3s timeout + while self.__get_properties[property_type].value is None: + if time.time() - first_request_time > 3: + raise Module.GetValueInitTimeout + time.sleep(0.1) + else: + return bytearray(14) # Increased from 12 to 14 to support RGB properties (offset 12 + 2 bytes) + + return self.__get_properties[property_type].value + + def _set_property(self, destination_id: int, + property_num: int, + property_values: Union[Tuple, str], + force: bool = False) -> None: + """Send the message of set_property command to the module + + :param destination_id: Id of the destination module + :type destination_id: int + :param property_num: Property Type + :type property_num: int + :param property_values: Property Values + :type property_values: Tuple + :param force: Force data to be sent + :type force: bool + :return: None + """ + + do_send = False + now_time = time.time() + + if not self.__check_last_set_property(property_num): + force = True + + if property_num in self.__set_properties: + if property_values == self.__set_properties[property_num].value: + duration = now_time - self.__set_properties[property_num].last_update_time + if force or duration > self.prop_request_period: + # 마지막으로 보낸 데이터와 같은 경우, 2초마다 전송 or force가 true인 경우 + self.__set_properties[property_num].value = property_values + self.__set_properties[property_num].last_update_time = now_time + do_send = True + else: + # 마지막으로 보낸 데이터와 다른 경우, 바로 전송 + self.__set_properties[property_num].value = property_values + self.__set_properties[property_num].last_update_time = now_time + do_send = True + else: + # 데이터를 한번도 안 보낸 경우, 바로 전송 + self.__set_properties[property_num] = self.Property() + self.__set_properties[property_num].value = property_values + self.__set_properties[property_num].last_update_time = now_time + do_send = True + + if do_send: + message = parse_set_property_message( + destination_id, + property_num, + property_values, + ) + self._connection.send_nowait(message) + + self.__last_set_property_num = property_num + + def update_property(self, property_type: int, property_value: bytearray) -> None: + """ Update property value and time + + :param property_type: Type of the updated property + :type property_type: int + :param property_value: Value to update the property + :type property_value: bytearray + """ + + if property_type not in self.__get_properties: + self.__get_properties[property_type] = self.Property() + self.__get_properties[property_type].value = property_value + self.__get_properties[property_type].last_update_time = time.time() + + def __request_property(self, destination_id: int, property_type: int) -> None: + """ Generate message for request property + + :param destination_id: Id of the destination module + :type destination_id: int + :param property_type: Type of the requested property + :type property_type: int + :return: None + """ + + self.__get_properties[property_type].last_update_time = time.time() + req_prop_msg = parse_get_property_message(destination_id, property_type, self.prop_samp_freq) + self._connection.send(req_prop_msg) + + def __check_last_set_property(self, property_num: int) -> bool: + if self.__last_set_property_num is None: + return False + else: + return self.__last_set_property_num == property_num + + +class SetupModule(Module): + pass + + +class InputModule(Module): + pass + + +class OutputModule(Module): + pass + + +class ModuleList(list): + + def __init__(self, src, module_type=None): + self.__src = src + self.__module_type = module_type + super().__init__(self.sublist()) + + def __len__(self): + return len(self.sublist()) + + def __eq__(self, other): + return super().__eq__(other) + + def __getitem__(self, key): + if int(key) >= len(self): + start_time = time.time() + # 3s timeout + while ((time.time() - start_time) < 3) and (int(key) >= len(self)): + time.sleep(0.1) + if int(key) >= len(self): + raise Exception("Not enough modules exits!!") + return self.sublist()[key] + + def get(self, module_id): + for module in self.sublist(): + if module.id == module_id: + return module + raise Exception("Module with given id does not exits!!") + + def sublist(self): + """ When accessing the module, the modules are sorted in an ascending order of + 1. the connected time from network module + + :return: Module + """ + + if self.__module_type: + modules = list(filter(lambda module: module.module_type == self.__module_type, self.__src)) + else: + modules = self.__src + modules.sort() + return modules + + def find(self, module_id): + for idx, module in enumerate(self.sublist()): + if module_id == module.id: + return idx + return -1 diff --git a/packages/core/modi_plus/module/output_module/__init__.py b/packages/core/modi_plus/module/output_module/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/packages/core/modi_plus/module/output_module/display.py b/packages/core/modi_plus/module/output_module/display.py new file mode 100644 index 0000000..1823e8c --- /dev/null +++ b/packages/core/modi_plus/module/output_module/display.py @@ -0,0 +1,347 @@ +"""Display module.""" + +import time +from typing import List +from modi_plus.module.module import OutputModule + + +class Display(OutputModule): + + WIDTH = 96 + HEIGHT = 96 + + TEXT_SPLIT_LEN = 24 + DOT_SPLIT_LEN = 23 + DOT_LEN = int(WIDTH * HEIGHT / 8) + + PROPERTY_DISPLAY_WRITE_TEXT = 17 + PROPERTY_DISPLAY_DRAW_DOT = 18 + PROPERTY_DISPLAY_DRAW_PICTURE = 19 + PROPERTY_DISPLAY_RESET = 21 + PROPERTY_DISPLAY_WRITE_VARIABLE = 22 + PROPERTY_DISPLAY_SET_OFFSET = 25 + PROPERTY_DISPLAY_MOVE_SCREEN = 26 + + PRESET_PICTURE = { + "smiling brightly": "res/smileb.bmp", + "falling in love": "res/love.bmp", + "smiling": "res/smiling.bmp", + "angry": "res/angry.bmp", + "tired": "res/tired.bmp", + "surprised": "res/surprise.bmp", + "crying": "res/cry.bmp", + "dizzy": "res/dizzy.bmp", + "turn a blind eye": "res/bilnd.bmp", + "sleeping": "res/sleeping.bmp", + "embarrassed": "res/emv.bmp", + "proud": "res/proud.bmp", + "Devil": "res/devil.bmp", + "Angel": "res/angel.bmp", + "Dragon": "res/dragon.bmp", + "Santa Claus": "res/santa.bmp", + "Ludolf": "res/ludolf.bmp", + "Ghost": "res/ghost.bmp", + "Witch": "res/witch.bmp", + "Halloween Pumpkin": "res/pumpkin.bmp", + "magic wand": "res/wand.bmp", + "magic hat": "res/hat.bmp", + "crystal ball": "res/ball.bmp", + "potion": "res/potion.bmp", + "Dog": "res/dog.bmp", + "Cat": "res/cat.bmp", + "Rabbit": "res/rabbit.bmp", + "Chick": "res/chick.bmp", + "Lion": "res/lion.bmp", + "Turtle": "res/turtle.bmp", + "Sparrow": "res/sparrow.bmp", + "Penguin": "res/penguin.bmp", + "Butterfly": "res/butfly.bmp", + "Fish": "res/fish.bmp", + "Dolphin": "res/dolphin.bmp", + "Hedgehog": "res/hedgeh.bmp", + "Flower": "res/flower.bmp", + "Tree": "res/tree.bmp", + "Sun": "res/sun.bmp", + "Star": "res/star.bmp", + "Moon": "res/moon.bmp", + "Earth": "res/earth.bmp", + "Space": "res/space.bmp", + "Cloud": "res/cloud.bmp", + "Rain": "res/rain.bmp", + "Snow": "res/snow.bmp", + "Wind": "res/wind.bmp", + "Thunder": "res/thunder.bmp", + "Water drop": "res/water.bmp", + "Fire": "res/fire.bmp", + "Car": "res/car.bmp", + "Ship": "res/ship.bmp", + "Airplane": "res/airplane.bmp", + "Train": "res/train.bmp", + "Bus": "res/bus.bmp", + "Police car": "res/policec.bmp", + "Ambulance": "res/ambul.bmp", + "Rocket": "res/rocket.bmp", + "Hot-air balloon": "res/hotair.bmp", + "Helicopter": "res/helicop.bmp", + "Sports car": "res/sportsc.bmp", + "Bicycle": "res/bicycle.bmp", + "School": "res/school.bmp", + "Park": "res/park.bmp", + "Hospital": "res/hospital.bmp", + "Building": "res/build.bmp", + "Apartment": "res/apart.bmp", + "Amusement park": "res/amuse.bmp", + "a house of brick": "res/brick.bmp", + "log cabin": "res/cabin.bmp", + "a house of straw": "res/straw.bmp", + "vacant lot": "res/vacant.bmp", + "Field": "res/field.bmp", + "Mountain": "res/mountain.bmp", + "Apple": "res/apple.bmp", + "Banana": "res/banana.bmp", + "Strawberry": "res/strawb.bmp", + "Peach": "res/peach.bmp", + "Watermelon": "res/waterm.bmp", + "Chicken": "res/chicken.bmp", + "Pizza": "res/pizza.bmp", + "Hamburger": "res/hamburg.bmp", + "Cake": "res/cake.bmp", + "Nuddle": "res/nuddle.bmp", + "Donut": "res/donut.bmp", + "Candy": "res/candy.bmp", + "Communication ": "res/comm.bmp", + "Battery": "res/battery.bmp", + "Download": "res/download.bmp", + "Check": "res/check.bmp", + "X": "res/x.bmp", + "Play": "res/play.bmp", + "Stop": "res/stop2.bmp", + "Pause": "res/pause.bmp", + "Power": "res/power.bmp", + "Bulb": "res/bulb.bmp", + "straight sign": "res/straigh.bmp", + "turn left sign": "res/lefts.bmp", + "turn right sign": "res/rights.bmp", + "stop sign": "res/stop.bmp", + "prize": "res/prize.bmp", + "losing ticket": "res/losing.bmp", + "Retry": "res/retry.bmp", + "Thumbs up": "res/thumbs.bmp", + "Scissors": "res/scissors.bmp", + "Rock": "res/rock.bmp", + "Paper": "res/paper.bmp", + "up arrow": "res/up.bmp", + "down arrow": "res/down.bmp", + "Right arrow": "res/righta.bmp", + "Left arrow": "res/lefta.bmp", + "Heart": "res/heart.bmp", + "Musical note": "res/note.bmp", + "baby": "res/baby.bmp", + "Girl": "res/girl.bmp", + "Boy": "res/boy.bmp", + "Women": "res/women.bmp", + "Men": "res/men.bmp", + "Grandmother": "res/grandm.bmp", + "Grandfather": "res/grandf.bmp", + "Teacher": "res/teacher.bmp", + "Programmer": "res/program.bmp", + "Police": "res/police.bmp", + "Doctor": "res/doctor.bmp", + "Farmer": "res/farmer.bmp", + "game console": "res/game.bmp", + "Microphone": "res/microp.bmp", + "loud speaker": "res/speaker.bmp", + "Watch": "res/watch.bmp", + "Telephone": "res/tele.bmp", + "Camera": "res/camera.bmp", + "TV": "res/tv.bmp", + "Radio": "res/radio.bmp", + "Book": "res/book.bmp", + "Microscope": "res/micros.bmp", + "Telescope": "res/teles.bmp", + "Wastebasket": "res/waste.bmp", + "Mask": "res/mask.bmp", + "Flag": "res/flag.bmp", + "Letter": "res/letter.bmp", + "Soccer ball": "res/soccer.bmp", + "basketball": "res/basket.bmp", + "Piano": "res/piano.bmp", + "Gittar": "res/gittar.bmp", + "Drum": "res/drum.bmp", + "Siren": "res/siren.bmp", + "Gift box": "res/giftbox.bmp", + "Crown": "res/crown.bmp", + "Dice": "res/dice.bmp", + "Medal": "res/medal.bmp", + "Key": "res/key.bmp", + "jewerly": "res/jewerly.bmp", + "Coin": "res/coin.bmp", + } + + @staticmethod + def preset_pictures() -> List[str]: + return list(Display.PRESET_PICTURE.keys()) + + def __init__(self, id_, uuid, connection_task): + super().__init__(id_, uuid, connection_task) + self._text = "" + + @property + def text(self) -> str: + return self._text + + @text.setter + def text(self, text: str) -> None: + self.write_text(text) + + def write_text(self, text: str) -> None: + """Show the input string on the display. + + :param text: Text to display. + :type text: str + :return: None + """ + + n = Display.TEXT_SPLIT_LEN + encoding_data = str.encode(str(text)) + bytes(1) + splited_data = [encoding_data[x - n:x] for x in range(n, len(encoding_data) + n, n)] + for index, data in enumerate(splited_data): + self._set_property( + self._id, + Display.PROPERTY_DISPLAY_WRITE_TEXT, + property_values=(("bytes", data), ), + force=True + ) + + self._text = text + time.sleep(0.02 + 0.003 * len(encoding_data)) + + def write_variable_xy(self, x: int, y: int, variable: float) -> None: + """Show the input variable on the display. + + :param x: X coordinate of the desired position + :type x: int + :param y: Y coordinate of te desired position + :type y: int + :param variable: Variable to display. + :type variable: float + :return: None + """ + self._set_property( + self._id, + Display.PROPERTY_DISPLAY_WRITE_VARIABLE, + property_values=(("u8", x), + ("u8", y), + ("float", variable), ) + ) + self._text += str(variable) + time.sleep(0.01) + + def write_variable_line(self, line: int, variable: float) -> None: + """Show the input variable on the display. + + :param line: display line number of the desired position + :type line: int + :param variable: Variable to display. + :type variable: float + :return: None + """ + self._set_property( + self._id, + Display.PROPERTY_DISPLAY_WRITE_VARIABLE, + property_values=(("u8", 0), + ("u8", line * 20), + ("float", variable), ) + ) + self._text += str(variable) + time.sleep(0.01) + + def draw_picture(self, name: int) -> None: + """Clears the display and show the input picture on the display. + + :param x: X coordinate of the desired position + :type x: int + :param y: Y coordinate of te desired position + :type y: int + :param name: Picture name to display. + :type name: float + :return: None + """ + + file_name = Display.PRESET_PICTURE.get(name) + if file_name is None: + raise ValueError(f"{file_name} is not on the list, check 'Display.preset_pictures()'") + + self._set_property( + self._id, + Display.PROPERTY_DISPLAY_DRAW_PICTURE, + property_values=(("u8", 0), + ("u8", 0), + ("u8", Display.WIDTH), + ("u8", Display.HEIGHT), + ("string", file_name), ) + ) + time.sleep(0.05) + + def draw_dot(self, dot: bytes) -> None: + """Clears the display and show the input dot on the display. + + :param dot: Dot to display + :type dot: bytes + :return: None + """ + + if not isinstance(dot, bytes): + raise ValueError("dot type must bytes") + + if len(dot) != Display.DOT_LEN: + raise ValueError(f"dot length must be {Display.DOT_LEN}") + + n = Display.DOT_SPLIT_LEN + splited_data = [dot[x - n:x] for x in range(n, len(dot) + n, n)] + for index, data in enumerate(splited_data): + send_data = bytes([index]) + data + + self._set_property( + self._id, + Display.PROPERTY_DISPLAY_DRAW_DOT, + property_values=(("bytes", send_data), ) + ) + time.sleep(0.3) + + def set_offset(self, x: int, y: int) -> None: + """Set origin point on the screen + + :param x: X-axis offset on screen + :type x: int + :param y: Y-axis offset on screen + :type y: int + :return: None + """ + + self._set_property( + self.id, + Display.PROPERTY_DISPLAY_SET_OFFSET, + property_values=(("s8", x), ("s8", y), ) + ) + time.sleep(0.01) + + def reset(self, mode=0) -> None: + """Clear the screen. + + :param mode: Erase mode + - mode 0 : Erase inside buffer(it looks like nothing has changed) + - mode 1 : Erase display + :return: None + """ + + if mode > 1: + mode = 0 + + self._set_property( + self._id, + Display.PROPERTY_DISPLAY_RESET, + property_values=(("u8", mode), ) + ) + self._text = "" + time.sleep(0.01) diff --git a/packages/core/modi_plus/module/output_module/led.py b/packages/core/modi_plus/module/output_module/led.py new file mode 100644 index 0000000..1ce71ac --- /dev/null +++ b/packages/core/modi_plus/module/output_module/led.py @@ -0,0 +1,145 @@ +"""Led module.""" + +import struct +from typing import Tuple +from modi_plus.module.module import OutputModule + + +class Led(OutputModule): + + PROPERTY_LED_STATE = 2 + + PROPERTY_LED_SET_RGB = 16 + + PROPERTY_OFFSET_RED = 0 + PROPERTY_OFFSET_GREEN = 2 + PROPERTY_OFFSET_BLUE = 4 + + @property + def rgb(self) -> Tuple[int, int, int]: + return self.red, self.green, self.blue + + @rgb.setter + def rgb(self, color: Tuple[int, int, int]) -> None: + """Sets the color of the LED light with given RGB values, and returns + the current RGB values. + + :param color: RGB value to set + :type color: Tuple[int, int, int] + :return: None + """ + + self.set_rgb(color[0], color[1], color[2]) + + @property + def red(self) -> int: + """Returns the current value of the red component of the LED + + :return: Red component + :rtype: int + """ + + offset = Led.PROPERTY_OFFSET_RED + raw = self._get_property(Led.PROPERTY_LED_STATE) + data = struct.unpack("H", raw[offset:offset + 2])[0] + return data + + @red.setter + def red(self, red: int) -> None: + """Sets the red component of the LED light by given value + + :param red: Red component to set + :type red: int + :return: None + """ + + self.rgb = red, self.green, self.blue + + @property + def green(self) -> int: + """Returns the current value of the green component of the LED + + :return: Green component + :rtype: int + """ + + offset = Led.PROPERTY_OFFSET_GREEN + raw = self._get_property(Led.PROPERTY_LED_STATE) + data = struct.unpack("H", raw[offset:offset + 2])[0] + return data + + @green.setter + def green(self, green: int) -> None: + """Sets the green component of the LED light by given value + + :param green: Green component to set + :type green: int + :return: None + """ + + self.rgb = self.red, green, self.blue + + @property + def blue(self) -> int: + """Returns the current value of the blue component of the LED + + :return: Blue component + :rtype: int + """ + + offset = Led.PROPERTY_OFFSET_BLUE + raw = self._get_property(Led.PROPERTY_LED_STATE) + data = struct.unpack("H", raw[offset:offset + 2])[0] + return data + + @blue.setter + def blue(self, blue: int) -> None: + """Sets the blue component of the LED light by given value + + :param blue: Blue component to set + :type blue: int + :return: None + """ + + self.rgb = self.red, self.green, blue + + def set_rgb(self, red: int, green: int, blue: int) -> None: + """Sets the color of the LED light with given RGB values, and returns + the current RGB values. + + :param red: Red component to set + :type red: int + :param green: Green component to set + :type green: int + :param blue: Blue component to set + :type blue: int + :return: None + """ + + self._set_property( + destination_id=self._id, + property_num=Led.PROPERTY_LED_SET_RGB, + property_values=(("u16", red), + ("u16", green), + ("u16", blue), ) + ) + + # + # Legacy Support + # + def turn_on(self) -> None: + """Turn on led at maximum brightness. + + :return: RGB value of the LED set to maximum brightness + :rtype: None + """ + + self.rgb = 100, 100, 100 + + def turn_off(self) -> None: + """Turn off led. + + :return: None + """ + + self.rgb = 0, 0, 0 diff --git a/packages/core/modi_plus/module/output_module/motor.py b/packages/core/modi_plus/module/output_module/motor.py new file mode 100644 index 0000000..2795b8c --- /dev/null +++ b/packages/core/modi_plus/module/output_module/motor.py @@ -0,0 +1,168 @@ +"""Motor module.""" + +import time +import struct +from typing import Tuple +from modi_plus.module.module import OutputModule + + +class Motor(OutputModule): + + PROPERTY_MOTOR_STATE = 2 + + PROPERTY_MOTOR_SPEED = 17 + PROPERTY_MOTOR_ANGLE = 18 + PROPERTY_MOTOR_ANGLE_APPEND = 19 + PROPERTY_MOTOR_STOP = 20 + + PROPERTY_OFFSET_CURRENT_ANGLE = 0 + PROPERTY_OFFSET_CURRENT_SPEED = 2 + PROPERTY_OFFSET_TARGET_ANGLE = 4 + PROPERTY_OFFSET_TARGET_SPEED = 6 + + @property + def angle(self) -> int: + """Returns current angle + + :return: Current angle value + :rtype: int + """ + + offset = Motor.PROPERTY_OFFSET_CURRENT_ANGLE + raw = self._get_property(Motor.PROPERTY_MOTOR_STATE) + data = struct.unpack("H", raw[offset:offset + 2])[0] + return data + + @angle.setter + def angle(self, angle_value: Tuple[int, int]) -> None: + """Sets the angle of the motor + + :param angle_value: Value of angle and speed to reach target angle + :type angle_value: Tuple[int, int] + :return: None + """ + + self.set_angle(angle_value[0], angle_value[1]) + + @property + def target_angle(self) -> int: + """Returns target angle + + :return: Target angle value + :rtype: int + """ + + offset = Motor.PROPERTY_OFFSET_TARGET_ANGLE + raw = self._get_property(Motor.PROPERTY_MOTOR_STATE) + data = struct.unpack("H", raw[offset:offset + 2])[0] + return data + + @property + def speed(self) -> int: + """Returns current speed + + :return: Current speed value + :rtype: int + """ + + offset = Motor.PROPERTY_OFFSET_CURRENT_SPEED + raw = self._get_property(Motor.PROPERTY_MOTOR_STATE) + data = struct.unpack("H", raw[offset:offset + 2])[0] + return data + + @speed.setter + def speed(self, target_speed: int) -> None: + """Sets the speed of the motor + + :param target_speed: Speed to set the motor. + :type target_speed: int + :return: None + """ + + self.set_speed(target_speed) + + @property + def target_speed(self) -> int: + """Returns target speed + + :return: Target speed value + :rtype: int + """ + + offset = Motor.PROPERTY_OFFSET_TARGET_SPEED + raw = self._get_property(Motor.PROPERTY_MOTOR_STATE) + data = struct.unpack("H", raw[offset:offset + 2])[0] + return data + + def set_angle(self, target_angle: int, target_speed: int = 70) -> None: + """Sets the angle of the motor + + :param target_angle: Angle to set the motor. + :type target_angle: int + :param target_speed: Speed to reach target angle. + :type target_speed: int + :return: None + """ + + invalid_angle = (target_angle < 0 or target_angle > 360) + invalid_speed = (target_speed < 0 or target_speed > 100) + + if invalid_angle or invalid_speed: + return + + self._set_property( + destination_id=self._id, + property_num=Motor.PROPERTY_MOTOR_ANGLE, + property_values=(("u16", target_angle), + ("u16", target_speed), + ("u16", 0), + ("u16", 0), ) + ) + time.sleep(0.01) + + def set_speed(self, target_speed: int) -> None: + """Sets the speed of the motor + + :param target_speed: Speed to set the motor. + :type target_speed: int + :return: None + """ + + self._set_property( + destination_id=self._id, + property_num=Motor.PROPERTY_MOTOR_SPEED, + property_values=(("s32", target_speed), ) + ) + time.sleep(0.01) + + def append_angle(self, target_angle: int, target_speed: int = 70) -> None: + """append the angle form current angle of the motor + + :param target_angle: Angle to append the motor angle. + :type target_angle: int + :param target_speed: Speed to reach target angle. + :type target_speed: int + :return: None + """ + + self._set_property( + destination_id=self._id, + property_num=Motor.PROPERTY_MOTOR_ANGLE_APPEND, + property_values=(("s16", target_angle), + ("u16", target_speed), ), + force=True + ) + time.sleep(0.01) + + def stop(self) -> None: + """Stop operating motor + + :return: None + """ + + self._set_property( + destination_id=self._id, + property_num=Motor.PROPERTY_MOTOR_STOP, + property_values=() + ) + time.sleep(0.01) diff --git a/packages/core/modi_plus/module/output_module/speaker.py b/packages/core/modi_plus/module/output_module/speaker.py new file mode 100644 index 0000000..79083b1 --- /dev/null +++ b/packages/core/modi_plus/module/output_module/speaker.py @@ -0,0 +1,311 @@ +"""Speaker module.""" + +import time +import struct +from typing import List, Tuple, Union +from modi_plus.module.module import OutputModule + + +class Speaker(OutputModule): + + STATE_STOP = 0 + STATE_START = 1 + STATE_PAUSE = 2 + STATE_RESUME = 3 + + PROPERTY_SPEAKER_STATE = 2 + + PROPERTY_SPEAKER_SET_TUNE = 16 + PROPERTY_SPEAKER_RESET = 17 + PROPERTY_SPEAKER_MUSIC = 18 + PROPERTY_SPEAKER_MELODY = 19 + + PROPERTY_OFFSET_CURRENT_VOLUME = 0 + PROPERTY_OFFSET_CURRENT_FREQUENCY = 2 + + SCALE_TABLE = { + "FA5": 698, + "SOL5": 783, + "LA5": 880, + "TI5": 988, + "DO#5": 554, + "RE#5": 622, + "FA#5": 739, + "SOL#5": 830, + "LA#5": 932, + "DO6": 1046, + "RE6": 1174, + "MI6": 1318, + "FA6": 1397, + "SOL6": 1567, + "LA6": 1760, + "TI6": 1975, + "DO#6": 1108, + "RE#6": 1244, + "FA#6": 1479, + "SOL#6": 1661, + "LA#6": 1864, + "DO7": 2093, + "RE7": 2349, + "MI7": 2637 + } + + PRESET_MUSIC = { + # .mid + "Sylvia : Pizzicato": "res/Delibes.mid", + "London Bridge is Falling Down": "res/London.mid", + "Old MacDonald Had a Farm": "res/OldMac.mid", + "Piano Concerto No.21": "res/Mozart21.mid", + "Le Donna E mobile": "res/Verdi.mid", + "Four Seasons: Spring": "res/Vivaldi.mid", + "Carmen : Les Toreadors": "res/Bizet.mid", + "The Washington Post": "res/Sousa.mid", + "Die Forelle(The Trout)": "res/SchubeD.mid", + "The Cuckoo Waltz": "res/Jonasson.mid", + "Entry of the Gladiators": "res/Fucik.mid", + "Mary had a Little Lamb": "res/Mary.mid", + "Symphony No.9": "res/Dvorak.mid", + "William Tell Overture": "res/Rossini.mid", + "Symphony No.40": "res/Mozart40.mid", + "Queen of the Night": "res/MozartQ.mid", + "Orpheus in the Underworld": "res/BachO.mid", + "Piano Concerto": "res/Grieg.mid", + "Toccata and Fugue in D minor": "res/BachD.mid", + "Symphony No. 5: I": "res/Beeth5.mid", + "For Elise": "res/BeethF.mid", + "Blue Danube": "res/Straus.mid", + "Carmina Burana: O Fortuna": "res/Orff.mid", + "Piano Concerto No.1": "res/Tchaiko1.mid", + "Csikos Post": "res/Necke.mid", + "Turkish March": "res/MozartR.mid", + "Hungarian Dance No.5": "res/Brahms5.mid", + "Dance of the Sugar Plum Fairy": "res/TchaikoD.mid", + "Itsy Bitsy Spider": "res/Spider.mid", + "The Farmer in The Dell": "res/Farmer.mid", + "Liebestraum No.3(Love Dream)": "res/Liszt.mid", + "Piano Sonata No.16": "res/Mozart16.mid", + "Bach: Minuet in G": "res/BachG.mid", + "Twinkle Twinkle Little Star": "res/twinkle.mid", + "Beethoven: Minuet in G": "res/BeethG.mid", + "Minuet": "res/Bocc.mid", + "16 Waltzes": "res/Brahms16.mid", + "Brahms: Lullaby": "res/BrahmsL.mid", + "Schubert: Lullaby": "res/SchubeW.mid", + "Yankee Doodle": "res/yankee.mid", + "Salut d'Amour(Love's Greeting)": "res/ElgarS.mid", + "Silver Waves": "res/Wyman.mid", + "Waltz of the Flowers": "res/TchaikoW.mid", + "Swan Lake : Scene": "res/TchaikoS.mid", + "Wedding March": "res/Mendel.mid", + "Bridal Chorus": "res/Wagner.mid", + "Pomp and Circumstance March": "res/ElgarP.mid", + "Happy Birthday to You": "res/Birthday.mid", + "Jingle Bells": "res/Jingle.mid", + "We Wish You a Merry Christmas": "res/Merry.mid", + "Excitement": "res/Emotion1.mid", + "Depressed": "res/Emotion2.mid", + "Joy": "res/Emotion3.mid", + "Warning 1": "res/Warning1.mid", + "Warning 2": "res/Warning2.mid", + "Start 1": "res/Start1.mid", + "Start 2": "res/Start2.mid", + "Complete 1": "res/Complet1.mid", + "Complete 2": "res/Complet2.mid", + + # .wav + "Alarm": "res/Alarm.wav", + "Bomb": "res/Bomb.wav", + "Camera": "res/Camera.wav", + "Car": "res/Car.wav", + "Complete": "res/Complete.wav", + "Exciting": "res/Exciting.wav", + "Robot": "res/Robot.wav", + "Siren": "res/Siren.wav", + "Start": "res/Start.wav", + "Success": "res/Success.wav", + "Win": "res/Win.wav", + "Bouncing": "res/bouncing.wav", + } + + @staticmethod + def preset_notes() -> List[str]: + return list(Speaker.SCALE_TABLE.keys()) + + @staticmethod + def preset_musics() -> List[str]: + return list(Speaker.PRESET_MUSIC.keys()) + + @property + def tune(self) -> Tuple[int, int]: + return self.frequency, self.volume + + @tune.setter + def tune(self, tune_value: Tuple[Union[int, str], int]) -> None: + """Set tune for the speaker + + :param tune_value: Value of frequency and volume + :type tune_value: Tuple[Union[int, str], int] + :return: None + """ + + self.set_tune(tune_value[0], tune_value[1]) + + @property + def frequency(self) -> int: + """Returns Current frequency + + :return: Frequency value + :rtype: int + """ + + offset = Speaker.PROPERTY_OFFSET_CURRENT_FREQUENCY + raw = self._get_property(Speaker.PROPERTY_SPEAKER_STATE) + data = struct.unpack("H", raw[offset:offset + 2])[0] + return data + + @frequency.setter + def frequency(self, frequency_value: int) -> None: + """Set the frequency for the speaker + + :param frequency_value: Frequency to set + :type frequency_value: int + :return: None + """ + self.tune = frequency_value, self.volume + + @property + def volume(self) -> int: + """Returns Current volume + + :return: Volume value + :rtype: int + """ + + offset = Speaker.PROPERTY_OFFSET_CURRENT_VOLUME + raw = self._get_property(Speaker.PROPERTY_SPEAKER_STATE) + data = struct.unpack("H", raw[offset:offset + 2])[0] + return data + + @volume.setter + def volume(self, volume_value: int) -> None: + """Set the volume for the speaker + + :param volume_value: Volume to set + :type volume_value: int + :return: None + """ + self.tune = self.frequency, volume_value + + def set_tune(self, frequency: Union[int, str], volume: int) -> None: + """Set tune for the speaker + + :param frequency: Frequency value + :type frequency: int + :param volume: Volume value + :type volume: int + :return: None + """ + + if isinstance(frequency, str): + frequency = Speaker.SCALE_TABLE.get(frequency, -1) + + if frequency < 0: + raise ValueError("Not a supported frequency value") + + self._set_property( + destination_id=self._id, + property_num=Speaker.PROPERTY_SPEAKER_SET_TUNE, + property_values=(("u16", frequency), ("u16", volume), ) + ) + time.sleep(0.01) + + def play_music(self, name: str, volume: int) -> None: + """Play music in speaker module + + :param name: Music name for playing + :type name: str + :param volume: Volume of speaker + :type volume: int + :return: None + """ + + file_name = Speaker.PRESET_MUSIC.get(name) + if file_name is None: + raise ValueError(f"{file_name} is not on the list, check 'Speaker.preset_musics()'") + + property_num = Speaker.PROPERTY_SPEAKER_MELODY if ".mid" in file_name else Speaker.PROPERTY_SPEAKER_MUSIC + self.playing_file_name = file_name + + self._set_property( + self._id, + property_num, + property_values=(("u8", Speaker.STATE_START), + ("u8", volume), + ("string", self.playing_file_name), ) + ) + time.sleep(0.1) + + def stop_music(self) -> None: + """Stop music in speaker module + + :return: None + """ + + if not len(self.playing_file_name): + return + + property_num = Speaker.PROPERTY_SPEAKER_MELODY if ".mid" in self.playing_file_name else Speaker.PROPERTY_SPEAKER_MUSIC + + self._set_property( + self._id, + property_num, + property_values=(("u8", Speaker.STATE_STOP), + ("u8", 0), + ("string", self.playing_file_name), ) + ) + + def pause_music(self) -> None: + """Pause music in speaker module + + :return: None + """ + + if not len(self.playing_file_name): + return + + property_num = Speaker.PROPERTY_SPEAKER_MELODY if ".mid" in self.playing_file_name else Speaker.PROPERTY_SPEAKER_MUSIC + + self._set_property( + self._id, + property_num, + property_values=(("u8", Speaker.STATE_PAUSE), + ("u8", 0), + ("string", self.playing_file_name), ) + ) + + def resume_music(self) -> None: + """Resume music in speaker module + + :return: None + """ + + if not len(self.playing_file_name): + return + + property_num = Speaker.PROPERTY_SPEAKER_MELODY if ".mid" in self.playing_file_name else Speaker.PROPERTY_SPEAKER_MUSIC + + self._set_property( + self._id, + property_num, + property_values=(("u8", Speaker.STATE_RESUME), + ("u8", 0), + ("string", self.playing_file_name), ) + ) + + def reset(self) -> None: + """Turn off the sound + + :return: None + """ + + self.set_tune(0, 0) diff --git a/packages/core/modi_plus/module/setup_module/__init__.py b/packages/core/modi_plus/module/setup_module/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/packages/core/modi_plus/module/setup_module/battery.py b/packages/core/modi_plus/module/setup_module/battery.py new file mode 100644 index 0000000..a809c53 --- /dev/null +++ b/packages/core/modi_plus/module/setup_module/battery.py @@ -0,0 +1,24 @@ +"""Battery module.""" + +import struct +from modi_plus.module.module import SetupModule + + +class Battery(SetupModule): + + PROPERTY_BATTERY_STATE = 2 + + PROPERTY_OFFSET_LEVEL = 0 + + @property + def level(self) -> float: + """Returns the level value + + :return: The battery's level. + :rtype: float + """ + + offset = Battery.PROPERTY_OFFSET_LEVEL + raw = self._get_property(Battery.PROPERTY_BATTERY_STATE) + data = struct.unpack("f", raw[offset:offset + 4])[0] + return data diff --git a/packages/core/modi_plus/module/setup_module/network.py b/packages/core/modi_plus/module/setup_module/network.py new file mode 100644 index 0000000..bf3bdc5 --- /dev/null +++ b/packages/core/modi_plus/module/setup_module/network.py @@ -0,0 +1,395 @@ +"""Network module.""" + +import time +import struct +from importlib import import_module as im + +from modi_plus.util.connection_util import get_ble_task_path +from modi_plus.module.module import SetupModule + + +def check_connection(func): + """Check connection decorator + """ + def wrapper(*args, **kwargs): + if isinstance(args[0]._connection, im(get_ble_task_path()).BleTask): + raise ValueError(f"{func.__name__} doen't supported for ble connection") + return func(*args, **kwargs) + return wrapper + + +class Network(SetupModule): + + STATE_TRUE = 100 + STATE_FALSE = 0 + + STATE_JOYSTICK_UP = 100 + STATE_JOYSTICK_DOWN = -100 + STATE_JOYSTICK_LEFT = -50 + STATE_JOYSTICK_RIGHT = 50 + STATE_JOYSTICK_UNPRESSED = 0 + + STATE_TIMER_REACHED = 100 + STATE_TIMER_UNREACHED = 0 + + STATE_IMU_FRONT = 100 + STATE_IMU_REAR = -100 + STATE_IMU_LEFT = -50 + STATE_IMU_RIGHT = 50 + STATE_IMU_ORIGIN = 0 + + STATE_BUZZER_ON = 100 + STATE_BUZZER_OFF = 0 + + STATE_CAMERA_PICTURE = 100 + + PROPERTY_NETWORK_RECEIVE_DATA = 2 + PROPERTY_NETWORK_BUTTON = 3 + PROPERTY_NETWORK_SWITCH = 4 + PROPERTY_NETWORK_DIAL = 5 + PROPERTY_NETWORK_JOYSTICK = 6 + PROPERTY_NETWORK_SLIDER = 7 + PROPERTY_NETWORK_TIMER = 8 + PROPERTY_NETWORK_IMU = 9 + PROPERTY_NETWORK_IMU_DIRECTION = 0 + + PROPERTY_NETWORK_SEND_DATA = 2 + PROPERTY_NETWORK_SEND_TEXT = 3 + PROPERTY_NETWORK_BUZZER = 4 + PROPERTY_NETWORK_CAMERA = 5 + + PROPERTY_OFFSET_BUTTON_PRESSED = 0 + PROPERTY_OFFSET_BUTTON_CLICKED = 2 + PROPERTY_OFFSET_BUTTON_DOUBLE_CLICKED = 4 + + PROPERTY_OFFSET_IMU_ROLL = 0 + PROPERTY_OFFSET_IMU_PITCH = 2 + PROPERTY_OFFSET_IMU_YAW = 4 + + def __init__(self, id_, uuid, connection_task): + super().__init__(id_, uuid, connection_task) + self.__buzzer_flag = True + self.__esp_version = None + + @property + def esp_version(self): + if self.__esp_version: + return self.__esp_version + self._conn.send('{"c":160,"s":25,"d":4095,"b":"AAAAAAAAAA==","l":8}') + while not self.__esp_version: + time.sleep(0.01) + return self.__esp_version + + @esp_version.setter + def esp_version(self, version): + self.__esp_version = version + + @check_connection + def received_data(self, index: int = 0) -> int: + """Returns received data from MODI Play + + :param index: Data's index + :type index: int + :return: Received data + :rtype: int + """ + + property_num = Network.PROPERTY_NETWORK_RECEIVE_DATA + 100 * index + offset = 0 + + raw = self._get_property(property_num) + data = struct.unpack("i", raw[offset:offset + 4])[0] + return data + + @check_connection + def button_pressed(self, index: int = 0) -> bool: + """Returns whether MODI Play button is pressed + + :param index: Button's index + :type index: int + :return: True is pressed + :rtype: bool + """ + + property_num = Network.PROPERTY_NETWORK_BUTTON + 100 * index + offset = Network.PROPERTY_OFFSET_BUTTON_PRESSED + + raw = self._get_property(property_num) + data = struct.unpack("H", raw[offset:offset + 2])[0] + return data == Network.STATE_TRUE + + @check_connection + def button_clicked(self, index: int = 0) -> bool: + """Returns whether MODI Play button is clicked + + :param index: Button's index + :type index: int + :return: True is clicked + :rtype: bool + """ + + property_num = Network.PROPERTY_NETWORK_BUTTON + 100 * index + offset = Network.PROPERTY_OFFSET_BUTTON_CLICKED + + raw = self._get_property(property_num) + data = struct.unpack("H", raw[offset:offset + 2])[0] + return data == Network.STATE_TRUE + + @check_connection + def button_double_clicked(self, index: int = 0) -> bool: + """Returns whether MODI Play button is double clicked + + :param index: Button's index + :type index: int + :return: True is double clicked + :rtype: bool + """ + + property_num = Network.PROPERTY_NETWORK_BUTTON + 100 * index + offset = Network.PROPERTY_OFFSET_BUTTON_DOUBLE_CLICKED + + raw = self._get_property(property_num) + data = struct.unpack("H", raw[offset:offset + 2])[0] + return data == Network.STATE_TRUE + + @check_connection + def switch_toggled(self, index: int = 0) -> bool: + """Returns whether MODI Play switch is toggled + + :param index: Switch's index + :type index: int + :return: `True` if toggled or `False`. + :rtype: bool + """ + + property_num = Network.PROPERTY_NETWORK_SWITCH + 100 * index + offset = 0 + + raw = self._get_property(property_num) + data = struct.unpack("H", raw[offset:offset + 2])[0] + return data == Network.STATE_TRUE + + @check_connection + def dial_turn(self, index: int = 0) -> int: + """Returns the current degree of MODI Play dial + + :param index: Dial's index + :type index: int + :return: Current degree + :rtype: int + """ + + property_num = Network.PROPERTY_NETWORK_DIAL + 100 * index + offset = 0 + + raw = self._get_property(property_num) + data = struct.unpack("H", raw[offset:offset + 2])[0] + return data + + @check_connection + def joystick_direction(self, index: int = 0) -> str: + """Returns the direction of the MODI Play joystick + + :param index: Joystick's index + :type index: int + :return: 'up', 'down', 'left', 'right', 'unpressed' + :rtype: str + """ + + property_num = Network.PROPERTY_NETWORK_JOYSTICK + 100 * index + offset = 0 + + raw = self._get_property(property_num) + data = struct.unpack("h", raw[offset:offset + 2])[0] + + return { + Network.STATE_JOYSTICK_UP: "up", + Network.STATE_JOYSTICK_DOWN: "down", + Network.STATE_JOYSTICK_LEFT: "left", + Network.STATE_JOYSTICK_RIGHT: "right", + Network.STATE_JOYSTICK_UNPRESSED: "unpressed" + }.get(data) + + @check_connection + def slider_position(self, index: int = 0) -> int: + """Returns the current percentage of MODI Play slider + + :param index: Slider's index + :type index: int + :return: Current percentage + :rtype: int + """ + + property_num = Network.PROPERTY_NETWORK_SLIDER + 100 * index + offset = 0 + + raw = self._get_property(property_num) + data = struct.unpack("h", raw[offset:offset + 2])[0] + return data + + @property + @check_connection + def time_up(self) -> bool: + """Returns if the MODI Play timer ticks + + :return: True if timer is up + :rtype: bool + """ + + property_num = Network.PROPERTY_NETWORK_TIMER + offset = 0 + + raw = self._get_property(property_num) + data = struct.unpack("H", raw[offset:offset + 2])[0] + return data == Network.STATE_TIMER_REACHED + + @property + @check_connection + def imu_roll(self) -> int: + """Returns the roll angle of the MODI Play imu + + :return: Roll angle. + :rtype: int + """ + + property_num = Network.PROPERTY_NETWORK_IMU + offset = Network.PROPERTY_OFFSET_IMU_ROLL + + raw = self._get_property(property_num) + data = struct.unpack("h", raw[offset:offset + 2])[0] + return data + + @property + @check_connection + def imu_pitch(self) -> int: + """Returns the pitch angle of the MODI Play imu + + :return: Pitch angle. + :rtype: int + """ + + property_num = Network.PROPERTY_NETWORK_IMU + offset = Network.PROPERTY_OFFSET_IMU_PITCH + + raw = self._get_property(property_num) + data = struct.unpack("h", raw[offset:offset + 2])[0] + return data + + @property + @check_connection + def imu_yaw(self) -> int: + """Returns the yaw angle of the MODI Play imu + + :return: Yaw angle. + :rtype: int + """ + + property_num = Network.PROPERTY_NETWORK_IMU + offset = Network.PROPERTY_OFFSET_IMU_YAW + + raw = self._get_property(property_num) + data = struct.unpack("h", raw[offset:offset + 2])[0] + return data + + @property + @check_connection + def imu_direction(self) -> str: + """Returns the direction of the MODI Play imu + + :return: 'front', 'rear', 'left', 'right', 'origin' + :rtype: str + """ + + property_num = Network.PROPERTY_NETWORK_IMU_DIRECTION + offset = 0 + + raw = self._get_property(property_num) + data = struct.unpack("h", raw[offset:offset + 2])[0] + + return { + Network.STATE_IMU_FRONT: "front", + Network.STATE_IMU_REAR: "rear", + Network.STATE_IMU_LEFT: "left", + Network.STATE_IMU_RIGHT: "right", + Network.STATE_IMU_ORIGIN: "origin" + }.get(data) + + @check_connection + def send_data(self, index: int, data: int) -> None: + """Send text to MODI Play + + :param index: Data's index + :type index: int + :param data: Data to send. + :type data: int + :return: None + """ + + property_num = Network.PROPERTY_NETWORK_SEND_DATA + 0x100 * index + + self._set_property( + destination_id=self._id, + property_num=property_num, + property_values=(("s32", data),), + force=True + ) + + @check_connection + def send_text(self, text: str) -> None: + """Send text to MODI Play + + :param text: Text to send. + :type text: str + :return: None + """ + + self._set_property( + destination_id=self._id, + property_num=Network.PROPERTY_NETWORK_SEND_TEXT, + property_values=(("string", text),), + force=True + ) + + @check_connection + def buzzer_on(self) -> None: + """Turns on MODI Play buzzer + + :return: None + """ + + if self.__buzzer_flag: + self.buzzer_off() + self.__buzzer_flag = False + + self._set_property( + destination_id=self._id, + property_num=Network.PROPERTY_NETWORK_BUZZER, + property_values=(("u8", Network.STATE_BUZZER_ON),) + ) + + @check_connection + def buzzer_off(self) -> None: + """Turns off MODI Play buzzer + + :return: None + """ + + self._set_property( + destination_id=self._id, + property_num=Network.PROPERTY_NETWORK_BUZZER, + property_values=(("u8", Network.STATE_BUZZER_OFF),) + ) + self.__buzzer_flag = False + + @check_connection + def take_picture(self) -> None: + """Takes a picture on MODI Play + + :return: None + """ + + self._set_property( + destination_id=self._id, + property_num=Network.PROPERTY_NETWORK_CAMERA, + property_values=(("u8", Network.STATE_CAMERA_PICTURE),) + ) diff --git a/packages/core/modi_plus/task/__init__.py b/packages/core/modi_plus/task/__init__.py new file mode 100644 index 0000000..0152acc --- /dev/null +++ b/packages/core/modi_plus/task/__init__.py @@ -0,0 +1,34 @@ +"""MODI+ Task module - 통신 레이어 + +조건부 import를 통해 pyserial/bleak 없이도 패키지 import 가능 +""" + +# 플래그 초기화 +HAS_SERIAL = False +HAS_BLE = False + +# Serial Task (pyserial 필요) +try: + from modi_plus.task.serialport_task import SerialportTask + HAS_SERIAL = True +except ImportError: + SerialportTask = None + +# BLE Task (bleak 필요) +try: + from modi_plus.util.connection_util import get_ble_task_path + from importlib import import_module + # BLE task는 플랫폼별로 다르므로 여기서 직접 import하지 않음 + HAS_BLE = True +except ImportError: + HAS_BLE = False + +# Connection Task (항상 사용 가능) +from modi_plus.task.connection_task import ConnectionTask + +__all__ = [ + 'ConnectionTask', + 'HAS_SERIAL', + 'HAS_BLE', + 'SerialportTask', +] diff --git a/packages/core/modi_plus/task/ble_task/__init__.py b/packages/core/modi_plus/task/ble_task/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/packages/core/modi_plus/task/ble_task/ble_task_linux.py b/packages/core/modi_plus/task/ble_task/ble_task_linux.py new file mode 100644 index 0000000..c699434 --- /dev/null +++ b/packages/core/modi_plus/task/ble_task/ble_task_linux.py @@ -0,0 +1,29 @@ +from typing import Optional + +from modi_plus.task.connection_task import ConnectionTask + + +class BleTask(ConnectionTask): + CHAR_UUID = "00008421-0000-1000-8000-00805f9b34fb" + + def __init__(self, verbose=False, uuid=None): + super().__init__(verbose=verbose) + + def open_connection(self): + pass + + def close_connection(self): + pass + + def handle_disconnected(self, _): + print("Device is being properly disconnected...") + + def recv(self) -> Optional[str]: + return "" + + @ConnectionTask.wait + def send(self, pkt: str) -> None: + pass + + def send_nowait(self, pkt: str) -> None: + pass diff --git a/packages/core/modi_plus/task/ble_task/ble_task_mac.py b/packages/core/modi_plus/task/ble_task/ble_task_mac.py new file mode 100644 index 0000000..f74656a --- /dev/null +++ b/packages/core/modi_plus/task/ble_task/ble_task_mac.py @@ -0,0 +1,162 @@ +import sys +import json +import time +import base64 +import asyncio +import nest_asyncio + +from typing import Optional +from queue import Queue +from threading import Thread + +from bleak import BleakClient, BleakError, BleakScanner + +from modi_plus.task.connection_task import ConnectionTask +from modi_plus.util.connection_util import MODIConnectionError + + +nest_asyncio.apply() + + +class BleTask(ConnectionTask): + CHAR_UUID = "00008421-0000-1000-8000-00805f9b34fb" + + def __init__(self, verbose=False, uuid=None): + super().__init__(verbose=verbose) + self.modi_name = f"MODI+_{uuid.upper()}" + print(f"Initiating ble_task connection with {self.modi_name}") + self._loop = asyncio.get_event_loop() + self._recv_q = Queue() + self._send_q = Queue() + self.__close_event = False + + if sys.platform == "darwin": + from bleak.backends.corebluetooth import client as mac_client + self.__get_service = mac_client.BleakClientCoreBluetooth.get_services + mac_client.BleakClientCoreBluetooth.get_services = self.mac_get_service + + @staticmethod + async def mac_get_service(client): + return None + + def match_device(self, device, _): + return device.name == self.modi_name + + async def __connect(self, address): + client = BleakClient(address, disconnected_callback=self.handle_disconnected, timeout=2) + await client.connect(timeout=2) + await asyncio.sleep(1) + if sys.platform == "darwin": + await self.__get_service(client) + return client + + def __run_loop(self): + asyncio.set_event_loop(self._loop) + tasks = asyncio.gather(self.__send_handler(), self.__watch_notify()) + self._loop.run_until_complete(tasks) + + async def __watch_notify(self): + await self._bus.start_notify(self.CHAR_UUID, self.__recv_handler) + while True: + await asyncio.sleep(0.001) + if self.__close_event: + break + + async def __send_handler(self): + while True: + if self._send_q.empty(): + await asyncio.sleep(0.001) + else: + try: + pkt = self._send_q.get() + await self._bus.write_gatt_char(self.CHAR_UUID, pkt, response=True) + except BleakError: + self.__close_event = True + if self.__close_event: + break + + def __recv_handler(self, _, data): + self._recv_q.put(data) + + def open_connection(self): + modi_device = self._loop.run_until_complete(BleakScanner.find_device_by_filter(self.match_device)) + if modi_device: + self._bus = self._loop.run_until_complete(self.__connect(modi_device.address)) + Thread(target=self.__run_loop, daemon=True).start() + print(f"Connected to {modi_device.name}") + else: + raise MODIConnectionError(f"Network module of {self.modi_name} not found! Perhaps, the module is already paired with your device?") + + async def __close_client(self): + try: + await self._bus.stop_notify(self.CHAR_UUID) + await self._bus.disconnect() + except BleakError: + pass + + def close_connection(self): + if self._bus: + self.__close_event = True + while self._loop.is_running(): + time.sleep(0.1) + self._loop.run_until_complete(self.__close_client()) + self._loop.close() + + def handle_disconnected(self, _): + print("Device is being properly disconnected...") + + def recv(self) -> Optional[str]: + if self._recv_q.empty(): + return None + json_pkt = self.__parse_ble_msg(self._recv_q.get()) + if self.verbose: + print(f"recv: {json_pkt}") + return json_pkt + + @ConnectionTask.wait + def send(self, pkt: str) -> None: + self._send_q.put(self.__compose_ble_msg(pkt)) + while not self._send_q.empty(): + time.sleep(0.01) + if self.verbose: + print(f"send: {pkt}") + + def send_nowait(self, pkt: str) -> None: + self._send_q.put(self.__compose_ble_msg(pkt)) + if self.verbose: + print(f"send: {pkt}") + + # + # Non-Async Methods + # + @staticmethod + def __parse_ble_msg(ble_msg): + json_msg = dict() + json_msg["c"] = ble_msg[1] << 8 | ble_msg[0] + json_msg["s"] = ble_msg[3] << 8 | ble_msg[2] + json_msg["d"] = int.from_bytes(ble_msg[4:6], byteorder="little") + json_msg["b"] = base64.b64encode(ble_msg[8:]).decode("utf-8") + json_msg["l"] = ble_msg[7] << 8 | ble_msg[6] + return json.dumps(json_msg, separators=(",", ":")) + + @staticmethod + def __compose_ble_msg(json_msg): + json_msg = json.loads(json_msg) + ins = json_msg["c"] + sid = json_msg["s"] + did = json_msg["d"] + dlc = json_msg["l"] + data = json_msg["b"] + + ble_msg = bytearray(8 + dlc) + ble_msg[0] = ins & 0xFF + ble_msg[1] = ins >> 8 & 0xFF + ble_msg[2] = sid & 0xFF + ble_msg[3] = sid >> 8 & 0xFF + ble_msg[4] = did & 0xFF + ble_msg[5] = did >> 8 & 0xFF + ble_msg[6] = dlc & 0xFF + ble_msg[7] = dlc >> 8 & 0xFF + + ble_msg[8:8 + dlc] = bytearray(base64.b64decode(data)) + return ble_msg diff --git a/packages/core/modi_plus/task/ble_task/ble_task_rpi.py b/packages/core/modi_plus/task/ble_task/ble_task_rpi.py new file mode 100644 index 0000000..f4dc89a --- /dev/null +++ b/packages/core/modi_plus/task/ble_task/ble_task_rpi.py @@ -0,0 +1,182 @@ +import time +import os +import json +import queue +import base64 +import pexpect +import subprocess + +from typing import Optional +from threading import Thread + +from modi_plus.task.connection_task import ConnectionTask +from modi_plus.util.connection_util import ask_modi_device + + +class BleTask(ConnectionTask): + + def __init__(self, verbose=False, uuid=None): + print("Initiating ble_task connection...") + script = os.path.join(os.path.dirname(__file__), "change_interval.sh") + + # Security: Validate script path to prevent path traversal + script_abs = os.path.abspath(script) + expected_dir = os.path.abspath(os.path.dirname(__file__)) + if not script_abs.startswith(expected_dir): + raise ValueError("Invalid script path") + + # Security: Use subprocess instead of os.system to prevent command injection + # Change permissions to 755 (rwxr-xr-x) instead of 777 for better security + try: + subprocess.run(['chmod', '755', script], check=True, timeout=5) + subprocess.run(['sudo', script], check=True, timeout=10) + except subprocess.CalledProcessError as e: + print(f"Warning: Failed to execute Bluetooth configuration script: {e}") + except subprocess.TimeoutExpired: + print("Warning: Bluetooth configuration script timed out") + + super().__init__(verbose=verbose) + self._bus = None + self.__uuid = uuid + self._recv_q = queue.Queue() + self.__close_event = False + + @property + def bus(self): + return self._bus + + def __find_modi_device(self): + scanner = pexpect.spawn("sudo hcitool lescan") + init_time = time.time() + devices = [] + while time.time() - init_time < 1: + info = scanner.readline() + info = info.decode().split() + if "MODI+" in info[1] and info[1] not in (d[1] for d in devices): + devices.append(info) + scanner.terminate() + if not self.__uuid: + self.__uuid = ask_modi_device([d[1].upper() for d in devices]) + for info in devices: + if self.__uuid.upper() in info[1].upper(): + return info + raise ValueError("MODI+ network module does not exist!") + + def __reset(self): + # Security: Use subprocess instead of os.system to prevent command injection + try: + subprocess.run(['sudo', 'hciconfig', 'hci0', 'down'], + check=True, timeout=5, capture_output=True) + subprocess.run(['sudo', 'hciconfig', 'hci0', 'up'], + check=True, timeout=5, capture_output=True) + except subprocess.CalledProcessError as e: + print(f"Warning: Bluetooth reset failed: {e.stderr.decode() if e.stderr else e}") + except subprocess.TimeoutExpired: + print("Warning: Bluetooth reset timed out") + + def open_connection(self): + self.__reset() + modi_device = self.__find_modi_device() + print(f"Connecting to {modi_device[1]}...") + self.__reset() + self._bus = pexpect.spawn("gatttool -I") + self._bus.expect("LE") + for _ in range(5): + try: + self._bus.sendline(f"connect {modi_device[0]}") + self._bus.expect("Connection successful", timeout=1) + Thread(daemon=True, target=self.__ble_read).start() + break + except Exception: + print("...") + + def close_connection(self): + # Reboot modules to stop receiving channel messages + self.__close_event = True + self.send('{"c":9,"s":0,"d":4095,"b":"Bgg=","l":2}') + time.sleep(0.5) + self._bus.sendline("disconnect") + self._bus.terminate() + + # Security: Use subprocess instead of os.system to prevent command injection + try: + subprocess.run(['sudo', 'hciconfig', 'hci0', 'down'], + check=True, timeout=5, capture_output=True) + except subprocess.CalledProcessError as e: + print(f"Warning: Failed to shut down Bluetooth: {e.stderr.decode() if e.stderr else e}") + except subprocess.TimeoutExpired: + print("Warning: Bluetooth shutdown timed out") + + def __ble_read(self): + """ + handle -- integer, characteristic read handle the data was received on + value -- bytearray, the data returned in the notification + """ + + while True: + try: + self._bus.expect("value: .*?\r", timeout=0.5) + except Exception: + continue + msg = self._bus.after.decode().lstrip("value: ").split() + json_msg = self.__parse_ble_msg(bytearray([int(b, len(msg)) for b in msg])) + if self.verbose: + print(f"recv: {json_msg}") + self._recv_q.put(json_msg) + if self.__close_event: + break + time.sleep(0.002) + + @ConnectionTask.wait + def send(self, pkt: str) -> None: + self.send_nowait(pkt) + + def send_nowait(self, pkt: str) -> None: + json_msg = json.loads(pkt) + ble_msg = self.__compose_ble_msg(json_msg) + if self.verbose: + print(f"send: {json_msg}") + self._bus.sendline(f"char-write-cmd 0x002a {ble_msg}") + + def recv(self) -> Optional[str]: + if self._recv_q.empty(): + return None + return self._recv_q.get() + + # + # Ble Helper Methods + # + @staticmethod + def __parse_ble_msg(ble_msg): + json_msg = dict() + json_msg["c"] = ble_msg[1] << 8 | ble_msg[0] + json_msg["s"] = ble_msg[3] << 8 | ble_msg[2] + json_msg["d"] = ble_msg[5] << 8 | ble_msg[4] + json_msg["l"] = ble_msg[7] << 8 | ble_msg[6] + json_msg["b"] = base64.b64encode(ble_msg[8:]).decode("utf-8") + return json.dumps(json_msg, separators=(",", ":")) + + @staticmethod + def __compose_ble_msg(json_msg): + + ins = json_msg["c"] + sid = json_msg["s"] + did = json_msg["d"] + dlc = json_msg["l"] + data = json_msg["b"] + + ble_msg = bytearray(8 + dlc) + ble_msg[0] = ins & 0xFF + ble_msg[1] = ins >> 8 & 0xFF + ble_msg[2] = sid & 0xFF + ble_msg[3] = sid >> 8 & 0xFF + ble_msg[4] = did & 0xFF + ble_msg[5] = did >> 8 & 0xFF + ble_msg[6] = dlc & 0xFF + ble_msg[7] = dlc >> 8 & 0xFF + + ble_msg[8:8 + dlc] = bytearray(base64.b64decode(data)) + data = "" + for b in ble_msg: + data += f"{b:02X}" + return data diff --git a/packages/core/modi_plus/task/ble_task/ble_task_win.py b/packages/core/modi_plus/task/ble_task/ble_task_win.py new file mode 100644 index 0000000..5364d1f --- /dev/null +++ b/packages/core/modi_plus/task/ble_task/ble_task_win.py @@ -0,0 +1,145 @@ +import time +import json +import base64 +import asyncio + +from typing import Optional +from queue import Queue +from threading import Thread + +from bleak import BleakClient, BleakError, BleakScanner + +from modi_plus.task.connection_task import ConnectionTask +from modi_plus.util.connection_util import MODIConnectionError + + +class BleTask(ConnectionTask): + CHAR_UUID = "00008421-0000-1000-8000-00805f9b34fb" + + def __init__(self, verbose=False, uuid=None): + super().__init__(verbose=verbose) + self.modi_name = f"MODI+_{uuid.upper()}" + print(f"Initiating ble_task connection with {self.modi_name}") + self._loop = asyncio.get_event_loop() + self._recv_q = Queue() + self._send_q = Queue() + self.__close_event = False + + def match_device(self, device, _): + return device.name == self.modi_name + + async def __connect(self, address): + client = BleakClient(address, disconnected_callback=self.handle_disconnected, timeout=5) + await client.connect(timeout=2) + return client + + def __run_loop(self): + asyncio.set_event_loop(self._loop) + tasks = asyncio.gather(self.__send_handler(), self.__watch_notify()) + self._loop.run_until_complete(tasks) + + async def __watch_notify(self): + await self._bus.start_notify(self.CHAR_UUID, self.__recv_handler) + while True: + await asyncio.sleep(0.001) + if self.__close_event: + break + + async def __send_handler(self): + while True: + if self._send_q.empty(): + await asyncio.sleep(0.001) + else: + try: + pkt = self._send_q.get() + await self._bus.write_gatt_char(self.CHAR_UUID, pkt, response=True) + except BleakError: + self.__close_event = True + if self.__close_event: + break + + def __recv_handler(self, _, data): + self._recv_q.put(data) + + def open_connection(self): + modi_device = self._loop.run_until_complete(BleakScanner.find_device_by_filter(self.match_device)) + if modi_device: + self._bus = self._loop.run_until_complete(self.__connect(modi_device.address)) + Thread(target=self.__run_loop, daemon=True).start() + print(f"Connected to {modi_device.name}") + else: + raise MODIConnectionError(f"Network module of 0x{self.__uuid:X} not found!") + + async def __close_client(self): + try: + await self._bus.stop_notify(self.CHAR_UUID) + await self._bus.disconnect() + except BleakError: + pass + + def close_connection(self): + if self._bus: + self.__close_event = True + while self._loop.is_running(): + time.sleep(0.1) + self._loop.run_until_complete(self.__close_client()) + self._loop.close() + + def handle_disconnected(self, _): + print("Device is being properly disconnected...") + + def recv(self) -> Optional[str]: + if self._recv_q.empty(): + return None + json_pkt = self.__parse_ble_msg(self._recv_q.get()) + if self.verbose: + print(f"recv: {json_pkt}") + return json_pkt + + @ConnectionTask.wait + def send(self, pkt: str) -> None: + self._send_q.put(self.__compose_ble_msg(pkt)) + while not self._send_q.empty(): + time.sleep(0.01) + if self.verbose: + print(f"send: {pkt}") + + def send_nowait(self, pkt: str) -> None: + self._send_q.put(self.__compose_ble_msg(pkt)) + if self.verbose: + print(f"send: {pkt}") + + # + # Non-Async Methods + # + @staticmethod + def __parse_ble_msg(ble_msg): + json_msg = dict() + json_msg["c"] = ble_msg[1] << 8 | ble_msg[0] + json_msg["s"] = ble_msg[3] << 8 | ble_msg[2] + json_msg["d"] = int.from_bytes(ble_msg[4:6], byteorder="little") + json_msg["b"] = base64.b64encode(ble_msg[8:]).decode("utf-8") + json_msg["l"] = ble_msg[7] << 8 | ble_msg[6] + return json.dumps(json_msg, separators=(",", ":")) + + @staticmethod + def __compose_ble_msg(json_msg): + json_msg = json.loads(json_msg) + ins = json_msg["c"] + sid = json_msg["s"] + did = json_msg["d"] + dlc = json_msg["l"] + data = json_msg["b"] + + ble_msg = bytearray(8 + dlc) + ble_msg[0] = ins & 0xFF + ble_msg[1] = ins >> 8 & 0xFF + ble_msg[2] = sid & 0xFF + ble_msg[3] = sid >> 8 & 0xFF + ble_msg[4] = did & 0xFF + ble_msg[5] = did >> 8 & 0xFF + ble_msg[6] = dlc & 0xFF + ble_msg[7] = dlc >> 8 & 0xFF + + ble_msg[8:8 + dlc] = bytearray(base64.b64decode(data)) + return ble_msg diff --git a/packages/core/modi_plus/task/ble_task/change_interval.sh b/packages/core/modi_plus/task/ble_task/change_interval.sh new file mode 100644 index 0000000..a89340c --- /dev/null +++ b/packages/core/modi_plus/task/ble_task/change_interval.sh @@ -0,0 +1,2 @@ +echo 6 > /sys/kernel/debug/bluetooth/hci0/conn_min_interval +echo 20 > /sys/kernel/debug/bluetooth/hci0/conn_max_interval diff --git a/packages/core/modi_plus/task/connection_task.py b/packages/core/modi_plus/task/connection_task.py new file mode 100644 index 0000000..8e3e59a --- /dev/null +++ b/packages/core/modi_plus/task/connection_task.py @@ -0,0 +1,54 @@ +import time +from abc import ABC +from abc import abstractmethod +from typing import Optional + + +class ConnectionTask(ABC): + + def __init__(self, verbose=False): + self._bus = None + self.verbose = verbose + + @property + def bus(self): + return self._bus + + @bus.setter + def bus(self, new_bus): + if not isinstance(new_bus, type(self._bus)): + raise ValueError() + else: + self._bus = new_bus + + # + # Abstract Methods + # + @abstractmethod + def close_connection(self): + pass + + @abstractmethod + def open_connection(self): + pass + + @abstractmethod + def recv(self) -> Optional[str]: + pass + + @abstractmethod + def send(self, pkt: str) -> None: + pass + + @staticmethod + def wait(func): + """Wait decorator + Make sure this is attached to inherited send method + """ + + def decorator(self, pkt: str) -> None: + init_time = time.perf_counter() + func(self, pkt) + while time.perf_counter() - init_time < 0.04: + pass + return decorator diff --git a/packages/core/modi_plus/task/exe_task.py b/packages/core/modi_plus/task/exe_task.py new file mode 100644 index 0000000..6b0c05d --- /dev/null +++ b/packages/core/modi_plus/task/exe_task.py @@ -0,0 +1,217 @@ +import json +import time +from packaging import version +from base64 import b64decode + +from modi_plus.module.module import Module, BROADCAST_ID, get_module_from_name, get_module_type_from_uuid +from modi_plus.util.message_util import unpack_data, parse_message + + +class ExeTask: + + def __init__(self, modules, connection_task): + self._modules = modules + self._connection = connection_task + + # Reboot all modules + self.__request_reboot(BROADCAST_ID) + + def run(self, delay): + """ Run in ExecutorThread + + :param delay: time value to wait in seconds + :type delay: float + """ + + json_pkt = self._connection.recv() + if not json_pkt: + time.sleep(delay) + else: + try: + json_msg = json.loads(json_pkt) + self.__command_handler(json_msg["c"])(json_msg) + except json.decoder.JSONDecodeError: + print("current json message:", json_pkt) + + def __command_handler(self, command): + """ Execute task based on command message + + :param command: command code + :type command: int + :return: a function the corresponds to the command code + :rtype: Callable[[Dict[str, int]], None] + """ + + return { + 0x00: self.__update_health, + 0x05: self.__update_assign_id, + 0x1F: self.__update_channel, + 0xA1: self.__update_esp_version, + }.get(command, lambda _: None) + + def __get_module_by_id(self, module_id): + for module in self._modules: + if module.id == module_id: + return module + + def __compare_version(self, left, right): + if version.parse(left) > version.parse(right): + return 1 + elif version.parse(left) == version.parse(right): + return 0 + else: + return -1 + + def __update_health(self, message): + """ Update information by health message + + :param message: Dictionary format message of the module + :type message: Dictionary + :return: None + """ + + # Record battery information and user code state + module_id = message["s"] + curr_time = time.time() + + # Checking starts only when module is registered + if module_id in (module.id for module in self._modules): + module = self.__get_module_by_id(module_id) + module.last_updated_time = curr_time + module.is_connected = True + + if module.module_type == "network" and message["l"] == 6: + _, dir = unpack_data(message["b"], (5, 1)) + + # usb로 연결된 네트워크 모듈인 경우 interpreter 삭제 + if dir & 2 and module.is_usb_connected is False: + self.__request_erase_interpreter() + self.__request_reboot(BROADCAST_ID) + time.sleep(1) + self.__request_pnp_off() + module.is_usb_connected = True + + # 일반 모듈의 OS 버전이 1.3.1 이상일 경우, health data에 pnp on/off 상태가 포함되어 있다. + if module.module_type != "network" and self.__compare_version(module.os_version, "1.3.1") != -1: + _, pnp = unpack_data(message["b"], (3, 1)) + if pnp == 0: + # pnp 상태일 경우, pnp off + self.__request_pnp_off(module_id) + + # Reset disconnection alert status + if module.has_printed: + module.has_printed = False + else: + self.__request_find_id(module_id) + self.__request_find_network_id(module_id) + + # Disconnect module with no health message for more than 2 second + for module in self._modules: + if (curr_time - module.last_updated_time > 2) and (module.is_connected is True): + module.is_connected = False + module._last_set_message = None + + def __update_assign_id(self, message): + """ Update module information + :param message: Dictionary format module info + :type message: Dictionary + :return: None + """ + + module_id = message["s"] + module_uuid, module_os_version_info, module_app_version_info = unpack_data(message["b"], (6, 2, 2)) + module_type = get_module_type_from_uuid(module_uuid) + + # Handle new modules + if module_id not in (module.id for module in self._modules): + new_module = self.__add_new_module(module_type, module_id, module_uuid, module_app_version_info, module_os_version_info) + new_module.module_type = module_type + new_module.first_connected_time = time.time() + if module_type == "network": + self.__request_esp_version(module_id) + else: + module = self.__get_module_by_id(module_id) + if not module.is_connected: + # Handle Reconnected modules + module.is_connected = True + self.__request_pnp_off() + print(f"{str(module)} has been reconnected!") + + def __add_new_module(self, module_type, module_id, module_uuid, module_app_version_info, module_os_version_info): + module_template = get_module_from_name(module_type) + module_instance = module_template(module_id, module_uuid, self._connection) + self.__request_pnp_off() + module_instance.app_version = module_app_version_info + module_instance.os_version = module_os_version_info + self._modules.append(module_instance) + print(f"{str(module_instance)} has been connected!") + return module_instance + + def __update_channel(self, message): + """ Update module property + + :param message: Dictionary format message + :type message: Dictionary + :return: None + """ + + module_id = message["s"] + property_number = message["d"] + property_data = bytearray(b64decode(message["b"])) + + # Do not update reserved property + if property_number == 0 or property_number == 1: + return + + module = self.__get_module_by_id(module_id) + if not module: + return + + module.update_property(property_number, property_data) + + def __update_esp_version(self, message): + network_module = None + for module in self._modules: + if module.module_type == "network": + network_module = module + break + if not network_module: + return + + raw_data = b64decode(message["b"]) + network_module.esp_version = raw_data.lstrip(b"\x00").decode() + + def __set_module_state(self, destination_id, module_state, pnp_state): + """ Generate message for set module state and pnp state + + :param destination_id: Id to target destination + :type destination_id: int + :param module_state: State value of the module + :type module_state: int + :param pnp_state: Pnp state value + :type pnp_state: int + :return: None + """ + + self._connection.send_nowait(parse_message(0x09, 0, destination_id, (module_state, pnp_state))) + + def __request_reboot(self, id=BROADCAST_ID): + self.__set_module_state(id, Module.REBOOT, Module.PNP_OFF) + + def __request_pnp_on(self, id=BROADCAST_ID): + self.__set_module_state(id, Module.RUN, Module.PNP_ON) + + def __request_pnp_off(self, id=BROADCAST_ID): + self.__set_module_state(id, Module.RUN, Module.PNP_OFF) + + def __request_find_id(self, id=BROADCAST_ID): + self._connection.send_nowait(parse_message(0x08, 0x00, id, (0xFF, 0x0F))) + + def __request_find_network_id(self, id=BROADCAST_ID): + self._connection.send_nowait(parse_message(0x28, 0x00, id, (0xFF, 0x0F))) + + def __request_esp_version(self, id): + self._connection.send_nowait(parse_message(0xA0, 25, id, (0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF))) + + def __request_erase_interpreter(self): + self._connection.send_nowait(parse_message(160, 80, 4095, (0, 0, 0, 0, 0, 0, 0, 0))) diff --git a/packages/core/modi_plus/task/serialport_task.py b/packages/core/modi_plus/task/serialport_task.py new file mode 100644 index 0000000..3caf535 --- /dev/null +++ b/packages/core/modi_plus/task/serialport_task.py @@ -0,0 +1,150 @@ +from typing import Optional +from queue import Queue +import threading as th + +from serial.serialutil import SerialException + +from modi_plus.task.connection_task import ConnectionTask +from modi_plus.util.connection_util import list_modi_ports +from modi_plus.util.modi_serialport import ModiSerialPort + + +class SerialportTask(ConnectionTask): + + def __init__(self, verbose=False, port=None): + print("Initiating serial connection...") + super().__init__(verbose) + self.__port = port + self.__json_buffer = b"" + self._recv_queue = Queue() + self.__recv_thread = None + self.__stop_signal = False + + # + # Inherited Methods + # + def open_connection(self) -> None: + """ Open serial port + + :return: None + """ + + modi_ports = list_modi_ports() + if not modi_ports: + raise SerialException("No MODI+ network module is available") + + if self.__port: + if self.__port not in map(lambda info: info, modi_ports): + raise SerialException(f"{self.__port} is not connected to a MODI+ network module.") + else: + try: + self._bus = self.__init_serial(self.__port) + self._bus.open() + self.__open_recv_thread() + return + except SerialException: + raise SerialException(f"{self.__port} is not available.") + + for modi_port in modi_ports: + self._bus = self.__init_serial(modi_port) + try: + self._bus.open(modi_port) + self.__open_recv_thread() + print(f'Serial is open at "{modi_port}"') + return + except SerialException: + continue + raise SerialException("No MODI+ port is available now") + + @staticmethod + def __init_serial(port): + ser = ModiSerialPort(timeout=0.01) + return ser + + def __open_recv_thread(self): + self.__json_buffer = b"" + self._recv_queue = Queue() + self.__stop_signal = False + self.__recv_thread = th.Thread(target=self.__recv_handler, daemon=True) + self.__recv_thread.start() + + def __close_recv_thread(self): + self.__stop_signal = True + if self.__recv_thread: + self.__recv_thread.join() + + def __recv_handler(self): + while not self.__stop_signal: + recv = self._bus.read() + if recv: + self.__json_buffer += recv + + header_index = self.__json_buffer.find(b"{") + if header_index < 0: + self.__json_buffer = b"" + continue + self.__json_buffer = self.__json_buffer[header_index:] + + tail_index = self.__json_buffer.find(b"}") + if tail_index < 0: + continue + + json_pkt = self.__json_buffer[:tail_index + 1].decode("utf8") + self.__json_buffer = self.__json_buffer[tail_index + 1:] + self._recv_queue.put(json_pkt) + + def close_connection(self) -> None: + """ Close serial port + + :return: None + """ + + self.__close_recv_thread() + self._bus.close() + + def recv(self) -> Optional[str]: + """ Read serial message and put message to serial read queue + + :return: str + """ + + if self._recv_queue.empty(): + return None + + json_pkt = self._recv_queue.get() + if json_pkt is None: + return None + + if self.verbose: + print(f"recv: {json_pkt}") + + return json_pkt + + @ConnectionTask.wait + def send(self, pkt: str, verbose=False) -> None: + """ Send json pkt + + :param pkt: Json pkt to send + :type pkt: str + :param verbose: Verbosity parameter + :type verbose: bool + :return: None + """ + + self._bus.write(pkt.encode("utf8")) + if self.verbose or verbose: + print(f"send: {pkt}") + + def send_nowait(self, pkt: str, verbose=False) -> None: + """ Send json pkt + + :param pkt: Json pkt to send + :type pkt: str + :param verbose: Verbosity parameter + :type verbose: bool + :return: None + """ + + self._bus.write(pkt.encode("utf8")) + if self.verbose or verbose: + print(f"send: {pkt}") diff --git a/packages/core/modi_plus/util/__init__.py b/packages/core/modi_plus/util/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/packages/core/modi_plus/util/connection_util.py b/packages/core/modi_plus/util/connection_util.py new file mode 100644 index 0000000..b9a1da7 --- /dev/null +++ b/packages/core/modi_plus/util/connection_util.py @@ -0,0 +1,89 @@ +import os +import sys +import platform +from typing import List + +# 조건부 import - pyserial 없어도 기본 기능은 사용 가능 +try: + import serial.tools.list_ports as stl + HAS_SERIAL = True +except ImportError: + stl = None + HAS_SERIAL = False + + +def list_modi_ports() -> List[str]: + """Returns a list of connected MODI ports + + :return: List[ListPortInfo] + """ + if not HAS_SERIAL: + return [] + + info_list = [] + + def __is_modi_port(port): + return (port.vid == 0x2FDE and port.pid == 0x0003) or port.description == "MODI+ Network Module" + modi_ports = [port for port in stl.comports() if __is_modi_port(port)] + for modi_port in modi_ports: + info_list.append(modi_port.device) + + if sys.platform.startswith("win"): + from modi_plus.util.winusb import list_modi_winusb_paths + path_list = list_modi_winusb_paths() + for index, value in enumerate(path_list): + info_list.append(value) + + return info_list + + +def is_on_pi() -> bool: + """Returns whether connected to pi + + :return: true if connected to pi + :rtype: bool + """ + return os.name != "nt" and os.uname()[4][:3] == "arm" + + +def is_network_module_connected() -> bool: + """Returns whether network module is connected + + :return: true if connected + :rtype: bool + """ + return bool(list_modi_ports()) + + +def ask_modi_device(devices): + if not devices: + raise ValueError( + "No MODI network module(s) available!\n" + "The network module that you're trying to connect, may in use." + ) + for idx, dev in enumerate(devices): + print(f"<{idx}>: {dev}") + i = input("Choose your device index (ex: 0) : ") + return devices[int(i)].lstrip("MODI+_") + + +def get_platform(): + if platform.uname().node == "raspberrypi": + return "rpi" + elif platform.uname().node == "penguin": + return "chrome" + return sys.platform + + +def get_ble_task_path(): + mod_path = { + "win32": "modi_plus.task.ble_task.ble_task_win", + "darwin": "modi_plus.task.ble_task.ble_task_mac", + "linux": "modi_plus.task.ble_task.ble_task_linux", + "rpi": "modi_plus.task.ble_task.ble_task_rpi", + }.get(get_platform()) + return mod_path + + +class MODIConnectionError(Exception): + pass diff --git a/packages/core/modi_plus/util/inspection_util.py b/packages/core/modi_plus/util/inspection_util.py new file mode 100644 index 0000000..d02a1ab --- /dev/null +++ b/packages/core/modi_plus/util/inspection_util.py @@ -0,0 +1,425 @@ +import os +import time + +import threading as th + +from textwrap import fill +from textwrap import dedent + + +class StoppableThread(th.Thread): + + def __init__(self, module, method): + super(StoppableThread, self).__init__(daemon=True) + self._stop = th.Event() + self._module = module + self._method = method + + def stop(self): + self._stop.set() + + def stopped(self): + return self._stop.isSet() + + def run(self): + # Security: Validate method name to prevent code injection + if not self._method.isidentifier(): + raise ValueError(f"Invalid method name: {self._method}") + + # Security: Check that the method exists before accessing it + if not hasattr(self._module, self._method): + raise AttributeError(f"Module has no attribute: {self._method}") + + while True: + # Security: Use getattr() instead of eval() to prevent code injection + prop = getattr(self._module, self._method) + print(f"\rObtained property value: {prop} ", end="") + time.sleep(0.1) + + +class Inspector: + """ + Inspector diagnoses malfunctioning modules (all modules but network) + """ + + row_len = 79 + + def __init__(self): + self.bundle = None + + @staticmethod + def clear(): + clear_cmd = "cls" if os.name == "nt" else "clear" + os.system(clear_cmd) + + def print_wrap(self, msg): + message = fill(dedent(msg), self.row_len).lstrip() + print(message) + + def print_module_page(self, module, i, nb_modules): + print("-" * self.row_len) + module_to_inspect = \ + f"| {' ' * 5} Diagnosing {module.module_type} ({module.id})" + progress_indicator = f"({i + 1} / {nb_modules}) {' ' * 5} |" + ls = f"{module_to_inspect:<{self.row_len}}" + s = progress_indicator.join( + ls.rsplit(" " * len(progress_indicator), 1) + ) + print(s) + print("-" * self.row_len) + + def inspect(self, module, i, nb_modules): + self.print_module_page(module, i, nb_modules) + + inspect_module = { + # inspection method for input modules + "battery": self.inspect_battery, + + # inspection method for input modules + "env": self.inspect_env, + "imu": self.inspect_imu, + "button": self.inspect_button, + "dial": self.inspect_dial, + "joystick": self.inspect_joystick, + "tof": self.inspect_tof, + + # inspection method for input modules + "display": self.inspect_display, + "motor": self.inspect_motor, + "led": self.inspect_led, + "speaker": self.inspect_speaker, + }.get(module.module_type) + inspect_module(module, i, nb_modules) + + self.clear() + + def inspect_battery(self, module, i, nb_modules): + self.print_wrap( + """ + Battery module has distance as its property. + """ + ) + input("\nIf you are ready to inspect this module, Press ENTER: ") + self.clear() + + properties = ["level"] + + for prop in properties: + self.print_module_page(module, i, nb_modules) + print(f"If the {prop} shown below seems correct, press ENTER: \n") + t = StoppableThread(module, prop) + t.start() + input() + t.stop() + + def inspect_env(self, module, i, nb_modules): + self.print_wrap( + """ + Environment module has illuminance, temperature, humidity and volume as its property. + """ + ) + input("\nIf you are ready to inspect this module, Press ENTER: ") + self.clear() + + properties = ["illuminance", "temperature", "humidity", "volume"] + + for prop in properties: + self.print_module_page(module, i, nb_modules) + print(f"If the {prop} shown below seems correct, press ENTER: \n") + t = StoppableThread(module, prop) + t.start() + input() + t.stop() + + def inspect_imu(self, module, i, nb_modules): + self.print_wrap( + """ + IMU module has angle, angular_velocity, acceleration and vibration as its property. + """ + ) + input("\nIf you are ready to inspect this module, Press ENTER: ") + self.clear() + + properties = ["angle", "angular_velocity", "acceleration", "vibration"] + + for prop in properties: + self.print_module_page(module, i, nb_modules) + print(f"If the {prop} shown below seems correct, press ENTER: \n") + t = StoppableThread(module, prop) + t.start() + input() + t.stop() + + def inspect_button(self, module, i, nb_modules): + self.print_wrap( + """ + Button module has cliked, double_clicked, pressed and toggled as its property. + """ + ) + input("\nIf you are ready to inspect this module, Press ENTER: ") + self.clear() + + properties = ["cliked", "double_clicked", "pressed", "toggled"] + + for prop in properties: + self.print_module_page(module, i, nb_modules) + print(f"If the {prop} shown below seems correct, press ENTER: \n") + t = StoppableThread(module, prop) + t.start() + input() + t.stop() + + def inspect_dial(self, module, i, nb_modules): + self.print_wrap( + """ + Dial module has turn and speed as its property. + """ + ) + input("\nIf you are ready to inspect this module, Press ENTER: ") + self.clear() + + properties = ["turn", "speed"] + + for prop in properties: + self.print_module_page(module, i, nb_modules) + print(f"If the {prop} shown below seems correct, press ENTER: \n") + t = StoppableThread(module, prop) + t.start() + input() + t.stop() + + def inspect_joystick(self, module, i, nb_modules): + self.print_wrap( + """ + Joystick module has turn and speed as its property. + """ + ) + input("\nIf you are ready to inspect this module, Press ENTER: ") + self.clear() + + properties = ["x", "y", "direction"] + + for prop in properties: + self.print_module_page(module, i, nb_modules) + print(f"If the {prop} shown below seems correct, press ENTER: \n") + t = StoppableThread(module, prop) + t.start() + input() + t.stop() + + def inspect_tof(self, module, i, nb_modules): + self.print_wrap( + """ + Tof module has distance as its property. + """ + ) + input("\nIf you are ready to inspect this module, Press ENTER: ") + self.clear() + + properties = ["distance"] + + for prop in properties: + self.print_module_page(module, i, nb_modules) + print(f"If the {prop} shown below seems correct, press ENTER: \n") + t = StoppableThread(module, prop) + t.start() + input() + t.stop() + + def inspect_display(self, module, i, nb_modules): + self.print_wrap( + """ + Display module has a text field as its property. We wil inspect + this property for the module. + """ + ) + input("\nIf you are ready to inspect this module, Press ENTER: ") + self.clear() + + self.print_module_page(module, i, nb_modules) + module.set_text("Hello MODI+!") + input(dedent( + """ + We have set "Hello MODI+!" as its text, if you see this press ENTER: + """.lstrip().rstrip() + " " + )) + module.reset() + + def inspect_motor(self, module, i, nb_modules): + self.print_wrap( + """ + Motor module has degree (i.e. position) and speed as its + property. We will inspect position property of the module. + """ + ) + print() + self.print_wrap( + """ + Before continuing, we have set motors' initial position to zero + (your motor module may have moved a bit), so be clam :) + """ + ) + input("\nPress ENTER to continue: ") + self.clear() + module.set_angle(0, 70) + + self.print_module_page(module, i, nb_modules) + self.print_wrap( + """ + Firstly, in order to inspect position property, we have rotated 360 degree. + """ + ) + module.set_angle(360, 70) + time.sleep(1.5) + input("\nIf the first motor has rotated 360 degrees, press ENTER: ") + self.clear() + + self.print_module_page(module, i, nb_modules) + self.print_wrap( + f""" + It looks like the motor module ({module.id}) is properly + functioning! + """ + ) + input("\nTo inspect next module, press ENTER to continue: ") + + def inspect_led(self, module, i, nb_modules): + self.print_wrap( + """ + LED module has red, green and blue as its property. We will inspect + these properties each. + """ + ) + input("\nPress ENTER to continue: ") + self.clear() + + self.print_module_page(module, i, nb_modules) + self.print_wrap( + """ + To inspect RED, We have set LED's RED to its maximum intensity. + """ + ) + module.set_rgb(255, 0, 0) + input("\nIf you see strong red from the led module, Press ENTER: ") + self.clear() + + self.print_module_page(module, i, nb_modules) + self.print_wrap( + """ + To inspect GREEN, We have set LED's GREEN to its maximum intensity. + """ + ) + module.set_rgb(0, 255, 0) + input("\nIf you see strong green from the led module, Press ENTER: ") + self.clear() + + self.print_module_page(module, i, nb_modules) + self.print_wrap( + """ + To inspect BLUE, We have set LED's BLUE to its maximum intensity. + """ + ) + module.set_rgb(0, 0, 255) + input("\nIf you see strong blue from the led module, Press ENTER: ") + self.clear() + + module.set_rgb(0, 0, 0) + self.print_module_page(module, i, nb_modules) + input(dedent( + f""" + It looks like the LED module ({module.id}) is properly functioning! + To inspect next module, press ENTER to continue: + """ + )) + + def inspect_speaker(self, module, i, nb_modules): + self.print_wrap( + """ + Speaker module has tune as its property, tune is composed of + frequency and volume. Thus inspecting the tune property consists of + inspecting frequency and volume properties. + """ + ) + self.clear() + + self.print_module_page(module, i, nb_modules) + self.print_wrap( + """ + To inspect tune property, we have set frequency of 880 and volume + of 50. + """ + ) + module.set_tune(880, 50) + input(dedent( + "\nPress ENTER if you hear a gentle sound from the speaker module!" + )) + module.set_tune(880, 0) + self.clear() + + # + # Main methods are defined below + # + def run_inspection(self): + self.clear() + print("=" * self.row_len) + print(f"= {'This is PyMODI+ Module Inspector':^{self.row_len - 4}} =") + print("=" * self.row_len) + + self.print_wrap( + """ + PyMODI+ provides a number of tools that can be utilized in different + purpose. One of them is the module (all modules but network) + inspector which diagnoses any malfunctioning MODI+ module. + """ + ) + + nb_modules = int(input(dedent( + """ + Connect network module to your local machine, attach other modi+ + modules to the network module. When attaching modi+ modules, make + sure that you provide sufficient power to the modules. Using modi+ + battery module is a good way of supplying the power to the modules. + + Type the number of modi+ modules (integer value) that are connected + to the network module (note that the maximum number of modules is + 20) and press ENTER: + """.rstrip() + " " + ))) + self.clear() + + if not (1 <= nb_modules <= 20): + print(f"ERROR: {nb_modules} is invalid for the number of modules") + os._exit(0) + + print("Importing modi_plus package and creating a modi+ bundle object...\n") + import modi_plus + self.bundle = modi_plus.MODIPlus() + + input("wait for connecting.....\nif check the module connected, press ENTER\n") + + modules = [m for m in self.bundle.modules if m.module_type != "network"] + nb_modules_detected = len(modules) + if nb_modules != nb_modules_detected: + self.print_wrap( + f""" + You said that you have attached {nb_modules} modules but PyMODI+ + detects only {nb_modules_detected} number of modules! Look at + the printed log above regarding module connection and check + which modules have not been printed above. + """ + ) + os._exit(0) + + input(dedent( + """ + It looks like all stm modules have been initialized properly! Let's + diagnose each module, one by one! + + Press ENTER to continue: + """.rstrip() + " " + )) + self.clear() + + # Let's inspect each stm module! + for i, module in enumerate(modules): + self.inspect(module, i, nb_modules) diff --git a/packages/core/modi_plus/util/message_util.py b/packages/core/modi_plus/util/message_util.py new file mode 100644 index 0000000..8f8a43e --- /dev/null +++ b/packages/core/modi_plus/util/message_util.py @@ -0,0 +1,101 @@ +import json +import struct +from base64 import b64encode, b64decode +from typing import Optional +from typing import Tuple + + +def parse_get_property_message(destination_id: int, property_type: int, property_frequency: int): + return parse_message(0x03, 0, destination_id, (property_type, 0x00, property_frequency, 0x00)) + + +def parse_set_property_message(destination_id: int, property_type: int, property_values: Tuple): + data = [] + for value_type, value in property_values: + data += parse_data(value, value_type) + return parse_message(0x04, property_type, destination_id, data) + + +def parse_message(command: int, source: int, destination: int, + byte_data: Tuple = + (None, None, None, None, None, None, None, None)): + message = dict() + message["c"] = command + message["s"] = source + message["d"] = destination + message["b"] = __encode_bytes(byte_data) + message["l"] = len(byte_data) + return json.dumps(message, separators=(",", ":")) + + +def __extract_length(begin: int, src: Tuple) -> int: + length = 1 + for i in range(begin + 1, len(src)): + if not src[i]: + length += 1 + else: + break + return length + + +def __encode_bytes(byte_data: Tuple): + idx = 0 + data = bytearray(len(byte_data)) + while idx < len(byte_data): + if not byte_data[idx]: + idx += 1 + elif byte_data[idx] > 256: + length = __extract_length(idx, byte_data) + data[idx: idx + length] = int.to_bytes( + byte_data[idx], byteorder="little", length=length, signed=True + ) + idx += length + elif byte_data[idx] < 0: + data[idx: idx + 4] = int.to_bytes( + int(byte_data[idx]), byteorder="little", length=4, signed=True + ) + idx += 4 + elif byte_data[idx] < 256: + data[idx] = int(byte_data[idx]) + idx += 1 + return b64encode(bytes(data)).decode("utf8") + + +def decode_message(message: str): + message = json.loads(message) + command = message["c"] + source = message["s"] + destination = message["d"] + data = message["b"] + length = message["l"] + return command, source, destination, data, length + + +def unpack_data(data: str, structure: Tuple = (1, 1, 1, 1, 1, 1, 1, 1)): + data = bytearray(b64decode(data.encode("utf8"))) + idx = 0 + result = [] + for size in structure: + result.append(int.from_bytes(data[idx:idx + size], byteorder="little")) + idx += size + return result + + +def parse_data(values, data_type: str) -> Optional[Tuple]: + if data_type == "string": + return tuple(str.encode(values)) + elif data_type == "float": + return tuple(bytearray(struct.pack("f", values))) + elif data_type == "bytes": + return values + elif data_type in ["s8", "s16", "s32"]: + return tuple(int.to_bytes(int(values), byteorder="little", signed=True, length=(int(data_type[1:])) // 8)) + elif data_type in ["u8", "u16", "u32"]: + return tuple(int.to_bytes(int(values), byteorder="little", signed=False, length=(int(data_type[1:])) // 8)) + else: + # error type + return None + + +def decode_data(data: str) -> float: + return round(struct.unpack("f", bytes(unpack_data(data)[:4]))[0], 2) diff --git a/packages/core/modi_plus/util/modi_serialport.py b/packages/core/modi_plus/util/modi_serialport.py new file mode 100644 index 0000000..40b1683 --- /dev/null +++ b/packages/core/modi_plus/util/modi_serialport.py @@ -0,0 +1,211 @@ +import sys +import time +import serial + + +class ModiSerialPort(): + SERIAL_MODE_COMPORT = 1 + SERIAL_MODI_WINUSB = 2 + + def __init__(self, port=None, baudrate=921600, timeout=0.2, write_timeout=None): + self.type = self.SERIAL_MODE_COMPORT + self._port = port + self._baudrate = baudrate + self._timeout = timeout + self._write_timeout = write_timeout + + self.serial_port = None + self._is_open = False + + if self._port is not None: + self.open(self._port) + + def open(self, port): + self._port = port + + if sys.platform.startswith("win"): + from modi_plus.util.winusb import ModiWinUsbComPort, list_modi_winusb_paths + if port in list_modi_winusb_paths(): + self.type = self.SERIAL_MODI_WINUSB + winusb = ModiWinUsbComPort(path=self._port, baudrate=self._baudrate, timeout=self._timeout) + self.serial_port = winusb + else: + ser = serial.Serial(port=self._port, baudrate=self._baudrate, timeout=self._timeout, write_timeout=self._write_timeout, exclusive=True) + self.serial_port = ser + else: + ser = serial.Serial(port=self._port, baudrate=self._baudrate, timeout=self._timeout, write_timeout=self._write_timeout, exclusive=True) + self.serial_port = ser + + self.is_open = True + + def close(self): + if self.is_open: + self.serial_port.close() + + def write(self, data): + if not self.is_open: + raise Exception("serialport is not opened") + if type(data) is str: + data = data.encode("utf8") + self.serial_port.write(data) + + def read(self, size=1): + if not self.is_open: + raise Exception("serialport is not opened") + if size is None and self.type == self.SERIAL_MODE_COMPORT: + size = 1 + return self.serial_port.read(size) + + def read_until(self, expected=b"\x0A", size=None): + if not self.is_open: + raise Exception("serialport is not opened") + + lenterm = len(expected) + line = bytearray() + modi_timeout = self.Timeout(self._timeout) + while True: + c = self.read(1) + if c: + line += c + if line[-lenterm:] == expected: + break + if size is not None and len(line) >= size: + break + else: + break + if modi_timeout.expired(): + break + return bytes(line) + + def read_all(self): + if not self.is_open: + raise Exception("serialport is not opened") + return self.serial_port.read_all() + + def flush(self): + if not self.is_open: + raise Exception("serialport is not opened") + self.serial_port.flush() + + def flushInput(self): + if not self.is_open: + raise Exception("serialport is not opened") + self.serial_port.flushInput() + + def flushOutput(self): + if not self.is_open: + raise Exception("serialport is not opened") + self.serial_port.flushOutput() + + def setDTR(self, state): + if not self.is_open: + raise Exception("serialport is not opened") + self.serial_port.setDTR(state) + + def setRTS(self, state): + if not self.is_open: + raise Exception("serialport is not opened") + self.serial_port.setRTS(state) + + def inWaiting(self): + if not self.is_open: + raise Exception("serialport is not opened") + + waiting = None + if self.type == self.SERIAL_MODE_COMPORT: + waiting = self.serial_port.inWaiting() + return waiting + + @property + def port(self): + return self._port + + @port.setter + def port(self, value): + self._port = value + self.serial_port.port = value + + @property + def baudrate(self): + return self._baudrate + + @baudrate.setter + def baudrate(self, value): + self._baudrate = value + self.serial_port.baudrate = value + + @property + def timeout(self): + return self._timeout + + @timeout.setter + def timeout(self, value): + self._timeout = value + self.serial_port.timeout = value + + @property + def write_timeout(self): + return self._write_timeout + + @write_timeout.setter + def write_timeout(self, value): + self._write_timeout = value + self.serial_port.write_timeout = value + + class Timeout(object): + """\ + Abstraction for timeout operations. Using time.monotonic() if available + or time.time() in all other cases. + + The class can also be initialized with 0 or None, in order to support + non-blocking and fully blocking I/O operations. The attributes + is_non_blocking and is_infinite are set accordingly. + """ + if hasattr(time, "monotonic"): + # Timeout implementation with time.monotonic(). This function is only + # supported by Python 3.3 and above. It returns a time in seconds + # (float) just as time.time(), but is not affected by system clock + # adjustments. + TIME = time.monotonic + else: + # Timeout implementation with time.time(). This is compatible with all + # Python versions but has issues if the clock is adjusted while the + # timeout is running. + TIME = time.time + + def __init__(self, duration): + """Initialize a timeout with given duration""" + self.is_infinite = (duration is None) + self.is_non_blocking = (duration == 0) + self.duration = duration + if duration is not None: + self.target_time = self.TIME() + duration + else: + self.target_time = None + + def expired(self): + """Return a boolean, telling if the timeout has expired""" + return self.target_time is not None and self.time_left() <= 0 + + def time_left(self): + """Return how many seconds are left until the timeout expires""" + if self.is_non_blocking: + return 0 + elif self.is_infinite: + return None + else: + delta = self.target_time - self.TIME() + if delta > self.duration: + # clock jumped, recalculate + self.target_time = self.TIME() + self.duration + return self.duration + else: + return max(0, delta) + + def restart(self, duration): + """\ + Restart a timeout, only supported if a timeout was already set up + before. + """ + self.duration = duration + self.target_time = self.TIME() + duration diff --git a/packages/core/modi_plus/util/tutorial_util.py b/packages/core/modi_plus/util/tutorial_util.py new file mode 100644 index 0000000..735f35c --- /dev/null +++ b/packages/core/modi_plus/util/tutorial_util.py @@ -0,0 +1,357 @@ +import os +import time + +from textwrap import fill +from textwrap import dedent + + +class Tutor: + """ + Tutor teaches overall usage of PyMODI+ + """ + + row_len = 79 + + def __init__(self): + self.bundle = None + self.led = None + self.button = None + + @staticmethod + def clear(): + clear_cmd = "cls" if os.name == "nt" else "clear" + os.system(clear_cmd) + + def print_wrap(self, msg): + message = fill(dedent(msg), self.row_len).lstrip() + print(message) + + def print_lesson(self, lesson, title): + print("-" * self.row_len) + topic = f"Lesson {lesson}: {title}" + print(f"{topic:^{self.row_len}}") + print("-" * self.row_len) + + @staticmethod + def check_user_input(answer, give_answer=True, guide=">>> "): + response = input(guide) + nb_wrong = 1 + while response != answer: + if give_answer: + print(f"Write below code precisely.\n>>> {answer}\n") + elif nb_wrong > 2: + print(f"The answer is {answer}. Type it below.") + else: + print("Try again!") + response = input(guide) + nb_wrong += 1 + return response + + def run_introduction(self): + self.clear() + print("=" * self.row_len) + print(f"= {'Welcome to the PyMODI+ Tutor':^{self.row_len - 4}} =") + print("=" * self.row_len) + + self.print_wrap( + """ + PyMODI+ is a very powerful tool that can control the MODI+ modules + using python scripts. As long as you learn how to use built-in + functions of PyMODI+, you can easily control MODI+ modules. This + interactive CUI tutorial will guide you through the world of + PyMODI+. + """ + ) + + selection = dedent( + """ + Tutorial includes: + 1. Making MODI+ + 2. Accessing Modules + 3. Controlling Modules + 4. Your First PyMODI+ Project + """ + ) + print(selection) + + lesson_nb = int(input("Enter the lesson number and press ENTER: ")) + self.clear() + + if not (0 < lesson_nb < 5): + print("ERROR: lesson_nb must be one of 1, 2, 3 or 4") + os._exit(0) + + # Skip lesson 1 + if lesson_nb > 1: + print("=" * self.row_len) + print(f"= {'Preparing the modi_plus object...':^{self.row_len - 4}} =") + print("=" * self.row_len) + import modi_plus + self.print_wrap( + """ + In order to skip the first lesson, we need to set-up the + prerequisites. Thus, connect button and led module to your + device. + """ + ) + input("\nif the modules are ready, press ENTER to continue: \n") + print() + + self.bundle = modi_plus.MODIPlus() + + # Skip lesson 2 + if lesson_nb > 2: + self.button = self.bundle.buttons[0] + self.led = self.bundle.leds[0] + + run_selected_lesson = { + 1: self.run_lesson1, + 2: self.run_lesson2, + 3: self.run_lesson3, + 4: self.run_lesson4, + }.get(lesson_nb) + run_selected_lesson() + + def run_lesson1(self): + self.print_lesson(1, "Making MODI+") + self.print_wrap('First, you should import modi_plus. Type "import modi_plus"') + + self.check_user_input("import modi_plus") + import modi_plus + print("\nGreat! Now you can use all the features of MODI+!\n") + + self.print_wrap( + """ + To control the modules, make a MODIPlus object that contains all the + connected modules. Once you create it, it will automatically find + all the modules connected to the network module. + """ + ) + input("\nPress ENTER") + self.clear() + + self.print_wrap( + """ + Now, prepare real MODI+ modules. Connect a network module to your + computing device. Then, connect a Button module and an Led module. + Make a MODIPlus bundle object by typing bundle = modi_plus.MODIPlus() + """ + ) + self.check_user_input("bundle = modi_plus.MODIPlus()") + bundle = modi_plus.MODIPlus() + + self.print_wrap( + """ + Great! The "bundle" is your MODIPlus object. With it, you can control + all the modules connected to your device. + """ + ) + input("\nYou have completed this lesson. Press ENTER to continue.\n") + self.bundle = bundle + self.run_lesson2() + + def run_lesson2(self): + self.clear() + self.print_lesson(2, "Accessing modules") + self.print_wrap( + """ + In the previous lesson, you created a MODIPlus object. Let's figure out + how we can access modules connected to it. + """ + ) + print() + self.print_wrap( + """ + "bundle.modules" is a method to get all the modules connected to + the device. + """ + ) + print("\nType: bundle.modules") + self.check_user_input("bundle.modules") + print(self.bundle.modules) + print() + + self.print_wrap( + """ + You can see two modules connected (excluding the network module) to + the machine. You can access each module by the same method we use + with an array. + """ + ) + self.print_wrap( + """ + You can also access modules by types. + """ + ) + print("\nType: bundle.leds") + + self.check_user_input("bundle.leds") + print(self.bundle.leds) + print() + self.print_wrap( + """ + If you have followed previous instructions correctly, there must be + one led module connected to the network module. Now, make an led + variable by accessing the first led module. + """ + ) + print("\nType: led = bundle.leds[0]") + + self.check_user_input("led = bundle.leds[0]") + led = self.bundle.leds[0] + self.led = led + print() + self.print_wrap( + """ + Super! You can now do whatever you want with these modules. If you + have different modules connected, you can access the modules in a + same way, just typing bundle.s" + """ + ) + + input("\nYou have completed this lesson. Press ENTER to continue: \n") + self.run_lesson3() + + def run_lesson3(self): + led = self.led + led.set_rgb(0, 0, 0) + self.clear() + self.print_lesson(3, "Controlling modules") + self.print_wrap( + """ + Now you know how to access individual modules. + + Let's make an object named "button" as well for your button module. + You know how to do it (You have the modi_plus object, "bundle"). + """ + ) + + self.check_user_input("button = bundle.buttons[0]", False) + button = self.bundle.buttons[0] + self.button = button + print() + + self.print_wrap( + """ + Perfect. With your button module and led module, we can either get + data from the module or send command to the module. + """ + ) + + print() + self.print_wrap( + """ + "pressed" is a property method of a button module which returns + whether the button is pressed or not (i.e. press state). + """ + ) + print("Check the press state of the button by typing button.pressed") + + self.check_user_input("button.pressed") + print(button.pressed) + print() + + self.print_wrap( + """ + Now, see if the same command returns True when pressing the button. + """ + ) + + self.check_user_input("button.pressed") + print(button.pressed) + print() + + self.print_wrap( + """ + Good. Now let's send a command to the led module. Led's set_rgb is a + method of an led module. + """ + ) + print("Let there be light by typing led.set_rgb(0, 0, 100)") + + response = self.check_user_input("led.set_rgb(0, 0, 100)") + # Security: Use direct function call instead of exec() to prevent code injection + if response == "led.set_rgb(0, 0, 100)": + led.set_rgb(0, 0, 100) + else: + print(f"Invalid input. Expected 'led.set_rgb(0, 0, 100)', got '{response}'") + print() + + self.print_wrap( + """ + Perfect! You will see the blue light from the led module. + """ + ) + + input("\nYou have completed this lesson. Press ENTER to continue.\n") + self.run_lesson4() + + def run_lesson4(self): + button = self.button + led = self.led + + self.clear() + self.print_lesson(4, "Your First PyMODI+ Project(i.e. Creation)") + + self.print_wrap( + """ + Let's make a PyMODI+ project that blinks led when button is pressed. + """ + ) + self.print_wrap( + """ + In an infinite loop, we want our led to light up when button is + pressed, and turn off when not pressed. Complete the following code + based on the description. + """ + ) + + input("\nPress ENTER when you're ready! ") + self.clear() + + print(">>> while True:") + print("... # Check if button is pressed") + self.check_user_input( + "button.pressed:", give_answer=False, guide="... if " + ) + print("... # Set Led color to green") + self.check_user_input( + "led.set_rgb(0, 100, 0)", give_answer=False, guide="... " + ) + print("... elif button.double_clicked:") + print("... break") + print("... else:") + print("... # Turn off the led. (i.e. set color to (0, 0, 0))") + self.check_user_input( + "led.set_rgb(0, 0, 0)", give_answer=False, guide="... " + ) + print() + + self.print_wrap( + """ + Congrats!! Now let's see if the code works as we want. + Press the button to light up the led. Double click the button to + break out of the loop. + """ + ) + + while True: + if button.pressed: + led.set_rgb(0, 100, 0) + elif button.double_clicked: + break + else: + led.set_rgb(0, 0, 0) + time.sleep(0.01) + print() + self.print_wrap( + """ + It looks great! Now you know how to use PyMODI+ to control modules. + """ + ) + print( + 'You can check more functions at "pymodi-plus.readthedocs.io/en/latest"' + ) + + input("You have completed the tutorial. Press ENTER to exit: ") + os._exit(0) diff --git a/packages/core/modi_plus/util/unittest_util.py b/packages/core/modi_plus/util/unittest_util.py new file mode 100644 index 0000000..f48d905 --- /dev/null +++ b/packages/core/modi_plus/util/unittest_util.py @@ -0,0 +1,98 @@ +from modi_plus.module.setup_module.network import Network +from modi_plus.module.setup_module.battery import Battery +from modi_plus.module.input_module.env import Env +from modi_plus.module.input_module.imu import Imu +from modi_plus.module.input_module.button import Button +from modi_plus.module.input_module.dial import Dial +from modi_plus.module.input_module.joystick import Joystick +from modi_plus.module.input_module.tof import Tof +from modi_plus.module.output_module.display import Display +from modi_plus.module.output_module.motor import Motor +from modi_plus.module.output_module.led import Led +from modi_plus.module.output_module.speaker import Speaker + + +class MockConnection: + def __init__(self): + self.send_list = [] + + def send(self, pkt): + self.send_list.append(pkt) + + def send_nowait(self, pkt): + self.send_list.append(pkt) + + def recv(self): + return "Test" + + +class MockNetwork(Network): + def __init__(self, id_, uuid, connection_task): + super().__init__(id_, uuid, connection_task) + self._enable_get_property_timeout = False + + +class MockBattery(Battery): + def __init__(self, id_, uuid, connection_task): + super().__init__(id_, uuid, connection_task) + self._enable_get_property_timeout = False + + +class MockEnv(Env): + def __init__(self, id_, uuid, connection_task): + super().__init__(id_, uuid, connection_task) + self._enable_get_property_timeout = False + + +class MockImu(Imu): + def __init__(self, id_, uuid, connection_task): + super().__init__(id_, uuid, connection_task) + self._enable_get_property_timeout = False + + +class MockButton(Button): + def __init__(self, id_, uuid, connection_task): + super().__init__(id_, uuid, connection_task) + self._enable_get_property_timeout = False + + +class MockDial(Dial): + def __init__(self, id_, uuid, connection_task): + super().__init__(id_, uuid, connection_task) + self._enable_get_property_timeout = False + + +class MockJoystick(Joystick): + def __init__(self, id_, uuid, connection_task): + super().__init__(id_, uuid, connection_task) + self._enable_get_property_timeout = False + + +class MockTof(Tof): + def __init__(self, id_, uuid, connection_task): + super().__init__(id_, uuid, connection_task) + self._enable_get_property_timeout = False + + +class MockDisplay(Display): + def __init__(self, id_, uuid, connection_task): + super().__init__(id_, uuid, connection_task) + self._enable_get_property_timeout = False + + +class MockMotor(Motor): + def __init__(self, id_, uuid, connection_task): + super().__init__(id_, uuid, connection_task) + self._enable_get_property_timeout = False + + +class MockLed(Led): + def __init__(self, id_, uuid, connection_task): + super().__init__(id_, uuid, connection_task) + self._enable_get_property_timeout = False + + +class MockSpeaker(Speaker): + def __init__(self, id_, uuid, connection_task): + super().__init__(id_, uuid, connection_task) + self._enable_get_property_timeout = False diff --git a/packages/core/modi_plus/util/usage_util.py b/packages/core/modi_plus/util/usage_util.py new file mode 100644 index 0000000..fa8b347 --- /dev/null +++ b/packages/core/modi_plus/util/usage_util.py @@ -0,0 +1,308 @@ +import os + +from textwrap import fill +from textwrap import dedent + + +class UsageInstructor: + """ + Usage Instructor teaches basic module usage of PyMODI+. + It mainly teachs what methods are available for each module. + """ + + row_len = 79 + + def __init__(self): + self.bundle = None + self.led = None + self.button = None + + @staticmethod + def clear(): + clear_cmd = "cls" if os.name == "nt" else "clear" + os.system(clear_cmd) + + def print_wrap(self, msg): + message = fill(dedent(msg), self.row_len).lstrip() + print(message) + + def print_topic(self, module_type): + print("-" * self.row_len) + topic = f"Usage Manual {module_type}" + print(f"{topic:^{self.row_len}}") + print("-" * self.row_len) + + def run_usage_manual(self): + self.clear() + print("=" * self.row_len) + print(f"= {'Welcome to PyMODI+ Usage Manual':^{self.row_len - 4}} =") + print("=" * self.row_len) + + selection = dedent( + """ + Modules available for usage: + 1. Button + 2. Dial + 3. Env + 4. Imu + 5. Joystick + 7. Tof + 8. Display + 9. Led + 10. Motor + 11. Speaker + """ + ) + print(selection) + module_nb = int(input( + "Enter the module index (0 to exit) and press ENTER: " + )) + self.clear() + + if not (0 <= module_nb <= 11): + print("ERROR: invalid module index") + os._exit(0) + + run_selected_manual = { + 0: self.exit, + 1: self.run_button_manual, + 2: self.run_dial_manual, + 3: self.run_env_manual, + 4: self.run_imu_manual, + 5: self.run_joystick_manual, + 7: self.run_tof_manual, + 8: self.run_display_manual, + 9: self.run_led_manual, + 10: self.run_motor_manual, + 11: self.run_speaker_manual, + }.get(module_nb) + run_selected_manual() + + # + # Usage manuals for each module + # + def exit(self): + os._exit(0) + + def run_button_manual(self): + self.print_topic("Button") + + print(dedent( + """ + import modi_plus + + bundle = modi_plus.MODIPlus() + button = bundle.button[0] + + while True: + if button.clicked: + print(f"Button({button.id}) is clicked!") + if button.double_clicked: + print(f"Button({button.id}) is double clicked!") + if button.pressed: + print(f"Button({button.id}) is pressed!") + if button.toggled: + print(f"Button({button.id}) is toggled!") + """ + )) + input("Press ENTER to exit: ") + self.run_usage_manual() + + def run_dial_manual(self): + self.print_topic("Dial") + print(dedent( + """ + import modi_plus + + bundle = modi_plus.MODIPlus() + dial = bundle.dials[0] + + while True: + print(f"Dial ({dial.id}) turn: {dial.turn}") + print(f"Dial ({dial.id}) speed: {dial.speed}") + """ + )) + input("Press ENTER to exit: ") + self.run_usage_manual() + + def run_env_manual(self): + self.print_topic("Env") + print(dedent( + """ + import modi_plus + + bundle = modi_plus.MODIPlus() + env = bundle.envs[0] + + while True: + print(f"Env ({env.id}) illuminance: {env.illuminance}") + print(f"Env ({env.id}) temperature: {env.temperature}") + print(f"Env ({env.id}) humidity: {env.humidity}") + print(f"Env ({env.id}) volume: {env.volume}") + """ + )) + input("Press ENTER to exit: ") + self.run_usage_manual() + + def run_imu_manual(self): + self.print_topic("Imu") + print(dedent( + """ + import modi_plus + + bundle = modi_plus.MODIPlus() + imu = bundle.imus[0] + + while True: + print(f"Gyro ({imu.id}) angle_x: {imu.angle_x}") + print(f"Gyro ({imu.id}) angle_y: {imu.angle_y}") + print(f"Gyro ({imu.id}) angle_z: {imu.angle_z}") + print(f"Gyro ({imu.id}) angular_vel_x: {imu.angular_vel_x}") + print(f"Gyro ({imu.id}) angular_vel_y: {imu.angular_vel_y}") + print(f"Gyro ({imu.id}) angular_vel_z: {imu.angular_vel_z}") + print(f"Gyro ({imu.id}) acceleration_x: {imu.acceleration_x}") + print(f"Gyro ({imu.id}) acceleration_y: {imu.acceleration_y}") + print(f"Gyro ({imu.id}) acceleration_z: {imu.acceleration_z}") + print(f"Gyro ({imu.id}) vibration: {imu.vibration}") + """ + )) + input("Press ENTER to exit: ") + self.run_usage_manual() + + def run_joystick_manual(self): + self.print_topic("Joystick") + print(dedent( + """ + import modi_plus + + bundle = modi_plus.MODIPlus() + joystick = bundle.joysticks[0] + + while True: + print(f"Joystick ({joystick.id}) x: {joystick.x}") + print(f"Joystick ({joystick.id}) y: {joystick.y}") + print(f"Joystick ({joystick.id}) direction: {joystick.direction}") + """ + )) + input("Press ENTER to exit: ") + self.run_usage_manual() + + def run_tof_manual(self): + self.print_topic("Tof") + print(dedent( + """ + import modi_plus + + bundle = modi_plus.MODIPlus() + tof = bundle.tofs[0] + + while True: + print(f"ToF ({tof.id}) distance: {tof.distance}") + """ + )) + input("Press ENTER to exit: ") + self.run_usage_manual() + + def run_display_manual(self): + self.print_topic("Display") + print(dedent( + """ + import modi_plus + + bundle = modi_plus.MODIPlus() + display = bundle.displays[0] + + # Set text to display, you can check the text being displayed + display.set_text("Hello World!") + + # Check what text has been displayed currently (in program) + print(f"Display ({display.id}) text: {display.text}) + """ + )) + input("Press ENTER to exit: ") + self.run_usage_manual() + + def run_led_manual(self): + self.print_topic("Led") + print(dedent( + """ + import modi_plus + import time + + bundle = modi_plus.MODIPlus() + + led = bundle.leds[0] + + # Turn the led on for a second + led.set_rgb(100, 100, 100) + time.sleep(1) + + # Turn the led off for a second + led.set_rgb(0, 0, 0) + time.sleep(1) + + # Turn red on for a second + led.set_rgb(100, 0, 0) + time.sleep(1) + + led.set_rgb(0, 0, 0) + + # Turn green on for a second + led.set_rgb(0, 100, 0) + time.sleep(1) + + led.set_rgb(0, 0, 0) + + # Turn blue on for a second + led.set_rgb(0, 0, 100) + time.sleep(1) + + led.set_rgb(0, 0, 0) + """ + )) + input("Press ENTER to exit: ") + self.run_usage_manual() + + def run_motor_manual(self): + self.print_topic("Motor") + print(dedent( + """ + import modi_plus + import time + + bundle = modi_plus.MODIPlus() + motor = bundle.motors[0] + + motor.set_angle(0, 70) + time.sleep(1) + + motor.set_angle(60, 70) + time.sleep(1) + + print(f"motor ({motor.id}) angle: {motor.angle}") + + motor.set_speed(20) + time.sleep(1) + + print(f"motor ({motor.id}) speed: {motor.speed}") + """ + )) + input("Press ENTER to exit: ") + self.run_usage_manual() + + def run_speaker_manual(self): + self.print_topic("Speaker") + print(dedent( + """ + import modi_plus + import time + + bundle = modi_plus.MODIPlus() + speaker = bundle.speakers[0] + + speaker.set_tune("SOL6", 50) + time.sleep(1) + """ + )) + input("Press ENTER to exit: ") + self.run_usage_manual() diff --git a/packages/core/modi_plus/util/winusb.py b/packages/core/modi_plus/util/winusb.py new file mode 100644 index 0000000..68f34ae --- /dev/null +++ b/packages/core/modi_plus/util/winusb.py @@ -0,0 +1,560 @@ +import time +import ctypes +from winusbcdc import WinUSBApi +from winusbcdc import UsbSetupPacket +from winusbcdc.usb_cdc import CDC_CMDS +from winusbcdc import GUID, DIGCF_PRESENT, DIGCF_DEVICE_INTERFACE, \ + SpDeviceInterfaceData, SpDeviceInterfaceDetailData, SpDevinfoData, GENERIC_WRITE, GENERIC_READ, FILE_SHARE_WRITE, \ + FILE_SHARE_READ, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, FILE_FLAG_OVERLAPPED, INVALID_HANDLE_VALUE, \ + UsbInterfaceDescriptor, PipeInfo, ERROR_IO_INCOMPLETE, ERROR_IO_PENDING, Overlapped +from ctypes import c_byte, byref, sizeof, c_ulong, resize, wstring_at, c_void_p, c_ubyte, create_string_buffer +from ctypes.wintypes import DWORD +from winusbcdc import SetupDiGetClassDevs, SetupDiEnumDeviceInterfaces, SetupDiGetDeviceInterfaceDetail, is_device, \ + CreateFile, WinUsb_Initialize, Close_Handle, WinUsb_Free, GetLastError, WinUsb_QueryDeviceInformation, \ + WinUsb_GetAssociatedInterface, WinUsb_QueryInterfaceSettings, WinUsb_QueryPipe, WinUsb_ControlTransfer, \ + WinUsb_WritePipe, WinUsb_ReadPipe, WinUsb_GetOverlappedResult, \ + WinUsb_SetPipePolicy, WinUsb_FlushPipe + + +def list_modi_winusb_paths(): + api = ModiWinUsb() + return api.list_usb_devices() + + +class ModiWinUsb(object): + + def __init__(self): + self.api = WinUSBApi() + byte_array = c_byte * 8 + self.usb_device_guid = GUID(0xA5DCBF10, 0x6530, 0x11D2, byte_array(0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED)) + self.usb_winusb_guid = GUID(0xDEE824EF, 0x729b, 0x4A0E, byte_array(0x9C, 0x14, 0xB7, 0x11, 0x7D, 0x33, 0xA8, 0x17)) + self.usb_composite_guid = GUID(0x36FC9E60, 0xC465, 0x11CF, byte_array(0x80, 0x56, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00)) + self.handle_file = INVALID_HANDLE_VALUE + self.handle_winusb = [c_void_p()] + self._index = -1 + self.vid = 0x2FDE + self.pid = 0x0003 + + def list_usb_devices(self): + device_paths = [] + value = 0x00000000 + value |= DIGCF_PRESENT + value |= DIGCF_DEVICE_INTERFACE + + flags = DWORD(value) + self.handle = self.api.exec_function_setupapi(SetupDiGetClassDevs, byref(self.usb_winusb_guid), None, None, flags) + + sp_device_interface_data = SpDeviceInterfaceData() + sp_device_interface_data.cb_size = sizeof(sp_device_interface_data) + sp_device_interface_detail_data = SpDeviceInterfaceDetailData() + sp_device_info_data = SpDevinfoData() + sp_device_info_data.cb_size = sizeof(sp_device_info_data) + + i = 0 + required_size = DWORD(0) + member_index = DWORD(i) + cb_sizes = (8, 6, 5) # different on 64 bit / 32 bit etc + + while self.api.exec_function_setupapi(SetupDiEnumDeviceInterfaces, self.handle, None, byref(self.usb_winusb_guid), member_index, byref(sp_device_interface_data)): + self.api.exec_function_setupapi(SetupDiGetDeviceInterfaceDetail, self.handle, byref(sp_device_interface_data), None, 0, byref(required_size), None) + resize(sp_device_interface_detail_data, required_size.value) + + path = None + for cb_size in cb_sizes: + sp_device_interface_detail_data.cb_size = cb_size + ret = self.api.exec_function_setupapi(SetupDiGetDeviceInterfaceDetail, self.handle, byref(sp_device_interface_data), byref(sp_device_interface_detail_data), required_size, byref(required_size), byref(sp_device_info_data)) + if ret: + cb_sizes = (cb_size, ) + path = wstring_at(byref(sp_device_interface_detail_data, sizeof(DWORD))) + break + if path is None: + raise ctypes.WinError() + + if self.find_device(path) and path not in device_paths: + device_paths.append(path) + + i += 1 + member_index = DWORD(i) + required_size = c_ulong(0) + resize(sp_device_interface_detail_data, sizeof(SpDeviceInterfaceDetailData)) + + return device_paths + + def find_device(self, path): + return is_device(None, self.vid, self.pid, path) + + def init_winusb_device(self, path): + self.handle_file = self.api.exec_function_kernel32(CreateFile, path, GENERIC_WRITE | GENERIC_READ, + FILE_SHARE_WRITE | FILE_SHARE_READ, None, OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, None) + + if self.handle_file == INVALID_HANDLE_VALUE: + return False + result = self.api.exec_function_winusb(WinUsb_Initialize, self.handle_file, byref(self.handle_winusb[0])) + if result == 0: + self.get_last_error_code() + raise ctypes.WinError() + # return False + else: + self._index = 0 + return True + + def close_winusb_device(self): + result_file = 1 + if self.handle_file: + result_file = self.api.exec_function_kernel32(Close_Handle, self.handle_file) + if result_file: + self.handle_file = None + + result_winusb = [self.api.exec_function_winusb(WinUsb_Free, h) for h in self.handle_winusb] + if 0 in result_winusb: + raise RuntimeError("Unable to close winusb handle") + self.handle_winusb = [] + return result_file != 0 + + def get_last_error_code(self): + return self.api.exec_function_kernel32(GetLastError) + + def query_device_info(self, query=1): + info_type = c_ulong(query) + buff = (c_void_p * 1)() + buff_length = c_ulong(sizeof(c_void_p)) + result = self.api.exec_function_winusb(WinUsb_QueryDeviceInformation, self.handle_winusb[self._index], info_type, byref(buff_length), buff) + if result != 0: + return buff[0] + else: + return -1 + + def query_interface_settings(self, index): + if self._index != -1: + temp_handle_winusb = self.handle_winusb[self._index] + interface_descriptor = UsbInterfaceDescriptor() + result = self.api.exec_function_winusb(WinUsb_QueryInterfaceSettings, temp_handle_winusb, c_ubyte(0), byref(interface_descriptor)) + if result != 0: + return interface_descriptor + else: + return None + else: + return None + + def change_interface(self, index, alternate=0): + new_handle = c_void_p() + result = self.api.exec_function_winusb(WinUsb_GetAssociatedInterface, self.handle_winusb[self._index], c_ubyte(alternate), byref(new_handle)) + if result != 0: + self._index = index + 1 + self.handle_winusb.append(new_handle) + return True + else: + return False + + def query_pipe(self, pipe_index): + pipe_info = PipeInfo() + result = self.api.exec_function_winusb(WinUsb_QueryPipe, self.handle_winusb[self._index], c_ubyte(0), pipe_index, byref(pipe_info)) + if result != 0: + return pipe_info + else: + return None + + def control_transfer(self, setup_packet, buff=None): + if buff is not None: + if setup_packet.length > 0: # Host 2 Device + buff = (c_ubyte * setup_packet.length)(*buff) + buffer_length = setup_packet.length + else: # Device 2 Host + buff = (c_ubyte * setup_packet.length)() + buffer_length = setup_packet.length + else: + buff = c_ubyte() + buffer_length = 0 + + result = self.api.exec_function_winusb(WinUsb_ControlTransfer, self.handle_winusb[0], setup_packet, byref(buff), c_ulong(buffer_length), byref(c_ulong(0)), None) + return {"result": result != 0, "buffer": [buff]} + + def write(self, pipe_id, write_buffer): + write_buffer = create_string_buffer(write_buffer) + written = c_ulong(0) + self.api.exec_function_winusb(WinUsb_WritePipe, self.handle_winusb[self._index], c_ubyte(pipe_id), write_buffer, c_ulong(len(write_buffer) - 1), byref(written), None) + return written.value + + def read(self, pipe_id, length_buffer): + read_buffer = create_string_buffer(length_buffer) + read = c_ulong(0) + result = self.api.exec_function_winusb(WinUsb_ReadPipe, self.handle_winusb[self._index], c_ubyte(pipe_id), read_buffer, c_ulong(length_buffer), byref(read), None) + if result != 0: + if read.value != length_buffer: + return read_buffer[:read.value] + else: + return read_buffer + else: + return None + + def set_timeout(self, pipe_id, timeout): + class POLICY_TYPE: + SHORT_PACKET_TERMINATE = 1 + AUTO_CLEAR_STALL = 2 + PIPE_TRANSFER_TIMEOUT = 3 + IGNORE_SHORT_PACKETS = 4 + ALLOW_PARTIAL_READS = 5 + AUTO_FLUSH = 6 + RAW_IO = 7 + + policy_type = c_ulong(POLICY_TYPE.PIPE_TRANSFER_TIMEOUT) + value_length = c_ulong(4) + value = c_ulong(int(timeout * 1000)) # in ms + result = self.api.exec_function_winusb(WinUsb_SetPipePolicy, self.handle_winusb[self._index], c_ubyte(pipe_id), policy_type, value_length, byref(value)) + return result + + def flush(self, pipe_id): + result = self.api.exec_function_winusb(WinUsb_FlushPipe, self.handle_winusb[self._index], c_ubyte(pipe_id)) + return result + + def _overlapped_read_do(self, pipe_id): + self.olread_ol.Internal = 0 + self.olread_ol.InternalHigh = 0 + self.olread_ol.Offset = 0 + self.olread_ol.OffsetHigh = 0 + self.olread_ol.Pointer = 0 + self.olread_ol.hEvent = 0 + result = self.api.exec_function_winusb(WinUsb_ReadPipe, self.handle_winusb[self._index], c_ubyte(pipe_id), self.olread_buf, c_ulong(self.olread_buflen), byref(c_ulong(0)), byref(self.olread_ol)) + if result != 0: + return True + else: + return False + + def overlapped_read_init(self, pipe_id, length_buffer): + self.olread_ol = Overlapped() + self.olread_buf = create_string_buffer(length_buffer) + self.olread_buflen = length_buffer + return self._overlapped_read_do(pipe_id) + + def overlapped_read(self, pipe_id): + """ keep on reading overlapped, return bytearray, empty if nothing to read, None if err""" + rl = c_ulong(0) + result = self.api.exec_function_winusb(WinUsb_GetOverlappedResult, self.handle_winusb[self._index], byref(self.olread_ol), byref(rl), False) + if result == 0: + if self.get_last_error_code() == ERROR_IO_PENDING or self.get_last_error_code() == ERROR_IO_INCOMPLETE: + return "" + else: + return None + else: + ret = str(self.olread_buf[0:rl.value]) + self._overlapped_read_do(pipe_id) + return ret + + +class ModiWinUsbComPort: + def __init__(self, path=None, baudrate=921600, timeout=0.2, write_timeout=0, start=True): + self.device = None + self.path = path + self._rxremaining = b"" + self.parity = 0 + self.stopbits = 1 + self.databits = 8 + self.maximum_packet_size = 0 + + self._baudrate = baudrate + self._timeout = timeout + self._write_timeout = write_timeout + + self.is_open = False + if start: + self.open() + + def open(self): + self.close() + + # Control interface + api = self._select_device(self.path) + if not api: + return False + + # Data Interface + api.change_interface(0) + interface2_descriptor = api.query_interface_settings(0) + + pipe_info_list = map(api.query_pipe, range(interface2_descriptor.b_num_endpoints)) + for item in pipe_info_list: + if item.pipe_id & 0x80: + self._ep_in = item.pipe_id + else: + self._ep_out = item.pipe_id + self.maximum_packet_size = min(item.maximum_packet_size, self.maximum_packet_size) or item.maximum_packet_size + + self.device = api + + self.is_open = True + + self.setControlLineState() + self.setLineCoding() + self.device.set_timeout(self._ep_in, self._timeout) + self.reset_input_buffer() + + @property + def in_waiting(self): + return False + + @property + def timeout(self): + return self._timeout + + @timeout.setter + def timeout(self, value): + self._timeout = value + if self.is_open: + self.device.set_timeout(self._ep_in, value) + + @property + def write_timeout(self): + return self._write_timeout + + @write_timeout.setter + def write_timeout(self, value): + self._write_timeout = value + + @property + def baudrate(self): + return self._baudrate + + @baudrate.setter + def baudrate(self, value): + self._baudrate = value + self.setLineCoding(baudrate=value) + + def readinto(self, buf): + if not self.is_open: + return None + orig_size = len(buf) + read = 0 + if self._rxremaining: + remain_len = len(self._rxremaining) + read = min(remain_len, orig_size) + buf[0:read] = self._rxremaining[0:read] + self._rxremaining = self._rxremaining[read:] + end_timeout = time.time() + (self._timeout or 0.2) + self.device.set_timeout(self._ep_in, 2) + while read < orig_size: + remaining = orig_size - read + c = self.device.read(self._ep_in, min(remaining, 1024 * 4)) + if c is not None and len(c): + if len(c) > remaining: + end_timeout += 0.2 + buf[read:] = c[0:remaining] + self._rxremaining = c[remaining:] + return orig_size + else: + buf[read:] = c + read += len(c) + if time.time() > end_timeout: + break + return read + + def read(self, size=1): + if not self.is_open: + return None + rx = [self._rxremaining] + length = len(self._rxremaining) + self._rxremaining = b"" + end_timeout = time.time() + (self._timeout or 0.2) + if size: + self.device.set_timeout(self._ep_in, self._timeout) + while length < size: + c = self.device.read(self._ep_in, size - length) + if c is not None and len(c): + end_timeout += 0.2 + rx.append(c) + length += len(c) + if time.time() > end_timeout: + break + else: + self.device.set_timeout(self._ep_in, 0.2) + while True: + c = self.device.read(self._ep_in, self.maximum_packet_size) + if c is not None and len(c): + end_timeout += 0.2 + rx.append(c) + length += len(c) + else: + break + if time.time() > end_timeout: + break + chunk = b"".join(rx) + if size and len(chunk) >= size: + if self._rxremaining: + self._rxremaining = chunk[size:] + self._rxremaining + else: + self._rxremaining = chunk[size:] + chunk = chunk[0:size] + return chunk + + def readline(self, size=64 * 1024): + if not self.is_open: + return None + rx = [self._rxremaining] + length = len(self._rxremaining) + self._rxremaining = b"" + end_timeout = time.time() + self.timeout + self.device.set_timeout(self._ep_in, 0.2) + while b"\n" not in rx[-1]: # 10 == b"\n" + c = self.device.read(self._ep_in, size - length) + if c is not None and len(c): + end_timeout += 0.2 + length += len(c) + rx.append(c) + if time.time() > end_timeout: + break + line = b"".join(rx) + i = line.find(b"\n") + 1 + self._rxremaining = line[i:] + return line[0:i] + + def read_all(self): + return self.read(None) + + def write(self, data): + if not self.is_open: + return None + try: + self.device.write(self._ep_out, data) + except Exception: + # print("USB Error on write {}".format(e)) + return + + # if len(data) != ret: + # print("Bytes written mismatch {0} vs {1}".format(len(data), ret)) + # else: + # print("{} bytes written to ep".format(ret)) + + def setControlLineState(self, RTS=None, DTR=None): + if not self.is_open: + return None + ctrlstate = (2 if RTS else 0) + (1 if DTR else 0) + + txdir = 0 # 0:OUT, 1:IN + req_type = 1 # 0:std, 1:class, 2:vendor + # 0:device, 1:interface, 2:endpoint, 3:other + recipient = 1 + req_type = (txdir << 7) + (req_type << 5) + recipient + + pkt = UsbSetupPacket( + request_type=req_type, + request=CDC_CMDS["SET_CONTROL_LINE_STATE"], + value=ctrlstate, + index=0x00, + length=0x00 + ) + buff = None + + self.device.control_transfer(pkt, buff) + + def setLineCoding(self, baudrate=None, parity=None, databits=None, stopbits=None): + if not self.is_open: + return None + + sbits = {1: 0, 1.5: 1, 2: 2} + dbits = {5, 6, 7, 8, 16} + pmodes = {0, 1, 2, 3, 4} + brates = {300, 600, 1200, 2400, 4800, 9600, 14400, + 19200, 28800, 38400, 57600, 115200, 230400, 921600} + + if stopbits is not None: + if stopbits not in sbits.keys(): + valid = ", ".join(str(k) for k in sorted(sbits.keys())) + raise ValueError("Valid stopbits are " + valid) + self.stopbits = stopbits + + if databits is not None: + if databits not in dbits: + valid = ", ".join(str(d) for d in sorted(dbits)) + raise ValueError("Valid databits are " + valid) + self.databits = databits + + if parity is not None: + if parity not in pmodes: + valid = ", ".join(str(pm) for pm in sorted(pmodes)) + raise ValueError("Valid parity modes are " + valid) + self.parity = parity + + if baudrate is not None: + if baudrate not in brates: + brs = sorted(brates) + dif = [abs(br - baudrate) for br in brs] + best = brs[dif.index(min(dif))] + raise ValueError("Invalid baudrates, nearest valid is {}".format(best)) + self._baudrate = baudrate + + linecode = [ + self._baudrate & 0xff, + (self._baudrate >> 8) & 0xff, + (self._baudrate >> 16) & 0xff, + (self._baudrate >> 24) & 0xff, + sbits[self.stopbits], + self.parity, + self.databits] + + txdir = 0 # 0:OUT, 1:IN + req_type = 1 # 0:std, 1:class, 2:vendor + recipient = 1 # 0:device, 1:interface, 2:endpoint, 3:other + req_type = (txdir << 7) + (req_type << 5) + recipient + + pkt = UsbSetupPacket( + request_type=req_type, + request=CDC_CMDS["SET_LINE_CODING"], + value=0x0000, + index=0x00, + length=len(linecode) + ) + buff = linecode + + self.device.control_transfer(pkt, buff) + + def disconnect(self): + if not self.is_open: + return None + self.device.close_winusb_device() + self.is_open = False + + def __del__(self): + self.disconnect() + + def reset_input_buffer(self): + if self.is_open: + self.device.flush(self._ep_in) + self._rxremaining = b"" + + def reset_output_buffer(self): + pass + + def flush(self): + if not self.is_open: + return None + self.device.flush(self._ep_in) + + def close(self): + self.disconnect() + + def flushInput(self): + self.reset_input_buffer() + + def flushOutput(self): + self.reset_output_buffer() + + def setDTR(self, state): + pass + + def setRTS(self, state): + pass + + def _select_device(self, path): + api = ModiWinUsb() + + if not api.init_winusb_device(path): + return None + + return api + + +# main +if __name__ == "__main__": + paths = list_modi_winusb_paths() + for index, value in enumerate(paths): + print(index, value) diff --git a/packages/core/pytest.ini b/packages/core/pytest.ini new file mode 100644 index 0000000..4ef9582 --- /dev/null +++ b/packages/core/pytest.ini @@ -0,0 +1,24 @@ +[pytest] +# Test discovery patterns +testpaths = tests +python_files = test_*.py +python_classes = Test* +python_functions = test_* + +# Directories to ignore during test collection +norecursedirs = .git .tox dist build *.egg .eggs __pycache__ .pytest_cache htmlcov + +# Output options +addopts = + --strict-markers + --tb=short + -ra + +# Logging +log_cli = false +log_cli_level = INFO + +# Disable warnings summary +filterwarnings = + ignore::DeprecationWarning + ignore::PendingDeprecationWarning diff --git a/packages/core/requirements-dev.txt b/packages/core/requirements-dev.txt new file mode 100644 index 0000000..af8db80 --- /dev/null +++ b/packages/core/requirements-dev.txt @@ -0,0 +1,4 @@ +flake8==4.0.1 +black==24.3.0 +tox==3.24.4 +coverage==6.1.1 diff --git a/packages/core/requirements.txt b/packages/core/requirements.txt new file mode 100644 index 0000000..c008908 --- /dev/null +++ b/packages/core/requirements.txt @@ -0,0 +1,15 @@ +# common +pyserial==3.5 +nest-asyncio==1.5.4 +websocket-client==1.2.3 +packaging>=21.3 + +# windows +bleak==0.13.0; sys_platform == 'win32' +winusbcdc==1.4; sys_platform == 'win32' + +# mac +bleak==0.13.0; sys_platform == 'darwin' + +# linux +pexpect; sys_platform == 'linux' diff --git a/packages/core/setup.cfg b/packages/core/setup.cfg new file mode 100644 index 0000000..c8ab39f --- /dev/null +++ b/packages/core/setup.cfg @@ -0,0 +1,15 @@ +[bumpversion] +current_version = 0.4.0 +commit = True +tag = False + +[bumpversion:file:./modi_plus/about.py] +search = __version__ = "{current_version}" +replace = __version__ = "{new_version}" + +[bdist_wheel] +universal = 1 + +[flake8] +exclude = docs +ignore = E203,W503,W504,E501 diff --git a/packages/core/setup.py b/packages/core/setup.py new file mode 100644 index 0000000..e386ec0 --- /dev/null +++ b/packages/core/setup.py @@ -0,0 +1,89 @@ +from os import path +from io import open +from setuptools import setup, find_packages + + +def get_spec(filename: str, mode: str="r"): + def wrapper(): + here = path.dirname(__file__) + result = {} + with open(path.join(here, filename), encoding="utf8") as src_file: + if mode == "d": + exec(src_file.read(), result) + else: + result = src_file.read() + return result + return wrapper + + +get_about = get_spec("./modi_plus/about.py", "d") +get_readme = get_spec("README.md") +get_history = get_spec("HISTORY.md") +get_requirements_dev = get_spec("requirements-dev.txt") + +# 최소 의존성 (Pyodide 호환) +INSTALL_REQUIRES = [ + 'nest-asyncio>=1.5.4', + 'packaging>=21.3', +] + +# Optional 의존성 +EXTRAS_REQUIRE = { + 'serial': [ + 'pyserial>=3.5', + ], + 'ble': [ + 'bleak>=0.13.0; sys_platform == "win32"', + 'bleak>=0.13.0; sys_platform == "darwin"', + ], + 'websocket': [ + 'websocket-client>=1.2.3', + ], + 'all': [ + 'pyserial>=3.5', + 'bleak>=0.13.0; sys_platform == "win32"', + 'bleak>=0.13.0; sys_platform == "darwin"', + 'websocket-client>=1.2.3', + 'winusbcdc>=1.4; sys_platform == "win32"', + 'pexpect; sys_platform == "linux"', + ], +} +EXTRAS_REQUIRE['dev'] = get_requirements_dev() + +about = get_about() +setup( + name=about["__title__"], + version=about["__version__"], + author=about["__author__"], + author_email=about["__email__"], + description=about["__summary__"], + long_description=get_readme() + "\n" + get_history(), + long_description_content_type="text/markdown", + install_requires=INSTALL_REQUIRES, + extras_require=EXTRAS_REQUIRE, + license=about["__license__"], + include_package_data=True, + keywords=["python", "modi", "modi-plus", "modi_plus", "modi+"], + packages=find_packages( + include=[ + "modi_plus", "modi_plus.util", "modi_plus.task", "modi_plus.task.ble_task", + "modi_plus.module", + "modi_plus.module.setup_module", + "modi_plus.module.input_module", + "modi_plus.module.output_module" + ] + ), + test_suite="tests", + url=about["__url__"], + classifiers=[ + "Natural Language :: English", + "Intended Audience :: Developers", + "Intended Audience :: Education", + "Intended Audience :: Information Technology", + "Intended Audience :: Science/Research", + 'Programming Language :: Python :: 3', + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", + ], + python_requires='>=3.7', +) diff --git a/packages/core/tests/__init__.py b/packages/core/tests/__init__.py new file mode 100644 index 0000000..1e12afc --- /dev/null +++ b/packages/core/tests/__init__.py @@ -0,0 +1,9 @@ +""" +DO NOT DELETE THIS __init__.py FILE. + +The file is required in order to correctly run the command below. +>>> python setup.py test + +Setup detects test_suite="tests", as a package. +For tests/ to be recognized as a package, __init__.py is required. +""" diff --git a/packages/core/tests/module/__init__.py b/packages/core/tests/module/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/packages/core/tests/module/input_module/__init__.py b/packages/core/tests/module/input_module/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/packages/core/tests/module/input_module/test_button.py b/packages/core/tests/module/input_module/test_button.py new file mode 100644 index 0000000..1d38615 --- /dev/null +++ b/packages/core/tests/module/input_module/test_button.py @@ -0,0 +1,65 @@ +import unittest + +from modi_plus.module.input_module.button import Button +from modi_plus.util.message_util import parse_get_property_message +from modi_plus.util.unittest_util import MockConnection, MockButton + + +class TestButton(unittest.TestCase): + """Tests for 'Button' class.""" + + def setUp(self): + """Set up test fixtures, if any.""" + + self.connection = MockConnection() + mock_args = (-1, -1, self.connection) + self.button = MockButton(*mock_args) + + def tearDown(self): + """Tear down test fixtures, if any.""" + + del self.button + + def test_get_clicked(self): + """Test get_clicked method.""" + + _ = self.button.clicked + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Button.PROPERTY_BUTTON_STATE, self.button.prop_samp_freq) + ) + self.assertEqual(_, False) + + def test_get_double_clicked(self): + """Test get_double_clicked method.""" + + _ = self.button.double_clicked + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Button.PROPERTY_BUTTON_STATE, self.button.prop_samp_freq) + ) + self.assertEqual(_, False) + + def test_get_pressed(self): + """Test get_pressed method.""" + + _ = self.button.pressed + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Button.PROPERTY_BUTTON_STATE, self.button.prop_samp_freq) + ) + self.assertEqual(_, False) + + def test_get_toggled(self): + """Test get_toggled method.""" + + _ = self.button.toggled + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Button.PROPERTY_BUTTON_STATE, self.button.prop_samp_freq) + ) + self.assertEqual(_, False) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/core/tests/module/input_module/test_dial.py b/packages/core/tests/module/input_module/test_dial.py new file mode 100644 index 0000000..21ddddd --- /dev/null +++ b/packages/core/tests/module/input_module/test_dial.py @@ -0,0 +1,45 @@ +import unittest + +from modi_plus.module.input_module.dial import Dial +from modi_plus.util.message_util import parse_get_property_message +from modi_plus.util.unittest_util import MockConnection, MockDial + + +class TestDial(unittest.TestCase): + """Tests for 'Dial' class.""" + + def setUp(self): + """Set up test fixtures, if any.""" + + self.connection = MockConnection() + mock_args = (-1, -1, self.connection) + self.dial = MockDial(*mock_args) + + def tearDown(self): + """Tear down test fixtures, if any.""" + + del self.dial + + def test_get_degree(self): + """Test get_degree method.""" + + _ = self.dial.turn + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Dial.PROPERTY_DIAL_STATE, self.dial.prop_samp_freq) + ) + self.assertEqual(_, 0) + + def test_get_speed(self): + """Test get_speed method.""" + + _ = self.dial.speed + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Dial.PROPERTY_DIAL_STATE, self.dial.prop_samp_freq) + ) + self.assertEqual(_, 0) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/core/tests/module/input_module/test_env.py b/packages/core/tests/module/input_module/test_env.py new file mode 100644 index 0000000..f5c2938 --- /dev/null +++ b/packages/core/tests/module/input_module/test_env.py @@ -0,0 +1,393 @@ +import unittest +import struct + +from modi_plus.module.input_module.env import Env +from modi_plus.util.message_util import parse_get_property_message +from modi_plus.util.unittest_util import MockConnection, MockEnv + + +class TestEnv(unittest.TestCase): + """Tests for 'Env' class.""" + + def setUp(self): + """Set up test fixtures, if any.""" + + self.connection = MockConnection() + mock_args = (-1, -1, self.connection) + self.env = MockEnv(*mock_args) + + def tearDown(self): + """Tear down test fixtures, if any.""" + + del self.env + + def test_get_temperature(self): + """Test get_temperature method.""" + + _ = self.env.temperature + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Env.PROPERTY_ENV_STATE, self.env.prop_samp_freq) + ) + self.assertEqual(_, 0) + + def test_get_humidity(self): + """Test get_humidity method.""" + + _ = self.env.humidity + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Env.PROPERTY_ENV_STATE, self.env.prop_samp_freq) + ) + self.assertEqual(_, 0) + + def test_get_illuminance(self): + """Test get_illuminance method.""" + + _ = self.env.illuminance + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Env.PROPERTY_ENV_STATE, self.env.prop_samp_freq) + ) + self.assertEqual(_, 0) + + def test_get_volume(self): + """Test get_volume method.""" + + _ = self.env.volume + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Env.PROPERTY_ENV_STATE, self.env.prop_samp_freq) + ) + self.assertEqual(_, 0) + + +class TestEnvRGBVersion1(unittest.TestCase): + """Tests for RGB properties with app version 1.x (not supported).""" + + def setUp(self): + """Set up test fixtures with version 1.x.""" + self.connection = MockConnection() + mock_args = (-1, -1, self.connection) + self.env = MockEnv(*mock_args) + + # Set app version to 1.5.0 (major version = 1) + # Version format: major << 13 | minor << 8 | patch + # 1.5.0 = (1 << 13) | (5 << 8) | 0 = 8192 + 1280 = 9472 + version_1_5_0 = (1 << 13) | (5 << 8) | 0 + self.env.app_version = version_1_5_0 + + def tearDown(self): + """Tear down test fixtures.""" + del self.env + + def test_rgb_not_supported_version_1(self): + """Test that RGB properties raise AttributeError in version 1.x.""" + with self.assertRaises(AttributeError) as context: + _ = self.env.red + self.assertIn("not supported in Env module version 1.x", str(context.exception)) + + def test_green_not_supported_version_1(self): + """Test that green property raises AttributeError in version 1.x.""" + with self.assertRaises(AttributeError) as context: + _ = self.env.green + self.assertIn("not supported in Env module version 1.x", str(context.exception)) + + def test_blue_not_supported_version_1(self): + """Test that blue property raises AttributeError in version 1.x.""" + with self.assertRaises(AttributeError) as context: + _ = self.env.blue + self.assertIn("not supported in Env module version 1.x", str(context.exception)) + + def test_rgb_tuple_not_supported_version_1(self): + """Test that rgb tuple property raises AttributeError in version 1.x.""" + with self.assertRaises(AttributeError) as context: + _ = self.env.rgb + self.assertIn("not supported in Env module version 1.x", str(context.exception)) + + def test_is_rgb_supported_version_1(self): + """Test _is_rgb_supported returns False for version 1.x.""" + self.assertFalse(self.env._is_rgb_supported()) + + def test_white_not_supported_version_1(self): + """Test that white property raises AttributeError in version 1.x.""" + with self.assertRaises(AttributeError) as context: + _ = self.env.white + self.assertIn("not supported in Env module version 1.x", str(context.exception)) + + def test_black_not_supported_version_1(self): + """Test that black property raises AttributeError in version 1.x.""" + with self.assertRaises(AttributeError) as context: + _ = self.env.black + self.assertIn("not supported in Env module version 1.x", str(context.exception)) + + def test_color_class_not_supported_version_1(self): + """Test that color_class property raises AttributeError in version 1.x.""" + with self.assertRaises(AttributeError) as context: + _ = self.env.color_class + self.assertIn("not supported in Env module version 1.x", str(context.exception)) + + def test_brightness_not_supported_version_1(self): + """Test that brightness property raises AttributeError in version 1.x.""" + with self.assertRaises(AttributeError) as context: + _ = self.env.brightness + self.assertIn("not supported in Env module version 1.x", str(context.exception)) + + +class TestEnvRGBVersion2(unittest.TestCase): + """Tests for RGB properties with app version 2.x (supported).""" + + def setUp(self): + """Set up test fixtures with version 2.x.""" + self.connection = MockConnection() + mock_args = (-1, -1, self.connection) + self.env = MockEnv(*mock_args) + + # Set app version to 2.0.0 (major version = 2) + # Version format: major << 13 | minor << 8 | patch + # 2.0.0 = (2 << 13) | (0 << 8) | 0 = 16384 + version_2_0_0 = (2 << 13) | (0 << 8) | 0 + self.env.app_version = version_2_0_0 + + def tearDown(self): + """Tear down test fixtures.""" + del self.env + + def test_get_red(self): + """Test get_red method with version 2.x.""" + _ = self.env.red + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Env.PROPERTY_RGB_STATE, self.env.prop_samp_freq) + ) + self.assertEqual(_, 0) + + def test_get_green(self): + """Test get_green method with version 2.x.""" + _ = self.env.green + # Green is the second call (red was first in previous test setup) + # But in isolated test, this is first + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Env.PROPERTY_RGB_STATE, self.env.prop_samp_freq) + ) + self.assertEqual(_, 0) + + def test_get_blue(self): + """Test get_blue method with version 2.x.""" + _ = self.env.blue + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Env.PROPERTY_RGB_STATE, self.env.prop_samp_freq) + ) + self.assertEqual(_, 0) + + def test_get_rgb_tuple(self): + """Test get_rgb tuple method with version 2.x.""" + result = self.env.rgb + self.assertIsInstance(result, tuple) + self.assertEqual(len(result), 3) + self.assertEqual(result, (0, 0, 0)) + + def test_is_rgb_supported_version_2(self): + """Test _is_rgb_supported returns True for version 2.x.""" + self.assertTrue(self.env._is_rgb_supported()) + + def test_rgb_property_offsets(self): + """Test that RGB properties use correct offsets.""" + self.assertEqual(Env.PROPERTY_OFFSET_RED, 0) + self.assertEqual(Env.PROPERTY_OFFSET_GREEN, 2) + self.assertEqual(Env.PROPERTY_OFFSET_BLUE, 4) + self.assertEqual(Env.PROPERTY_OFFSET_WHITE, 6) + self.assertEqual(Env.PROPERTY_OFFSET_BLACK, 8) + self.assertEqual(Env.PROPERTY_OFFSET_COLOR_CLASS, 10) + self.assertEqual(Env.PROPERTY_OFFSET_BRIGHTNESS, 11) + + def test_get_white(self): + """Test get_white method with version 2.x.""" + _ = self.env.white + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Env.PROPERTY_RGB_STATE, self.env.prop_samp_freq) + ) + self.assertEqual(_, 0) + + def test_get_black(self): + """Test get_black method with version 2.x.""" + _ = self.env.black + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Env.PROPERTY_RGB_STATE, self.env.prop_samp_freq) + ) + self.assertEqual(_, 0) + + def test_get_color_class(self): + """Test get_color_class method with version 2.x.""" + _ = self.env.color_class + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Env.PROPERTY_RGB_STATE, self.env.prop_samp_freq) + ) + # Default value should be 0 (unknown) + self.assertEqual(_, 0) + + def test_get_brightness(self): + """Test get_brightness method with version 2.x.""" + _ = self.env.brightness + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Env.PROPERTY_RGB_STATE, self.env.prop_samp_freq) + ) + self.assertEqual(_, 0) + + +class TestEnvRGBVersion3(unittest.TestCase): + """Tests for RGB properties with app version 3.x (also supported).""" + + def setUp(self): + """Set up test fixtures with version 3.x.""" + self.connection = MockConnection() + mock_args = (-1, -1, self.connection) + self.env = MockEnv(*mock_args) + + # Set app version to 3.2.1 (major version = 3) + # Version format: major << 13 | minor << 8 | patch + # 3.2.1 = (3 << 13) | (2 << 8) | 1 = 24576 + 512 + 1 = 25089 + version_3_2_1 = (3 << 13) | (2 << 8) | 1 + self.env.app_version = version_3_2_1 + + def tearDown(self): + """Tear down test fixtures.""" + del self.env + + def test_is_rgb_supported_version_3(self): + """Test _is_rgb_supported returns True for version 3.x.""" + self.assertTrue(self.env._is_rgb_supported()) + + def test_rgb_works_in_version_3(self): + """Test that RGB properties work in version 3.x.""" + # Should not raise any exception + _ = self.env.red + _ = self.env.green + _ = self.env.blue + rgb = self.env.rgb + self.assertEqual(rgb, (0, 0, 0)) + + def test_new_properties_work_in_version_3(self): + """Test that new color properties work in version 3.x.""" + # Should not raise any exception + _ = self.env.white + _ = self.env.black + _ = self.env.color_class + _ = self.env.brightness + # All should be 0 in mock + self.assertEqual(self.env.white, 0) + self.assertEqual(self.env.black, 0) + self.assertEqual(self.env.color_class, 0) + self.assertEqual(self.env.brightness, 0) + + +class TestEnvRGBNoVersion(unittest.TestCase): + """Tests for RGB properties when app version is not set.""" + + def setUp(self): + """Set up test fixtures without setting version.""" + self.connection = MockConnection() + mock_args = (-1, -1, self.connection) + self.env = MockEnv(*mock_args) + # Don't set app_version - it should be None by default + + def tearDown(self): + """Tear down test fixtures.""" + del self.env + + def test_rgb_not_supported_no_version(self): + """Test that RGB properties raise AttributeError when version is not set.""" + with self.assertRaises(AttributeError): + _ = self.env.red + + def test_is_rgb_supported_no_version(self): + """Test _is_rgb_supported returns False when version is not set.""" + self.assertFalse(self.env._is_rgb_supported()) + + +class TestEnvRGBDataTypes(unittest.TestCase): + """Tests for RGB properties data types and values with app version 2.x.""" + + def setUp(self): + """Set up test fixtures with version 2.x and mock data.""" + self.connection = MockConnection() + mock_args = (-1, -1, self.connection) + self.env = MockEnv(*mock_args) + + # Set app version to 2.0.0 + version_2_0_0 = (2 << 13) | (0 << 8) | 0 + self.env.app_version = version_2_0_0 + + # Create mock RGB data with known values + # red=50, green=75, blue=100, white=25, black=10, color_class=2 (green), brightness=80 + self.mock_rgb_data = struct.pack("HHHHHBB", 50, 75, 100, 25, 10, 2, 80) + + def tearDown(self): + """Tear down test fixtures.""" + del self.env + + def test_rgb_values_with_mock_data(self): + """Test RGB values are correctly parsed from mock data.""" + # Override _get_property to return our mock data + original_get_property = self.env._get_property + + def mock_get_property(prop_id): + if prop_id == Env.PROPERTY_RGB_STATE: + return self.mock_rgb_data + return original_get_property(prop_id) + + self.env._get_property = mock_get_property + + # Test uint16_t values (0-100%) + self.assertEqual(self.env.red, 50) + self.assertEqual(self.env.green, 75) + self.assertEqual(self.env.blue, 100) + self.assertEqual(self.env.white, 25) + self.assertEqual(self.env.black, 10) + + # Test uint8_t values + self.assertEqual(self.env.color_class, 2) # green + self.assertEqual(self.env.brightness, 80) + + # Test rgb tuple + self.assertEqual(self.env.rgb, (50, 75, 100)) + + def test_color_class_values(self): + """Test color_class returns correct values for each color.""" + original_get_property = self.env._get_property + + # Test different color classes + color_class_tests = [ + (0, "unknown"), + (1, "red"), + (2, "green"), + (3, "blue"), + (4, "white"), + (5, "black"), + ] + + for color_value, color_name in color_class_tests: + mock_data = struct.pack("HHHHHBB", 0, 0, 0, 0, 0, color_value, 0) + + def mock_get_property(prop_id): + if prop_id == Env.PROPERTY_RGB_STATE: + return mock_data + return original_get_property(prop_id) + + self.env._get_property = mock_get_property + self.assertEqual(self.env.color_class, color_value, + f"color_class should be {color_value} for {color_name}") + + def test_property_rgb_state_constant(self): + """Test that PROPERTY_RGB_STATE constant is correctly defined.""" + self.assertEqual(Env.PROPERTY_RGB_STATE, 3) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/core/tests/module/input_module/test_imu.py b/packages/core/tests/module/input_module/test_imu.py new file mode 100644 index 0000000..1d23bfd --- /dev/null +++ b/packages/core/tests/module/input_module/test_imu.py @@ -0,0 +1,155 @@ +import unittest + +from modi_plus.module.input_module.imu import Imu +from modi_plus.util.message_util import parse_get_property_message +from modi_plus.util.unittest_util import MockConnection, MockImu + + +class TestImu(unittest.TestCase): + """Tests for 'Imu' class.""" + + def setUp(self): + """Set up test fixtures, if any.""" + + self.connection = MockConnection() + mock_args = (-1, -1, self.connection) + self.imu = MockImu(*mock_args) + + def tearDown(self): + """Tear down test fixtures, if any.""" + + del self.imu + + def test_get_angle_x(self): + """Test get_angle_x method.""" + + _ = self.imu.angle_x + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Imu.PROPERTY_ANGLE_STATE, self.imu.prop_samp_freq) + ) + self.assertEqual(_, 0.0) + + def test_get_angle_y(self): + """Test get_angle_y method.""" + + _ = self.imu.angle_y + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Imu.PROPERTY_ANGLE_STATE, self.imu.prop_samp_freq) + ) + self.assertEqual(_, 0.0) + + def test_get_angle_z(self): + """Test get_angle_z method.""" + + _ = self.imu.angle_z + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Imu.PROPERTY_ANGLE_STATE, self.imu.prop_samp_freq) + ) + self.assertEqual(_, 0.0) + + def test_get_angular_vel_x(self): + """Test get_angular_vel_x method.""" + + _ = self.imu.angular_vel_x + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Imu.PROPERTY_GYRO_STATE, self.imu.prop_samp_freq) + ) + self.assertEqual(_, 0.0) + + def test_get_angular_vel_y(self): + """Test get_angular_vel_y method.""" + + _ = self.imu.angular_vel_y + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Imu.PROPERTY_GYRO_STATE, self.imu.prop_samp_freq) + ) + self.assertEqual(_, 0.0) + + def test_get_angular_vel_z(self): + """Test get_angular_vel_z method.""" + + _ = self.imu.angular_vel_z + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Imu.PROPERTY_GYRO_STATE, self.imu.prop_samp_freq) + ) + self.assertEqual(_, 0.0) + + def test_get_acceleration_x(self): + """Test get_acceleration_x method.""" + + _ = self.imu.acceleration_x + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Imu.PROPERTY_ACC_STATE, self.imu.prop_samp_freq) + ) + self.assertEqual(_, 0.0) + + def test_get_acceleration_y(self): + """Test get_acceleration_x method.""" + + _ = self.imu.acceleration_y + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Imu.PROPERTY_ACC_STATE, self.imu.prop_samp_freq) + ) + self.assertEqual(_, 0.0) + + def test_get_acceleration_z(self): + """Test get_acceleration_z method.""" + + _ = self.imu.acceleration_z + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Imu.PROPERTY_ACC_STATE, self.imu.prop_samp_freq) + ) + self.assertEqual(_, 0.0) + + def test_get_vibration(self): + """Test get_vibration method.""" + + _ = self.imu.vibration + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Imu.PROPERTY_VIBRATION_STATE, self.imu.prop_samp_freq) + ) + self.assertEqual(_, 0.0) + + def test_get_angle(self): + """Test get_angle_z method.""" + + _ = self.imu.angle + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Imu.PROPERTY_ANGLE_STATE, self.imu.prop_samp_freq) + ) + self.assertEqual(_, (0.0, 0.0, 0.0)) + + def test_get_angular_velocity(self): + """Test get_angular_velocity method.""" + + _ = self.imu.angular_velocity + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Imu.PROPERTY_GYRO_STATE, self.imu.prop_samp_freq) + ) + self.assertEqual(_, (0.0, 0.0, 0.0)) + + def test_get_acceleration(self): + """Test get_acceleration method.""" + + _ = self.imu.acceleration + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Imu.PROPERTY_ACC_STATE, self.imu.prop_samp_freq) + ) + self.assertEqual(_, (0.0, 0.0, 0.0)) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/core/tests/module/input_module/test_joystick.py b/packages/core/tests/module/input_module/test_joystick.py new file mode 100644 index 0000000..ee0203c --- /dev/null +++ b/packages/core/tests/module/input_module/test_joystick.py @@ -0,0 +1,55 @@ +import unittest + +from modi_plus.module.input_module.joystick import Joystick +from modi_plus.util.message_util import parse_get_property_message +from modi_plus.util.unittest_util import MockConnection, MockJoystick + + +class TestJoystick(unittest.TestCase): + """Tests for 'Joystick' package.""" + + def setUp(self): + """Set up test fixtures, if any.""" + + self.connection = MockConnection() + mock_args = (-1, -1, self.connection) + self.joystick = MockJoystick(*mock_args) + + def tearDown(self): + """Tear down test fixtures, if any.""" + + del self.joystick + + def test_get_x(self): + """Test get_x method.""" + + _ = self.joystick.x + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Joystick.PROPERTY_POSITION_STATE, self.joystick.prop_samp_freq) + ) + self.assertEqual(_, 0) + + def test_get_y(self): + """Test get_y method.""" + + _ = self.joystick.y + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Joystick.PROPERTY_POSITION_STATE, self.joystick.prop_samp_freq) + ) + self.assertEqual(_, 0) + + def test_get_dirction(self): + """Test get_dirction method.""" + + _ = self.joystick.direction + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Joystick.PROPERTY_DIRECTION_STATE, self.joystick.prop_samp_freq) + ) + self.assertEqual(_, "origin") + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/core/tests/module/input_module/test_tof.py b/packages/core/tests/module/input_module/test_tof.py new file mode 100644 index 0000000..d0ae840 --- /dev/null +++ b/packages/core/tests/module/input_module/test_tof.py @@ -0,0 +1,35 @@ +import unittest + +from modi_plus.module.input_module.tof import Tof +from modi_plus.util.message_util import parse_get_property_message +from modi_plus.util.unittest_util import MockConnection, MockTof + + +class TestTof(unittest.TestCase): + """Tests for 'Tof' class.""" + + def setUp(self): + """Set up test fixtures, if any.""" + + self.connection = MockConnection() + mock_args = (-1, -1, self.connection) + self.tof = MockTof(*mock_args) + + def tearDown(self): + """Tear down test fixtures, if any.""" + + del self.tof + + def test_get_distance(self): + """Test get_distance method.""" + + _ = self.tof.distance + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Tof.PROPERTY_DISTANCE_STATE, self.tof.prop_samp_freq) + ) + self.assertEqual(_, 0.0) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/core/tests/module/output_module/__init__.py b/packages/core/tests/module/output_module/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/packages/core/tests/module/output_module/test_display.py b/packages/core/tests/module/output_module/test_display.py new file mode 100644 index 0000000..94dcd5f --- /dev/null +++ b/packages/core/tests/module/output_module/test_display.py @@ -0,0 +1,148 @@ +import unittest + +from modi_plus.module.output_module.display import Display +from modi_plus.util.message_util import parse_set_property_message +from modi_plus.util.unittest_util import MockConnection, MockDisplay + + +class TestDisplay(unittest.TestCase): + """Tests for 'Display' class.""" + + def setUp(self): + """Set up test fixtures, if any.""" + + self.connection = MockConnection() + self.mock_kwargs = [-1, -1, self.connection] + self.display = MockDisplay(*self.mock_kwargs) + + def tearDown(self): + """Tear down test fixtures, if any.""" + + del self.display + + def test_write_text(self): + """Test write_text method.""" + + mock_text = "0123456789abcdefghijklmnopqrstuvwxyz" + self.display.text = mock_text + set_messages = [] + + n = Display.TEXT_SPLIT_LEN + encoding_data = str.encode(str(mock_text)) + bytes(1) + splited_data = [encoding_data[x - n:x] for x in range(n, len(encoding_data) + n, n)] + for index, data in enumerate(splited_data): + set_message = parse_set_property_message( + -1, Display.PROPERTY_DISPLAY_WRITE_TEXT, + (("bytes", data), ) + ) + set_messages.append(set_message) + + sent_messages = [] + while self.connection.send_list: + sent_messages.append(self.connection.send_list.pop()) + for set_message in set_messages: + self.assertTrue(set_message in sent_messages) + self.assertEqual(self.display.text, mock_text) + + def test_write_variable_xy(self): + """Test write_variable_xy method.""" + + mock_variable = 123 + mock_position = 5 + self.display.write_variable_xy(mock_position, mock_position, mock_variable) + set_message = parse_set_property_message( + -1, Display.PROPERTY_DISPLAY_WRITE_VARIABLE, + (("u8", mock_position), ("u8", mock_position), + ("float", mock_variable), ) + ) + sent_messages = [] + while self.connection.send_list: + sent_messages.append(self.connection.send_list.pop()) + self.assertTrue(set_message in sent_messages) + + def test_write_variable_line(self): + """Test write_variable_line method.""" + + mock_variable = 123 + mock_line = 2 + self.display.write_variable_line(mock_line, mock_variable) + set_message = parse_set_property_message( + -1, Display.PROPERTY_DISPLAY_WRITE_VARIABLE, + (("u8", 0), ("u8", mock_line * 20), + ("float", mock_variable), ) + ) + sent_messages = [] + while self.connection.send_list: + sent_messages.append(self.connection.send_list.pop()) + self.assertTrue(set_message in sent_messages) + + def test_draw_picture(self): + """Test draw_picture method.""" + + mock_name = Display.preset_pictures()[0] + self.display.draw_picture(mock_name) + set_message = parse_set_property_message( + -1, Display.PROPERTY_DISPLAY_DRAW_PICTURE, + (("u8", 0), ("u8", 0), + ("u8", Display.WIDTH), ("u8", Display.HEIGHT), + ("string", Display.PRESET_PICTURE[mock_name]), ) + ) + sent_messages = [] + while self.connection.send_list: + sent_messages.append(self.connection.send_list.pop()) + self.assertTrue(set_message in sent_messages) + + def test_draw_dot(self): + """Test draw_dot method.""" + + mock_dot = bytes([0 for i in range(Display.DOT_LEN)]) + self.display.draw_dot(mock_dot) + set_messages = [] + + n = Display.DOT_SPLIT_LEN + splited_data = [mock_dot[x - n:x] for x in range(n, len(mock_dot) + n, n)] + for index, data in enumerate(splited_data): + send_data = bytes([index]) + data + set_message = parse_set_property_message( + -1, Display.PROPERTY_DISPLAY_DRAW_DOT, + (("bytes", send_data), ) + ) + set_messages.append(set_message) + + sent_messages = [] + while self.connection.send_list: + sent_messages.append(self.connection.send_list.pop()) + for set_message in set_messages: + self.assertTrue(set_message in sent_messages) + + def test_set_offset(self): + """Test set_offset method.""" + + mock_x = 10 + mock_y = 20 + self.display.set_offset(mock_x, mock_y) + set_message = parse_set_property_message( + -1, Display.PROPERTY_DISPLAY_SET_OFFSET, + (("s8", mock_x), ("s8", mock_y), ) + ) + sent_messages = [] + while self.connection.send_list: + sent_messages.append(self.connection.send_list.pop()) + self.assertTrue(set_message in sent_messages) + + def test_reset(self): + """Test reset method.""" + + self.display.reset() + set_message = parse_set_property_message( + -1, Display.PROPERTY_DISPLAY_RESET, + (("u8", 0), ) + ) + sent_messages = [] + while self.connection.send_list: + sent_messages.append(self.connection.send_list.pop()) + self.assertTrue(set_message in sent_messages) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/core/tests/module/output_module/test_led.py b/packages/core/tests/module/output_module/test_led.py new file mode 100644 index 0000000..6755a87 --- /dev/null +++ b/packages/core/tests/module/output_module/test_led.py @@ -0,0 +1,149 @@ +import unittest + +from modi_plus.module.output_module.led import Led +from modi_plus.util.message_util import parse_set_property_message, parse_get_property_message +from modi_plus.util.unittest_util import MockConnection, MockLed + + +class TestLed(unittest.TestCase): + """Tests for 'Led' class.""" + + def setUp(self): + """Set up test fixtures, if any.""" + + self.connection = MockConnection() + self.mock_kwargs = -1, -1, self.connection + self.led = MockLed(*self.mock_kwargs) + + def tearDown(self): + """Tear down test fixtures, if any.""" + + del self.led + + def test_set_rgb(self): + """Test set_rgb method with user-defined inputs.""" + + mock_red, mock_green, mock_blue = 10, 20, 100 + self.led.set_rgb(mock_red, mock_green, mock_blue) + set_message = parse_set_property_message( + -1, Led.PROPERTY_LED_SET_RGB, + (("u16", mock_red), ("u16", mock_green), ("u16", mock_blue), ) + ) + sent_messages = [] + while self.connection.send_list: + sent_messages.append(self.connection.send_list.pop()) + self.assertTrue(set_message in sent_messages) + + def test_set_red(self): + """Test set_red method with user-defined inputs.""" + + mock_red = 10 + self.led.red = mock_red + set_message = parse_set_property_message( + -1, Led.PROPERTY_LED_SET_RGB, + (("u16", mock_red), ("u16", 0), ("u16", 0), ) + ) + sent_messages = [] + while self.connection.send_list: + sent_messages.append(self.connection.send_list.pop()) + self.assertTrue(set_message in sent_messages) + + def test_set_green(self): + """Test set_green method with user-defined inputs.""" + + mock_green = 10 + self.led.green = mock_green + set_message = parse_set_property_message( + -1, Led.PROPERTY_LED_SET_RGB, + (("u16", 0), ("u16", mock_green), ("u16", 0), ) + ) + sent_messages = [] + while self.connection.send_list: + sent_messages.append(self.connection.send_list.pop()) + self.assertTrue(set_message in sent_messages) + + def test_set_blue(self): + """Test set_blue method with user-defined inputs.""" + + mock_blue = 10 + self.led.blue = mock_blue + set_message = parse_set_property_message( + -1, Led.PROPERTY_LED_SET_RGB, + (("u16", 0), ("u16", 0), ("u16", mock_blue), ) + ) + sent_messages = [] + while self.connection.send_list: + sent_messages.append(self.connection.send_list.pop()) + self.assertTrue(set_message in sent_messages) + + def test_get_red(self): + """Test get_red method with none input.""" + + _ = self.led.red + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Led.PROPERTY_LED_STATE, self.led.prop_samp_freq) + ) + self.assertEqual(_, 0) + + def test_get_rgb(self): + """Test get_rgb method with none input.""" + + _ = self.led.rgb + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Led.PROPERTY_LED_STATE, self.led.prop_samp_freq) + ) + self.assertEqual(_, (0, 0, 0)) + + def test_get_green(self): + """Test set_green method with none input.""" + + _ = self.led.green + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Led.PROPERTY_LED_STATE, self.led.prop_samp_freq) + ) + self.assertEqual(_, 0) + + def test_get_blue(self): + """Test get blue method with none input.""" + + _ = self.led.blue + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Led.PROPERTY_LED_STATE, self.led.prop_samp_freq) + ) + self.assertEqual(_, 0) + + def test_turn_on(self): + """Test turn_on method.""" + + mock_red, mock_green, mock_blue = 100, 100, 100 + self.led.turn_on() + set_message = parse_set_property_message( + -1, Led.PROPERTY_LED_SET_RGB, + (("u16", mock_red), ("u16", mock_green), ("u16", mock_blue), ) + ) + sent_messages = [] + while self.connection.send_list: + sent_messages.append(self.connection.send_list.pop()) + self.assertTrue(set_message in sent_messages) + + def test_turn_off(self): + """Test turn_off method.""" + + mock_red, mock_green, mock_blue = 0, 0, 0 + self.led.turn_off() + set_message = parse_set_property_message( + -1, Led.PROPERTY_LED_SET_RGB, + (("u16", mock_red), ("u16", mock_green), ("u16", mock_blue), ) + ) + sent_messages = [] + while self.connection.send_list: + sent_messages.append(self.connection.send_list.pop()) + self.assertTrue(set_message in sent_messages) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/core/tests/module/output_module/test_motor.py b/packages/core/tests/module/output_module/test_motor.py new file mode 100644 index 0000000..0e6c15c --- /dev/null +++ b/packages/core/tests/module/output_module/test_motor.py @@ -0,0 +1,120 @@ +import unittest + +from modi_plus.module.output_module.motor import Motor +from modi_plus.util.message_util import parse_set_property_message, parse_get_property_message +from modi_plus.util.unittest_util import MockConnection, MockMotor + + +class TestMotor(unittest.TestCase): + """Tests for 'Motor' class.""" + + def setUp(self): + """Set up test fixtures, if any.""" + + self.connection = MockConnection() + self.mock_kwargs = [-1, -1, self.connection] + self.motor = MockMotor(*self.mock_kwargs) + + def tearDown(self): + """Tear down test fixtures, if any.""" + + del self.motor + + def test_set_speed(self): + """Test set_speed method.""" + + mock_speed = 50 + self.motor.speed = mock_speed + set_message = parse_set_property_message( + -1, Motor.PROPERTY_MOTOR_SPEED, + (("s32", mock_speed), ) + ) + sent_messages = [] + while self.connection.send_list: + sent_messages.append(self.connection.send_list.pop()) + self.assertTrue(set_message in sent_messages) + + def test_get_speed(self): + """Test get_speed method with none input.""" + + _ = self.motor.speed + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Motor.PROPERTY_MOTOR_STATE, self.motor.prop_samp_freq) + ) + self.assertEqual(_, 0) + + def test_get_target_speed(self): + """Test get_target_speed method with none input.""" + + _ = self.motor.target_speed + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Motor.PROPERTY_MOTOR_STATE, self.motor.prop_samp_freq) + ) + self.assertEqual(_, 0) + + def test_set_angle(self): + """Test set_angle method.""" + + mock_angle, mock_speed = 90, 50 + self.motor.angle = mock_angle, mock_speed + set_message = parse_set_property_message( + -1, Motor.PROPERTY_MOTOR_ANGLE, + (("u16", mock_angle), + ("u16", mock_speed), + ("u16", 0), + ("u16", 0), ) + ) + sent_messages = [] + while self.connection.send_list: + sent_messages.append(self.connection.send_list.pop()) + self.assertTrue(set_message in sent_messages) + + def test_get_angle(self): + """Test get_angle method with none input.""" + + _ = self.motor.angle + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Motor.PROPERTY_MOTOR_STATE, self.motor.prop_samp_freq) + ) + self.assertEqual(_, 0) + + def test_get_target_angle(self): + """Test get_target_angle method with none input.""" + + _ = self.motor.target_angle + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Motor.PROPERTY_MOTOR_STATE, self.motor.prop_samp_freq) + ) + self.assertEqual(_, 0) + + def test_append_angle(self): + """Test append_angle method with none input.""" + + mock_angle, mock_speed = 90, 50 + self.motor.append_angle(mock_angle, mock_speed) + set_message = parse_set_property_message( + -1, Motor.PROPERTY_MOTOR_ANGLE_APPEND, + (("u16", mock_angle), ("u16", mock_speed), ) + ) + sent_messages = [] + while self.connection.send_list: + sent_messages.append(self.connection.send_list.pop()) + self.assertTrue(set_message in sent_messages) + + def test_stop(self): + """Test stop method with none input.""" + + self.motor.stop() + set_message = parse_set_property_message(-1, Motor.PROPERTY_MOTOR_STOP, ()) + sent_messages = [] + while self.connection.send_list: + sent_messages.append(self.connection.send_list.pop()) + self.assertTrue(set_message in sent_messages) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/core/tests/module/output_module/test_speaker.py b/packages/core/tests/module/output_module/test_speaker.py new file mode 100644 index 0000000..0621eb1 --- /dev/null +++ b/packages/core/tests/module/output_module/test_speaker.py @@ -0,0 +1,193 @@ +import unittest + +from modi_plus.module.output_module.speaker import Speaker +from modi_plus.util.message_util import parse_set_property_message, parse_get_property_message +from modi_plus.util.unittest_util import MockConnection, MockSpeaker + + +class TestSpeaker(unittest.TestCase): + """Tests for 'Speaker' class.""" + + def setUp(self): + """Set up test fixtures, if any.""" + + self.connection = MockConnection() + self.mock_kwargs = [-1, -1, self.connection] + self.speaker = MockSpeaker(*self.mock_kwargs) + + def tearDown(self): + """Tear down test fixtures, if any.""" + + del self.speaker + + def test_set_tune(self): + """Test set_tune method.""" + + mock_frequency, mock_volume = 500, 30 + self.speaker.tune = mock_frequency, mock_volume + set_message = parse_set_property_message( + -1, Speaker.PROPERTY_SPEAKER_SET_TUNE, + (("u16", mock_frequency), ("u16", mock_volume), ) + ) + sent_messages = [] + while self.connection.send_list: + sent_messages.append(self.connection.send_list.pop()) + self.assertTrue(set_message in sent_messages) + + def test_set_tune_str(self): + """Test set_tune method.""" + + mock_note = Speaker.preset_notes()[0] + mock_frequency, mock_volume = Speaker.SCALE_TABLE[mock_note], 30 + self.speaker.tune = mock_note, mock_volume + set_message = parse_set_property_message( + -1, Speaker.PROPERTY_SPEAKER_SET_TUNE, + (("u16", mock_frequency), ("u16", mock_volume), ) + ) + sent_messages = [] + while self.connection.send_list: + sent_messages.append(self.connection.send_list.pop()) + self.assertTrue(set_message in sent_messages) + + def test_get_tune(self): + """Test get_tune method.""" + + _ = self.speaker.tune + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Speaker.PROPERTY_SPEAKER_STATE, self.speaker.prop_samp_freq) + ) + self.assertEqual(_, (0, 0)) + + def test_set_frequency(self): + """Test set_frequency method.""" + + mock_frequency = 500 + self.speaker.frequency = mock_frequency + set_message = parse_set_property_message( + -1, Speaker.PROPERTY_SPEAKER_SET_TUNE, + (("u16", mock_frequency), ("u16", 0), ) + ) + sent_messages = [] + while self.connection.send_list: + sent_messages.append(self.connection.send_list.pop()) + self.assertTrue(set_message in sent_messages) + + def test_get_frequency(self): + """Test get_frequency method with none input.""" + + _ = self.speaker.frequency + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Speaker.PROPERTY_SPEAKER_STATE, self.speaker.prop_samp_freq) + ) + self.assertEqual(_, 0) + + def test_set_volume(self): + """Test set_volume method.""" + + mock_volume = 30 + self.speaker.volume = 30 + set_message = parse_set_property_message( + -1, Speaker.PROPERTY_SPEAKER_SET_TUNE, + (("u16", 0), ("u16", mock_volume), ) + ) + sent_messages = [] + while self.connection.send_list: + sent_messages.append(self.connection.send_list.pop()) + self.assertTrue(set_message in sent_messages) + + def test_get_volume(self): + """Test get_volume method with none input.""" + + _ = self.speaker.volume + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Speaker.PROPERTY_SPEAKER_STATE, self.speaker.prop_samp_freq) + ) + self.assertEqual(_, 0) + + def test_play_music(self): + """Test play_music method.""" + + mock_music = Speaker.preset_musics()[0] + mock_volume = 80 + self.speaker.play_music(mock_music, mock_volume) + set_message = parse_set_property_message( + -1, Speaker.PROPERTY_SPEAKER_MELODY, + (("u8", Speaker.STATE_START), ("u8", mock_volume), + ("string", Speaker.PRESET_MUSIC[mock_music]), ) + ) + sent_messages = [] + while self.connection.send_list: + sent_messages.append(self.connection.send_list.pop()) + self.assertTrue(set_message in sent_messages) + + def test_stop_music(self): + """Test stop_music method.""" + + mock_music = Speaker.preset_musics()[0] + mock_volume = 80 + self.speaker.play_music(mock_music, mock_volume) + self.speaker.stop_music() + set_message = parse_set_property_message( + -1, Speaker.PROPERTY_SPEAKER_MELODY, + (("u8", Speaker.STATE_STOP), ("u8", 0), + ("string", Speaker.PRESET_MUSIC[mock_music]), ) + ) + sent_messages = [] + while self.connection.send_list: + sent_messages.append(self.connection.send_list.pop()) + self.assertTrue(set_message in sent_messages) + + def test_pause_music(self): + """Test pause_music method.""" + + mock_music = Speaker.preset_musics()[0] + mock_volume = 80 + self.speaker.play_music(mock_music, mock_volume) + self.speaker.pause_music() + set_message = parse_set_property_message( + -1, Speaker.PROPERTY_SPEAKER_MELODY, + (("u8", Speaker.STATE_PAUSE), ("u8", 0), + ("string", Speaker.PRESET_MUSIC[mock_music]), ) + ) + sent_messages = [] + while self.connection.send_list: + sent_messages.append(self.connection.send_list.pop()) + self.assertTrue(set_message in sent_messages) + + def test_resume_music(self): + """Test resume_music method.""" + + mock_music = Speaker.preset_musics()[0] + mock_volume = 80 + self.speaker.play_music(mock_music, mock_volume) + self.speaker.resume_music() + set_message = parse_set_property_message( + -1, Speaker.PROPERTY_SPEAKER_MELODY, + (("u8", Speaker.STATE_RESUME), ("u8", 0), + ("string", Speaker.PRESET_MUSIC[mock_music]), ) + ) + sent_messages = [] + while self.connection.send_list: + sent_messages.append(self.connection.send_list.pop()) + self.assertTrue(set_message in sent_messages) + + def test_reset(self): + """Test reset method""" + + mock_frequency, mock_volume = 0, 0 + self.speaker.reset() + set_message = parse_set_property_message( + -1, Speaker.PROPERTY_SPEAKER_SET_TUNE, + (("u16", mock_frequency), ("u16", mock_volume), ) + ) + sent_messages = [] + while self.connection.send_list: + sent_messages.append(self.connection.send_list.pop()) + self.assertTrue(set_message in sent_messages) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/core/tests/module/setup_module/__init__.py b/packages/core/tests/module/setup_module/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/packages/core/tests/module/setup_module/test_battery.py b/packages/core/tests/module/setup_module/test_battery.py new file mode 100644 index 0000000..d847388 --- /dev/null +++ b/packages/core/tests/module/setup_module/test_battery.py @@ -0,0 +1,35 @@ +import unittest + +from modi_plus.module.setup_module.battery import Battery +from modi_plus.util.message_util import parse_get_property_message +from modi_plus.util.unittest_util import MockConnection, MockBattery + + +class TestBattery(unittest.TestCase): + """Tests for 'Battery' class.""" + + def setUp(self): + """Set up test fixtures, if any.""" + + self.connection = MockConnection() + self.mock_kwargs = [-1, -1, self.connection] + self.battery = MockBattery(*self.mock_kwargs) + + def tearDown(self): + """Tear down test fixtures, if any.""" + + del self.battery + + def test_get_level(self): + """Test get_level method.""" + + _ = self.battery.level + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Battery.PROPERTY_BATTERY_STATE, self.battery.prop_samp_freq) + ) + self.assertEqual(_, 0.0) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/core/tests/module/setup_module/test_network.py b/packages/core/tests/module/setup_module/test_network.py new file mode 100644 index 0000000..7a7f7ca --- /dev/null +++ b/packages/core/tests/module/setup_module/test_network.py @@ -0,0 +1,222 @@ +import unittest + +from modi_plus.module.setup_module.network import Network +from modi_plus.util.message_util import parse_set_property_message, parse_get_property_message +from modi_plus.util.unittest_util import MockConnection, MockNetwork + + +class TestNetwork(unittest.TestCase): + """Tests for 'Network' class.""" + + def setUp(self): + """Set up test fixtures, if any.""" + + self.connection = MockConnection() + self.mock_kwargs = [-1, -1, self.connection] + self.network = MockNetwork(*self.mock_kwargs) + + def tearDown(self): + """Tear down test fixtures, if any.""" + + del self.network + + def test_received_data(self): + """Test received_data method.""" + + _ = self.network.received_data(0) + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Network.PROPERTY_NETWORK_RECEIVE_DATA, self.network.prop_samp_freq) + ) + self.assertEqual(_, 0.0) + + def test_button_pressed(self): + """Test button_pressed method.""" + + _ = self.network.button_pressed(0) + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Network.PROPERTY_NETWORK_BUTTON, self.network.prop_samp_freq) + ) + self.assertEqual(_, False) + + def test_button_clicked(self): + """Test button_clicked method.""" + + _ = self.network.button_clicked(0) + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Network.PROPERTY_NETWORK_BUTTON, self.network.prop_samp_freq) + ) + self.assertEqual(_, False) + + def test_button_double_clicked(self): + """Test button_double_clicked method.""" + + _ = self.network.button_double_clicked(0) + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Network.PROPERTY_NETWORK_BUTTON, self.network.prop_samp_freq) + ) + self.assertEqual(_, False) + + def test_switch_toggled(self): + """Test switch_toggled method.""" + + _ = self.network.switch_toggled(0) + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Network.PROPERTY_NETWORK_SWITCH, self.network.prop_samp_freq) + ) + self.assertEqual(_, False) + + def test_dial_turn(self): + """Test dial_turn method.""" + + _ = self.network.dial_turn(0) + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Network.PROPERTY_NETWORK_DIAL, self.network.prop_samp_freq) + ) + self.assertEqual(_, False) + + def test_joystick_direction(self): + """Test joystick_direction method.""" + + _ = self.network.joystick_direction(0) + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Network.PROPERTY_NETWORK_JOYSTICK, self.network.prop_samp_freq) + ) + self.assertEqual(_, "unpressed") + + def test_slider_position(self): + """Test slider_position method.""" + + _ = self.network.slider_position(0) + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Network.PROPERTY_NETWORK_SLIDER, self.network.prop_samp_freq) + ) + self.assertEqual(_, 0) + + def test_time_up(self): + """Test time_up method.""" + + _ = self.network.time_up + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Network.PROPERTY_NETWORK_TIMER, self.network.prop_samp_freq) + ) + self.assertEqual(_, False) + + def test_imu_roll(self): + """Test imu_roll method.""" + + _ = self.network.imu_roll + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Network.PROPERTY_NETWORK_IMU, self.network.prop_samp_freq) + ) + self.assertEqual(_, 0) + + def test_imu_pitch(self): + """Test imu_pitch method.""" + + _ = self.network.imu_pitch + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Network.PROPERTY_NETWORK_IMU, self.network.prop_samp_freq) + ) + self.assertEqual(_, 0) + + def test_imu_yaw(self): + """Test imu_yaw method.""" + + _ = self.network.imu_yaw + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Network.PROPERTY_NETWORK_IMU, self.network.prop_samp_freq) + ) + self.assertEqual(_, 0) + + def test_imu_direction(self): + """Test imu_direction method.""" + + _ = self.network.imu_direction + self.assertEqual( + self.connection.send_list[0], + parse_get_property_message(-1, Network.PROPERTY_NETWORK_IMU_DIRECTION, self.network.prop_samp_freq) + ) + self.assertEqual(_, "origin") + + def test_send_data(self): + """Test send_data method.""" + + data = 123 + self.network.send_data(0, data) + set_message = parse_set_property_message( + -1, Network.PROPERTY_NETWORK_SEND_DATA, + (("s32", data),) + ) + sent_messages = [] + while self.connection.send_list: + sent_messages.append(self.connection.send_list.pop()) + self.assertTrue(set_message in sent_messages) + + def test_send_text(self): + """Test send_text method.""" + + text = "MODI+" + self.network.send_text(text) + set_message = parse_set_property_message( + -1, Network.PROPERTY_NETWORK_SEND_TEXT, + (("string", text), ) + ) + sent_messages = [] + while self.connection.send_list: + sent_messages.append(self.connection.send_list.pop()) + self.assertTrue(set_message in sent_messages) + + def test_buzzer_on(self): + """Test buzzer_on method.""" + + self.network.buzzer_on() + set_message = parse_set_property_message( + -1, Network.PROPERTY_NETWORK_BUZZER, + (("u8", Network.STATE_BUZZER_ON), ) + ) + sent_messages = [] + while self.connection.send_list: + sent_messages.append(self.connection.send_list.pop()) + self.assertTrue(set_message in sent_messages) + + def test_buzzer_off(self): + """Test buzzer_off method.""" + + self.network.buzzer_off() + set_message = parse_set_property_message( + -1, Network.PROPERTY_NETWORK_BUZZER, + (("u8", Network.STATE_BUZZER_OFF), ) + ) + sent_messages = [] + while self.connection.send_list: + sent_messages.append(self.connection.send_list.pop()) + self.assertTrue(set_message in sent_messages) + + def test_take_picture(self): + """Test take_picture method.""" + + self.network.take_picture() + set_message = parse_set_property_message( + -1, Network.PROPERTY_NETWORK_CAMERA, + (("u8", Network.STATE_CAMERA_PICTURE), ) + ) + sent_messages = [] + while self.connection.send_list: + sent_messages.append(self.connection.send_list.pop()) + self.assertTrue(set_message in sent_messages) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/core/tests/task/__init__.py b/packages/core/tests/task/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/packages/core/tests/task/test_conn_task.py b/packages/core/tests/task/test_conn_task.py new file mode 100644 index 0000000..5aeeef4 --- /dev/null +++ b/packages/core/tests/task/test_conn_task.py @@ -0,0 +1,21 @@ +import unittest +# from unittest import mock + +from modi_plus.task.connection_task import ConnectionTask + + +class TestConnTask(unittest.TestCase): + """Tests for 'ConnTask' class""" + + def setUp(self): + """Set up test fixtures, if any.""" + self.mock_kwargs = {"serialport_recv_q": None, "serialport_send_q": None} + self.connection_task = ConnectionTask(**self.mock_kwargs) + + def tearDown(self): + """Tear down test fixtures, if any.""" + del self.connection_task + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/core/tests/task/test_serialport_task.py b/packages/core/tests/task/test_serialport_task.py new file mode 100644 index 0000000..2bb12e0 --- /dev/null +++ b/packages/core/tests/task/test_serialport_task.py @@ -0,0 +1,48 @@ +import unittest + +from unittest import mock + +from modi_plus.task.serialport_task import SerialportTask + + +class TestSerialportTask(unittest.TestCase): + """Tests for 'SerialportTask' class""" + class MockSerial: + def __init__(self): + self.in_waiting = 1 + self.write = mock.Mock() + self.close = mock.Mock() + + def read_mock(self): + self.in_waiting = 0 + return "complete" + + def setUp(self): + """Set up test fixtures, if any.""" + self.serialport_task = SerialportTask() + + def tearDown(self): + """Tear down test fixtures, if any.""" + del self.serialport_task + + def test_close_conn(self): + """Test close_conn method""" + self.serialport_task._bus = self.MockSerial() + self.serialport_task.close_connection() + self.serialport_task.bus.close.assert_called_once_with() + + def test_recv_data(self): + """Test _read_data method""" + self.serialport_task._bus = self.MockSerial() + self.serialport_task._recv_queue.put("complete") + self.assertEqual(self.serialport_task.recv(), "complete") + + def test_send_data(self): + """Test _write_data method""" + self.serialport_task._bus = self.MockSerial() + self.serialport_task.send("foo") + self.serialport_task._bus.write.assert_called_once_with("foo".encode()) + + +if __name__ == "__main__": + unittest.main() diff --git a/packages/web/LICENSE b/packages/web/LICENSE new file mode 100644 index 0000000..8a81302 --- /dev/null +++ b/packages/web/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 LUXROBO + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/web/README.md b/packages/web/README.md new file mode 100644 index 0000000..4c8bb00 --- /dev/null +++ b/packages/web/README.md @@ -0,0 +1,121 @@ +# pymodi-plus-web + +MODI+ Python Library for Web/Pyodide environments. + +This package provides a `PostMessageTask` communication layer that enables `pymodi-plus` to work in web browsers via Pyodide, communicating with WebUSB through JavaScript postMessage. + +## Installation + +### In Pyodide (Browser) + +```python +import micropip +await micropip.install('pymodi-plus-web') +``` + +### Local Development + +```bash +pip install pymodi-plus-web +``` + +## Usage + +### Basic Usage (Pyodide) + +```python +from modi_plus_web import MODIPlusWeb + +# Create MODI+ instance with postMessage communication +modi = MODIPlusWeb() + +# Use standard MODI+ API +led = modi.led(0x1234) +led.rgb = (255, 0, 0) +``` + +### With JavaScript Integration + +```javascript +// JavaScript side +const pyodide = await loadPyodide(); +await pyodide.loadPackage('micropip'); +await pyodide.runPythonAsync(` + import micropip + await micropip.install('pymodi-plus-web') + + from modi_plus_web import MODIPlusWeb + modi = MODIPlusWeb() +`); + +// Send data from WebUSB to Python +window.addEventListener('message', (e) => { + if (e.data.type === 'modi_packet') { + pyodide.runPython(`modi.task.on_message('${JSON.stringify(e.data.payload)}')`); + } +}); + +// Set up Python to JavaScript callback +pyodide.runPython(` + import js + def send_to_webusb(pkt): + js.parent.postMessage({'type': 'modi_packet', 'payload': pkt}, '*') + modi.set_send_callback(send_to_webusb) +`); +``` + +## Architecture + +``` +┌─────────────────────────────────────────────────────────────┐ +│ Browser │ +│ ┌─────────────────┐ postMessage ┌─────────────┐ │ +│ │ modi_flutter │ <──────────────────> │ iframe │ │ +│ │ (WebUSB) │ JSON packets │ │ │ +│ │ │ │ ┌───────┐ │ │ +│ │ MODI Hardware │ │ │Pyodide│ │ │ +│ │ Connection │ │ │pymodi │ │ │ +│ │ │ │ │-plus │ │ │ +│ └─────────────────┘ │ │-web │ │ │ +│ │ └───────┘ │ │ +│ └─────────────┘ │ +└─────────────────────────────────────────────────────────────┘ +``` + +## API Reference + +### MODIPlusWeb + +Inherits from `modi_plus.MODIPlus` with `PostMessageTask` as the default communication layer. + +```python +class MODIPlusWeb(MODIPlus): + def set_send_callback(self, callback): ... + def on_message(self, data): ... +``` + +### PostMessageTask + +Communication task for JavaScript postMessage integration. + +```python +class PostMessageTask(ConnectionTask): + def set_send_callback(self, callback): ... + def on_message(self, data): ... + def send(self, pkt): ... + def recv(self): ... +``` + +## Requirements + +- Python >= 3.8 +- pymodi-plus (automatically installed) + +## License + +MIT License - see LICENSE file for details. + +## Related Projects + +- [pymodi-plus](https://github.com/LUXROBO/pymodi-plus) - Desktop version with USB/BLE support +- [modi_flutter](https://github.com/LUXROBO/modi_flutter) - Flutter app with WebUSB support diff --git a/packages/web/modi_plus_web/__init__.py b/packages/web/modi_plus_web/__init__.py new file mode 100644 index 0000000..80e1e6a --- /dev/null +++ b/packages/web/modi_plus_web/__init__.py @@ -0,0 +1,13 @@ +"""pymodi-plus-web - MODI+ Python Library for Web/Pyodide + +This package provides web-compatible communication layer for pymodi-plus, +enabling MODI+ hardware control through JavaScript postMessage in Pyodide environments. +""" + +from modi_plus_web.modi_plus_web import MODIPlusWeb +from modi_plus_web.task.postmessage_task import PostMessageTask + +__version__ = "0.1.0" +__all__ = ["MODIPlusWeb", "PostMessageTask"] + +print(f"Running PyMODI+ Web (v{__version__})") diff --git a/packages/web/modi_plus_web/modi_plus_web.py b/packages/web/modi_plus_web/modi_plus_web.py new file mode 100644 index 0000000..a6bbc04 --- /dev/null +++ b/packages/web/modi_plus_web/modi_plus_web.py @@ -0,0 +1,70 @@ +"""MODIPlusWeb - 웹 환경용 MODI+ 클래스 + +pymodi-plus의 MODIPlus를 상속하여 PostMessageTask를 기본 통신 레이어로 사용합니다. +Pyodide 환경에서 JavaScript와 postMessage를 통해 MODI+ 모듈과 통신할 수 있습니다. +""" + +from typing import Callable, Optional + +from modi_plus import MODIPlus +from modi_plus_web.task.postmessage_task import PostMessageTask + + +class MODIPlusWeb(MODIPlus): + """웹 환경용 MODI+ 클래스 + + PostMessageTask를 사용하여 JavaScript와 postMessage로 통신합니다. + modi_flutter의 WebUSB와 연동하여 MODI+ 모듈을 제어할 수 있습니다. + + Usage: + from modi_plus_web import MODIPlusWeb + + modi = MODIPlusWeb() + + # JavaScript 콜백 설정 + import js + modi.set_send_callback(lambda pkt: js.postMessage({'type': 'modi', 'data': pkt})) + + # 표준 MODI+ API 사용 + led = modi.led(0x1234) + led.rgb = (255, 0, 0) + """ + + def __init__(self, verbose: bool = False): + """MODIPlusWeb 초기화 + + Args: + verbose: 디버그 메시지 출력 여부 + """ + # PostMessageTask를 주입하여 부모 클래스 초기화 + self._postmessage_task = PostMessageTask(verbose=verbose) + super().__init__(task=self._postmessage_task, verbose=verbose) + + @property + def task(self) -> PostMessageTask: + """PostMessageTask 인스턴스 접근""" + return self._postmessage_task + + def set_send_callback(self, callback: Callable[[str], None]) -> None: + """JavaScript로 메시지를 전송할 콜백 함수 설정 + + Args: + callback: 메시지를 받아 JavaScript로 전송하는 함수 + + Example: + import js + modi.set_send_callback(lambda pkt: js.postMessage({'type': 'modi', 'data': pkt})) + """ + self._postmessage_task.set_send_callback(callback) + + def on_message(self, data) -> None: + """JavaScript에서 메시지 수신 시 호출 + + Args: + data: 수신된 데이터 (JSON 문자열 또는 dict) + + Example: + # JavaScript에서 + pyodide.runPython(`modi.on_message('${jsonData}')`) + """ + self._postmessage_task.on_message(data) diff --git a/packages/web/modi_plus_web/task/__init__.py b/packages/web/modi_plus_web/task/__init__.py new file mode 100644 index 0000000..022879a --- /dev/null +++ b/packages/web/modi_plus_web/task/__init__.py @@ -0,0 +1,5 @@ +"""MODI+ Web Task module - postMessage 통신 레이어""" + +from modi_plus_web.task.postmessage_task import PostMessageTask + +__all__ = ["PostMessageTask"] diff --git a/packages/web/modi_plus_web/task/postmessage_task.py b/packages/web/modi_plus_web/task/postmessage_task.py new file mode 100644 index 0000000..b4f97da --- /dev/null +++ b/packages/web/modi_plus_web/task/postmessage_task.py @@ -0,0 +1,143 @@ +"""PostMessageTask - JavaScript postMessage 통신용 Task + +Pyodide 환경에서 JavaScript와 postMessage를 통해 통신하는 Task 클래스입니다. +modi_flutter의 WebUSB와 연동하여 MODI+ 모듈과 통신할 수 있습니다. +""" + +from queue import Queue +from typing import Optional, Callable +import json + +from modi_plus.task.connection_task import ConnectionTask + + +class PostMessageTask(ConnectionTask): + """JavaScript postMessage 통신용 Task + + Pyodide 환경에서 JavaScript와 postMessage를 통해 통신합니다. + + Usage: + task = PostMessageTask() + + # JavaScript에서 Python으로 메시지 전달 + task.on_message('{"c":0,"s":1,"d":2,"b":"AA==","l":1}') + + # Python에서 JavaScript로 메시지 전달 + task.set_send_callback(lambda pkt: js.postMessage(pkt)) + task.send('{"c":0,"s":1,"d":2,"b":"AA==","l":1}') + """ + + def __init__(self, verbose: bool = False): + """PostMessageTask 초기화 + + Args: + verbose: 디버그 메시지 출력 여부 + """ + super().__init__(verbose) + self._recv_queue: Queue = Queue() + self._send_callback: Optional[Callable[[str], None]] = None + self._connected: bool = False + + def set_send_callback(self, callback: Callable[[str], None]) -> None: + """JavaScript로 메시지를 전송할 콜백 함수 설정 + + Args: + callback: 메시지를 받아 JavaScript로 전송하는 함수 + + Example: + # Pyodide에서 + import js + task.set_send_callback(lambda pkt: js.postMessage({'type': 'modi', 'data': pkt})) + """ + self._send_callback = callback + + def on_message(self, data) -> None: + """JavaScript에서 메시지 수신 시 호출 + + Args: + data: 수신된 데이터 (JSON 문자열 또는 dict) + + Example: + # JavaScript에서 + pyodide.runPython(`task.on_message('${jsonData}')`) + """ + if isinstance(data, dict): + data = json.dumps(data) + elif isinstance(data, str): + # 이미 JSON 문자열인 경우 그대로 사용 + try: + # 유효한 JSON인지 확인 + json.loads(data) + except json.JSONDecodeError: + if self.verbose: + print(f"Invalid JSON received: {data}") + return + else: + if self.verbose: + print(f"Unsupported data type: {type(data)}") + return + + self._recv_queue.put(data) + + if self.verbose: + print(f"on_message: {data}") + + def open_connection(self) -> None: + """연결 시작 (JavaScript 측에서 WebUSB 연결 처리)""" + self._connected = True + self._recv_queue = Queue() + if self.verbose: + print("PostMessageTask connection opened") + + def close_connection(self) -> None: + """연결 종료""" + self._connected = False + self._send_callback = None + if self.verbose: + print("PostMessageTask connection closed") + + def recv(self) -> Optional[str]: + """수신 큐에서 메시지 가져오기 + + Returns: + JSON 문자열 또는 None (큐가 비어있는 경우) + """ + if self._recv_queue.empty(): + return None + + json_pkt = self._recv_queue.get() + + if self.verbose: + print(f"recv: {json_pkt}") + + return json_pkt + + def send(self, pkt: str, verbose: bool = False) -> None: + """JavaScript로 메시지 전송 + + Args: + pkt: 전송할 JSON 패킷 + verbose: 디버그 메시지 출력 여부 + """ + if self._send_callback: + self._send_callback(pkt) + + if self.verbose or verbose: + print(f"send: {pkt}") + else: + if self.verbose or verbose: + print(f"send (no callback): {pkt}") + + def send_nowait(self, pkt: str, verbose: bool = False) -> None: + """JavaScript로 메시지 전송 (send와 동일) + + Args: + pkt: 전송할 JSON 패킷 + verbose: 디버그 메시지 출력 여부 + """ + self.send(pkt, verbose) + + @property + def is_connected(self) -> bool: + """연결 상태 확인""" + return self._connected diff --git a/packages/web/pytest.ini b/packages/web/pytest.ini new file mode 100644 index 0000000..4ecb1ad --- /dev/null +++ b/packages/web/pytest.ini @@ -0,0 +1,5 @@ +[pytest] +testpaths = tests +python_files = test_*.py +python_classes = Test* +python_functions = test_* diff --git a/packages/web/setup.py b/packages/web/setup.py new file mode 100644 index 0000000..e202851 --- /dev/null +++ b/packages/web/setup.py @@ -0,0 +1,36 @@ +from setuptools import setup, find_packages + +with open("README.md", "r", encoding="utf-8") as fh: + long_description = fh.read() + +setup( + name="pymodi-plus-web", + version="0.1.0", + author="LUXROBO", + author_email="tech@luxrobo.com", + description="MODI+ Python Library for Web/Pyodide - postMessage communication", + long_description=long_description, + long_description_content_type="text/markdown", + url="https://github.com/LUXROBO/pymodi-plus-web", + packages=find_packages(), + install_requires=[ + "pymodi-plus", # 코어 재사용 (serial/ble 없이 설치됨) + ], + python_requires=">=3.8", + classifiers=[ + "Development Status :: 4 - Beta", + "Intended Audience :: Developers", + "Intended Audience :: Education", + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Environment :: Web Environment", + "Topic :: Education", + "Topic :: Software Development :: Libraries :: Python Modules", + ], + keywords=["modi", "modi-plus", "pyodide", "web", "webusb", "postmessage"], +) diff --git a/packages/web/test_pyodide.html b/packages/web/test_pyodide.html new file mode 100644 index 0000000..3848668 --- /dev/null +++ b/packages/web/test_pyodide.html @@ -0,0 +1,742 @@ + + + + + pymodi-plus-web Pyodide IDE + + + + +

+ +
+
+

Python Editor - pymodi-plus 스타일

+
+ + + + + +
+
+
1
+ +
+
+ + + +
+
+ +
+

Output

+

+        
+ +
+

Hardware Simulation (WebUSB 시뮬레이션)

+
+
+
LED
+
ID: 0x1001
+
+
+
+
Button
+
ID: 0x2001
+
OFF
+ +
+
+
Dial
+
ID: 0x3001
+
0
+ +
+
+
ENV
+
ID: 0x4001
+
25°C
+
+
+
하드웨어 통신 로그...
+
+ +
+

Communication Log (Python ↔ JS)

+
+ + +
+
패킷 통신 로그가 여기에 표시됩니다...
+
+
+ + + + diff --git a/packages/web/tests/__init__.py b/packages/web/tests/__init__.py new file mode 100644 index 0000000..913e766 --- /dev/null +++ b/packages/web/tests/__init__.py @@ -0,0 +1 @@ +# pymodi-plus-web tests diff --git a/packages/web/tests/test_modi_plus_web.py b/packages/web/tests/test_modi_plus_web.py new file mode 100644 index 0000000..ff493de --- /dev/null +++ b/packages/web/tests/test_modi_plus_web.py @@ -0,0 +1,93 @@ +"""MODIPlusWeb 단위 테스트""" + +import unittest +from unittest.mock import MagicMock, patch +import json + +from modi_plus_web.task.postmessage_task import PostMessageTask +from modi_plus_web.modi_plus_web import MODIPlusWeb + + +class TestMODIPlusWeb(unittest.TestCase): + """MODIPlusWeb 클래스 테스트""" + + def setUp(self): + """각 테스트 전 실행 - MODIPlus import 모킹""" + # MODIPlus가 하드웨어 연결을 시도하지 않도록 모킹 + self.mock_modi_plus_patcher = patch('modi_plus_web.modi_plus_web.MODIPlus.__init__') + self.mock_modi_plus = self.mock_modi_plus_patcher.start() + self.mock_modi_plus.return_value = None + + def tearDown(self): + """각 테스트 후 실행""" + self.mock_modi_plus_patcher.stop() + + def test_initialization(self): + """초기화 테스트""" + modi = MODIPlusWeb() + + self.assertIsNotNone(modi._postmessage_task) + self.assertIsInstance(modi._postmessage_task, PostMessageTask) + + def test_task_property(self): + """task 프로퍼티 테스트""" + modi = MODIPlusWeb() + + self.assertIsInstance(modi.task, PostMessageTask) + self.assertEqual(modi.task, modi._postmessage_task) + + def test_set_send_callback(self): + """set_send_callback 메서드 테스트""" + modi = MODIPlusWeb() + + callback = MagicMock() + modi.set_send_callback(callback) + + self.assertEqual(modi._postmessage_task._send_callback, callback) + + def test_on_message(self): + """on_message 메서드 테스트""" + modi = MODIPlusWeb() + + test_data = '{"c":0,"s":1,"d":2}' + modi.on_message(test_data) + + received = modi._postmessage_task.recv() + self.assertEqual(received, test_data) + + def test_verbose_mode(self): + """verbose 모드 전달 테스트""" + modi = MODIPlusWeb(verbose=True) + + self.assertTrue(modi._postmessage_task.verbose) + + +class TestMODIPlusWebIntegration(unittest.TestCase): + """MODIPlusWeb 통합 테스트 (모킹 없이)""" + + @patch('modi_plus_web.modi_plus_web.MODIPlus.__init__') + def test_full_workflow(self, mock_init): + """전체 워크플로우 테스트""" + mock_init.return_value = None + + modi = MODIPlusWeb() + + # 콜백 설정 + sent_packets = [] + modi.set_send_callback(lambda pkt: sent_packets.append(pkt)) + + # 외부 메시지 수신 + modi.on_message('{"c":0,"s":100,"d":0}') + + # 내부에서 처리 + received = modi.task.recv() + self.assertIsNotNone(received) + + # 응답 전송 + modi.task.send('{"c":4,"s":0,"d":100}') + + self.assertEqual(len(sent_packets), 1) + + +if __name__ == '__main__': + unittest.main() diff --git a/packages/web/tests/test_postmessage_task.py b/packages/web/tests/test_postmessage_task.py new file mode 100644 index 0000000..5b04e50 --- /dev/null +++ b/packages/web/tests/test_postmessage_task.py @@ -0,0 +1,195 @@ +"""PostMessageTask 단위 테스트""" + +import unittest +import json +from modi_plus_web.task.postmessage_task import PostMessageTask + + +class TestPostMessageTask(unittest.TestCase): + """PostMessageTask 클래스 테스트""" + + def setUp(self): + """각 테스트 전 실행""" + self.task = PostMessageTask() + + def tearDown(self): + """각 테스트 후 실행""" + self.task.close_connection() + + # =================== + # 연결 테스트 + # =================== + def test_initial_state(self): + """초기 상태 테스트""" + self.assertFalse(self.task.is_connected) + self.assertIsNone(self.task._send_callback) + self.assertTrue(self.task._recv_queue.empty()) + + def test_open_connection(self): + """연결 열기 테스트""" + self.task.open_connection() + self.assertTrue(self.task.is_connected) + + def test_close_connection(self): + """연결 닫기 테스트""" + self.task.open_connection() + self.task.close_connection() + self.assertFalse(self.task.is_connected) + self.assertIsNone(self.task._send_callback) + + # =================== + # 메시지 수신 테스트 + # =================== + def test_on_message_with_string(self): + """JSON 문자열 수신 테스트""" + self.task.open_connection() + test_msg = '{"c":0,"s":1,"d":2,"b":"AA==","l":1}' + + self.task.on_message(test_msg) + + self.assertFalse(self.task._recv_queue.empty()) + received = self.task.recv() + self.assertEqual(received, test_msg) + + def test_on_message_with_dict(self): + """딕셔너리 수신 테스트""" + self.task.open_connection() + test_data = {"c": 0, "s": 1, "d": 2, "b": "AA==", "l": 1} + + self.task.on_message(test_data) + + received = self.task.recv() + self.assertEqual(json.loads(received), test_data) + + def test_on_message_invalid_json(self): + """유효하지 않은 JSON 테스트""" + self.task.open_connection() + self.task.verbose = True # 디버그 모드 + + self.task.on_message("invalid json {{{") + + # 유효하지 않은 JSON은 무시됨 + self.assertTrue(self.task._recv_queue.empty()) + + def test_recv_empty_queue(self): + """빈 큐에서 수신 테스트""" + self.task.open_connection() + received = self.task.recv() + self.assertIsNone(received) + + def test_recv_multiple_messages(self): + """다중 메시지 수신 테스트""" + self.task.open_connection() + messages = [ + '{"c":0,"s":1}', + '{"c":1,"s":2}', + '{"c":2,"s":3}', + ] + + for msg in messages: + self.task.on_message(msg) + + for expected in messages: + received = self.task.recv() + self.assertEqual(received, expected) + + # 큐가 비어있어야 함 + self.assertIsNone(self.task.recv()) + + # =================== + # 메시지 전송 테스트 + # =================== + def test_send_without_callback(self): + """콜백 없이 전송 테스트""" + self.task.open_connection() + # 콜백 없이 send해도 에러 없어야 함 + self.task.send('{"test": 1}') + + def test_send_with_callback(self): + """콜백 있을 때 전송 테스트""" + self.task.open_connection() + sent_messages = [] + + def mock_callback(pkt): + sent_messages.append(pkt) + + self.task.set_send_callback(mock_callback) + + test_pkt = '{"c":4,"s":0,"d":1234}' + self.task.send(test_pkt) + + self.assertEqual(len(sent_messages), 1) + self.assertEqual(sent_messages[0], test_pkt) + + def test_send_nowait(self): + """send_nowait 테스트 (send와 동일 동작)""" + self.task.open_connection() + sent_messages = [] + + self.task.set_send_callback(lambda pkt: sent_messages.append(pkt)) + self.task.send_nowait('{"test": 1}') + + self.assertEqual(len(sent_messages), 1) + + # =================== + # 콜백 테스트 + # =================== + def test_set_send_callback(self): + """콜백 설정 테스트""" + callback = lambda x: x + self.task.set_send_callback(callback) + self.assertEqual(self.task._send_callback, callback) + + def test_callback_cleared_on_close(self): + """연결 종료 시 콜백 초기화 테스트""" + self.task.set_send_callback(lambda x: x) + self.task.open_connection() + self.task.close_connection() + self.assertIsNone(self.task._send_callback) + + # =================== + # verbose 모드 테스트 + # =================== + def test_verbose_mode(self): + """verbose 모드 테스트""" + task = PostMessageTask(verbose=True) + self.assertTrue(task.verbose) + + task2 = PostMessageTask(verbose=False) + self.assertFalse(task2.verbose) + + +class TestPostMessageTaskIntegration(unittest.TestCase): + """PostMessageTask 통합 테스트""" + + def test_full_communication_cycle(self): + """전체 통신 사이클 테스트""" + task = PostMessageTask() + task.open_connection() + + # 콜백 설정 + responses = [] + task.set_send_callback(lambda pkt: responses.append(pkt)) + + # 메시지 수신 (외부에서 온 것 시뮬레이션) + incoming = {"c": 0, "s": 100, "d": 0, "b": "VEVTVA==", "l": 4} + task.on_message(incoming) + + # 메시지 처리 + received = task.recv() + data = json.loads(received) + + # 응답 전송 + response = {"c": 4, "s": 0, "d": data["s"], "b": "T0s=", "l": 2} + task.send(json.dumps(response)) + + # 검증 + self.assertEqual(len(responses), 1) + sent_data = json.loads(responses[0]) + self.assertEqual(sent_data["d"], 100) # 원래 소스로 응답 + + task.close_connection() + + +if __name__ == '__main__': + unittest.main() diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..f803ce4 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,28 @@ +# PyMODI+ Monorepo Configuration +[project] +name = "pymodi-plus-monorepo" +description = "PyMODI+ Monorepo - Core library and Web extension" +readme = "README.md" +requires-python = ">=3.7" + +[tool.pytest.ini_options] +testpaths = [ + "packages/core/tests", + "packages/web/tests", +] +python_files = "test_*.py" +python_classes = "Test*" +python_functions = "test_*" + +[tool.ruff] +line-length = 120 +target-version = "py38" + +[tool.ruff.lint] +select = ["E", "F", "W", "I"] +ignore = ["E501"] + +# Monorepo packages configuration +# Each package has its own setup.py for independent publishing +# - packages/core/ -> pymodi-plus (PyPI) +# - packages/web/ -> pymodi-plus-web (PyPI) From c9d7df7a6616fd2a272503f84d93dd6287b6376a Mon Sep 17 00:00:00 2001 From: csk6124 Date: Thu, 12 Feb 2026 18:50:05 +0900 Subject: [PATCH 3/5] docs: Add web deployment guide and update README - Add comprehensive WEB_DEPLOYMENT_GUIDE.md with: - Internal test deployment (TestPyPI, Git, wheel) - Pyodide integration examples - Flutter integration guide - Troubleshooting section - Update packages/web/README.md with internal install options Co-Authored-By: Claude Opus 4.5 --- docs/guides/WEB_DEPLOYMENT_GUIDE.md | 407 ++++++++++++++++++++++++++++ packages/web/README.md | 18 ++ 2 files changed, 425 insertions(+) create mode 100644 docs/guides/WEB_DEPLOYMENT_GUIDE.md diff --git a/docs/guides/WEB_DEPLOYMENT_GUIDE.md b/docs/guides/WEB_DEPLOYMENT_GUIDE.md new file mode 100644 index 0000000..e8ed939 --- /dev/null +++ b/docs/guides/WEB_DEPLOYMENT_GUIDE.md @@ -0,0 +1,407 @@ +# PyMODI+ Web 배포 및 사용 가이드 + +## 목차 +1. [개요](#개요) +2. [내부 테스트 배포](#내부-테스트-배포) +3. [설치 방법](#설치-방법) +4. [사용 방법](#사용-방법) +5. [Pyodide 통합](#pyodide-통합) +6. [Flutter 연동](#flutter-연동) +7. [트러블슈팅](#트러블슈팅) + +--- + +## 개요 + +`pymodi-plus-web`은 웹 브라우저 환경(Pyodide)에서 MODI+ 모듈을 제어하기 위한 패키지입니다. + +### 아키텍처 + +``` +┌─────────────────────────────────────────────────────────────┐ +│ Web Browser │ +│ ┌─────────────┐ postMessage ┌─────────────────────┐ │ +│ │ Pyodide │ ◄───────────────► │ JavaScript/Flutter │ │ +│ │ (Python) │ │ (WebUSB) │ │ +│ └─────────────┘ └─────────────────────┘ │ +│ │ │ │ +│ ▼ ▼ │ +│ ┌─────────────┐ ┌─────────────────────┐ │ +│ │ pymodi-plus │ │ MODI+ Hardware │ │ +│ │ -web │ │ (via WebUSB) │ │ +│ └─────────────┘ └─────────────────────┘ │ +└─────────────────────────────────────────────────────────────┘ +``` + +### 패키지 구조 + +``` +pymodi-plus-web/ +├── modi_plus_web/ +│ ├── __init__.py +│ ├── modi_plus_web.py # MODIPlusWeb 클래스 +│ └── task/ +│ ├── __init__.py +│ └── postmessage_task.py # PostMessageTask 통신 레이어 +└── tests/ +``` + +--- + +## 내부 테스트 배포 + +### 방법 1: TestPyPI (권장) + +TestPyPI는 PyPI의 테스트 서버로, 실제 배포 전 테스트용으로 사용합니다. + +#### 1단계: TestPyPI 계정 설정 + +```bash +# ~/.pypirc 파일 생성 +cat > ~/.pypirc << 'EOF' +[testpypi] +username = __token__ +password = pypi-YOUR_TEST_PYPI_TOKEN +EOF +``` + +#### 2단계: 패키지 빌드 + +```bash +cd packages/web +rm -rf dist build *.egg-info +python -m build +``` + +#### 3단계: TestPyPI에 업로드 + +```bash +python -m twine upload --repository testpypi dist/* +``` + +#### 4단계: TestPyPI에서 설치 테스트 + +```bash +pip install -i https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple/ pymodi-plus-web +``` + +### 방법 2: Git에서 직접 설치 + +브랜치에서 직접 설치하는 방법입니다. + +```bash +# pymodi-plus (core) 설치 - 변경된 버전 +pip install git+https://github.com/LUXROBO/pymodi-plus.git@feature/web-support + +# pymodi-plus-web 설치 +pip install git+https://github.com/LUXROBO/pymodi-plus.git@feature/web-support#subdirectory=packages/web +``` + +### 방법 3: 로컬 wheel 파일 + +빌드된 wheel 파일을 직접 공유하는 방법입니다. + +```bash +# 빌드 +cd packages/web +python -m build + +# 설치 (wheel 파일 경로) +pip install dist/pymodi_plus_web-0.1.0-py3-none-any.whl +``` + +--- + +## 설치 방법 + +### 데스크톱 환경 + +```bash +# pymodi-plus-web 설치 (pymodi-plus 자동 설치됨) +pip install pymodi-plus-web +``` + +### Pyodide 환경 (웹 브라우저) + +```python +import micropip + +# pymodi-plus 설치 (최소 의존성) +await micropip.install('pymodi-plus') + +# pymodi-plus-web 설치 +await micropip.install('pymodi-plus-web') +``` + +--- + +## 사용 방법 + +### 기본 사용법 + +```python +from modi_plus_web import MODIPlusWeb + +# 인스턴스 생성 +modi = MODIPlusWeb(verbose=True) + +# JavaScript로 메시지 전송할 콜백 설정 +def send_to_js(packet): + # JavaScript postMessage로 전송 + js.window.modiSend(packet) + +modi.set_send_callback(send_to_js) + +# JavaScript에서 메시지 수신 시 호출 +def on_js_message(data): + modi.on_message(data) + +# 모듈 사용 (기존 pymodi-plus와 동일) +led = modi.leds[0] +led.turn_on() +led.set_rgb(255, 0, 0) +``` + +### PostMessageTask 직접 사용 + +```python +from modi_plus_web.task import PostMessageTask + +# Task 직접 생성 +task = PostMessageTask(verbose=True) +task.open_connection() + +# 콜백 설정 +task.set_send_callback(lambda pkt: print(f"Send: {pkt}")) + +# 메시지 수신 +task.on_message('{"c":0,"s":100,"d":0}') + +# 메시지 처리 +received = task.recv() +print(f"Received: {received}") + +# 메시지 전송 +task.send('{"c":4,"s":0,"d":100}') +``` + +--- + +## Pyodide 통합 + +### HTML 템플릿 + +```html + + + + PyMODI+ Web + + + +
+ + + + +``` + +### Python 코드 실행 + +```javascript +// JavaScript에서 Python 코드 실행 +async function runPythonCode(code) { + try { + const result = await pyodide.runPythonAsync(code); + return result; + } catch (error) { + console.error('Python error:', error); + throw error; + } +} + +// 예시: LED 제어 +await runPythonCode(` +led = modi.leds[0] +led.turn_on() +led.set_rgb(255, 0, 0) +`); +``` + +--- + +## Flutter 연동 + +### Flutter → Pyodide 통신 + +```dart +// Flutter (Dart) +import 'package:webview_flutter/webview_flutter.dart'; + +class ModiWebView extends StatefulWidget { + @override + _ModiWebViewState createState() => _ModiWebViewState(); +} + +class _ModiWebViewState extends State { + late WebViewController controller; + + @override + void initState() { + super.initState(); + controller = WebViewController() + ..setJavaScriptMode(JavaScriptMode.unrestricted) + ..addJavaScriptChannel( + 'ModiChannel', + onMessageReceived: (message) { + // Python에서 온 메시지 → 하드웨어로 전송 + _sendToHardware(message.message); + }, + ) + ..loadFlutterAsset('assets/pyodide.html'); + } + + // 하드웨어에서 온 메시지 → Python으로 전송 + void sendToPython(String data) { + controller.runJavaScript('sendToPython($data)'); + } + + void _sendToHardware(String packet) { + // WebUSB 또는 시리얼 통신으로 전송 + } +} +``` + +### JavaScript Bridge 설정 + +```javascript +// pyodide.html 내 JavaScript +window.modiSend = function(packet) { + // Flutter로 전송 + if (window.ModiChannel) { + ModiChannel.postMessage(packet); + } +}; +``` + +--- + +## 트러블슈팅 + +### 1. micropip 설치 오류 + +**증상:** +``` +ValueError: Can't find a pure Python 3 wheel for 'pymodi-plus' +``` + +**해결:** +pymodi-plus가 pure Python wheel로 빌드되어야 합니다. TestPyPI나 PyPI에서 올바른 버전을 확인하세요. + +### 2. JavaScript 콜백 오류 + +**증상:** +``` +AttributeError: 'JsProxy' object has no attribute 'js_send' +``` + +**해결:** +`js.window.modiSend` 형식으로 전역 함수를 호출하세요: +```python +modi.set_send_callback(lambda pkt: js.window.modiSend(pkt)) +``` + +### 3. 모듈을 찾을 수 없음 + +**증상:** +``` +IndexError: list index out of range (modi.leds[0]) +``` + +**해결:** +모듈 검색이 완료될 때까지 대기하거나, 하드웨어 연결 상태를 확인하세요: +```python +import time +time.sleep(2) # 모듈 검색 대기 +print(modi.modules) # 연결된 모듈 확인 +``` + +### 4. 메시지 형식 오류 + +**증상:** +``` +json.JSONDecodeError: Expecting property name +``` + +**해결:** +JSON 형식이 올바른지 확인하세요: +```python +# 올바른 형식 +modi.on_message('{"c":0,"s":100,"d":0}') + +# 잘못된 형식 +modi.on_message("{c:0,s:100,d:0}") # 따옴표 누락 +``` + +--- + +## 버전 호환성 + +| pymodi-plus | pymodi-plus-web | Python | Pyodide | +|-------------|-----------------|--------|---------| +| >= 0.5.0 | 0.1.0 | >= 3.8 | >= 0.24 | + +--- + +## 참고 자료 + +- [PyMODI+ GitHub](https://github.com/LUXROBO/pymodi-plus) +- [Pyodide 공식 문서](https://pyodide.org/) +- [WebUSB API](https://developer.mozilla.org/en-US/docs/Web/API/WebUSB_API) diff --git a/packages/web/README.md b/packages/web/README.md index 4c8bb00..64ef318 100644 --- a/packages/web/README.md +++ b/packages/web/README.md @@ -19,6 +19,24 @@ await micropip.install('pymodi-plus-web') pip install pymodi-plus-web ``` +### 내부 테스트 설치 + +#### TestPyPI에서 설치 +```bash +pip install -i https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple/ pymodi-plus-web +``` + +#### Git에서 직접 설치 +```bash +# feature/web-support 브랜치에서 설치 +pip install git+https://github.com/LUXROBO/pymodi-plus.git@feature/web-support#subdirectory=packages/web +``` + +#### 로컬 wheel 파일에서 설치 +```bash +pip install pymodi_plus_web-0.1.0-py3-none-any.whl +``` + ## Usage ### Basic Usage (Pyodide) From a6a32d0b7d7deb65075fc3b985672355b489e69b Mon Sep 17 00:00:00 2001 From: csk6124 Date: Fri, 13 Feb 2026 10:54:22 +0900 Subject: [PATCH 4/5] feat: Add Flutter integration test page MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add test_flutter_integration.html for iframe testing with modi_flutter - Implements PostMessage communication: - setPropertyRequest: Python → Flutter (hardware control) - getPropertyRequest: Python → Flutter (sensor read) - getPropertyResponse: Flutter → Python (hardware data) - Mock modules for standalone testing - Real-time communication log display Co-Authored-By: Claude Opus 4.5 --- packages/web/test_flutter_integration.html | 695 +++++++++++++++++++++ 1 file changed, 695 insertions(+) create mode 100644 packages/web/test_flutter_integration.html diff --git a/packages/web/test_flutter_integration.html b/packages/web/test_flutter_integration.html new file mode 100644 index 0000000..c489a4b --- /dev/null +++ b/packages/web/test_flutter_integration.html @@ -0,0 +1,695 @@ + + + + + + PyMODI+ Web - Flutter Integration + + + + +
+

PyMODI+ Web - Flutter Integration

+
+
+
+ Pyodide +
+
+
+ MODI+ +
+
+
+ Flutter +
+
+
+ +
+
+
Python Code Editor (Ctrl+Enter to run)
+ +
+ + + +
+
+ +
+
Communication Log
+
+ Connected Modules: +
+ Waiting for connection... +
+
+
+
+
+ + + + From 763909363b0f0cb054b69b25494b21a0bc773440 Mon Sep 17 00:00:00 2001 From: csk6124 Date: Fri, 13 Feb 2026 16:28:02 +0900 Subject: [PATCH 5/5] feat: Add web test pages for coding, simple, and standalone modes Co-Authored-By: Claude Opus 4.5 --- packages/web/test_coding.html | 621 +++++++++++++++++++++ packages/web/test_flutter_integration.html | 45 +- packages/web/test_simple.html | 63 +++ packages/web/test_standalone.html | 172 ++++++ 4 files changed, 893 insertions(+), 8 deletions(-) create mode 100644 packages/web/test_coding.html create mode 100644 packages/web/test_simple.html create mode 100644 packages/web/test_standalone.html diff --git a/packages/web/test_coding.html b/packages/web/test_coding.html new file mode 100644 index 0000000..bf02fcf --- /dev/null +++ b/packages/web/test_coding.html @@ -0,0 +1,621 @@ + + + + + + PyMODI+ Web - Python Coding + + + +
+

PyMODI+ Web Coding

+
+
+
+ Pyodide +
+
+
+ Flutter +
+
+
+ MODI+ +
+
+
+ +
+
+
+ Python Editor + +
+ +
+ + + + + +
+
+ +
+
Output
+
+ No modules +
+
+
+
+ +
+
+ Communication Log + +
+
+
+
+
+ + + + diff --git a/packages/web/test_flutter_integration.html b/packages/web/test_flutter_integration.html index c489a4b..b01adbb 100644 --- a/packages/web/test_flutter_integration.html +++ b/packages/web/test_flutter_integration.html @@ -134,7 +134,8 @@

PyMODI+ Web - Flutter Integration

- + +
@@ -180,8 +181,7 @@

PyMODI+ Web - Flutter Integration

entry.className = `log-entry ${type}`; const time = new Date().toLocaleTimeString('ko-KR', { hour12: false }); entry.textContent = `[${time}] ${message}`; - logEl.appendChild(entry); - logEl.scrollTop = logEl.scrollHeight; + logEl.insertBefore(entry, logEl.firstChild); } function updateStatus(id, status) { @@ -228,11 +228,13 @@

PyMODI+ Web - Flutter Integration

function sendToFlutter(type, data) { const message = { type: type, data: data }; + log(`📤 SEND → type: ${type}, data: ${JSON.stringify(data).substring(0, 80)}`, 'send'); + if (window.parent !== window) { window.parent.postMessage(message, '*'); + log(`📤 postMessage sent to parent`, 'send'); } else { - // 부모 윈도우가 없는 경우 (독립 실행) - log(`[Standalone] Would send: ${type}`, 'info'); + log(`⚠️ [Standalone mode] No parent window - message not sent`, 'info'); } } @@ -240,12 +242,22 @@

PyMODI+ Web - Flutter Integration

* Flutter에서 메시지 수신 */ window.addEventListener('message', function(event) { + // 모든 메시지 로깅 (디버깅용) + log(`📩 RAW message from: ${event.origin}`, 'recv'); + try { const message = typeof event.data === 'string' ? JSON.parse(event.data) : event.data; - if (!message || !message.type) return; + if (!message) { + log(`📩 Empty message data`, 'recv'); + return; + } + + log(`📩 Message type: ${message.type || 'no type'}, data: ${JSON.stringify(message.data || message).substring(0, 100)}`, 'recv'); + + if (!message.type) return; switch (message.type) { case PostMessageType.GET_PROPERTY_RESPONSE: @@ -267,10 +279,10 @@

PyMODI+ Web - Flutter Integration

break; default: - log(`← Unknown: ${message.type}`, 'recv'); + log(`← Unknown type: ${message.type}`, 'recv'); } } catch (e) { - // JSON 아닌 메시지는 무시 + log(`📩 Parse error: ${e.message}, raw: ${String(event.data).substring(0, 50)}`, 'error'); } }); @@ -680,6 +692,23 @@

PyMODI+ Web - Flutter Integration

document.getElementById('stopBtn').addEventListener('click', () => log('Stop requested', 'info')); document.getElementById('clearBtn').addEventListener('click', () => document.getElementById('log').innerHTML = ''); + document.getElementById('testMsgBtn').addEventListener('click', () => { + log('=== TEST MESSAGE ===', 'info'); + // 테스트: LED 빨간색 설정 명령 전송 + sendToFlutter('setPropertyRequest', { + moduleType: 'led', + index: 0, + propertyNum: 2, + data: [255, 0, 0] + }); + // 테스트: 환경센서 온도 요청 + sendToFlutter('getPropertyRequest', { + moduleType: 'environment', + index: 0, + propertyNum: 0 + }); + }); + document.getElementById('editor').addEventListener('keydown', (e) => { if ((e.ctrlKey || e.metaKey) && e.key === 'Enter') { e.preventDefault(); diff --git a/packages/web/test_simple.html b/packages/web/test_simple.html new file mode 100644 index 0000000..6c8a4da --- /dev/null +++ b/packages/web/test_simple.html @@ -0,0 +1,63 @@ + + + + + PyMODI+ Simple Test + + + +

PyMODI+ Web - Simple Test

+
Loading Pyodide...
+

+
+    
+
+
diff --git a/packages/web/test_standalone.html b/packages/web/test_standalone.html
new file mode 100644
index 0000000..25ddb60
--- /dev/null
+++ b/packages/web/test_standalone.html
@@ -0,0 +1,172 @@
+
+
+
+    
+    PyMODI+ Web - Standalone Test (Mock Mode)
+    
+
+
+    

PyMODI+ Web - Standalone Test (Mock Mode)

+

This test runs without Flutter, using mock modules for testing.

+ +
+

Code

+ +
+ + +
+
+ +
+

Output

+
+
+ + + + +