Metadata-Version: 2.5
Name: pycympleosc
Version: 0.1.3
Summary: Python receiver for Cymple Eye and Face tracker OSC data
Project-URL: Homepage, https://github.com/Dominocs/Project_Cymple
Project-URL: Repository, https://github.com/Dominocs/Project_Cymple
Author: Zarrakun
License: MIT
License-File: LICENSE
Keywords: cymple,eye-tracking,face-tracking,osc,vrcft,vrchat
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Scientific/Engineering
Requires-Python: >=3.8
Description-Content-Type: text/markdown

# PyCympleOSC

Python receiver for Cymple Eye and Face tracker OSC data.

No dependencies, pure stdlib OSC decoder. Handles both address forms
`/EyeLeftX` and `/avatar/parameters/EyeLeftX`.

## Install

```bash
pip install pycympleosc
```

## Usage

```python
from pycympleosc import CympleOSC

osc = CympleOSC(port=9000)
osc.start()

# polling
eye = osc.eye
if eye.available:
    print(eye.left.x, eye.left.y, eye.right.x, eye.right.y)

print(osc.face["JawOpen"])
print(osc.head.yaw)

osc.stop()
```

Callbacks:

```python
osc = CympleOSC()

@osc.on_eye
def handle_eye(eye):
    print(eye.left, eye.right)

@osc.on_face
def handle_face(face):
    print(face.jaw_open)

@osc.on_raw
def handle_raw(addr, args):
    print(addr, args)

osc.start()
input("press enter to stop\n")
osc.stop()
```

Context manager:

```python
with CympleOSC(port=9000) as osc:
    while True:
        print(osc.values)
```

Multi-port (if eye and face use different ports):

```python
osc = CympleOSC(ports=[9000, 9001])
osc.start()
```

## VRChat / Cymple

Set Cymple OSC target to `127.0.0.1:9000` (or the port you listen on).
