use core::convert::Infallible;
use display_types::cea861::hdmi_forum::HdmiForumFrl;
use hdmi_hal::phy::{EqParams, FrlOutput, HdmiPhy, LanePatterns};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum PhyCall {
SetFrlRate(HdmiForumFrl),
SendLtp(LanePatterns),
SetFrlOutput(FrlOutput),
AdjustEqualization(EqParams),
SetScrambling(bool),
}
pub struct StubPhy<F> {
on_call: F,
}
impl<F: FnMut(PhyCall)> StubPhy<F> {
pub fn new(on_call: F) -> Self {
Self { on_call }
}
}
impl<F: FnMut(PhyCall)> HdmiPhy for StubPhy<F> {
type Error = Infallible;
fn set_frl_rate(&mut self, rate: HdmiForumFrl) -> Result<(), Infallible> {
(self.on_call)(PhyCall::SetFrlRate(rate));
Ok(())
}
fn send_ltp(&mut self, patterns: LanePatterns) -> Result<(), Infallible> {
(self.on_call)(PhyCall::SendLtp(patterns));
Ok(())
}
fn set_frl_output(&mut self, output: FrlOutput) -> Result<(), Infallible> {
(self.on_call)(PhyCall::SetFrlOutput(output));
Ok(())
}
fn adjust_equalization(&mut self, params: EqParams) -> Result<(), Infallible> {
(self.on_call)(PhyCall::AdjustEqualization(params));
Ok(())
}
fn set_scrambling(&mut self, enabled: bool) -> Result<(), Infallible> {
(self.on_call)(PhyCall::SetScrambling(enabled));
Ok(())
}
}
#[cfg(test)]
#[path = "phy_tests.rs"]
mod tests;