AprilNEA/OpenLogi · error

{e}

Error message

{e}

What it means

This error wraps any failure from `openlogi_camera::set_auto` when the CLI `camera set` command tries to change an auto-exposure-style toggle (e.g. auto-focus, auto-exposure) on a Logitech UVC camera. The underlying camera error message is passed through verbatim via `anyhow!("{e}")`, so the displayed text comes from the camera crate, not this site. It exists to convert the camera crate's error type into the CLI's `anyhow::Result` chain.

Solutions

  1. Re-run `openlogi camera list` (or equivalent) to confirm the camera UID is still valid and the device is present, then retry the set.
  2. Check the camera's supported controls in the list output; the requested auto toggle may not exist on this model.
  3. Verify the process has camera-device access permissions (macOS camera TCC, Linux udev/video-group access) and retry.
  4. Read the wrapped `{e}` message — it names the underlying UVC failure; fix that condition directly.

Example fix

// before: blind call, any failure surfaces here
openlogi_camera::set_auto(&uid, *toggle, value != 0).map_err(|e| anyhow!("{e}"))?;
// after: probe the control first and give a targeted message
if !openlogi_camera::supports_auto(&uid, *toggle)? {
    anyhow::bail!("camera {} does not support auto {}", uid, toggle.name());
}
openlogi_camera::set_auto(&uid, *toggle, value != 0).map_err(|e| anyhow!("set auto {}: {e}", toggle.name()))?;
Defensive patterns

Strategy: try-catch

Validate before calling

// confirm the camera and control exist before setting
let known = openlogi_camera::list_controls(&uid)?;
if !known.iter().any(|c| c.is_auto_toggle(toggle)) {
    eprintln!("camera {uid} lacks auto toggle {}", toggle.name());
    std::process::exit(1);
}

Try / catch

match openlogi_camera::set_auto(&uid, toggle, on) {
    Ok(()) => println!("set {} = {on}", toggle.name()),
    Err(e) if e.is_disconnected() => eprintln!("camera {uid} disappeared; re-enumerate and retry"),
    Err(e) => eprintln!("set auto {} failed: {e}", toggle.name()),
}

Prevention

When it happens

Trigger: Running `openlogi camera set <auto-toggle-name> <0|1>` where `openlogi_camera::set_auto(&uid, toggle, bool)` returns Err — e.g. the camera is disconnected between enumeration and the set, the UVC control is not supported by the device, or the OS rejects the control write.

Common situations: Camera unplugged or asleep when the command runs; targeting a webcam that lacks the requested auto control; running without OS permission to access the camera device; a stale device UID from a previous enumeration.

Related errors


AI-assisted analysis of AprilNEA/OpenLogi@e846e6f4b4 (2026-09-13). Data as JSON: /api/errors/044b8798f4330483. Report an issue: GitHub.

Appendix: source

Thrown at crates/openlogi-cli/src/cmd/camera.rs:78

                        );
                    }
                    for (toggle, st) in &state.autos {
                        println!(
                            "  {}: current={} default={}",
                            toggle.name(),
                            st.current,
                            st.default
                        );
                    }
                }
                Ok(_) => println!("  (no adjustable controls, or camera not found)"),
                Err(e) => println!("  {e}"),
            }
        }
        CameraCmd::Set { control, value } => {
            let raw = control.to_ascii_lowercase();
            if let Some(toggle) = AutoToggle::ALL.iter().find(|t| t.name() == raw) {
                openlogi_camera::set_auto(&uid, *toggle, value != 0).map_err(|e| anyhow!("{e}"))?;
                println!("set {} = {}", toggle.name(), value != 0);
            } else {
                let control = parse_control(&raw)?;
                openlogi_camera::set_control(&uid, control, value).map_err(|e| anyhow!("{e}"))?;
                println!("set {} = {value}", control.name());
            }
        }
    }
    Ok(())
}

fn parse_control(raw: &str) -> Result<CameraControl> {
    CameraControl::ALL
        .into_iter()
        .find(|c| c.name() == raw)
        .ok_or_else(|| {
            let names: Vec<&str> = CameraControl::ALL
                .iter()

View on GitHub (pinned to e846e6f4b4)