# roblib
#### _a remote library for a dank engine._
this repo contains the new roblib server and client library written in rust,
as well as bindings to said library for nodejs. the server has two versions:
**base**, that only accepts gpio and *(software)* pwm commands,
and **roland**, a specialized version for the dank engine.
## client libraries in other languages:
- ~~[javascript/typescript](https://github.com/kareszklub/roblib-client)~~ (currently outdated, new version planned)
## server downloads
*the cache may be old. to bypass it, open the lates commit and use the links in the comments*
[View all](https://nightly.link/kareszklub/roblib-rs/workflows/ci/main)
| aarch64-unknown-linux-gnu | [Download](https://nightly.link/kareszklub/roblib-rs/workflows/ci/main/roblib-server-base-aarch64-unknown-linux-gnu.zip) | [Download](https://nightly.link/kareszklub/roblib-rs/actions/runs/5766762992/roblib-server-roland-aarch64-unknown-linux-gnu.zip) |
| aarch64-unknown-linux-musl | [Download](https://nightly.link/kareszklub/roblib-rs/workflows/ci/main/roblib-server-base-aarch64-unknown-linux-musl.zip) | [Download](https://nightly.link/kareszklub/roblib-rs/actions/runs/5766762992/roblib-server-roland-aarch64-unknown-linux-musl.zip) |
| armv7-unknown-linux-gnueabihf | [Download](https://nightly.link/kareszklub/roblib-rs/workflows/ci/main/roblib-server-base-armv7-unknown-linux-gnueabihf.zip) | [Download](https://nightly.link/kareszklub/roblib-rs/actions/runs/5766762992/roblib-server-roland-armv7-unknown-linux-gnueabihf.zip) |
| armv7-unknown-linux-musleabihf | [Download](https://nightly.link/kareszklub/roblib-rs/workflows/ci/main/roblib-server-base-armv7-unknown-linux-musleabihf.zip) | [Download](https://nightly.link/kareszklub/roblib-rs/actions/runs/5766762992/roblib-server-roland-armv7-unknown-linux-musleabihf.zip) |
| x86_64-pc-windows-msvc | [Download](https://nightly.link/kareszklub/roblib-rs/workflows/ci/main/roblib-server-base-x86_64-pc-windows-msvc.zip) | [Download](https://nightly.link/kareszklub/roblib-rs/actions/runs/5766762992/roblib-server-roland-x86_64-pc-windows-msvc.zip) |
| x86_64-unknown-linux-gnu | [Download](https://nightly.link/kareszklub/roblib-rs/workflows/ci/main/roblib-server-base-x86_64-unknown-linux-gnu.zip) | [Download](https://nightly.link/kareszklub/roblib-rs/actions/runs/5766762992/roblib-server-roland-x86_64-unknown-linux-gnu.zip) |
| x86_64-unknown-linux-musl | [Download](https://nightly.link/kareszklub/roblib-rs/workflows/ci/main/roblib-server-base-x86_64-unknown-linux-musl.zip) | [Download](https://nightly.link/kareszklub/roblib-rs/actions/runs/5766762992/roblib-server-roland-x86_64-unknown-linux-musl.zip) |
## server api
| TCP | Yes | No | 1110 | |
| UDP | Yes | No | 1110 | |
| WebSocket | Yes | Yes | 1111 | Endpoint: /ws |
| HTTP POST | No | Yes | 1111 | Endpoint: /cmd |
# Binary format
The binary format is using [bincode](https://lib.rs/bincode).
Each transport implements its own wire format that aligns with its advantages.
It isnt't guaranteed to be stable, implementing it outside of here isn't recommended.
# Text format
The text format is designed to be simpler.
It consists of an ID *(u32)*, the command prefix, and any additional arguments for that command,
separated by a space.
```
1 command arg1 arg2 ...
```
## Available commands and their arguments
### Built-in
These require no additional feature flags and are always available.
- `+ event eventargs`: Subscribe to an event
- `- event eventargs`: Unsubscribe from an event
- `0`: No-op
- `U`: Get server uptime in seconds
- `X`: Abort: immediately perform a clean shutdown
### GPIO
These commands are designed to control generic gpio and (software) pwm devices.
- `p pin mode`: REQUIRED! Set a pin to input or output mode
- `r pin`: Read a pin's logic level
- `w pin logic`: Write a pin to high or low, logic can be 0 or 1
- `W pin hz cycle`: Configure a software pwm on a pin, hz is the frequency, and
cycle is the duty cycle, a number between 0 and 100
- `V pin deg`: Move a servo between -90 and 90 degrees, using PWM
### Roland
The dank engine.
- `m left right`: Move the robot's left and right motors with the given speed (between 0 and 1)
- `M aleft aright`: Move the robot by specifying two angles for the two motors
- `s`: Stop the robot
- `l r g b`: Set the leds to the given color, r,g,b can be 0 or 1
- `a angle`: Set the servo to the given absolute angle
- `b freq`: Sounds the buzzer at the given frequency
- `t`: Get the data from the four onboard sensors in the format of four comma
separated boolean numbers
- `u`: Read the onboard ultra sensor, returns the distance in meters
### Camloc
[Camera location service](https://github.com/Kris030/camloc)
- `P`: Get the position of the robot
## Profiles
We currently have two profiles, for the two primary use-cases.
- **Base**: Includes the GPIO features, for a generic gpio pin controller
- **Roland**: Includes everything, for the dank engine