culvert_async/client/
version.rs1use hdmi_hal_async::scdc::ScdcTransport;
2
3use crate::ScdcError;
4use culvert::codec;
5
6use super::Scdc;
7
8impl<T: ScdcTransport> Scdc<T> {
9 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 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 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}