reader_invalidation_recovery/
reader_invalidation_recovery.rs1use opendaq::{Channel, Instance, Sample, StreamReader};
6
7fn show_averages<D: Sample + std::fmt::Display>(
10 reader: &StreamReader<f64, D>,
11) -> opendaq::Result<()> {
12 for _ in 0..50 {
13 let (averages, ticks) = reader.read_with_domain(4, 1000)?;
14 if !averages.is_empty() {
15 for (average, tick) in averages.iter().zip(&ticks) {
16 println!(" tick {tick} -> avg {average:.3}");
17 }
18 return Ok(());
19 }
20 }
21 panic!("The statistics stream produced no averages.");
22}
23
24fn main() -> opendaq::Result<()> {
25 let instance = Instance::new()?;
26 instance
27 .add_device("daqref://device0")?
28 .expect("reference device");
29 let channel = instance
30 .find_component("Dev/RefDev0/IO/AI/RefCh0")?
31 .expect("reference channel")
32 .cast::<Channel>()?;
33 channel.set_property_value("Waveform", 0)?;
34 channel.set_property_value("Amplitude", 0.0)?;
35 channel.set_property_value("DC", 2.0)?;
36 channel.set_property_value("NoiseAmplitude", 0.0)?;
37
38 let statistics_fb = instance
41 .add_function_block("RefFBModuleStatistics")?
42 .expect("statistics function block");
43 statistics_fb.input_ports()?[0].connect(&channel.signals()?[0])?;
44 let avg_signal = statistics_fb.signals()?[0].clone();
45
46 let reader = StreamReader::<f64, f64>::new(&avg_signal)?;
49 println!("implicit int64 domain, read as float64:");
50 show_averages(&reader)?;
51
52 statistics_fb.set_property_value("DomainSignalType", 2)?;
59 let mut recovered = None;
60 for _ in 0..50 {
61 match reader.read_with_domain(100, 200) {
62 Ok(_) => continue,
63 Err(err) if err.is_reader_invalidated() => {
64 println!("{err}");
65 recovered = Some(StreamReader::<f64, i64>::from_existing(&reader)?);
69 break;
70 }
71 Err(err) => return Err(err),
72 }
73 }
74 let recovered = recovered.expect("expected the domain change to invalidate the reader");
75
76 println!("explicit RangeInt64 domain, read as int64 range starts:");
77 show_averages(&recovered)?;
78 Ok(())
79}