neuron-explorer
Steering-first neuron explorer for Qwen3.5-4B: push every MLP neuron, keep every rollout, browse the results
High-level Rust and C# control for VISA / SCPI instruments
Developer toolsC# · RustGitHub @josh-hemphillOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
High-level Rust/C# control for VISA instruments: auto-discovery, IVI-inspired typed classes (DMM, PSU, function generator, oscilloscope, switch, counter), and mock fixtures for CI
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
High-level Rust and C# control for VISA instruments: auto-discovery, IVI-inspired typed classes, and mock fixtures for CI. Shared SCPI, dialect, and classifier tables keep the two native implementations aligned.
Rust: cargo add instrument-components then use instrument::prelude::* (the library name stays instrument).
C#: project-reference InstrumentComponents (and InstrumentComponents.Visa for hardware) — see dotnet/.Read the full README ↗High-level Rust and C# control for VISA instruments: auto-discovery, IVI-inspired typed classes, and mock fixtures for CI. Shared SCPI, dialect, and classifier tables keep the two native implementations aligned.
Rust: cargo add instrument-components then use instrument::prelude::* (the library name stays instrument).
C#: project-reference InstrumentComponents (and InstrumentComponents.Visa for hardware) — see dotnet/.
DeviceId for instrument replacement workflows| I want to… | Start here |
|---|---|
| Test in CI without hardware | Mock quick start · C# mock |
| Talk to real USB/GPIB gear | Hardware quick start · C# hardware |
| Build an app with device pickers | docs/discovery.md |
| Use async VISA I/O (opt-in) | docs/async.md · C# async |
No VISA installation required. Rust:
[dependencies]
instrument-components = { version = "0.1", default-features = false }
use instrument::prelude::*;
let fixture = ScriptedFixture::builder()
.idn("Acme Corp", "SMU2602", "SN001", "1.0")
.kinds([InstrumentKind::Dmm, InstrumentKind::DcPowerSupply])
.on_query(":MEAS:VOLT:DC?", "3.300")
.build();
let catalog = DeviceCatalog::from_fixture("mock://smu-1", fixture)?;
let dmm = catalog.open_dmm("mock://smu-1")?;
let volts = dmm.measure_voltage_dc(None)?;
println!("{volts} V");
C# (same fixture, no VISA):
dotnet run --project dotnet/examples/MockFixtureCi
[dependencies]
instrument-components = "0.1"
use instrument::prelude::*;
let catalog = Discovery::visa()?.scan()?;
catalog.print_summary();
let dmm = catalog.open_dmm(&catalog.devices_by_kind(InstrumentKind::Dmm)[0].address.raw)?;
let volts = dmm.measure_voltage_dc(None)?;
println!("{volts} V");
TCPIP/LXI devices usually need a manual address:
let catalog = Discovery::visa()?
.manual_address("TCPIP0::192.168.0.42::INSTR")
.scan()?;
See docs/getting-started.md for the full walkthrough.
| Feature | Default | Description |
|---|---|---|
visa | yes | VISA backend via instrument-visa |
record | no | Record real I/O into mock scripts |
tokio | no | Full async API: AsyncScpiSession, AsyncDiscovery, typed classes |
cross-compile | no | Cross-compile enum repr for visa-rs |
default-features = false | — | Mock/CI only; no native VISA link |
# CI / mock only
instrument-components = { version = "0.1", default-features = false }
# Async VISA (opt-in; use git/`latest` until 0.2.0 is published)
instrument-components = { version = "0.1", features = ["visa", "tokio"] }
tokio = { version = "1", features = ["rt-multi-thread", "macros"] }
Same mock path as above, with .await and AsyncDeviceCatalog:
[dependencies]
instrument-components = { version = "0.1", default-features = false, features = ["tokio"] }
tokio = { version = "1", features = ["rt-multi-thread", "macros"] }
use instrument::prelude::*;
#[tokio::main]
async fn main() -> Result<()> {
let fixture = ScriptedFixture::builder()
.idn("Acme", "DMM1", "SN1", "1.0")
.kinds([InstrumentKind::Dmm])
.on_query(":MEAS:VOLT:DC?", "1.0")
.build();
let catalog = AsyncDeviceCatalog::from_fixture("mock://dmm", fixture).await?;
let mut dmm = catalog.open_dmm("mock://dmm").await?;
println!("{} V", dmm.measure_voltage_dc(None).await?);
Ok(())
}
crates.io 0.1.0 predates the async API and later instrument classes. Until 0.2.0 is published, take those features from git/latest.
Published site (MkDocs): https://josh-hemphill.github.io/instrument-components/
API reference on docs.rs (after first publish). Local docs site: docs-site/ (pip install -r requirements.txt && mkdocs serve).
Native C# packages live under dotnet/ — first-class, same contracts as Rust. Install from NuGet:
dotnet add package InstrumentComponents # mock/CI — no VISA
dotnet add package InstrumentComponents.Visa # Windows + IviFoundation.Visa
See dotnet/README.md for mock and hardware quick starts.
| Crate | crates.io | Role |
|---|---|---|
instrument-components | facade | Discovery, typed classes, re-exports |
instrument-core | backend | Transport, SCPI, mocks — no VISA |
instrument-visa | backend | NI-VISA / Keysight VISA via visa-rs |
# Mock path (no VISA) — runs in CI
cargo test --workspace --no-default-features
# Async mock path
cargo test -p instrument-core --features async
cargo test -p instrument-components --features tokio --no-default-features
# Hardware (local or self-hosted, requires VISA + a DMM)
cargo test -p instrument-components --features visa -- --ignored
# One-resource DMM smoke (used by .github/workflows/hardware.yml)
INSTRUMENT_RESOURCE='USB0::0x0957::0x0607::SN::INSTR' \
cargo test -p instrument-components --features visa --test hardware dmm_measure_voltage_dc_smoke -- --ignored --nocapture --exact
Licensed under either of Apache License, Version 2.0 or MIT License at your option.