toio.py


Nametoio.py JSON
Version 1.1.0 PyPI version JSON
download
home_pagehttps://toio.io/
SummaryControl toio™Core Cube
upload_time2024-06-04 05:53:12
maintainerNone
docs_urlNone
authorSony Interactive Entertainment
requires_python<3.13,>=3.8.1
licenseMIT
keywords toio
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # toio.py

[![PyPI](https://img.shields.io/pypi/v/toio-py?color=00aeca)](https://pypi.org/project/toio-py/)

This is a library for controlling [toio™Core Cube](https://toio.io/platform/cube/) from Python.

Based on [toio Core Cube Specifications](https://toio.github.io/toio-spec/en/) v2.4.0.

**(日本語版 README.md は[こちら](./blob/main/README.ja.md))**

## Features

- Uses [bleak](https://github.com/hbldh/bleak) for Bluetooth communication
- Supports Python 3.8 and later versions (Python 3.12 is recommended)
- Multi-platform (Windows, Linux, macOS, iOS, iPadOS)
- No dedicated Bluetooth dongle required
- Asynchronous API (ToioCoreCube API) based on the toio Core Cube Specifications and synchronous API (SimpleCube API) for easy cube control
- Scanning function by specifying BLE addresses and cube-specific names
- API to control cube functions classified by characteristics (ToioCoreCube API)
- Ability to scan paired cubes (Windows only)

## System requirements

### Primary tested environment

- Windows: Windows 10 (22H2)

### Secondary tested environment

- Windows: Windows 11 (23H2)
- Linux: Ubuntu24.04
- macOS: macOS 14(Sonoma)

### Experimental implementation

- iOS, iPadOS: 17

toio.py works on Pythonista3.  
[How to install: INSTALL_TO_PYTHONISTA3.en.md](https://toio.github.io/toio.py/INSTALL_TO_PYTHONISTA3.en.html)


## Setup and tutorial

See below for instructions on how to set up and run the tutorial.

- [Setup Guide (English)](./blob/main/SETUP_GUIDE.en.md)
- [Setup Guide (Japanese)](./blob/main/SETUP_GUIDE.ja.md)
- [Setup Guide (Chinese)](./blob/main/SETUP_GUIDE.zh.md)

---

## SimpleCube API

See [SIMPLE_API.en.md](./blob/main/SIMPLE_API.en.md) for information on the SimpleCube API for easily controlling toio Core Cubes.

- [SIMPLE_API.en.md (English)](./blob/main/SIMPLE_API.en.md)
- [SIMPLE_API.ja.md (Japanese)](./blob/main/SIMPLE_API.ja.md)

---

## API document

- [API Document](https://toio.github.io/toio.py/)

---

## Implementation overview

toio.py consists of following classes:

### ToioCoreCube

Class for controlling the cube.

ToioCoreCube has subclasses corresponding to the characteristics described in [toio CoreCube Specifications](https://toio.github.io/toio-spec/). You access the various functions of the cube via these subclasses.

#### Features added since v1.1:

ToioCoreCube class includes basic scanner function.
ToioCoreCube class can scan a toio Core Cube without the help of the Scanner class.
For scanning in special settings. use the Scanner class.

### Scanner

Class for scanning cubes via the BLE interface.

You can scan for cubes in the following ways:

- Scan for nearby cubes
- Scan for a specific cube by name (the last 3 characters of the toio Core Cube name)

The following is available only for Windows and Linux:

- Scan for a specific cube by BLE address

The following is available only for Windows:

- Scan for cubes registered (paired) with OS

### MultipleToioCoreCubes

MultipleToioCoreCubes class is added since v1.1.

MultipleToioCoreCubes is supplementary helper class to control multiple toio Core Cubes.

This class provides several functions for multiple toio Core Cubes such as connect, disconnect, etc.

## Examples

### Scan and connect

Create a ToioCoreCube instance with `ToioCoreCube()` without parameters and call `scan()` and `connect()`.

```Python
import asyncio

from toio import *

async def scan_and_connect():
    cube = ToioCoreCube()
    await cube.scan()
    await cube.connect()

    await asyncio.sleep(3)

    await cube.disconnect()
    return 0

if __name__ == "__main__":
    asyncio.run(scan_and_connect())
```

Since `ToioCoreCube()` is an asynchronous context manager, you can use `async with` to implicitly scan, connect, and disconnect.  
The preceding code can be written as follows using `async with`:

```Python
import asyncio

from toio import *

async def scan_and_connect():
    async with ToioCoreCube() as cube:

        await asyncio.sleep(3)

    return 0

if __name__ == "__main__":
    asyncio.run(scan_and_connect())
```

### Scan and connect using Scanner class

Use `BLEScanner.scan()`.

The argument is the number of cubes to find in the scan.

If the specified number of cubes are not found by the timeout (default value is 5 seconds), it returns a list of the number of cubes found at the time of the timeout.

The following sample scans and connects nearby cubes.

Disconnects 3 seconds after connecting.

```Python
import asyncio

from toio import *

async def scan_and_connect():
    dev_list = await BLEScanner.scan(num=1)
    assert len(dev_list)
    cube = ToioCoreCube(dev_list[0].interface)
    await cube.connect()

    await asyncio.sleep(3)

    await cube.disconnect()
    return 0

if __name__ == "__main__":
    asyncio.run(scan_and_connect())
```

### Scan and connect using Scanner class (scan by cube name)

Use `BLEScanner.scan_with_id()`.

The argument is [set (set type)](https://docs.python.org/3/library/stdtypes.html#set-types-set-frozenset), a 3-digit string at the end of the cube.
The argument is given as set even if only one unit is to be scanned.

If the specified number of cubes are not found by the timeout (default value is 5 seconds), it returns a list of cubes found at the time of the timeout.

```Python
    dev_list = await BLEScanner.scan_with_id(cube_id={"C7f"})
```

Scan and connect `toio Core Cube-C7f`.

Disconnects 3 seconds after connecting.

```Python
import asyncio

from toio import *

async def scan_and_connect():
    dev_list = await BLEScanner.scan_with_id(cube_id={"C7f"})
    assert len(dev_list)
    cube = ToioCoreCube(dev_list[0].interface)
    await cube.connect()

    await asyncio.sleep(3)

    await cube.disconnect()
    return 0

if __name__ == "__main__":
    asyncio.run(scan_and_connect())
```

### Scan and connect using Scanner class (scan paired cubes: supported on Windows only)

Windows only, paired cubes can be scanned.

Use `BLEScanner.scan_registered_cubes()`.

The argument is the number of cubes to find in the scan.

If the specified number of cubes are not found by the timeout (default value is 5 seconds), it returns a list of the number of cubes found at the time of the timeout.

```Python
    dev_list = await BLEScanner.scan_registered_cubes()

```

Scan for paired cubes and connect them. (Pair the cube with Windows using "Add Bluetooth Device" before doing this.)

Disconnects 3 seconds after connecting.

```Python
import asyncio

from toio import *

async def scan_and_connect():
    dev_list = await BLEScanner.scan_registered_cubes(num=1)
    assert len(dev_list)
    cube = ToioCoreCube(dev_list[0].interface)
    await cube.connect()

    await asyncio.sleep(3)

    await cube.disconnect()
    return 0

if __name__ == "__main__":
    asyncio.run(scan_and_connect())
```

### Get the cube location

Use the class `ToioCoreCube.api.id_information` to get the location information of the cube.
This class provides access to the [read sensor characteristic](https://toio.github.io/toio-spec/en/docs/ble_id).

The following code reads and displays the cube ID information 200 times.
It uses `read()` to read to the characteristic.

```Python
import asyncio

from toio import *

async def read_id():
    async with ToioCoreCube() as cube:
        for n in range(200):
            pos = await cube.api.id_information.read()
            print("%4d:%s" % (n, str(pos)))

if __name__ == "__main__":
    asyncio.run(read_id())
```

### Get the cube location (using notification)

You can receive notifications from the cube by registering a notification handler with `register_notification_handler()`.
Notifications are per each characteristic. A notification handler that registered with `ToioCoreCube.api.id_information.register_notification_handler()` receives
only notifications from the read sensor.

The following code reads the ID by notification.

After 10 seconds, the handler is unregistered and disconnected.

```Python
import asyncio

from toio import *

def notification_handler(payload: bytearray):
    id_info = IdInformation.is_my_data(payload)
    print(str(id_info))


async def read_id():
    async with ToioCoreCube() as cube:
        # add notification handler
        await cube.api.id_information.register_notification_handler(notification_handler)

        await asyncio.sleep(10)

        # remove notification handler
        await cube.api.id_information.unregister_notification_handler(
            notification_handler
        )
    return 0

if __name__ == "__main__":
    asyncio.run(read_id())
```

The complete code that keeps displaying ID information until Ctrl-C is pressed is [examples/read_position.py](https://github.com/toio/toio.py/blob/main/examples/read_position.py).

### Motor control

The `ToioCoreCube.api.motor` class is used to control the motor.
This class provides access to the [motor's characteristic](https://toio.github.io/toio-spec/en/docs/ble_motor).

The following code uses `motor_control()` to rotate the cube in place for 2 seconds.

```Python
import asyncio

from toio import *

async def motor_1():
    async with ToioCoreCube() as cube:
        # go
        await cube.api.motor.motor_control(10, -10)
        await asyncio.sleep(2)
        # stop
        await cube.api.motor.motor_control(0, 0)

    return 0

if __name__ == "__main__":
    asyncio.run(motor_1())
```

### Motor control (move to specified position)

Use `motor.motor_control_target()` to move the cube to a specified position on the mat.

```Python
import asyncio

from toio import *

def notification_handler(payload: bytearray):
    id_info = IdInformation.is_my_data(payload)
    print(str(id_info))

async def motor_2():
    async with ToioCoreCube() as cube:
        await cube.api.motor.register_notification_handler(notification_handler)
        await cube.api.motor.motor_control_target(
            timeout=5,
            movement_type=MovementType.Linear,
            speed=Speed(
                max=100, speed_change_type=SpeedChangeType.AccelerationAndDeceleration),
            target=TargetPosition(
                cube_location=CubeLocation(point=Point(x=200, y=200), angle=0),
                rotation_option=RotationOption.AbsoluteOptimal,
            ),
        )

        await asyncio.sleep(4)

if __name__ == "__main__":
    asyncio.run(motor_2())
```
### Motor control (move to multiple specified positions)

Use `motor.motor_control_multiple_targets()` to move the cube to a specified position on multiple mats.

```Python
import asyncio

from toio import *

async def motor_3():
    async with ToioCoreCube() as cube:
        targets = [
            TargetPosition(
                cube_location=CubeLocation(point=Point(x=250, y=250), angle=0), rotation_option=RotationOption.AbsoluteOptimal
            ),
            TargetPosition(
                cube_location=CubeLocation(point=Point(x=120, y=170), angle=0), rotation_option=RotationOption.AbsoluteOptimal
            ),
        ]
        await cube.api.motor.motor_control_multiple_targets(
            timeout=5,
            movement_type=MovementType.Linear,
            speed=Speed(
                max=100, speed_change_type=SpeedChangeType.AccelerationAndDeceleration),
            mode=WriteMode.Overwrite,
            target_list=targets,
        )

        await asyncio.sleep(5)

if __name__ == "__main__":
    asyncio.run(motor_3())
```

### Multiple cubes control

This is an example of `MultipleToioCoreCubes()`.

`cubes=` parameter is the number of cubes to use.

`MultipleToioCoreCubes()` is a context manager.
In the `async with` block, cubes are already connected and
all cubes are disconnected when exiting `async with` block.

```Python
import asyncio

from toio import *

async def scan_and_connect():
    async with MultipleToioCoreCubes(cubes=2) as cubes:
        await cubes[0].api.indicator.turn_on(
            IndicatorParam(duration_ms=0, color=Color(r=0xFF, g=0x00, b=0xFF))
        )
        await cubes[1].api.indicator.turn_on(
            IndicatorParam(duration_ms=0, color=Color(r=0x00, g=0xFF, b=0xFF))
        )
        await asyncio.sleep(3)

    return 0

if __name__ == "__main__":
    asyncio.run(scan_and_connect())
```

#### Name the cubes and access them by name

If `name=` parameter is given to `MultipleToioCoreCubes()`, each cube can be accessed by name.

```Python
import asyncio

from toio import *

async def scan_and_connect():
    async with MultipleToioCoreCubes(cubes=2, names=("taro", "jiro")) as cubes:
        await cubes.taro.api.indicator.turn_on(
            IndicatorParam(duration_ms=0, color=Color(r=0xFF, g=0x00, b=0xFF))
        )
        await cubes.jiro.api.indicator.turn_on(
            IndicatorParam(duration_ms=0, color=Color(r=0x00, g=0xFF, b=0xFF))
        )
        await asyncio.sleep(3)

    return 0

if __name__ == "__main__":
    asyncio.run(scan_and_connect())
```

Accessing by class properties may not be understood by LSP or code completion systems.
Therefore, it can be written using `named()` as follows:

```Python
import asyncio

from toio import *

async def scan_and_connect():
    async with MultipleToioCoreCubes(cubes=2, names=("taro", "jiro")) as cubes:
        await cubes.named("taro").api.indicator.turn_on(
            IndicatorParam(duration_ms=0, color=Color(r=0xFF, g=0x00, b=0xFF))
        )
        await cubes.named("jiro").api.indicator.turn_on(
            IndicatorParam(duration_ms=0, color=Color(r=0x00, g=0xFF, b=0xFF))
        )
        await asyncio.sleep(3)

    return 0

if __name__ == "__main__":
    asyncio.run(scan_and_connect())
```



            

Raw data

            {
    "_id": null,
    "home_page": "https://toio.io/",
    "name": "toio.py",
    "maintainer": null,
    "docs_url": null,
    "requires_python": "<3.13,>=3.8.1",
    "maintainer_email": null,
    "keywords": "toio",
    "author": "Sony Interactive Entertainment",
    "author_email": null,
    "download_url": "https://files.pythonhosted.org/packages/36/9c/25d39419ecb65908551fc9910b9bbadcb75cf1e3dd40c099cc8b44aa476b/toio_py-1.1.0.tar.gz",
    "platform": null,
    "description": "\ufeff# toio.py\n\n[![PyPI](https://img.shields.io/pypi/v/toio-py?color=00aeca)](https://pypi.org/project/toio-py/)\n\nThis is a library for controlling [toio\u2122Core Cube](https://toio.io/platform/cube/) from Python.\n\nBased on [toio Core Cube Specifications](https://toio.github.io/toio-spec/en/) v2.4.0.\n\n**\uff08\u65e5\u672c\u8a9e\u7248 README.md \u306f[\u3053\u3061\u3089](./blob/main/README.ja.md)\uff09**\n\n## Features\n\n- Uses [bleak](https://github.com/hbldh/bleak) for Bluetooth communication\n- Supports Python 3.8 and later versions (Python 3.12 is recommended)\n- Multi-platform (Windows, Linux, macOS, iOS, iPadOS)\n- No dedicated Bluetooth dongle required\n- Asynchronous API (ToioCoreCube API) based on the toio Core Cube Specifications and synchronous API (SimpleCube API) for easy cube control\n- Scanning function by specifying BLE addresses and cube-specific names\n- API to control cube functions classified by characteristics (ToioCoreCube API)\n- Ability to scan paired cubes (Windows only)\n\n## System requirements\n\n### Primary tested environment\n\n- Windows: Windows 10 (22H2)\n\n### Secondary tested environment\n\n- Windows: Windows 11 (23H2)\n- Linux: Ubuntu24.04\n- macOS: macOS 14(Sonoma)\n\n### Experimental implementation\n\n- iOS, iPadOS: 17\n\ntoio.py works on Pythonista3.  \n[How to install: INSTALL_TO_PYTHONISTA3.en.md](https://toio.github.io/toio.py/INSTALL_TO_PYTHONISTA3.en.html)\n\n\n## Setup and tutorial\n\nSee below for instructions on how to set up and run the tutorial.\n\n- [Setup Guide (English)](./blob/main/SETUP_GUIDE.en.md)\n- [Setup Guide (Japanese)](./blob/main/SETUP_GUIDE.ja.md)\n- [Setup Guide (Chinese)](./blob/main/SETUP_GUIDE.zh.md)\n\n---\n\n## SimpleCube API\n\nSee [SIMPLE_API.en.md](./blob/main/SIMPLE_API.en.md) for information on the SimpleCube API for easily controlling toio Core Cubes.\n\n- [SIMPLE_API.en.md (English)](./blob/main/SIMPLE_API.en.md)\n- [SIMPLE_API.ja.md (Japanese)](./blob/main/SIMPLE_API.ja.md)\n\n---\n\n## API document\n\n- [API Document](https://toio.github.io/toio.py/)\n\n---\n\n## Implementation overview\n\ntoio.py consists of following classes:\n\n### ToioCoreCube\n\nClass for controlling the cube.\n\nToioCoreCube has subclasses corresponding to the characteristics described in [toio CoreCube Specifications](https://toio.github.io/toio-spec/). You access the various functions of the cube via these subclasses.\n\n#### Features added since v1.1:\n\nToioCoreCube class includes basic scanner function.\nToioCoreCube class can scan a toio Core Cube without the help of the Scanner class.\nFor scanning in special settings. use the Scanner class.\n\n### Scanner\n\nClass for scanning cubes via the BLE interface.\n\nYou can scan for cubes in the following ways:\n\n- Scan for nearby cubes\n- Scan for a specific cube by name (the last 3 characters of the toio Core Cube name)\n\nThe following is available only for Windows and Linux:\n\n- Scan for a specific cube by BLE address\n\nThe following is available only for Windows:\n\n- Scan for cubes registered (paired) with OS\n\n### MultipleToioCoreCubes\n\nMultipleToioCoreCubes class is added since v1.1.\n\nMultipleToioCoreCubes is supplementary helper class to control multiple toio Core Cubes.\n\nThis class provides several functions for multiple toio Core Cubes such as connect, disconnect, etc.\n\n## Examples\n\n### Scan and connect\n\nCreate a ToioCoreCube instance with `ToioCoreCube()` without parameters and call `scan()` and `connect()`.\n\n```Python\nimport asyncio\n\nfrom toio import *\n\nasync def scan_and_connect():\n    cube = ToioCoreCube()\n    await cube.scan()\n    await cube.connect()\n\n    await asyncio.sleep(3)\n\n    await cube.disconnect()\n    return 0\n\nif __name__ == \"__main__\":\n    asyncio.run(scan_and_connect())\n```\n\nSince `ToioCoreCube()` is an asynchronous context manager, you can use `async with` to implicitly scan, connect, and disconnect.  \nThe preceding code can be written as follows using `async with`:\n\n```Python\nimport asyncio\n\nfrom toio import *\n\nasync def scan_and_connect():\n    async with ToioCoreCube() as cube:\n\n        await asyncio.sleep(3)\n\n    return 0\n\nif __name__ == \"__main__\":\n    asyncio.run(scan_and_connect())\n```\n\n### Scan and connect using Scanner class\n\nUse `BLEScanner.scan()`.\n\nThe argument is the number of cubes to find in the scan.\n\nIf the specified number of cubes are not found by the timeout (default value is 5 seconds), it returns a list of the number of cubes found at the time of the timeout.\n\nThe following sample scans and connects nearby cubes.\n\nDisconnects 3 seconds after connecting.\n\n```Python\nimport asyncio\n\nfrom toio import *\n\nasync def scan_and_connect():\n    dev_list = await BLEScanner.scan(num=1)\n    assert len(dev_list)\n    cube = ToioCoreCube(dev_list[0].interface)\n    await cube.connect()\n\n    await asyncio.sleep(3)\n\n    await cube.disconnect()\n    return 0\n\nif __name__ == \"__main__\":\n    asyncio.run(scan_and_connect())\n```\n\n### Scan and connect using Scanner class (scan by cube name)\n\nUse `BLEScanner.scan_with_id()`.\n\nThe argument is [set (set type)](https://docs.python.org/3/library/stdtypes.html#set-types-set-frozenset), a 3-digit string at the end of the cube.\nThe argument is given as set even if only one unit is to be scanned.\n\nIf the specified number of cubes are not found by the timeout (default value is 5 seconds), it returns a list of cubes found at the time of the timeout.\n\n```Python\n    dev_list = await BLEScanner.scan_with_id(cube_id={\"C7f\"})\n```\n\nScan and connect `toio Core Cube-C7f`.\n\nDisconnects 3 seconds after connecting.\n\n```Python\nimport asyncio\n\nfrom toio import *\n\nasync def scan_and_connect():\n    dev_list = await BLEScanner.scan_with_id(cube_id={\"C7f\"})\n    assert len(dev_list)\n    cube = ToioCoreCube(dev_list[0].interface)\n    await cube.connect()\n\n    await asyncio.sleep(3)\n\n    await cube.disconnect()\n    return 0\n\nif __name__ == \"__main__\":\n    asyncio.run(scan_and_connect())\n```\n\n### Scan and connect using Scanner class (scan paired cubes: supported on Windows only)\n\nWindows only, paired cubes can be scanned.\n\nUse `BLEScanner.scan_registered_cubes()`.\n\nThe argument is the number of cubes to find in the scan.\n\nIf the specified number of cubes are not found by the timeout (default value is 5 seconds), it returns a list of the number of cubes found at the time of the timeout.\n\n```Python\n    dev_list = await BLEScanner.scan_registered_cubes()\n\n```\n\nScan for paired cubes and connect them. (Pair the cube with Windows using \"Add Bluetooth Device\" before doing this.)\n\nDisconnects 3 seconds after connecting.\n\n```Python\nimport asyncio\n\nfrom toio import *\n\nasync def scan_and_connect():\n    dev_list = await BLEScanner.scan_registered_cubes(num=1)\n    assert len(dev_list)\n    cube = ToioCoreCube(dev_list[0].interface)\n    await cube.connect()\n\n    await asyncio.sleep(3)\n\n    await cube.disconnect()\n    return 0\n\nif __name__ == \"__main__\":\n    asyncio.run(scan_and_connect())\n```\n\n### Get the cube location\n\nUse the class `ToioCoreCube.api.id_information` to get the location information of the cube.\nThis class provides access to the [read sensor characteristic](https://toio.github.io/toio-spec/en/docs/ble_id).\n\nThe following code reads and displays the cube ID information 200 times.\nIt uses `read()` to read to the characteristic.\n\n```Python\nimport asyncio\n\nfrom toio import *\n\nasync def read_id():\n    async with ToioCoreCube() as cube:\n        for n in range(200):\n            pos = await cube.api.id_information.read()\n            print(\"%4d:%s\" % (n, str(pos)))\n\nif __name__ == \"__main__\":\n    asyncio.run(read_id())\n```\n\n### Get the cube location (using notification)\n\nYou can receive notifications from the cube by registering a notification handler with `register_notification_handler()`.\nNotifications are per each characteristic. A notification handler that registered with `ToioCoreCube.api.id_information.register_notification_handler()` receives\nonly notifications from the read sensor.\n\nThe following code reads the ID by notification.\n\nAfter 10 seconds, the handler is unregistered and disconnected.\n\n```Python\nimport asyncio\n\nfrom toio import *\n\ndef notification_handler(payload: bytearray):\n    id_info = IdInformation.is_my_data(payload)\n    print(str(id_info))\n\n\nasync def read_id():\n    async with ToioCoreCube() as cube:\n        # add notification handler\n        await cube.api.id_information.register_notification_handler(notification_handler)\n\n        await asyncio.sleep(10)\n\n        # remove notification handler\n        await cube.api.id_information.unregister_notification_handler(\n            notification_handler\n        )\n    return 0\n\nif __name__ == \"__main__\":\n    asyncio.run(read_id())\n```\n\nThe complete code that keeps displaying ID information until Ctrl-C is pressed is [examples/read_position.py](https://github.com/toio/toio.py/blob/main/examples/read_position.py).\n\n### Motor control\n\nThe `ToioCoreCube.api.motor` class is used to control the motor.\nThis class provides access to the [motor's characteristic](https://toio.github.io/toio-spec/en/docs/ble_motor).\n\nThe following code uses `motor_control()` to rotate the cube in place for 2 seconds.\n\n```Python\nimport asyncio\n\nfrom toio import *\n\nasync def motor_1():\n    async with ToioCoreCube() as cube:\n        # go\n        await cube.api.motor.motor_control(10, -10)\n        await asyncio.sleep(2)\n        # stop\n        await cube.api.motor.motor_control(0, 0)\n\n    return 0\n\nif __name__ == \"__main__\":\n    asyncio.run(motor_1())\n```\n\n### Motor control (move to specified position)\n\nUse `motor.motor_control_target()` to move the cube to a specified position on the mat.\n\n```Python\nimport asyncio\n\nfrom toio import *\n\ndef notification_handler(payload: bytearray):\n    id_info = IdInformation.is_my_data(payload)\n    print(str(id_info))\n\nasync def motor_2():\n    async with ToioCoreCube() as cube:\n        await cube.api.motor.register_notification_handler(notification_handler)\n        await cube.api.motor.motor_control_target(\n            timeout=5,\n            movement_type=MovementType.Linear,\n            speed=Speed(\n                max=100, speed_change_type=SpeedChangeType.AccelerationAndDeceleration),\n            target=TargetPosition(\n                cube_location=CubeLocation(point=Point(x=200, y=200), angle=0),\n                rotation_option=RotationOption.AbsoluteOptimal,\n            ),\n        )\n\n        await asyncio.sleep(4)\n\nif __name__ == \"__main__\":\n    asyncio.run(motor_2())\n```\n### Motor control (move to multiple specified positions)\n\nUse `motor.motor_control_multiple_targets()` to move the cube to a specified position on multiple mats.\n\n```Python\nimport asyncio\n\nfrom toio import *\n\nasync def motor_3():\n    async with ToioCoreCube() as cube:\n        targets = [\n            TargetPosition(\n                cube_location=CubeLocation(point=Point(x=250, y=250), angle=0), rotation_option=RotationOption.AbsoluteOptimal\n            ),\n            TargetPosition(\n                cube_location=CubeLocation(point=Point(x=120, y=170), angle=0), rotation_option=RotationOption.AbsoluteOptimal\n            ),\n        ]\n        await cube.api.motor.motor_control_multiple_targets(\n            timeout=5,\n            movement_type=MovementType.Linear,\n            speed=Speed(\n                max=100, speed_change_type=SpeedChangeType.AccelerationAndDeceleration),\n            mode=WriteMode.Overwrite,\n            target_list=targets,\n        )\n\n        await asyncio.sleep(5)\n\nif __name__ == \"__main__\":\n    asyncio.run(motor_3())\n```\n\n### Multiple cubes control\n\nThis is an example of `MultipleToioCoreCubes()`.\n\n`cubes=` parameter is the number of cubes to use.\n\n`MultipleToioCoreCubes()` is a context manager.\nIn the `async with` block, cubes are already connected and\nall cubes are disconnected when exiting `async with` block.\n\n```Python\nimport asyncio\n\nfrom toio import *\n\nasync def scan_and_connect():\n    async with MultipleToioCoreCubes(cubes=2) as cubes:\n        await cubes[0].api.indicator.turn_on(\n            IndicatorParam(duration_ms=0, color=Color(r=0xFF, g=0x00, b=0xFF))\n        )\n        await cubes[1].api.indicator.turn_on(\n            IndicatorParam(duration_ms=0, color=Color(r=0x00, g=0xFF, b=0xFF))\n        )\n        await asyncio.sleep(3)\n\n    return 0\n\nif __name__ == \"__main__\":\n    asyncio.run(scan_and_connect())\n```\n\n#### Name the cubes and access them by name\n\nIf `name=` parameter is given to `MultipleToioCoreCubes()`, each cube can be accessed by name.\n\n```Python\nimport asyncio\n\nfrom toio import *\n\nasync def scan_and_connect():\n    async with MultipleToioCoreCubes(cubes=2, names=(\"taro\", \"jiro\")) as cubes:\n        await cubes.taro.api.indicator.turn_on(\n            IndicatorParam(duration_ms=0, color=Color(r=0xFF, g=0x00, b=0xFF))\n        )\n        await cubes.jiro.api.indicator.turn_on(\n            IndicatorParam(duration_ms=0, color=Color(r=0x00, g=0xFF, b=0xFF))\n        )\n        await asyncio.sleep(3)\n\n    return 0\n\nif __name__ == \"__main__\":\n    asyncio.run(scan_and_connect())\n```\n\nAccessing by class properties may not be understood by LSP or code completion systems.\nTherefore, it can be written using `named()` as follows:\n\n```Python\nimport asyncio\n\nfrom toio import *\n\nasync def scan_and_connect():\n    async with MultipleToioCoreCubes(cubes=2, names=(\"taro\", \"jiro\")) as cubes:\n        await cubes.named(\"taro\").api.indicator.turn_on(\n            IndicatorParam(duration_ms=0, color=Color(r=0xFF, g=0x00, b=0xFF))\n        )\n        await cubes.named(\"jiro\").api.indicator.turn_on(\n            IndicatorParam(duration_ms=0, color=Color(r=0x00, g=0xFF, b=0xFF))\n        )\n        await asyncio.sleep(3)\n\n    return 0\n\nif __name__ == \"__main__\":\n    asyncio.run(scan_and_connect())\n```\n\n\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Control toio\u2122Core Cube",
    "version": "1.1.0",
    "project_urls": {
        "Homepage": "https://toio.io/",
        "Repository": "https://github.com/toio/toio.py"
    },
    "split_keywords": [
        "toio"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "03e355bef27941c3f602c9e0efd6ae1a580db8c8acebc468c33170759dff71bd",
                "md5": "94d3300cc3f04b3a0f5ce11e44e39d48",
                "sha256": "4221f4a06c12fd6a02da57bf29a5fadbba2496c7ae98058a9f06f4469b539a5c"
            },
            "downloads": -1,
            "filename": "toio_py-1.1.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "94d3300cc3f04b3a0f5ce11e44e39d48",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": "<3.13,>=3.8.1",
            "size": 75508,
            "upload_time": "2024-06-04T05:53:10",
            "upload_time_iso_8601": "2024-06-04T05:53:10.791493Z",
            "url": "https://files.pythonhosted.org/packages/03/e3/55bef27941c3f602c9e0efd6ae1a580db8c8acebc468c33170759dff71bd/toio_py-1.1.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "369c25d39419ecb65908551fc9910b9bbadcb75cf1e3dd40c099cc8b44aa476b",
                "md5": "f211a407abadfdb98bda16458db98b50",
                "sha256": "b36c225d3f3f9229330b2509a27db8f9db54b42e07c2794e24cfd95b971168a5"
            },
            "downloads": -1,
            "filename": "toio_py-1.1.0.tar.gz",
            "has_sig": false,
            "md5_digest": "f211a407abadfdb98bda16458db98b50",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": "<3.13,>=3.8.1",
            "size": 57211,
            "upload_time": "2024-06-04T05:53:12",
            "upload_time_iso_8601": "2024-06-04T05:53:12.667463Z",
            "url": "https://files.pythonhosted.org/packages/36/9c/25d39419ecb65908551fc9910b9bbadcb75cf1e3dd40c099cc8b44aa476b/toio_py-1.1.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-06-04 05:53:12",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "toio",
    "github_project": "toio.py",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "toio.py"
}
        
Elapsed time: 0.24011s