diff --git a/content/usage/advanced/diy-widget-config.png b/content/usage/advanced/diy-widget-config.png
index fda7d83..f716ccf 100644
Binary files a/content/usage/advanced/diy-widget-config.png and b/content/usage/advanced/diy-widget-config.png differ
diff --git a/content/usage/advanced/ekf-status-mini-widget.png b/content/usage/advanced/ekf-status-mini-widget.png
new file mode 100644
index 0000000..eeec679
Binary files /dev/null and b/content/usage/advanced/ekf-status-mini-widget.png differ
diff --git a/content/usage/advanced/index.md b/content/usage/advanced/index.md
index f09ae71..bec0ca4 100644
--- a/content/usage/advanced/index.md
+++ b/content/usage/advanced/index.md
@@ -141,20 +141,22 @@ Users are mostly helpful for the following situations:
For individuals with their own vehicles and control computers, it is generally fine to set a
username once and then ignore that the "user" level exists.
-Switching users is done through [`Settings / General`](#general):
-{{ easy_image(src="user-manager", width=500, center=true) }}
+Switching users is done through [`Settings / General > Manage Users`](#general):
+{{ easy_image(src="user-switcher", width=500, center=true) }}
+
+Turning on admin mode, in the bottom left corner, it is possible to add new users or delete
+existing ones:
-Creating new users is possible by clicking the "Add New" button, and choosing a unique name.
-The new user copies the Profiles of the currently selected user (if one exists - otherwise
-it uses Cockpit's default profiles).
+{{ easy_image(src="user-manager", width=500, center=true) }}
-It is [not currently possible to delete users](https://github.com/bluerobotics/cockpit/issues/1384).
+Users must have unique names, and creating a new user copies the Profiles of the currently selected
+user (if one exists - otherwise it uses Cockpit's default profiles).
### Profiles
A "profile" is a collection of [views](#views) that are relevant to a particular use-case or vehicle,
-together with any configured [custom widgets](#do-it-yourself-widget), [custom Actions](#custom-actions),
-and persistent [data-lake](#data-lake) variables.
+together with any configured [custom widgets](#do-it-yourself-diy-widget),
+[custom Actions](#custom-actions), and persistent [data-lake](#data-lake) variables.
If one control station computer is used for multiple complex use-cases (which each require multiple
separate Views), then they can be separated into Profiles and the most relevant one can be switched
@@ -304,13 +306,16 @@ The vehicle connection mini-widget provides a continuous indication:
The joystick connection mini-widget indicates whether a joystick is disconnected, disabled, or connected:
{{ easy_image(src="joystick-mini-widget", width=120, center=true) }}
-Clicking on the widget allows manually disabling the connection:
+Clicking on the widget allows manually disabling the joystick pipeline:
{{ easy_image(src="joystick-config", width=300, center=true) }}
which can be useful if multiple users are switching control of the vehicle between separate devices with
Cockpit open, or to prevent a faulty joystick from sending errant commands without needing to physically
disconnect or unpair it.
+The joystick pipeline is disabled by default if Cockpit detects another control station software sending
+joystick commands to the vehicle when it starts up.
+
##### GPS Connection Indicator
For vehicles that use satellite positioning, the GPS connection mini-widget indicates the number of
connected satellites, and the status of the position lock:
@@ -327,6 +332,11 @@ presenting the current state.
##### Flight Mode
{{ easy_image(src="flight-mode-mini-widget", width=150, center=true) }}
+##### EKF Status
+For help with understanding and debugging the autopilot's state estimates, the EKF status can be checked
+to see which estimates are undefined or uncertain:
+{{ easy_image(src="ekf-status-mini-widget", width=600, center=true) }}
+
#### Interface Controls
While some interface controls (like changing Views) are available as [Cockpit Actions](#cockpit-actions)
@@ -574,6 +584,17 @@ convenient video playback:
If a recording is ongoing, Cockpit will try to prevent the tab/application from closing, with a warning:
{{ easy_image(src="video-recording-termination-warning", width=550, center=true) }}
+##### Snapshot Recorder
+The Snapshot mini-widget allows capturing the current frame from one or more WebRTC video streams, or the
+entire visible View (in the self-contained application) and saving them as timestamped image files with EXIF
+metadata specified for the vehicle's location and orientation:
+{{ easy_image(src="snapshot-mini-widget", width=230, center=true) }}
+
+Snapshots can be captured by clicking the button, or configured to trigger repeatedly with a timer:
+{{ easy_image(src="snapshot-config", width=350, center=true) }}
+
+The saved images can be accessed through the [Snapshot Library](#snapshot-library).
+
##### URL Video Player
The URL video player widget displays a video from a URL. This is useful for testing IP cameras that are not
@@ -671,11 +692,15 @@ modifying basic appearance characteristics:
It is possible to change the decimal resolution of the displayed statistics, and the limit the number
of plotted samples to improve visibility and performance.
-#### Do It Yourself Widget
+#### Do It Yourself (DIY) Widget
- Completely custom elements, code logic, and styling
{{ easy_image(src="diy-widget-config", width=550, center=true) }}
- Runs code automatically when Cockpit starts/refreshes
+- Can save and apply updates automatically (while editing), or be configured to only apply changes manually
+ - Auto-save should generally be disabled while editing JavaScript functionality, but can be convenient
+ while modifying a widget's visual interface / styling
+- Can inherit styles from the Cockpit interface, or use completely independent styles
- Can listen to, create, and modify [data-lake variables](#data-lake), and register and/or execute Actions
using the Cockpit API (`window.cockpit.*`)
- Can be exported to or imported from a JSON file with `"html"`, `"css"`, and `"js"` string fields
@@ -771,8 +796,8 @@ detailed debugging interface provided.
Cockpit's data lake is an accessible data management and storage system.
It is designed to expose Cockpit's internals to the interface (including [displaying](#very-generic-indicators)
-and [plotting](#data-plotting)), and for use in user-defined functions (through [custom widgets](#do-it-yourself-widget)
-and [custom Actions](#custom-actions)).
+and [plotting](#data-plotting)), and for use in user-defined functions (through
+[custom widgets](#do-it-yourself-diy-widget) and [custom Actions](#custom-actions)).
The data lake:
- Includes information about Cockpit, the vehicle, video streams, MAVLink telemetry, and widget and Action internals
@@ -832,17 +857,30 @@ Cockpit is intended to work with arbitrary joystick types, and allows mapping jo
various [protocol functions](#joystick-protocols), which can send inputs and commands to the vehicle, or
trigger interface events.
-{% note() %}
-Cockpit provides three independent sets of function mappings, which are automatically selected between
-based on the connected vehicle type. Changes to a mapping are synchronised to/from the [User](#users),
-including changes to which vehicle type(s) a mapping gets selected for. It is also possible
-to manually export the function mappings as a file, and import them into another User or a different
-Cockpit instance/device.
-{% end %}
+#### Function Mapping
+
+Cockpit provides three independent sets of function mappings, which are automatically pre-selected
+based on the connected vehicle type:
+
+{{ easy_image(src="joystick-function-mapping", width=600, center=true) }}
+
+Non-active mappings can be previewed by clicking on them, and switched to by clicking the switch
+button that appears while previewing:
+
+{{ easy_image(src="joystick-mapping-switch", width=250, center=true) }}
+
+Changes to a mapping are synchronised to/from the [User](#users), including changes to
+which vehicle type(s) a mapping gets selected for. It is also possible to manually export the function
+mappings as a file, and import them into another User or a different Cockpit instance/device.
+
+##### Buttons and Axes
Known joystick types have an interactive diagram for mapping button and axis functions visually:
{{ easy_image(src="joystick-button-mapping", width=600, center=true) }}
+Joysticks can be individually enabled/disabled from the toggle-switch under their name, or the entire
+joystick pipeline can be disabled via the [Joystick Connection Indicator](#joystick-connection-indicator).
+
Button presses and axis movements should be mirrored on the diagram, and clicking on a button
element in the diagram allows remapping its mapped function.
@@ -861,6 +899,21 @@ Support is built in for simultaneous input from multiple sources, including mult
default each joystick can provide up to 32 axis ranges and 32 buttons.
{% end %}
+#### Axis Calibration
+
+Axis calibration options are provided to improve control and compensate for joystick degradation:
+{{ easy_image(src="joystick-calibration", width=600, center=true) }}
+
+- Exponential scaling reduces the output change near the center of an axis, and increases it towards the edges
+ - Higher values can improve fine control at low thrust levels (e.g. slow speeds), at the expense of
+ less control fidelity at higher thrusts/speeds
+- Dead-bands zero-out inputs at the center
+ - This helps to avoid undesired input values when there is slop in the axis spring (i.e. "stick drift")
+ - The auto-calibration option allows wiggling the axis sticks in the region where the spring is not
+ engaging, to detect the zone the axes will return to when released
+ - Large dead-zones make fine control difficult, so if your joystick is suffering from signficant stick drift
+ it is a good idea to repair or replace it
+
#### Joystick Protocols
When mapping the functionality of a joystick button or axis, there are multiple protocols to choose from, which can be mixed and matched across different buttons and axes:
@@ -1079,6 +1132,7 @@ There are some predefined Actions built into Cockpit for convenience, including:
- `hold_to_confirm`
- `start_recording_all_streams`
- `stop_recording_all_streams`
+- `toggle_recording_all_streams`
- `mavlink_arm`
- `mavlink_disarm`
@@ -1128,6 +1182,10 @@ More detailed breakdowns and examples will be coming in future.
first file in the batch, or selecting a set of individual files using `CTRL+Click` or `CMD+Click` (for macOS).
{{ easy_image(src="video-recording-library", width=500, center=true) }}
+### Snapshot Library
+- Allows downloading and deleting [snapshots](#snapshot-recorder)
+{{ easy_image(src="snapshot-library", width=500, center=true) }}
+
### Telemetry Logs / Subtitle Files
Cockpit can optionally record some of its received telemetry values, which can then be turned into subtitle
diff --git a/content/usage/advanced/joystick-button-mapping.png b/content/usage/advanced/joystick-button-mapping.png
index 90ecac6..20b11f2 100644
Binary files a/content/usage/advanced/joystick-button-mapping.png and b/content/usage/advanced/joystick-button-mapping.png differ
diff --git a/content/usage/advanced/joystick-calibration.png b/content/usage/advanced/joystick-calibration.png
new file mode 100644
index 0000000..52fec08
Binary files /dev/null and b/content/usage/advanced/joystick-calibration.png differ
diff --git a/content/usage/advanced/joystick-function-mapping.png b/content/usage/advanced/joystick-function-mapping.png
new file mode 100644
index 0000000..8732665
Binary files /dev/null and b/content/usage/advanced/joystick-function-mapping.png differ
diff --git a/content/usage/advanced/joystick-mapping-switch.png b/content/usage/advanced/joystick-mapping-switch.png
new file mode 100644
index 0000000..62f1663
Binary files /dev/null and b/content/usage/advanced/joystick-mapping-switch.png differ
diff --git a/content/usage/advanced/snapshot-config.png b/content/usage/advanced/snapshot-config.png
new file mode 100644
index 0000000..c9036bf
Binary files /dev/null and b/content/usage/advanced/snapshot-config.png differ
diff --git a/content/usage/advanced/snapshot-library.png b/content/usage/advanced/snapshot-library.png
new file mode 100644
index 0000000..28904f9
Binary files /dev/null and b/content/usage/advanced/snapshot-library.png differ
diff --git a/content/usage/advanced/snapshot-mini-widget.png b/content/usage/advanced/snapshot-mini-widget.png
new file mode 100644
index 0000000..6e1e620
Binary files /dev/null and b/content/usage/advanced/snapshot-mini-widget.png differ
diff --git a/content/usage/advanced/user-manager.png b/content/usage/advanced/user-manager.png
index 03a8b7e..49a1313 100644
Binary files a/content/usage/advanced/user-manager.png and b/content/usage/advanced/user-manager.png differ
diff --git a/content/usage/advanced/user-switcher.png b/content/usage/advanced/user-switcher.png
new file mode 100644
index 0000000..2b27dab
Binary files /dev/null and b/content/usage/advanced/user-switcher.png differ
diff --git a/content/usage/installation.md b/content/usage/installation.md
index 63f25f9..05c403b 100644
--- a/content/usage/installation.md
+++ b/content/usage/installation.md
@@ -40,19 +40,15 @@ Download the latest version for your operating system here:
| Operating System | x86_64 | arm64 |
| --- | --- | --- |
| Windows | Cockpit.exe | Not available |
-| macOS[¹](#1) | Cockpit-Intel.dmg | Not yet available, use x86_64 version |
+| macOS | Cockpit-Intel.dmg | Cockpit-M-series.dmg |
| iOS / iPadOS | N/A | use the BlueOS Extension in a browser |
-| Linux[²](#2) | Cockpit-x86_64.AppImage
Cockpit-x86_64.flatpak | Cockpit-arm64.AppImage
Cockpit-arm64.flatpak |
+| Linux[¹](#1) | Cockpit-x86_64.AppImage
Cockpit-x86_64.flatpak | Cockpit-arm64.AppImage
Cockpit-arm64.flatpak |
| Android | N/A | use the BlueOS Extension in a browser |
{% end %}
or check the [releases](https://github.com/bluerobotics/cockpit/releases), for a list of all available versions, and the main changes between them.
-[^1]: Cockpit is not yet registered with Apple, so may get flagged as a potential security threat. For now, the first open on macOS may require
- right-clicking Cockpit in your Applications folder, selecting "Open", then choosing to "Open anyway" if prompted, or opening the security
- preferences and scrolling down to "Allow" opening if there is no prompt.
-
-[^2]: Steam Deck users are recommended to use at least `v.16.0-beta.13`, as versions before this were [incapable of recording vidoes](https://github.com/bluerobotics/cockpit/pull/1974), and had performance issues.
+[^1]: Steam Deck users are recommended to use at least `v.16.0`, as versions before this were [incapable of recording vidoes](https://github.com/bluerobotics/cockpit/pull/1974), and had performance issues.
### Application Updates
@@ -92,7 +88,11 @@ async function setDownloadURLs() {
setLinkURL("win-x64", artifact);
break;
case ".dmg": // macOS
- setLinkURL("mac-x86_64", artifact);
+ if (name.includes("x64")) {
+ setLinkURL("mac-x64", artifact);
+ } else if (name.includes("arm64")) {
+ setLinkURL("mac-arm64", artifact);
+ }
break;
case ".AppImage": // Linux (AppImage)
if (name.includes("x86_64")) {