openvibers/openvibe.link Commits
Document the installer --driver shape, defer Adeept OLED, cross-ref…
Changes
@@@ -7,17 +7,17 @@ ports, works behind any home router), and a local kill switch stops everything i1. On openvibe.bot, add a robot. You get a code like `ABCD-1234` (valid 10 minutes) and the installer command withthe robot's id filled in.--2. On the device, run that command and add the driver:++2. On the device, run that command, adding `--driver` for your robot:```shcurl -fsSL https://openvibe.bot/install | sh -s -- --robot rob_01J8Z4M2Q0R7T9YV3K6N8P1W2X --code ABCD-1234 --driver adeept```-- `--robot` is the robot's `rob_…` id and `--code` the pairing code (both from openvibe.bot; the code may also be the-- first argument). `--driver` is `adeept` (Adeept 4WD Smart Car, ordinary wheels), `adeept-mecanum`, `cozmo`, or++ The shape is `--robot rob_… --code CODE [--driver adeept|adeept-mecanum|cozmo|none]`. `--robot` is the robot's++ `rob_…` id and `--code` the pairing code (both from openvibe.bot; the code may also be the first argument).++ `--driver` names the plugin: `adeept` (Adeept 4WD Smart Car, ordinary wheels), `adeept-mecanum`, `cozmo`, or`none` (the default: the dry-run plugin with a test-pattern camera, for trying the Node on a laptop). `--name NAME`-- names the device on openvibe.bot (default: the hostname). The old form `--robot adeept` (a driver kind after-- `--robot`) still works but is deprecated: the installer warns and treats it as `--driver adeept`.++ names the device on openvibe.bot (default: the hostname).3. Confirm the new device on openvibe.bot.The installer detects the OS and CPU (linux amd64/arm64/armv7, macOS amd64/arm64), downloads the binary and the plugin@@@ -71,8 +71,11 @@ describes itself and waits for EOF without opening any hardware.| `video` | `format` (`jpeg`), `path`, optional `width`, `height`, `seq` |For `video`, the plugin writes each frame to a file (write to a temporary name, then rename, and rotate a few names so--a slow reader never sees a partial file) and announces it. The core reads the file at once and encodes it: with--`ffmpeg` if installed, otherwise with its built-in encoder at up to 5 frames per second.++a slow reader never sees a partial file) and announces it with `{"op": "video", "format": "jpeg", "path": …}`++(`emit_video` in [`plugins/sdk`](../plugins/sdk)). The core reads the file at once and encodes it: with `ffmpeg` if++installed, otherwise with its built-in encoder at up to 5 frames per second. The core side of this contract is++`JPEGSource` in [`internal/video/sources.go`](../internal/video/sources.go#L298), selected when the plugin's++`describe` advertises `camera.jpeg: true` (`internal/node/node.go`).## Safety rules (every plugin)@@@ -64,6 +64,10 @@ Enable I2C and SPI (`raspi-config`), then `pip install './plugins/sdk' './pluginTelemetry (2 Hz): `battery {volts, percent, low}`, `sensors {distance_cm, line {left, middle, right}}` and `faults`(sensors that failed to open or read; driving keeps working). A PCA9685 failure is a `hardware` fault at setup.++**OLED / `display`:** not supported (deferred). The plugin advertises no `display` capability and drives no OLED; the++`adeept.adr036` profile has no display widget either, so this waits on a profile change rather than shipping a++capability the panel cannot use. A `display` command is nacked like any other unsupported kind.++## Test```
@@ -7,17 +7,17 @@ ports, works behind any home router), and a local kill switch stops everything i
@@ -7,17 +7,17 @@ ports, works behind any home router), and a local kill switch stops everything i
1. On openvibe.bot, add a robot. You get a code like `ABCD-1234` (valid 10 minutes) and the installer command with
1. On openvibe.bot, add a robot. You get a code like `ABCD-1234` (valid 10 minutes) and the installer command with
the robot's id filled in.
the robot's id filled in.
-2. On the device, run that command and add the driver:
+2. On the device, run that command, adding `--driver` for your robot:
```sh
```sh
curl -fsSL https://openvibe.bot/install | sh -s -- --robot rob_01J8Z4M2Q0R7T9YV3K6N8P1W2X --code ABCD-1234 --driver adeept
curl -fsSL https://openvibe.bot/install | sh -s -- --robot rob_01J8Z4M2Q0R7T9YV3K6N8P1W2X --code ABCD-1234 --driver adeept
```
```
- `--robot` is the robot's `rob_…` id and `--code` the pairing code (both from openvibe.bot; the code may also be the
- first argument). `--driver` is `adeept` (Adeept 4WD Smart Car, ordinary wheels), `adeept-mecanum`, `cozmo`, or
+ The shape is `--robot rob_… --code CODE [--driver adeept|adeept-mecanum|cozmo|none]`. `--robot` is the robot's
+ `rob_…` id and `--code` the pairing code (both from openvibe.bot; the code may also be the first argument).
+ `--driver` names the plugin: `adeept` (Adeept 4WD Smart Car, ordinary wheels), `adeept-mecanum`, `cozmo`, or
`none` (the default: the dry-run plugin with a test-pattern camera, for trying the Node on a laptop). `--name NAME`
`none` (the default: the dry-run plugin with a test-pattern camera, for trying the Node on a laptop). `--name NAME`
- names the device on openvibe.bot (default: the hostname). The old form `--robot adeept` (a driver kind after
- `--robot`) still works but is deprecated: the installer warns and treats it as `--driver adeept`.
+ names the device on openvibe.bot (default: the hostname).
3. Confirm the new device on openvibe.bot.
3. Confirm the new device on openvibe.bot.
The installer detects the OS and CPU (linux amd64/arm64/armv7, macOS amd64/arm64), downloads the binary and the plugin
The installer detects the OS and CPU (linux amd64/arm64/armv7, macOS amd64/arm64), downloads the binary and the plugin
@@ -71,8 +71,11 @@ describes itself and waits for EOF without opening any hardware.
@@ -71,8 +71,11 @@ describes itself and waits for EOF without opening any hardware.
| `video` | `format` (`jpeg`), `path`, optional `width`, `height`, `seq` |
| `video` | `format` (`jpeg`), `path`, optional `width`, `height`, `seq` |
For `video`, the plugin writes each frame to a file (write to a temporary name, then rename, and rotate a few names so
For `video`, the plugin writes each frame to a file (write to a temporary name, then rename, and rotate a few names so
-a slow reader never sees a partial file) and announces it. The core reads the file at once and encodes it: with
-`ffmpeg` if installed, otherwise with its built-in encoder at up to 5 frames per second.
+a slow reader never sees a partial file) and announces it with `{"op": "video", "format": "jpeg", "path": …}`
+(`emit_video` in [`plugins/sdk`](../plugins/sdk)). The core reads the file at once and encodes it: with `ffmpeg` if
+installed, otherwise with its built-in encoder at up to 5 frames per second. The core side of this contract is
+`JPEGSource` in [`internal/video/sources.go`](../internal/video/sources.go#L298), selected when the plugin's
+`describe` advertises `camera.jpeg: true` (`internal/node/node.go`).
## Safety rules (every plugin)
## Safety rules (every plugin)
@@ -64,6 +64,10 @@ Enable I2C and SPI (`raspi-config`), then `pip install './plugins/sdk' './plugin
@@ -64,6 +64,10 @@ Enable I2C and SPI (`raspi-config`), then `pip install './plugins/sdk' './plugin
Telemetry (2 Hz): `battery {volts, percent, low}`, `sensors {distance_cm, line {left, middle, right}}` and `faults`
Telemetry (2 Hz): `battery {volts, percent, low}`, `sensors {distance_cm, line {left, middle, right}}` and `faults`
(sensors that failed to open or read; driving keeps working). A PCA9685 failure is a `hardware` fault at setup.
(sensors that failed to open or read; driving keeps working). A PCA9685 failure is a `hardware` fault at setup.
+**OLED / `display`:** not supported (deferred). The plugin advertises no `display` capability and drives no OLED; the
+`adeept.adr036` profile has no display widget either, so this waits on a profile change rather than shipping a
+capability the panel cannot use. A `display` command is nacked like any other unsupported kind.
+
## Test
## Test
```
```