Skip to main content

Crate laser_dac

Crate laser_dac 

Source
Expand description

Unified DAC backend abstraction for laser projectors.

This crate provides a common interface for communicating with various laser DAC (Digital-to-Analog Converter) hardware. Two API styles are available:

§Getting Started

Submit complete frames with automatic transition blanking:

use laser_dac::{open_device, FrameSessionConfig, Frame, LaserPoint};

let device = open_device("my-device").unwrap();
let config = FrameSessionConfig::new(30_000);
let (session, _info) = device.start_frame_session(config).unwrap();

session.control().arm().unwrap();
session.send_frame(Frame::new(vec![
    LaserPoint::new(-0.5, 0.0, 65535, 0, 0, 65535),
    LaserPoint::new( 0.5, 0.0, 0, 65535, 0, 65535),
]));
// Frame replays automatically. Submit new frames for animation.

For advanced frame-mode output-space processing on the final presented sequence, use FrameSessionConfig::with_output_filter. The filter runs after transition composition, blanking, and color delay, just before the backend write.

For downstream watchdogs, FrameSession::metrics exposes a small liveness surface with connectivity, last-loop-activity, and last-write-success timestamps. Watchdog policy remains application-owned.

§Callback Mode (advanced, FIFO backends only)

Fill point buffers via zero-allocation callback for custom timing. Not available for frame-swap backends (Helios) — use Frame Mode instead.

use laser_dac::{open_device, StreamConfig, LaserPoint, ChunkRequest, ChunkResult};

let device = open_device("my-device").unwrap();
let config = StreamConfig::new(30_000);
let (stream, _info) = device.start_stream(config).unwrap();

stream.control().arm().unwrap();

let exit = stream.run(
    |req: &ChunkRequest, buffer: &mut [LaserPoint]| {
        let n = req.target_points;
        for i in 0..n {
            buffer[i] = LaserPoint::blanked(0.0, 0.0);
        }
        ChunkResult::Filled(n)
    },
    |err| eprintln!("Stream error: {}", err),
);

§Supported DACs

  • Helios - USB laser DAC, Frame API only (feature: helios)
  • Ether Dream - Network laser DAC (feature: ether-dream)
  • IDN - ILDA Digital Network protocol (feature: idn)
  • LaserCube Network - LaserCube network DAC (feature: lasercube-network)
  • LaserCube USB - USB laser DAC / LaserDock (feature: lasercube-usb)
  • Oscilloscope - XY mode via stereo audio output (feature: oscilloscope)
  • AVB Audio Devices - AVB audio output via the system audio host: CoreAudio (macOS), WASAPI or ASIO (Windows, ASIO opt-in via the asio feature), ALSA (Linux). Feature: avb.

§Features

  • all-dacs (default): Enable all DAC protocols
  • usb-dacs: Enable USB DACs (Helios, LaserCube USB)
  • network-dacs: Enable network DACs (Ether Dream, IDN, LaserCube Network)
  • audio-dacs: Enable audio DACs (Oscilloscope, AVB)
  • asio (default): ASIO host on Windows for AVB output. Requires the Steinberg ASIO SDK plus LIBCLANG_PATH and CPAL_ASIO_DIR set at build time. Disable with default-features = false (and re-enable the features you want) to fall back to the default cpal host (WASAPI on Windows) and skip the SDK requirement.

§Coordinate System

All backends use normalized coordinates:

  • X: -1.0 (left) to 1.0 (right)
  • Y: -1.0 (bottom) to 1.0 (top)
  • Colors: 0-65535 for R, G, B, and intensity

Each backend handles conversion to its native format internally.

Re-exports§

pub use backend::BackendKind;
pub use backend::DacBackend;
pub use backend::FifoBackend;
pub use backend::FrameSwapBackend;
pub use backend::WriteOutcome;
pub use discovery::downcast_connect_data;
pub use discovery::slugify_device_id;
pub use discovery::DacDiscovery;
pub use discovery::DiscoveredDevice;
pub use discovery::DiscoveredDeviceInfo;
pub use discovery::Discoverer;
pub use point::LaserPoint;
pub use device::caps_for_dac_type;
pub use device::DacCapabilities;
pub use device::DacConnectionState;
pub use device::DacDevice;
pub use device::DacInfo;
pub use device::DacType;
pub use device::EnabledDacTypes;
pub use device::OutputModel;
pub use config::IdlePolicy;
pub use config::ReconnectConfig;
pub use config::StreamConfig;
pub use session::SessionControl;
pub use session::SessionExit;
pub use stream::ChunkRequest;
pub use stream::ChunkResult;
pub use stream::Dac;
pub use stream::Stream;
pub use stream::StreamInstant;
pub use stream::StreamStats;
pub use stream::StreamStatus;
pub use presentation::default_transition;
pub use presentation::Frame;
pub use presentation::FrameSession;
pub use presentation::FrameSessionConfig;
pub use presentation::FrameSessionMetrics;
pub use presentation::OutputFilter;
pub use presentation::OutputFilterContext;
pub use presentation::OutputResetReason;
pub use presentation::PresentedSliceKind;
pub use presentation::TransitionContext;
pub use presentation::TransitionFn;
pub use presentation::TransitionPlan;
pub use backend::HeliosBackend;
pub use protocols::helios;
pub use backend::EtherDreamBackend;
pub use protocols::ether_dream;
pub use backend::IdnBackend;
pub use protocols::idn;
pub use backend::LaserCubeNetworkBackend;
pub use protocols::lasercube_network;
pub use backend::LaserCubeUsbBackend;
pub use protocols::lasercube_usb;
pub use backend::AvbBackend;
pub use protocols::avb;
pub use protocols::lasercube_usb::rusb;

Modules§

backend
DAC backend traits and implementations for the streaming API.
buffer_estimate
Buffer fullness estimation for FIFO DAC backends.
config
Stream and reconnection configuration types.
device
DAC identity, capabilities, and discovery filtering.
discovery
DAC device discovery.
point
The DAC-agnostic laser point type and coordinate/colour conversion helpers.
presentation
Frame-first presentation types and engine.
protocols
Protocol implementations for various laser DAC types.
session
Shared session lifecycle control and exit types.
stream
Stream and Dac types for point output.
types
Backwards-compatible re-exports.

Enums§

Error
Streaming-specific error type.

Functions§

list_devices
List all available DACs.
list_devices_filtered
List available DACs filtered by DAC type.
open_device
Open a DAC by ID.
open_device_with
Open a DAC by ID using a custom discovery factory.

Type Aliases§

Result
Result type for streaming operations.