diff options
Diffstat (limited to 'src/qhyccd')
-rw-r--r-- | src/qhyccd/QHYCCDCam.rs | 5 | ||||
-rw-r--r-- | src/qhyccd/mod.rs | 43 |
2 files changed, 48 insertions, 0 deletions
diff --git a/src/qhyccd/QHYCCDCam.rs b/src/qhyccd/QHYCCDCam.rs index 2f6b4fb..246681a 100644 --- a/src/qhyccd/QHYCCDCam.rs +++ b/src/qhyccd/QHYCCDCam.rs @@ -199,4 +199,9 @@ extern "C" { pub fn GetQHYCCDLiveFrame(handle: *mut os::raw::c_void, w: *mut os::raw::c_int, h: *mut os::raw::c_int, bpp: *mut os::raw::c_int, channels: *mut os::raw::c_int, data: *mut os::raw::c_uchar) -> os::raw::c_int; pub fn CloseQHYCCD(handle: *mut os::raw::c_void) -> os::raw::c_int; pub fn ReleaseQHYCCDResource() -> os::raw::c_int; + pub fn GetQHYCCDNumberOfReadModes(handle: *mut os::raw::c_void, num_modes: *mut os::raw::c_int) -> os::raw::c_int; + pub fn GetQHYCCDReadModeResolution(handle: *mut os::raw::c_void, mode_number: os::raw::c_int, width: *mut os::raw::c_int, height: *mut os::raw::c_int) -> os::raw::c_int; + pub fn GetQHYCCDReadModeName(handle: *mut os::raw::c_void, mode_number: os::raw::c_int, name: *mut os::raw::c_char) -> os::raw::c_int; + pub fn SetQHYCCDReadMode(handle: *mut os::raw::c_void, mode_number: os::raw::c_int) -> os::raw::c_int; + pub fn GetQHYCCDReadMode(handle: *mut os::raw::c_void, mode_number: *mut os::raw::c_int) -> os::raw::c_int; } diff --git a/src/qhyccd/mod.rs b/src/qhyccd/mod.rs index bda6822..e819bd4 100644 --- a/src/qhyccd/mod.rs +++ b/src/qhyccd/mod.rs @@ -172,6 +172,9 @@ pub fn connect(camera_idx: i32) -> Result<(Receiver<QHYResponse>, Sender<QHYMess }, }; + eprintln!("camera readout modes: {:?}", camera.readout_modes()); + eprintln!("current mode: {}", camera.get_readout_mode().expect("can get current read mode")); + camera.set_defaults().unwrap(); // sleep for 2ms between waiting for messages and reading frames. This introduces an @@ -361,6 +364,13 @@ fn acquire(camera_idx: i32) -> Result<Camera> { } } +#[derive(Debug)] +struct ReadoutMode { + width: u32, + height: u32, + name: String, +} + impl Camera { pub fn get_frame(&mut self) -> Option<Vec<u8>> { if self.frame_size != self.image_buf_size() { @@ -381,6 +391,39 @@ impl Camera { check(QHYCCDCam::ControlQHYCCDTemp(self.handle, temp)) } } + pub fn readout_modes(&self) -> Result<Vec<ReadoutMode>> { + unsafe { + let mut num_readout_modes = 0; + check(QHYCCDCam::GetQHYCCDNumberOfReadModes(self.handle, &mut num_readout_modes as *mut os::raw::c_int))?; + let mut modes = Vec::new(); + for i in 0..num_readout_modes { + let mut width = 0; + let mut height = 0; + let mut name = [0i8; 512]; + check(QHYCCDCam::GetQHYCCDReadModeResolution(self.handle, i, &mut width as *mut i32, &mut height as *mut i32))?; + check(QHYCCDCam::GetQHYCCDReadModeName(self.handle, i, name.as_mut_ptr()))?; + modes.push(ReadoutMode { + name: std::ffi::CStr::from_ptr(name.as_ptr()).to_str().expect("valid string").to_string(), + width: width as u32, + height: height as u32, + }); + } + + Ok(modes) + } + } + pub fn get_readout_mode(&self) -> Result<u32> { + let mut mode = 0; + unsafe { + check(QHYCCDCam::GetQHYCCDReadMode(self.handle, &mut mode))?; + } + Ok(mode as u32) + } + pub fn set_readout_mode(&self, mode: u32) -> Result<()> { + unsafe { + check(QHYCCDCam::SetQHYCCDReadMode(self.handle, mode as i32)) + } + } pub fn has_control(&self, control: Control) -> bool { unsafe { match QHYResult::from(QHYCCDCam::IsQHYCCDControlAvailable(self.handle, control as i32) as u32) { |