use std::time::Duration;
use dvb_ci::resource::ResourceId;
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub enum Event<'a> {
Readable(&'a [u8]),
Tick {
elapsed: Duration,
},
Host(HostRequest<'a>),
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub enum HostRequest<'a> {
Init,
SendCaPmt(&'a [u8]),
MmiMenuAnswer(u8),
MmiEnquiryAnswer(&'a [u8]),
MmiCancel,
EnterMenu,
Descramble(&'a [u8]),
DescramblePrograms(&'a [&'a [u8]]),
AddProgram(&'a [u8]),
RemoveProgram(&'a [u8]),
Shutdown,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub enum Action {
Write(Vec<u8>),
Reset,
QuerySlot,
SetTimer {
after: Duration,
},
Notify(Notification),
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub enum Notification {
CamReady,
ApplicationInfo {
application_type: u8,
manufacturer: u16,
code: u16,
menu: String,
},
CaInfo {
ca_system_ids: Vec<u16>,
},
CaPmtReply {
program_number: u16,
descrambling_ok: bool,
},
Mmi(MmiEvent),
HostControl(HostControlEvent),
SessionOpened {
resource: ResourceId,
},
SessionClosed {
session_nb: u16,
},
Error {
detail: String,
},
HotPlug(HotPlug),
}
impl Notification {
#[must_use]
pub fn hotplug(&self) -> Option<HotPlug> {
if let Notification::HotPlug(h) = self {
Some(*h)
} else {
None
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum HotPlug {
CamPresent,
CamRemoved,
CardInserted,
CardRemoved,
CardChanged,
}
impl HotPlug {
#[must_use]
pub fn name(&self) -> &'static str {
match self {
Self::CamPresent => "cam-present",
Self::CamRemoved => "cam-removed",
Self::CardInserted => "card-inserted",
Self::CardRemoved => "card-removed",
Self::CardChanged => "card-changed",
}
}
}
broadcast_common::impl_spec_display!(HotPlug);
#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub struct MmiMenu {
pub title: String,
pub subtitle: String,
pub bottom: String,
pub choices: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub enum MmiEvent {
Menu(MmiMenu),
List(MmiMenu),
Enquiry {
prompt: String,
blind: bool,
answer_len: u8,
},
Close,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum HostControlEvent {
Tune {
network_id: u16,
original_network_id: u16,
transport_stream_id: u16,
service_id: u16,
},
Replace {
replacement_ref: u8,
replaced_pid: u16,
replacement_pid: u16,
},
ClearReplace {
replacement_ref: u8,
},
AskRelease,
}