#![allow(clippy::missing_panics_doc)]
pub mod control_handle;
pub mod register_map;
pub mod stream_handle;
pub use control_handle::{ControlHandle, SharedControlHandle};
pub use stream_handle::{StreamHandle, StreamParams};
pub use cameleon_device::u3v::DeviceInfo;
use cameleon_device::u3v;
use super::{
genapi::DefaultGenApiCtxt, CameleonResult, Camera, CameraInfo, ControlError, StreamError,
};
pub fn enumerate_cameras() -> CameleonResult<Vec<Camera<ControlHandle, StreamHandle>>> {
let devices = u3v::enumerate_devices().map_err(ControlError::from)?;
let mut cameras: Vec<Camera<ControlHandle, StreamHandle>> = Vec::with_capacity(devices.len());
for dev in devices {
let ctrl = ControlHandle::new(&dev)?;
let strm = if let Some(strm) = StreamHandle::new(&dev)? {
strm
} else {
continue;
};
let ctxt = None;
let dev_info = dev.device_info;
let camera_info = CameraInfo {
vendor_name: dev_info.vendor_name,
model_name: dev_info.model_name,
serial_number: dev_info.serial_number,
};
let camera: Camera<ControlHandle, StreamHandle, DefaultGenApiCtxt> =
Camera::new(ctrl, strm, ctxt, camera_info);
cameras.push(camera)
}
Ok(cameras)
}
impl From<u3v::Error> for ControlError {
fn from(err: u3v::Error) -> ControlError {
use u3v::Error::{BufferIo, InvalidDevice, InvalidPacket, LibUsb};
use u3v::LibUsbError::{
Access, BadDescriptor, Busy, Interrupted, InvalidParam, Io, NoDevice, NoMem, NotFound,
NotSupported, Other, Overflow, Pipe, Timeout,
};
match &err {
LibUsb(libusb_error) => match libusb_error {
Io | InvalidParam | Access | Overflow | Pipe | Interrupted | NoMem
| NotSupported | BadDescriptor | Other => ControlError::Io(err.into()),
Busy => ControlError::Busy,
NoDevice | NotFound => ControlError::Disconnected,
Timeout => ControlError::Timeout,
},
BufferIo(_) | InvalidPacket(_) => ControlError::Io(err.into()),
InvalidDevice => ControlError::InvalidDevice("invalid device".into()),
}
}
}
impl From<u3v::Error> for StreamError {
fn from(err: u3v::Error) -> Self {
use u3v::Error::LibUsb;
use u3v::LibUsbError::{
Access, BadDescriptor, Busy, Interrupted, InvalidParam, Io, NoDevice, NoMem, NotFound,
NotSupported, Other, Overflow, Pipe, Timeout,
};
match &err {
LibUsb(libusb_error) => match libusb_error {
Io | InvalidParam | Access | Overflow | Pipe | Interrupted | NoMem
| NotSupported | BadDescriptor | Busy | Other => Self::Io(err.into()),
NoDevice | NotFound => Self::Disconnected,
Timeout => Self::Timeout,
},
_ => Self::Io(err.into()),
}
}
}