@@ -27,8 +27,26 @@ use crate::usb::find_endpoint;
|
||||
const SESSION: u32 = 1;
|
||||
|
||||
pub struct Camera {
|
||||
r#impl: Box<dyn CameraImpl<GlobalContext>>,
|
||||
ptp: Ptp,
|
||||
pub r#impl: Box<dyn CameraImpl<GlobalContext>>,
|
||||
pub ptp: Ptp,
|
||||
}
|
||||
|
||||
macro_rules! camera_custom_settings {
|
||||
($( $name:ident : $type:ty => $code:expr ),+ $(,)?) => {
|
||||
$(
|
||||
paste::paste! {
|
||||
#[allow(dead_code)]
|
||||
pub fn [<get_ $name>](&mut self) -> anyhow::Result<$type> {
|
||||
self.r#impl.[<get_ $name>](&mut self.ptp)
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub fn [<set_ $name>](&mut self, value: &$type) -> anyhow::Result<()> {
|
||||
self.r#impl.[<set_ $name>](&mut self.ptp, value)
|
||||
}
|
||||
}
|
||||
)+
|
||||
};
|
||||
}
|
||||
|
||||
impl Camera {
|
||||
@@ -88,183 +106,28 @@ impl Camera {
|
||||
self.r#impl.import_backup(&mut self.ptp, backup)
|
||||
}
|
||||
|
||||
pub fn set_active_custom_setting(&mut self, slot: FujiCustomSetting) -> anyhow::Result<()> {
|
||||
self.r#impl.set_custom_setting_slot(&mut self.ptp, slot)
|
||||
}
|
||||
|
||||
pub fn get_custom_setting_name(&mut self) -> anyhow::Result<FujiCustomSettingName> {
|
||||
self.r#impl.get_custom_setting_name(&mut self.ptp)
|
||||
}
|
||||
|
||||
pub fn set_custom_setting_name(&mut self, value: &str) -> anyhow::Result<()> {
|
||||
self.r#impl.set_custom_setting_name(&mut self.ptp, value)
|
||||
}
|
||||
|
||||
pub fn get_image_size(&mut self) -> anyhow::Result<FujiImageSize> {
|
||||
self.r#impl.get_image_size(&mut self.ptp)
|
||||
}
|
||||
|
||||
pub fn set_image_size(&mut self, value: FujiImageSize) -> anyhow::Result<()> {
|
||||
self.r#impl.set_image_size(&mut self.ptp, value)
|
||||
}
|
||||
|
||||
pub fn get_image_quality(&mut self) -> anyhow::Result<FujiImageQuality> {
|
||||
self.r#impl.get_image_quality(&mut self.ptp)
|
||||
}
|
||||
|
||||
pub fn set_image_quality(&mut self, value: FujiImageQuality) -> anyhow::Result<()> {
|
||||
self.r#impl.set_image_quality(&mut self.ptp, value)
|
||||
}
|
||||
|
||||
pub fn get_dynamic_range(&mut self) -> anyhow::Result<FujiDynamicRange> {
|
||||
self.r#impl.get_dynamic_range(&mut self.ptp)
|
||||
}
|
||||
|
||||
pub fn set_dynamic_range(&mut self, value: FujiDynamicRange) -> anyhow::Result<()> {
|
||||
self.r#impl.set_dynamic_range(&mut self.ptp, value)
|
||||
}
|
||||
|
||||
pub fn get_dynamic_range_priority(&mut self) -> anyhow::Result<FujiDynamicRangePriority> {
|
||||
self.r#impl.get_dynamic_range_priority(&mut self.ptp)
|
||||
}
|
||||
|
||||
pub fn set_dynamic_range_priority(
|
||||
&mut self,
|
||||
value: FujiDynamicRangePriority,
|
||||
) -> anyhow::Result<()> {
|
||||
self.r#impl.set_dynamic_range_priority(&mut self.ptp, value)
|
||||
}
|
||||
|
||||
pub fn get_film_simulation(&mut self) -> anyhow::Result<FujiFilmSimulation> {
|
||||
self.r#impl.get_film_simulation(&mut self.ptp)
|
||||
}
|
||||
|
||||
pub fn set_film_simulation(&mut self, value: FujiFilmSimulation) -> anyhow::Result<()> {
|
||||
self.r#impl.set_film_simulation(&mut self.ptp, value)
|
||||
}
|
||||
|
||||
pub fn get_grain_effect(&mut self) -> anyhow::Result<FujiGrainEffect> {
|
||||
self.r#impl.get_grain_effect(&mut self.ptp)
|
||||
}
|
||||
|
||||
pub fn set_grain_effect(&mut self, value: FujiGrainEffect) -> anyhow::Result<()> {
|
||||
self.r#impl.set_grain_effect(&mut self.ptp, value)
|
||||
}
|
||||
|
||||
pub fn get_white_balance(&mut self) -> anyhow::Result<FujiWhiteBalance> {
|
||||
self.r#impl.get_white_balance(&mut self.ptp)
|
||||
}
|
||||
|
||||
pub fn set_white_balance(&mut self, value: FujiWhiteBalance) -> anyhow::Result<()> {
|
||||
self.r#impl.set_white_balance(&mut self.ptp, value)
|
||||
}
|
||||
|
||||
pub fn get_high_iso_nr(&mut self) -> anyhow::Result<FujiHighISONR> {
|
||||
self.r#impl.get_high_iso_nr(&mut self.ptp)
|
||||
}
|
||||
|
||||
pub fn set_high_iso_nr(&mut self, value: FujiHighISONR) -> anyhow::Result<()> {
|
||||
self.r#impl.set_high_iso_nr(&mut self.ptp, value)
|
||||
}
|
||||
|
||||
pub fn get_highlight_tone(&mut self) -> anyhow::Result<FujiHighlightTone> {
|
||||
self.r#impl.get_highlight_tone(&mut self.ptp)
|
||||
}
|
||||
|
||||
pub fn set_highlight_tone(&mut self, value: FujiHighlightTone) -> anyhow::Result<()> {
|
||||
self.r#impl.set_highlight_tone(&mut self.ptp, value)
|
||||
}
|
||||
|
||||
pub fn get_shadow_tone(&mut self) -> anyhow::Result<FujiShadowTone> {
|
||||
self.r#impl.get_shadow_tone(&mut self.ptp)
|
||||
}
|
||||
|
||||
pub fn set_shadow_tone(&mut self, value: FujiShadowTone) -> anyhow::Result<()> {
|
||||
self.r#impl.set_shadow_tone(&mut self.ptp, value)
|
||||
}
|
||||
|
||||
pub fn get_color(&mut self) -> anyhow::Result<FujiColor> {
|
||||
self.r#impl.get_color(&mut self.ptp)
|
||||
}
|
||||
|
||||
pub fn set_color(&mut self, value: FujiColor) -> anyhow::Result<()> {
|
||||
self.r#impl.set_color(&mut self.ptp, value)
|
||||
}
|
||||
|
||||
pub fn get_sharpness(&mut self) -> anyhow::Result<FujiSharpness> {
|
||||
self.r#impl.get_sharpness(&mut self.ptp)
|
||||
}
|
||||
|
||||
pub fn set_sharpness(&mut self, value: FujiSharpness) -> anyhow::Result<()> {
|
||||
self.r#impl.set_sharpness(&mut self.ptp, value)
|
||||
}
|
||||
|
||||
pub fn get_clarity(&mut self) -> anyhow::Result<FujiClarity> {
|
||||
self.r#impl.get_clarity(&mut self.ptp)
|
||||
}
|
||||
|
||||
pub fn set_clarity(&mut self, value: FujiClarity) -> anyhow::Result<()> {
|
||||
self.r#impl.set_clarity(&mut self.ptp, value)
|
||||
}
|
||||
|
||||
pub fn get_white_balance_shift_red(&mut self) -> anyhow::Result<FujiWhiteBalanceShift> {
|
||||
self.r#impl.get_white_balance_shift_red(&mut self.ptp)
|
||||
}
|
||||
|
||||
pub fn set_white_balance_shift_red(
|
||||
&mut self,
|
||||
value: FujiWhiteBalanceShift,
|
||||
) -> anyhow::Result<()> {
|
||||
self.r#impl
|
||||
.set_white_balance_shift_red(&mut self.ptp, value)
|
||||
}
|
||||
|
||||
pub fn get_white_balance_shift_blue(&mut self) -> anyhow::Result<FujiWhiteBalanceShift> {
|
||||
self.r#impl.get_white_balance_shift_blue(&mut self.ptp)
|
||||
}
|
||||
|
||||
pub fn set_white_balance_shift_blue(
|
||||
&mut self,
|
||||
value: FujiWhiteBalanceShift,
|
||||
) -> anyhow::Result<()> {
|
||||
self.r#impl
|
||||
.set_white_balance_shift_blue(&mut self.ptp, value)
|
||||
}
|
||||
|
||||
pub fn get_white_balance_temperature(&mut self) -> anyhow::Result<FujiWhiteBalanceTemperature> {
|
||||
self.r#impl.get_white_balance_temperature(&mut self.ptp)
|
||||
}
|
||||
|
||||
pub fn set_white_balance_temperature(
|
||||
&mut self,
|
||||
value: FujiWhiteBalanceTemperature,
|
||||
) -> anyhow::Result<()> {
|
||||
self.r#impl
|
||||
.set_white_balance_temperature(&mut self.ptp, value)
|
||||
}
|
||||
|
||||
pub fn get_color_chrome_effect(&mut self) -> anyhow::Result<FujiColorChromeEffect> {
|
||||
self.r#impl.get_color_chrome_effect(&mut self.ptp)
|
||||
}
|
||||
|
||||
pub fn set_color_chrome_effect(&mut self, value: FujiColorChromeEffect) -> anyhow::Result<()> {
|
||||
self.r#impl.set_color_chrome_effect(&mut self.ptp, value)
|
||||
}
|
||||
|
||||
pub fn get_color_chrome_fx_blue(&mut self) -> anyhow::Result<FujiColorChromeFXBlue> {
|
||||
self.r#impl.get_color_chrome_fx_blue(&mut self.ptp)
|
||||
}
|
||||
|
||||
pub fn set_color_chrome_fx_blue(&mut self, value: FujiColorChromeFXBlue) -> anyhow::Result<()> {
|
||||
self.r#impl.set_color_chrome_fx_blue(&mut self.ptp, value)
|
||||
}
|
||||
|
||||
pub fn get_smooth_skin_effect(&mut self) -> anyhow::Result<FujiSmoothSkinEffect> {
|
||||
self.r#impl.get_smooth_skin_effect(&mut self.ptp)
|
||||
}
|
||||
|
||||
pub fn set_smooth_skin_effect(&mut self, value: FujiSmoothSkinEffect) -> anyhow::Result<()> {
|
||||
self.r#impl.set_smooth_skin_effect(&mut self.ptp, value)
|
||||
camera_custom_settings! {
|
||||
active_custom_setting: FujiCustomSetting => DevicePropCode::FujiStillCustomSetting,
|
||||
custom_setting_name: FujiCustomSettingName => DevicePropCode::FujiStillCustomSettingName,
|
||||
image_size: FujiImageSize => DevicePropCode::FujiStillCustomSettingImageSize,
|
||||
image_quality: FujiImageQuality => DevicePropCode::FujiStillCustomSettingImageQuality,
|
||||
dynamic_range: FujiDynamicRange => DevicePropCode::FujiStillCustomSettingDynamicRange,
|
||||
dynamic_range_priority: FujiDynamicRangePriority => DevicePropCode::FujiStillCustomSettingDynamicRangePriority,
|
||||
film_simulation: FujiFilmSimulation => DevicePropCode::FujiStillCustomSettingFilmSimulation,
|
||||
grain_effect: FujiGrainEffect => DevicePropCode::FujiStillCustomSettingGrainEffect,
|
||||
white_balance: FujiWhiteBalance => DevicePropCode::FujiStillCustomSettingWhiteBalance,
|
||||
high_iso_nr: FujiHighISONR => DevicePropCode::FujiStillCustomSettingHighISONR,
|
||||
highlight_tone: FujiHighlightTone => DevicePropCode::FujiStillCustomSettingHighlightTone,
|
||||
shadow_tone: FujiShadowTone => DevicePropCode::FujiStillCustomSettingShadowTone,
|
||||
color: FujiColor => DevicePropCode::FujiStillCustomSettingColor,
|
||||
sharpness: FujiSharpness => DevicePropCode::FujiStillCustomSettingSharpness,
|
||||
clarity: FujiClarity => DevicePropCode::FujiStillCustomSettingClarity,
|
||||
white_balance_shift_red: FujiWhiteBalanceShift => DevicePropCode::FujiStillCustomSettingWhiteBalanceShiftRed,
|
||||
white_balance_shift_blue: FujiWhiteBalanceShift => DevicePropCode::FujiStillCustomSettingWhiteBalanceShiftBlue,
|
||||
white_balance_temperature: FujiWhiteBalanceTemperature => DevicePropCode::FujiStillCustomSettingWhiteBalanceTemperature,
|
||||
color_chrome_effect: FujiColorChromeEffect => DevicePropCode::FujiStillCustomSettingColorChromeEffect,
|
||||
color_chrome_fx_blue: FujiColorChromeFXBlue => DevicePropCode::FujiStillCustomSettingColorChromeFXBlue,
|
||||
smooth_skin_effect: FujiSmoothSkinEffect => DevicePropCode::FujiStillCustomSettingSmoothSkinEffect,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -348,6 +211,28 @@ impl TryFrom<&rusb::Device<GlobalContext>> for Camera {
|
||||
}
|
||||
}
|
||||
|
||||
macro_rules! camera_impl_custom_settings {
|
||||
($( $name:ident : $type:ty => $code:expr ),+ $(,)?) => {
|
||||
$(
|
||||
paste::paste! {
|
||||
#[allow(dead_code)]
|
||||
fn [<get_ $name>](&self, ptp: &mut Ptp) -> anyhow::Result<$type> {
|
||||
let bytes = self.get_prop_value(ptp, $code)?;
|
||||
let result = <$type>::try_from_ptp(&bytes)?;
|
||||
Ok(result)
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
fn [<set_ $name>](&self, ptp: &mut Ptp, value: &$type) -> anyhow::Result<()> {
|
||||
let bytes = value.try_into_ptp()?;
|
||||
self.set_prop_value(ptp, $code, &bytes)?;
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
)+
|
||||
};
|
||||
}
|
||||
|
||||
pub trait CameraImpl<P: rusb::UsbContext> {
|
||||
fn supported_camera(&self) -> &'static SupportedCamera<P>;
|
||||
|
||||
@@ -460,363 +345,27 @@ pub trait CameraImpl<P: rusb::UsbContext> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn set_custom_setting_slot(
|
||||
&self,
|
||||
ptp: &mut Ptp,
|
||||
slot: FujiCustomSetting,
|
||||
) -> anyhow::Result<()> {
|
||||
self.set_prop_value(
|
||||
ptp,
|
||||
DevicePropCode::FujiStillCustomSetting,
|
||||
&slot.try_into_ptp()?,
|
||||
)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn get_custom_setting_name(&self, ptp: &mut Ptp) -> anyhow::Result<FujiCustomSettingName> {
|
||||
let bytes = self.get_prop_value(ptp, DevicePropCode::FujiStillCustomSettingName)?;
|
||||
let result = FujiCustomSettingName::try_from_ptp(&bytes)?;
|
||||
Ok(result)
|
||||
}
|
||||
|
||||
fn set_custom_setting_name(&self, ptp: &mut Ptp, value: &str) -> anyhow::Result<()> {
|
||||
let bytes = value.try_into_ptp()?;
|
||||
self.set_prop_value(ptp, DevicePropCode::FujiStillCustomSettingName, &bytes)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn get_image_size(&self, ptp: &mut Ptp) -> anyhow::Result<FujiImageSize> {
|
||||
let bytes = self.get_prop_value(ptp, DevicePropCode::FujiStillCustomSettingImageSize)?;
|
||||
let result = FujiImageSize::try_from_ptp(&bytes)?;
|
||||
Ok(result)
|
||||
}
|
||||
|
||||
fn set_image_size(&self, ptp: &mut Ptp, value: FujiImageSize) -> anyhow::Result<()> {
|
||||
let bytes = value.try_into_ptp()?;
|
||||
self.set_prop_value(ptp, DevicePropCode::FujiStillCustomSettingImageSize, &bytes)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn get_image_quality(&self, ptp: &mut Ptp) -> anyhow::Result<FujiImageQuality> {
|
||||
let bytes = self.get_prop_value(ptp, DevicePropCode::FujiStillCustomSettingImageQuality)?;
|
||||
let result = FujiImageQuality::try_from_ptp(&bytes)?;
|
||||
Ok(result)
|
||||
}
|
||||
|
||||
fn set_image_quality(&self, ptp: &mut Ptp, value: FujiImageQuality) -> anyhow::Result<()> {
|
||||
let bytes = value.try_into_ptp()?;
|
||||
self.set_prop_value(
|
||||
ptp,
|
||||
DevicePropCode::FujiStillCustomSettingImageQuality,
|
||||
&bytes,
|
||||
)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn get_dynamic_range(&self, ptp: &mut Ptp) -> anyhow::Result<FujiDynamicRange> {
|
||||
let bytes = self.get_prop_value(ptp, DevicePropCode::FujiStillCustomSettingDynamicRange)?;
|
||||
let result = FujiDynamicRange::try_from_ptp(&bytes)?;
|
||||
Ok(result)
|
||||
}
|
||||
|
||||
fn set_dynamic_range(&self, ptp: &mut Ptp, value: FujiDynamicRange) -> anyhow::Result<()> {
|
||||
let bytes = value.try_into_ptp()?;
|
||||
self.set_prop_value(
|
||||
ptp,
|
||||
DevicePropCode::FujiStillCustomSettingDynamicRange,
|
||||
&bytes,
|
||||
)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn get_dynamic_range_priority(
|
||||
&self,
|
||||
ptp: &mut Ptp,
|
||||
) -> anyhow::Result<FujiDynamicRangePriority> {
|
||||
let bytes = self.get_prop_value(
|
||||
ptp,
|
||||
DevicePropCode::FujiStillCustomSettingDynamicRangePriority,
|
||||
)?;
|
||||
let result = FujiDynamicRangePriority::try_from_ptp(&bytes)?;
|
||||
Ok(result)
|
||||
}
|
||||
|
||||
fn set_dynamic_range_priority(
|
||||
&self,
|
||||
ptp: &mut Ptp,
|
||||
value: FujiDynamicRangePriority,
|
||||
) -> anyhow::Result<()> {
|
||||
let bytes = value.try_into_ptp()?;
|
||||
self.set_prop_value(
|
||||
ptp,
|
||||
DevicePropCode::FujiStillCustomSettingDynamicRangePriority,
|
||||
&bytes,
|
||||
)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn get_film_simulation(&self, ptp: &mut Ptp) -> anyhow::Result<FujiFilmSimulation> {
|
||||
let bytes =
|
||||
self.get_prop_value(ptp, DevicePropCode::FujiStillCustomSettingFilmSimulation)?;
|
||||
let result = FujiFilmSimulation::try_from_ptp(&bytes)?;
|
||||
Ok(result)
|
||||
}
|
||||
|
||||
fn set_film_simulation(&self, ptp: &mut Ptp, value: FujiFilmSimulation) -> anyhow::Result<()> {
|
||||
let bytes = value.try_into_ptp()?;
|
||||
self.set_prop_value(
|
||||
ptp,
|
||||
DevicePropCode::FujiStillCustomSettingFilmSimulation,
|
||||
&bytes,
|
||||
)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn get_grain_effect(&self, ptp: &mut Ptp) -> anyhow::Result<FujiGrainEffect> {
|
||||
let bytes = self.get_prop_value(ptp, DevicePropCode::FujiStillCustomSettingGrainEffect)?;
|
||||
let result = FujiGrainEffect::try_from_ptp(&bytes)?;
|
||||
Ok(result)
|
||||
}
|
||||
|
||||
fn set_grain_effect(&self, ptp: &mut Ptp, value: FujiGrainEffect) -> anyhow::Result<()> {
|
||||
let bytes = value.try_into_ptp()?;
|
||||
self.set_prop_value(
|
||||
ptp,
|
||||
DevicePropCode::FujiStillCustomSettingGrainEffect,
|
||||
&bytes,
|
||||
)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn get_white_balance(&self, ptp: &mut Ptp) -> anyhow::Result<FujiWhiteBalance> {
|
||||
let bytes = self.get_prop_value(ptp, DevicePropCode::FujiStillCustomSettingWhiteBalance)?;
|
||||
let result = FujiWhiteBalance::try_from_ptp(&bytes)?;
|
||||
Ok(result)
|
||||
}
|
||||
|
||||
fn set_white_balance(&self, ptp: &mut Ptp, value: FujiWhiteBalance) -> anyhow::Result<()> {
|
||||
let bytes = value.try_into_ptp()?;
|
||||
self.set_prop_value(
|
||||
ptp,
|
||||
DevicePropCode::FujiStillCustomSettingWhiteBalance,
|
||||
&bytes,
|
||||
)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn get_high_iso_nr(&self, ptp: &mut Ptp) -> anyhow::Result<FujiHighISONR> {
|
||||
let bytes = self.get_prop_value(ptp, DevicePropCode::FujiStillCustomSettingHighISONR)?;
|
||||
let result = FujiHighISONR::try_from_ptp(&bytes)?;
|
||||
Ok(result)
|
||||
}
|
||||
|
||||
fn set_high_iso_nr(&self, ptp: &mut Ptp, value: FujiHighISONR) -> anyhow::Result<()> {
|
||||
let bytes = value.try_into_ptp()?;
|
||||
self.set_prop_value(ptp, DevicePropCode::FujiStillCustomSettingHighISONR, &bytes)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn get_highlight_tone(&self, ptp: &mut Ptp) -> anyhow::Result<FujiHighlightTone> {
|
||||
let bytes =
|
||||
self.get_prop_value(ptp, DevicePropCode::FujiStillCustomSettingHighlightTone)?;
|
||||
let result = FujiHighlightTone::try_from_ptp(&bytes)?;
|
||||
Ok(result)
|
||||
}
|
||||
|
||||
fn set_highlight_tone(&self, ptp: &mut Ptp, value: FujiHighlightTone) -> anyhow::Result<()> {
|
||||
let bytes = value.try_into_ptp()?;
|
||||
self.set_prop_value(
|
||||
ptp,
|
||||
DevicePropCode::FujiStillCustomSettingHighlightTone,
|
||||
&bytes,
|
||||
)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn get_shadow_tone(&self, ptp: &mut Ptp) -> anyhow::Result<FujiShadowTone> {
|
||||
let bytes = self.get_prop_value(ptp, DevicePropCode::FujiStillCustomSettingShadowTone)?;
|
||||
let result = FujiShadowTone::try_from_ptp(&bytes)?;
|
||||
Ok(result)
|
||||
}
|
||||
|
||||
fn set_shadow_tone(&self, ptp: &mut Ptp, value: FujiShadowTone) -> anyhow::Result<()> {
|
||||
let bytes = value.try_into_ptp()?;
|
||||
self.set_prop_value(
|
||||
ptp,
|
||||
DevicePropCode::FujiStillCustomSettingShadowTone,
|
||||
&bytes,
|
||||
)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn get_color(&self, ptp: &mut Ptp) -> anyhow::Result<FujiColor> {
|
||||
let bytes = self.get_prop_value(ptp, DevicePropCode::FujiStillCustomSettingColor)?;
|
||||
let result = FujiColor::try_from_ptp(&bytes)?;
|
||||
Ok(result)
|
||||
}
|
||||
|
||||
fn set_color(&self, ptp: &mut Ptp, value: FujiColor) -> anyhow::Result<()> {
|
||||
let bytes = value.try_into_ptp()?;
|
||||
self.set_prop_value(ptp, DevicePropCode::FujiStillCustomSettingColor, &bytes)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn get_sharpness(&self, ptp: &mut Ptp) -> anyhow::Result<FujiSharpness> {
|
||||
let bytes = self.get_prop_value(ptp, DevicePropCode::FujiStillCustomSettingSharpness)?;
|
||||
let result = FujiSharpness::try_from_ptp(&bytes)?;
|
||||
Ok(result)
|
||||
}
|
||||
|
||||
fn set_sharpness(&self, ptp: &mut Ptp, value: FujiSharpness) -> anyhow::Result<()> {
|
||||
let bytes = value.try_into_ptp()?;
|
||||
self.set_prop_value(ptp, DevicePropCode::FujiStillCustomSettingSharpness, &bytes)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn get_clarity(&self, ptp: &mut Ptp) -> anyhow::Result<FujiClarity> {
|
||||
let bytes = self.get_prop_value(ptp, DevicePropCode::FujiStillCustomSettingClarity)?;
|
||||
let result = FujiClarity::try_from_ptp(&bytes)?;
|
||||
Ok(result)
|
||||
}
|
||||
|
||||
fn set_clarity(&self, ptp: &mut Ptp, value: FujiClarity) -> anyhow::Result<()> {
|
||||
let bytes = value.try_into_ptp()?;
|
||||
self.set_prop_value(ptp, DevicePropCode::FujiStillCustomSettingClarity, &bytes)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn get_white_balance_shift_red(&self, ptp: &mut Ptp) -> anyhow::Result<FujiWhiteBalanceShift> {
|
||||
let bytes = self.get_prop_value(
|
||||
ptp,
|
||||
DevicePropCode::FujiStillCustomSettingWhiteBalanceShiftRed,
|
||||
)?;
|
||||
let result = FujiWhiteBalanceShift::try_from_ptp(&bytes)?;
|
||||
Ok(result)
|
||||
}
|
||||
|
||||
fn set_white_balance_shift_red(
|
||||
&self,
|
||||
ptp: &mut Ptp,
|
||||
value: FujiWhiteBalanceShift,
|
||||
) -> anyhow::Result<()> {
|
||||
let bytes = value.try_into_ptp()?;
|
||||
self.set_prop_value(
|
||||
ptp,
|
||||
DevicePropCode::FujiStillCustomSettingWhiteBalanceShiftRed,
|
||||
&bytes,
|
||||
)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn get_white_balance_shift_blue(&self, ptp: &mut Ptp) -> anyhow::Result<FujiWhiteBalanceShift> {
|
||||
let bytes = self.get_prop_value(
|
||||
ptp,
|
||||
DevicePropCode::FujiStillCustomSettingWhiteBalanceShiftBlue,
|
||||
)?;
|
||||
let result = FujiWhiteBalanceShift::try_from_ptp(&bytes)?;
|
||||
Ok(result)
|
||||
}
|
||||
|
||||
fn set_white_balance_shift_blue(
|
||||
&self,
|
||||
ptp: &mut Ptp,
|
||||
value: FujiWhiteBalanceShift,
|
||||
) -> anyhow::Result<()> {
|
||||
let bytes = value.try_into_ptp()?;
|
||||
self.set_prop_value(
|
||||
ptp,
|
||||
DevicePropCode::FujiStillCustomSettingWhiteBalanceShiftBlue,
|
||||
&bytes,
|
||||
)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn get_white_balance_temperature(
|
||||
&self,
|
||||
ptp: &mut Ptp,
|
||||
) -> anyhow::Result<FujiWhiteBalanceTemperature> {
|
||||
let bytes = self.get_prop_value(
|
||||
ptp,
|
||||
DevicePropCode::FujiStillCustomSettingWhiteBalanceTemperature,
|
||||
)?;
|
||||
let result = FujiWhiteBalanceTemperature::try_from_ptp(&bytes)?;
|
||||
Ok(result)
|
||||
}
|
||||
|
||||
fn set_white_balance_temperature(
|
||||
&self,
|
||||
ptp: &mut Ptp,
|
||||
value: FujiWhiteBalanceTemperature,
|
||||
) -> anyhow::Result<()> {
|
||||
let bytes = value.try_into_ptp()?;
|
||||
self.set_prop_value(
|
||||
ptp,
|
||||
DevicePropCode::FujiStillCustomSettingWhiteBalanceTemperature,
|
||||
&bytes,
|
||||
)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn get_color_chrome_effect(&self, ptp: &mut Ptp) -> anyhow::Result<FujiColorChromeEffect> {
|
||||
let bytes =
|
||||
self.get_prop_value(ptp, DevicePropCode::FujiStillCustomSettingColorChromeEffect)?;
|
||||
let result = FujiColorChromeEffect::try_from_ptp(&bytes)?;
|
||||
Ok(result)
|
||||
}
|
||||
|
||||
fn set_color_chrome_effect(
|
||||
&self,
|
||||
ptp: &mut Ptp,
|
||||
value: FujiColorChromeEffect,
|
||||
) -> anyhow::Result<()> {
|
||||
let bytes = value.try_into_ptp()?;
|
||||
self.set_prop_value(
|
||||
ptp,
|
||||
DevicePropCode::FujiStillCustomSettingColorChromeEffect,
|
||||
&bytes,
|
||||
)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn get_color_chrome_fx_blue(&self, ptp: &mut Ptp) -> anyhow::Result<FujiColorChromeFXBlue> {
|
||||
let bytes =
|
||||
self.get_prop_value(ptp, DevicePropCode::FujiStillCustomSettingColorChromeFXBlue)?;
|
||||
let result = FujiColorChromeFXBlue::try_from_ptp(&bytes)?;
|
||||
Ok(result)
|
||||
}
|
||||
|
||||
fn set_color_chrome_fx_blue(
|
||||
&self,
|
||||
ptp: &mut Ptp,
|
||||
value: FujiColorChromeFXBlue,
|
||||
) -> anyhow::Result<()> {
|
||||
let bytes = value.try_into_ptp()?;
|
||||
self.set_prop_value(
|
||||
ptp,
|
||||
DevicePropCode::FujiStillCustomSettingColorChromeFXBlue,
|
||||
&bytes,
|
||||
)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn get_smooth_skin_effect(&self, ptp: &mut Ptp) -> anyhow::Result<FujiSmoothSkinEffect> {
|
||||
let bytes =
|
||||
self.get_prop_value(ptp, DevicePropCode::FujiStillCustomSettingSmoothSkinEffect)?;
|
||||
let result = FujiSmoothSkinEffect::try_from_ptp(&bytes)?;
|
||||
Ok(result)
|
||||
}
|
||||
|
||||
fn set_smooth_skin_effect(
|
||||
&self,
|
||||
ptp: &mut Ptp,
|
||||
value: FujiSmoothSkinEffect,
|
||||
) -> anyhow::Result<()> {
|
||||
let bytes = value.try_into_ptp()?;
|
||||
self.set_prop_value(
|
||||
ptp,
|
||||
DevicePropCode::FujiStillCustomSettingSmoothSkinEffect,
|
||||
&bytes,
|
||||
)?;
|
||||
Ok(())
|
||||
camera_impl_custom_settings! {
|
||||
active_custom_setting: FujiCustomSetting => DevicePropCode::FujiStillCustomSetting,
|
||||
custom_setting_name: FujiCustomSettingName => DevicePropCode::FujiStillCustomSettingName,
|
||||
image_size: FujiImageSize => DevicePropCode::FujiStillCustomSettingImageSize,
|
||||
image_quality: FujiImageQuality => DevicePropCode::FujiStillCustomSettingImageQuality,
|
||||
dynamic_range: FujiDynamicRange => DevicePropCode::FujiStillCustomSettingDynamicRange,
|
||||
dynamic_range_priority: FujiDynamicRangePriority => DevicePropCode::FujiStillCustomSettingDynamicRangePriority,
|
||||
film_simulation: FujiFilmSimulation => DevicePropCode::FujiStillCustomSettingFilmSimulation,
|
||||
grain_effect: FujiGrainEffect => DevicePropCode::FujiStillCustomSettingGrainEffect,
|
||||
white_balance: FujiWhiteBalance => DevicePropCode::FujiStillCustomSettingWhiteBalance,
|
||||
high_iso_nr: FujiHighISONR => DevicePropCode::FujiStillCustomSettingHighISONR,
|
||||
highlight_tone: FujiHighlightTone => DevicePropCode::FujiStillCustomSettingHighlightTone,
|
||||
shadow_tone: FujiShadowTone => DevicePropCode::FujiStillCustomSettingShadowTone,
|
||||
color: FujiColor => DevicePropCode::FujiStillCustomSettingColor,
|
||||
sharpness: FujiSharpness => DevicePropCode::FujiStillCustomSettingSharpness,
|
||||
clarity: FujiClarity => DevicePropCode::FujiStillCustomSettingClarity,
|
||||
white_balance_shift_red: FujiWhiteBalanceShift => DevicePropCode::FujiStillCustomSettingWhiteBalanceShiftRed,
|
||||
white_balance_shift_blue: FujiWhiteBalanceShift => DevicePropCode::FujiStillCustomSettingWhiteBalanceShiftBlue,
|
||||
white_balance_temperature: FujiWhiteBalanceTemperature => DevicePropCode::FujiStillCustomSettingWhiteBalanceTemperature,
|
||||
color_chrome_effect: FujiColorChromeEffect => DevicePropCode::FujiStillCustomSettingColorChromeEffect,
|
||||
color_chrome_fx_blue: FujiColorChromeFXBlue => DevicePropCode::FujiStillCustomSettingColorChromeFXBlue,
|
||||
smooth_skin_effect: FujiSmoothSkinEffect => DevicePropCode::FujiStillCustomSettingSmoothSkinEffect,
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user