Skip to main content

culvert_async/client/
version.rs

1use hdmi_hal_async::scdc::ScdcTransport;
2
3use crate::ScdcError;
4use culvert::codec;
5
6use super::Scdc;
7
8impl<T: ScdcTransport> Scdc<T> {
9    /// Reads the sink's SCDC protocol version from `Sink_Version` (0x01).
10    pub async fn read_sink_version(&mut self) -> Result<u8, ScdcError<T::Error>> {
11        self.transport
12            .read(codec::SINK_VERSION)
13            .await
14            .map_err(ScdcError::Transport)
15    }
16
17    /// Writes the source's SCDC protocol version to `Source_Version` (0x02).
18    pub async fn write_source_version(&mut self, version: u8) -> Result<(), ScdcError<T::Error>> {
19        self.transport
20            .write(codec::SOURCE_VERSION, version)
21            .await
22            .map_err(ScdcError::Transport)
23    }
24}
25
26#[cfg(test)]
27mod tests {
28    use super::super::Scdc;
29    use super::super::test_transport::TestTransport;
30    use crate::ScdcError;
31
32    #[pollster::test]
33    async fn read_sink_version_returns_register_value() {
34        let mut sim = TestTransport::new();
35        // Not 0x01 (the version a constant or a mask would also produce).
36        sim.set(0x01, 0xA5);
37        assert_eq!(Scdc::new(sim).read_sink_version().await.unwrap(), 0xA5);
38    }
39
40    #[pollster::test]
41    async fn write_source_version_writes_register() {
42        let mut scdc = Scdc::new(TestTransport::new());
43        scdc.write_source_version(0x5A).await.unwrap();
44        assert_eq!(scdc.into_transport().get(0x02), 0x5A);
45    }
46
47    #[pollster::test]
48    async fn transport_error_propagates() {
49        assert!(
50            Scdc::new(TestTransport::failing_after(0))
51                .read_sink_version()
52                .await
53                .is_err_and(|error| matches!(error, ScdcError::Transport(())))
54        );
55        assert!(
56            Scdc::new(TestTransport::failing_after(0))
57                .write_source_version(1)
58                .await
59                .is_err_and(|error| matches!(error, ScdcError::Transport(())))
60        );
61    }
62}