use std::time::Duration;
use serde::{Deserialize, Serialize};
use crate::dds::{RpcClient, RpcClientOptions, X5_CAMERA_CONTROL_API_TOPIC};
use crate::types::Result;
crate::api_id_enum! {
X5CameraApiId {
ChangeMode = 5001,
GetStatus = 5002,
}
}
crate::api_id_enum! {
CameraSetMode {
CameraModeNormal = 0,
CameraModeHighResolution = 1,
CameraModeNormalEnable = 2,
CameraModeHighResolutionEnable = 3,
}
}
crate::api_id_enum! {
CameraControlStatus {
CameraStatusNormal = 0,
CameraStatusHighResolution = 1,
CameraStatusError = 2,
CameraStatusNull = 3,
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub struct ChangeModeParameter {
pub mode: i32,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub struct GetStatusResponse {
pub status: i32,
}
impl GetStatusResponse {
#[must_use]
pub fn status_enum(&self) -> Option<CameraControlStatus> {
CameraControlStatus::try_from(self.status).ok()
}
}
pub struct X5CameraClient {
rpc: RpcClient,
}
impl X5CameraClient {
pub fn new() -> Result<Self> {
Self::with_options(RpcClientOptions::for_service(X5_CAMERA_CONTROL_API_TOPIC))
}
pub fn with_startup_wait(startup_wait: Duration) -> Result<Self> {
Self::with_options(
RpcClientOptions::for_service(X5_CAMERA_CONTROL_API_TOPIC)
.with_startup_wait(startup_wait),
)
}
pub fn with_options(options: RpcClientOptions) -> Result<Self> {
let rpc = RpcClient::for_topic(options, X5_CAMERA_CONTROL_API_TOPIC)?;
Ok(Self { rpc })
}
pub async fn change_mode(&self, mode: CameraSetMode) -> Result<()> {
let param = ChangeModeParameter {
mode: i32::from(mode),
};
self.rpc
.call_serialized(X5CameraApiId::ChangeMode, ¶m)
.await
}
pub async fn get_status(&self) -> Result<GetStatusResponse> {
self.rpc.call_response(X5CameraApiId::GetStatus, "").await
}
}