monitor/
monitor.rs

1/*!
2 * Monitor a CEC device.
3 * Think tcpdump.
4 * Needs CAP_NET_ADMIN.
5 */
6
7use cec_linux::*;
8
9fn main() -> std::io::Result<()> {
10    let cec = CecDevice::open("/dev/cec0")?;
11    let capas = cec.get_capas();
12    println!("capas  {:?}", capas);
13    cec.set_mode(CecModeInitiator::None, CecModeFollower::Monitor)?;
14
15    loop {
16        let f = cec.poll(
17            PollFlags::POLLIN | PollFlags::POLLRDNORM | PollFlags::POLLPRI,
18            PollTimeout::NONE,
19        )?;
20
21        if f.intersects(PollFlags::POLLPRI) {
22            let evt = cec.get_event()?;
23            println!("evt {:x?}", evt);
24        }
25        if f.contains(PollFlags::POLLIN | PollFlags::POLLRDNORM) {
26            let msg = cec.rec()?;
27
28            if msg.is_ok() {
29                match (msg.initiator(), msg.destination(), msg.opcode()) {
30                    (i, d, Some(Ok(o))) => {
31                        println!("msg {:?}->{:?} {:?} {:x?}", i, d, o, msg.parameters());
32                    }
33                    _ => println!("msg {:x?}", msg),
34                }
35            } else {
36                println!("msg {:x?}", msg);
37            }
38        }
39    }
40}