Skip to main content

mock_cam_session/
mock_cam_session.rs

1//! Drive a CAM through the `Driver` against an in-memory `MockCaDevice`.
2//!
3//! Shows the host-facing loop: `init` → `pump` (poll cadence) →
4//! `take_notifications`. The same `Driver` API runs against the real Linux
5//! `/dev/dvb/adapterN/caM` device (the `linux` feature) — only the `CaDevice`
6//! changes.
7//!
8//! Run: `cargo run -p dvb-ci-runtime --example mock_cam_session`
9
10use std::time::Duration;
11
12use dvb_ci_runtime::dvb_ci::tpdu::tags;
13use dvb_ci_runtime::{Driver, MockCaDevice, Notification};
14
15fn main() -> std::io::Result<()> {
16    // Script a module that accepts the transport connection (C_T_C_Reply).
17    let dev = MockCaDevice::new([vec![tags::C_T_C_REPLY, 0x01, 0x01]]);
18    let mut driver = Driver::new(dev);
19
20    // Bring the interface up: reset + open the transport connection.
21    driver.init()?;
22    println!("init: sent {} device op(s)", driver.device().ops.len());
23
24    // Pump the device. When readable it reads a frame and feeds the stack;
25    // otherwise it advances the EN 50221 poll cadence by the timeout.
26    for step in 0..5 {
27        let read = driver.pump(Duration::from_millis(100))?;
28        println!("pump {step}: processed_frame={read}");
29    }
30
31    // Anything the host application needs to act on surfaces as a Notification.
32    for note in driver.take_notifications() {
33        match note {
34            Notification::CamReady => println!("note: CAM ready — safe to send ca_pmt"),
35            Notification::ApplicationInfo { menu, .. } => {
36                println!("note: application_information menu={menu:?}")
37            }
38            Notification::CaInfo { ca_system_ids } => {
39                println!("note: ca_info system_ids={ca_system_ids:?}")
40            }
41            other => println!("note: {other:?}"),
42        }
43    }
44
45    // The mock records every device op (writes/ioctls) — handy for assertions.
46    println!("total recorded device ops: {}", driver.device().ops.len());
47    Ok(())
48}