Spvirit
/ˈspɪrɪt/ of the Machine
Spvirit is a Rust library for working with EPICS PVAccess protocol, including encoding/decoding and connection state tracking. It also includes tools for monitoring and testing PVAccess connections. These are more proof of concept than production ready, but they are available for anyone to use and contribute to.
Why Rust?
Because why not, admittedly I just wanted to learn Rust and this seemed like a fun project with a moderately useful outcome.
Project Structure
The project is structured as a Cargo workspace with three crates:
spvirit-types: Contains shared data model types for PVAccess Normative Types (NT).spvirit-codec: Contains the PVAccess protocol encoding/decoding logic and connection state tracking.spvirit-tools: Contains command-line tools for monitoring and testing PVAccess connections.
In the future I would like to split out the tools to client and server tools and add some more IOC-like functionality to the server tools, but for now they are all in one crate for simplicity.
Getting Started
Install Rust
# Linux
|
clone the repo
Build the project
Run the tools
# or
# or if installed
Using the library in your own Rust project
Add the crates you need to your Cargo.toml:
[]
= "0.1" # client/server library + CLI tools
= "0.1" # low-level PVA protocol encode/decode
= "0.1" # shared Normative Type data model
Fetching a PV value (client)
use ;
async
Searching for a PV server
use Duration;
use ;
async
Decoding a raw PVA packet (codec)
use ;
See the examples/ folders for runnable versions of each snippet:
Tools available
| spvirit tool | EPICS Base equivalent | Description |
|---|---|---|
spvirit_get |
pvget |
Fetch the current value of a PV |
spvirit_put |
pvput |
Write a value to a PV |
spvirit_monitor |
pvmonitor |
Subscribe to a PV and print value changes |
spvirit_info |
pvinfo |
Display field/metadata information for a PV |
spvirit_list |
pvlist |
List all available PVs on discovered servers |
spvirit_server |
softIoc |
Not fully one-to-one - just a demo, it does parse some db file vocab |
spvirit_explore |
Interactive TUI to browse servers, select PVs, and monitor values | |
spvirit_search |
TUI showing PV search network traffic for diagnostics | |
spvirit_sine |
Continuously write a sine wave to a PV (demo/testing) | |
spvirit_dodeca |
Server publishing a rotating 3D dodecahedron as an NTNDArray PV |
Related Projects
- spvirit-scry — A Rust tool for capturing and analyzing pvAccess EPICS packets.
References
I used the following libraries and repos as refernce materials for PVAccess protocol: