use super::context::Context;
use super::error::XCamError;
use super::ffi;
use super::types::{OpMode, WbGain, WbScene, XCamResult};
pub trait AutoWhiteBalance {
fn get_wb_mode(&self) -> XCamResult<OpMode>;
fn set_wb_mode(&self, mode: OpMode) -> XCamResult<()>;
fn lock_awb(&self) -> XCamResult<()>;
fn unlock_awb(&self) -> XCamResult<()>;
fn get_mwb_scene(&self) -> XCamResult<WbScene>;
fn set_mwb_scene<T: Into<WbScene>>(&self, scene: T) -> XCamResult<()>;
fn get_mwb_gain(&self) -> XCamResult<WbGain>;
fn set_mwb_gain<T: Into<WbGain>>(&self, gain: T) -> XCamResult<()>;
fn get_mwb_ct(&self) -> XCamResult<u32>;
fn set_mwb_ct(&self, ct: u32) -> XCamResult<()>;
}
impl AutoWhiteBalance for Context {
fn get_wb_mode(&self) -> XCamResult<OpMode> {
let mut mode = ffi::opMode_t::OP_INVAL;
unsafe {
XCamError::from(ffi::rk_aiq_uapi_getWBMode(
self.internal.as_ptr(),
&mut mode,
))
.ok()
.map(|_| mode.into())
}
}
#[cfg(any(feature = "v1_0", feature = "v2_0", feature = "v3_0"))]
fn set_wb_mode(&self, mode: OpMode) -> XCamResult<()> {
unsafe {
XCamError::from(ffi::rk_aiq_uapi_setWBMode(
self.internal.as_ptr(),
mode.into(),
))
.ok()
}
}
#[cfg(any(feature = "v4_0", feature = "v5_0"))]
fn set_wb_mode(&self, mode: OpMode) -> XCamResult<()> {
unsafe {
XCamError::from(ffi::rk_aiq_uapi2_setWBMode(
self.internal.as_ptr(),
mode.into(),
))
.ok()
}
}
fn lock_awb(&self) -> XCamResult<()> {
unsafe { XCamError::from(ffi::rk_aiq_uapi_lockAWB(self.internal.as_ptr())).ok() }
}
fn unlock_awb(&self) -> XCamResult<()> {
unsafe { XCamError::from(ffi::rk_aiq_uapi_unlockAWB(self.internal.as_ptr())).ok() }
}
fn get_mwb_scene(&self) -> XCamResult<WbScene> {
let mut scene: WbScene = Default::default();
unsafe {
XCamError::from(ffi::rk_aiq_uapi_getMWBScene(
self.internal.as_ptr(),
&mut scene,
))
.ok()
.map(|_| scene)
}
}
fn set_mwb_scene<T: Into<WbScene>>(&self, scene: T) -> XCamResult<()> {
unsafe {
XCamError::from(ffi::rk_aiq_uapi_setMWBScene(
self.internal.as_ptr(),
scene.into(),
))
.ok()
}
}
fn get_mwb_gain(&self) -> XCamResult<WbGain> {
let mut gain: WbGain = Default::default();
unsafe {
XCamError::from(ffi::rk_aiq_uapi_getMWBGain(
self.internal.as_ptr(),
&mut gain,
))
.ok()
.map(|_| gain)
}
}
fn set_mwb_gain<T: Into<WbGain>>(&self, gain: T) -> XCamResult<()> {
unsafe {
XCamError::from(ffi::rk_aiq_uapi_setMWBGain(
self.internal.as_ptr(),
&mut gain.into(),
))
.ok()
}
}
fn get_mwb_ct(&self) -> XCamResult<u32> {
let mut ct: u32 = 0;
unsafe {
XCamError::from(ffi::rk_aiq_uapi_getMWBCT(self.internal.as_ptr(), &mut ct))
.ok()
.map(|_| ct)
}
}
fn set_mwb_ct(&self, ct: u32) -> XCamResult<()> {
unsafe { XCamError::from(ffi::rk_aiq_uapi_setMWBCT(self.internal.as_ptr(), ct)).ok() }
}
}
pub enum WbOpMode {
#[cfg(feature = "v1_0")]
Invalid,
Manual,
Auto,
Max,
}
impl From<ffi::opMode_t> for WbOpMode {
fn from(val: ffi::opMode_t) -> Self {
use ffi::opMode_t::*;
match val {
OP_AUTO => WbOpMode::Auto,
#[cfg(feature = "v1_0")]
OP_SEMI_AUTO => WbOpMode::Invalid,
#[cfg(not(feature = "v1_0"))]
OP_SEMI_AUTO => WbOpMode::Max,
OP_MANUAL => WbOpMode::Manual,
#[cfg(feature = "v1_0")]
_ => WbOpMode::Invalid,
#[cfg(not(feature = "v1_0"))]
_ => WbOpMode::Max,
}
}
}
impl From<ffi::rk_aiq_wb_op_mode_t> for WbOpMode {
fn from(val: ffi::rk_aiq_wb_op_mode_t) -> Self {
use ffi::rk_aiq_wb_op_mode_t::*;
match val {
#[cfg(feature = "v1_0")]
RK_AIQ_WB_MODE_INVALID => WbOpMode::Invalid,
RK_AIQ_WB_MODE_MANUAL => WbOpMode::Manual,
RK_AIQ_WB_MODE_AUTO => WbOpMode::Auto,
RK_AIQ_WB_MODE_MAX => WbOpMode::Max,
}
}
}
impl From<WbOpMode> for ffi::opMode_t {
fn from(val: WbOpMode) -> Self {
use ffi::opMode_t::*;
match val {
#[cfg(feature = "v1_0")]
WbOpMode::Invalid => OP_INVAL,
WbOpMode::Manual => OP_MANUAL,
WbOpMode::Auto => OP_AUTO,
WbOpMode::Max => OP_INVAL,
}
}
}
impl From<WbOpMode> for ffi::rk_aiq_wb_op_mode_t {
fn from(val: WbOpMode) -> Self {
use ffi::rk_aiq_wb_op_mode_t::*;
match val {
#[cfg(feature = "v1_0")]
WbOpMode::Invalid => RK_AIQ_WB_MODE_INVALID,
WbOpMode::Manual => RK_AIQ_WB_MODE_MANUAL,
WbOpMode::Auto => RK_AIQ_WB_MODE_AUTO,
WbOpMode::Max => RK_AIQ_WB_MODE_MAX,
}
}
}