senseshift / senseshift-firmware

Open-source firmware for VR accessories. Build your own DIY haptic vest, gloves, and more!
https://senseshift.github.io/
GNU General Public License v3.0
101 stars 10 forks source link

[WIP] [RFC]: OpenHaptics protocol #9

Open leon0399 opened 2 years ago

leon0399 commented 2 years ago

Here I am just writing ideas from my mind to future implement in our own protocol, when current protocol from bHaptics when it ceases to meet the needs

OpenHaptics Protocol

Coordinates encoding

Each axis (X and Y) is _uint8_t_ between 0 and 255

Coordinates preview ``` (0, 0) (128, 0) (255, 0) (0, 128) (128, 128) (255, 128) (0, 255) (128, 255) (255, 255) ```

Intensity

Intensity is _uint8_t_:

0: 0%, 255: 100%

Effects layer

Effect layer is 16 possible values (4 bits - _uint8_t << 4_)

Proposed Effects layer IDs (WIP) * Vibro: `0x0` * Touch (LRA): `0x1` * Temperature (Peltier): `0x2` * Electricity (TENS): `0x3`

Body Parts IDs mapping

Every diverging part of the body is separated into Front and Back faces. Coordinate path has 255 possible values (8 bits - _uint8_t_)

Proposed Body Parts IDs (WIP) * `human://chest`: * `human://chest/front`: `0x00` * `human://chest/back`: `0x01` * `human://arm`: * `human://arm/left`: `0x02` * `human://arm/right`: `0x03` * `human://forearm`: * `human://forearm/left`: `0x04` * `human://forearm/right`: `0x05` * `human://hand`: * `human://hand/left`: * `human://hand/left/palm`: * `human://hand/left/palm/front`: `0x06` * `human://hand/left/palm/back`: `0x07` * `human://hand/left/finger`: * `human://hand/left/finger/thumb`: `0x08` * `human://hand/left/finger/index`: `0x09` * `human://hand/left/finger/middle`: `0x0a` * `human://hand/left/finger/ring`: `0x0b` * `human://hand/left/finger/pinky`: `0x0c` * `human://hand/right`: * `human://hand/right/palm`: * `human://hand/right/palm/front`: `0x0d` * `human://hand/right/palm/back`: `0x0e` * `human://hand/right/finger`: * `human://hand/right/finger/thumb`: `0x0f` * `human://hand/right/finger/index`: `0x10` * `human://hand/right/finger/middle`: `0x11` * `human://hand/right/finger/ring`: `0x12` * `human://hand/right/finger/pinky`: `0x13` * `human://upper_leg`: * `human://upper_leg/left`: `0x14` * `human://upper_leg/right`: `0x15` * `human://lower_leg`: * `human://lower_leg/left`: `0x16` * `human://lower_leg/right`: `0x17` * `human://foot`: * `human://foot/left`: * `human://foot/left/top`: `0x18` * `human://foot/left/bottom`: `0x19` * `human://foot/right`: * `human://foot/right/top`: `0x1a` * `human://foot/right/bottom`: `0x1b` * `human://neck`: `0x1c` * `human://head`: * `human://head/face`: `0x1d` * `human://head/back`: `0x1e` * `human://head/top`: `0x1f`
leon0399 commented 2 years ago

After some thought, I've decided on the given packet structure:

Thus:

Transition limits

Future software can automatically adjust MTU for each device in order to handle every motor change in a single packet (e.g. 20 motors per body part on x40 vest), so MTU for x40 vest might be 3*20 + 3 = 63 bytes