use crate::tapo_vendor::error::Error;
use crate::tapo_vendor::requests::{
SmartCamAddMotorPositionParams, SmartCamDeletePresetParams, SmartCamGetPresetConfigParams,
SmartCamMotorMoveParams, SmartCamMotorMoveToPresetParams, TapoParams, TapoRequest,
};
use crate::tapo_vendor::responses::{DeviceInfoCameraResult, Preset, PresetRaw};
tapo_handler! {
CameraPtzHandler(DeviceInfoCameraResult),
}
camera_device_management_handlers!(CameraPtzHandler);
camera_detection_handlers!(CameraPtzHandler, builder = c220);
camera_stream_handlers!(CameraPtzHandler);
impl CameraPtzHandler {
pub async fn pan_tilt(&self, pan: i32, tilt: i32) -> Result<(), Error> {
let request = TapoRequest::SmartCamMotorMove(TapoParams::new(
SmartCamMotorMoveParams::new(pan, tilt),
));
self.client
.read()
.await
.execute_smart_cam_command(request)
.await
}
pub async fn save_preset(&self, name: &str) -> Result<(), Error> {
let request = TapoRequest::SmartCamAddMotorPosition(TapoParams::new(
SmartCamAddMotorPositionParams::new(name),
));
self.client
.read()
.await
.execute_smart_cam_command(request)
.await
}
pub async fn goto_preset(&self, id: &str) -> Result<(), Error> {
let request = TapoRequest::SmartCamMotorMoveToPreset(TapoParams::new(
SmartCamMotorMoveToPresetParams::new(id),
));
self.client
.read()
.await
.execute_smart_cam_command(request)
.await
}
pub async fn delete_preset(&self, id: &str) -> Result<(), Error> {
let request =
TapoRequest::SmartCamDeletePreset(TapoParams::new(SmartCamDeletePresetParams::new(id)));
self.client
.read()
.await
.execute_smart_cam_command(request)
.await
}
pub async fn get_presets(&self) -> Result<Vec<Preset>, Error> {
let request = TapoRequest::SmartCamGetPresetConfig(TapoParams::new(
SmartCamGetPresetConfigParams::new(),
));
let raw: PresetRaw = self
.client
.read()
.await
.execute_smart_cam_section_request(request)
.await?;
Ok(raw.into_presets())
}
}