use std::net::Ipv4Addr;
use std::time::Instant;
use crate::state::{Bay, Device, State};
use crate::types::{
AmpZoneSettings, ArcStatus, BayMirrorStatus, BaySignalDetails, DeviceStatus, PowerStatus,
VolumeMuteStatus,
};
use crate::wire::{
BayFeatures, BayUid, DeviceFeature, DeviceUid, EdidProfile, MxrSignalType, RcType,
};
#[derive(Clone, Debug, PartialEq, Eq)]
#[non_exhaustive]
pub struct DeviceInfo {
pub uid: DeviceUid,
pub name: String,
pub serial: String,
pub model: String,
pub version: String,
pub supported_protocol: u16,
pub features: DeviceFeature,
pub address: Option<Ipv4Addr>,
pub status: DeviceStatus,
pub online: bool,
pub configuration_complete: bool,
pub config_initialised: bool,
pub temperatures: Vec<u8>,
pub mesh_master: DeviceUid,
pub hdbt_outputs: u8,
pub setup_done: Option<bool>,
pub installer_id: Option<u16>,
pub system_status: Option<(u16, String)>,
pub bays: Vec<BayUid>,
}
impl DeviceInfo {
pub(crate) fn of(device: &Device, now: Instant) -> Self {
Self {
uid: device.uid,
name: device.name().to_owned(),
serial: device.serial().to_owned(),
model: device.model_name().to_owned(),
version: device.hello.version.clone(),
supported_protocol: device.hello.supported_protocol,
features: device.hello.features,
address: device.hello.address,
status: device.status(now),
online: device.is_online(now),
configuration_complete: device.configuration_complete(),
config_initialised: device.config_initialised(),
temperatures: device.temperatures.clone(),
mesh_master: device.mesh_master,
hdbt_outputs: device.hdbt_outputs(),
setup_done: device.setup_done,
installer_id: device.installer_id,
system_status: device.sys_status.clone(),
bays: device.bays.values().map(Bay::uid).collect(),
}
}
}
#[derive(Clone, Debug, PartialEq)]
#[non_exhaustive]
pub struct BayInfo {
pub uid: BayUid,
pub port_name: String,
pub user_name: String,
pub bay_num: u8,
pub features: BayFeatures,
pub is_input: bool,
pub is_output: bool,
pub is_audio: bool,
pub has_dolby: bool,
pub is_local: bool,
pub video_source: Option<BayUid>,
pub audio_source: Option<BayUid>,
pub power_status: Option<PowerStatus>,
pub hidden: Option<bool>,
pub faulty: Option<bool>,
pub poe_powered: Option<bool>,
pub hdbt_connected: Option<bool>,
pub signal_detected: Option<bool>,
pub hpd_detected: Option<bool>,
pub cec_detected: Option<bool>,
pub encoder_disabled: Option<bool>,
pub decoder_disabled: Option<bool>,
pub signal_type: Option<String>,
pub signal_details: Option<BaySignalDetails>,
pub signal_mode: MxrSignalType,
pub arc: ArcStatus,
pub volume: Option<VolumeMuteStatus>,
pub rc_type: Option<RcType>,
pub edid_profile: Option<EdidProfile>,
pub mirror: BayMirrorStatus,
pub audio_endpoint: Option<u8>,
pub amp_settings: Option<AmpZoneSettings>,
pub filtered: Vec<DeviceUid>,
pub linked_bay: Option<BayUid>,
pub v2ip_uid: DeviceUid,
}
impl BayInfo {
pub(crate) fn of(state: &State, bay: &Bay) -> Self {
Self {
uid: bay.uid(),
port_name: bay.port_name.clone(),
user_name: bay.user_name().to_owned(),
bay_num: bay.bay_num(),
features: bay.features,
is_input: bay.is_input(),
is_output: bay.is_output(),
is_audio: bay.is_audio(),
has_dolby: bay.has_dolby(),
is_local: bay.is_local(),
video_source: bay.video_source,
audio_source: bay.effective_audio_source(),
power_status: bay.power_status,
hidden: bay.hidden,
faulty: bay.faulty,
poe_powered: bay.poe_powered,
hdbt_connected: bay.hdbt_connected,
signal_detected: bay.signal_detected,
hpd_detected: bay.hpd_detected,
cec_detected: bay.cec_detected,
encoder_disabled: bay.encoder_disabled,
decoder_disabled: bay.decoder_disabled,
signal_type: bay.signal_type.clone(),
signal_details: bay.signal_details,
signal_mode: bay.signal_mode,
arc: bay.arc,
volume: state
.bay(state.volume_bay(bay.uid()))
.and_then(|b| b.audio_volume),
rc_type: bay.rc_type,
edid_profile: bay.edid_profile,
mirror: bay.mirror,
audio_endpoint: bay.audio_endpoint,
amp_settings: bay.amp_settings,
filtered: bay.filtered.clone(),
linked_bay: state.linked_bay(bay.uid()),
v2ip_uid: bay.v2ip_uid,
}
}
}