pub struct DataRule(/* private fields */);Expand description
Rule that defines how a signal value is calculated from an implicit initialization value when the rule type is not Explicit.
Data rule objects implement the Struct methods internally and are Core type ctStruct.
@subsection data_rule_explicit Explicit rule
When the rule type of the Data rule is set to Explicit, the values passed through the signal path, described by
the Value descriptor are stored in packet buffers.
The Explicit rule can have 2 optional parameters:
minExpectedDelta: Specifies the minimum difference in value between two subsequent samplesmaxExpectedDelta: Specifies the maximum difference in value between two subsequent samples These are mostly used for domain signals to specify the expected rate of a signal, or the expected timeout of a signal. The delta parameters should be configured to match the deltas in terms of the raw signal values (before scaling/resolution are applied). An explicit rule must have either both or none of these parameters. To use only one, the other must be set to 0. @subsection data_rule_implicit Implicit rule When the rule type of the Data rule is notExplicit, the buffers of packets are empty. The values must instead be calculated via the Implicit value found in the packet buffers in conjunction with the parameters of the rule. Each implicit rule type specifies its own required set of parameters. @subsubsection data_rule_linear Linear rule The parameters include adeltaandstartinteger members. The values are calculated according to the following equation: <em>packetOffset + sampleIndex * delta + start</em>. @subsubsection data_rule_linear Constant rule The parameters contain aconstantnumber member. The value described by the constant rule is always equal to the constant. Wrapper over the openDAQdaqDataRuleinterface.
Implementations§
Source§impl DataRule
impl DataRule
Sourcepub fn constant() -> Result<DataRule>
pub fn constant() -> Result<DataRule>
Creates a DataRule with a Constant rule type configuration.
Calls the openDAQ C function daqDataRule_createConstantDataRule().
Sourcepub fn new(
rule_type: DataRuleType,
parameters: impl Into<Value>,
) -> Result<DataRule>
pub fn new( rule_type: DataRuleType, parameters: impl Into<Value>, ) -> Result<DataRule>
Creates a DataRule with an Explicit rule type configuration and parameters.
§Parameters
rule_type: .parameters: .
Calls the openDAQ C function daqDataRule_createDataRule().
Sourcepub fn from_builder(builder: &DataRuleBuilder) -> Result<DataRule>
pub fn from_builder(builder: &DataRuleBuilder) -> Result<DataRule>
Creates a DataRulePtr from Builder.
§Parameters
builder: DataRule Builder
Calls the openDAQ C function daqDataRule_createDataRuleFromBuilder().
Sourcepub fn explicit() -> Result<DataRule>
pub fn explicit() -> Result<DataRule>
Creates a DataRule with an Explicit rule type configuration and no parameters.
Calls the openDAQ C function daqDataRule_createExplicitDataRule().
Sourcepub fn explicit_domain(
min_expected_delta: impl Into<Value>,
max_expected_delta: impl Into<Value>,
) -> Result<DataRule>
pub fn explicit_domain( min_expected_delta: impl Into<Value>, max_expected_delta: impl Into<Value>, ) -> Result<DataRule>
Creates a DataRule with an Explicit rule type configuration two optional parameters.
§Parameters
min_expected_delta: The lowest expected distance between two samples.max_expected_delta: The highest expected distance between two samples. Most often used for domain signals to specify estimates on how close together/far apart two subsequent samples might be.
Calls the openDAQ C function daqDataRule_createExplicitDomainDataRule().
Sourcepub fn linear(
delta: impl Into<Value>,
start: impl Into<Value>,
) -> Result<DataRule>
pub fn linear( delta: impl Into<Value>, start: impl Into<Value>, ) -> Result<DataRule>
Creates a DataRule with a Linear rule type configuration.
§Parameters
delta: Coefficient by which the input data is to be multiplied.start: Constant that is added to the <em>scale * value</em> multiplication result. The scale and offset are stored within theparametersmember of the Rule object with the scale being at the first position of the list, and the offset at the second.
Calls the openDAQ C function daqDataRule_createLinearDataRule().
Examples found in repository?
62fn main() -> opendaq::Result<()> {
63 let instance = Instance::new()?;
64 let context = instance.context()?.expect("instance context");
65
66 let domain_descriptor = {
67 let builder = DataDescriptorBuilder::new()?;
68 builder.set_sample_type(SampleType::Int64)?;
69 builder.set_name("time")?;
70 // Origin stays at the epoch; the wall-clock time lives in the ticks.
71 builder.set_origin("1970-01-01T00:00:00Z")?;
72 builder.set_tick_resolution(TICK_RESOLUTION)?;
73 builder.set_unit(&Unit::new(-1, "s", "second", "time")?)?;
74 builder.set_rule(&DataRule::linear(TICKS_PER_SAMPLE, 0)?)?;
75 builder.build()?.expect("domain descriptor")
76 };
77 let value_descriptor = {
78 let builder = DataDescriptorBuilder::new()?;
79 builder.set_sample_type(SampleType::Float64)?;
80 builder.set_name("values")?;
81 builder.build()?.expect("value descriptor")
82 };
83
84 let domain_signal = SignalConfig::signal(&context, None, "time", None)?;
85 domain_signal.set_descriptor(&domain_descriptor)?;
86 let signal = SignalConfig::signal(&context, None, "values", None)?;
87 signal.set_descriptor(&value_descriptor)?;
88 signal.set_domain_signal(&domain_signal)?;
89
90 let reader = StreamReader::<f64, i64>::with_options(
91 &signal,
92 StreamReaderOptions {
93 timeout_type: ReadTimeoutType::Any,
94 ..Default::default()
95 },
96 )?;
97
98 // Stream a few seconds of a 5 Hz signal in real time. Each one-second
99 // batch is one packet of 5 samples; the ticks stay contiguous across
100 // batches (batch k starts at start_tick + k*1000 ms), so the whole run is
101 // an unbroken 5 Hz stream anchored to when the program started.
102 let batches = 3;
103 let start_tick = now_ticks();
104 let to_timestamp = TickConverter::from_signal(&signal)?;
105 println!(
106 "Streaming {SAMPLES_PER_SECOND} samples/second, starting at {}",
107 time_of_day(to_timestamp.tick_to_unix_nanos(start_tick))
108 );
109 for batch in 0..batches {
110 let base_sample = batch * SAMPLES_PER_SECOND;
111 let offset = start_tick + base_sample as i64 * TICKS_PER_SAMPLE;
112 let samples: Vec<f64> = (0..SAMPLES_PER_SECOND)
113 .map(|i| (2.0 * PI * ((base_sample + i) as f64 / 25.0)).sin())
114 .collect();
115 send_chunk(
116 &signal,
117 &domain_descriptor,
118 &value_descriptor,
119 offset,
120 &samples,
121 )?;
122
123 let (values, ticks) = reader.read_with_domain(100, 1000)?;
124 for (value, tick) in values.iter().zip(&ticks) {
125 println!(
126 " {} -> {value:.4}",
127 time_of_day(to_timestamp.tick_to_unix_nanos(*tick))
128 );
129 }
130 std::thread::sleep(Duration::from_secs(1));
131 }
132 Ok(())
133}Sourcepub fn parameters(&self) -> Result<HashMap<String, Value>>
pub fn parameters(&self) -> Result<HashMap<String, Value>>
Gets a dictionary of string-object key-value pairs representing the parameters used to evaluate the rule.
§Returns
parameters: The dictionary containing the rule parameter members.
Calls the openDAQ C function daqDataRule_getParameters().
Sourcepub fn type_(&self) -> Result<DataRuleType>
pub fn type_(&self) -> Result<DataRuleType>
Gets the type of the data rule.
§Returns
type: The type of the data rule.
Calls the openDAQ C function daqDataRule_getType().
Methods from Deref<Target = BaseObject>§
Sourcepub fn cast<T: Interface>(&self) -> Result<T>
pub fn cast<T: Interface>(&self) -> Result<T>
Query this object for interface T, returning a wrapper that owns its
own reference.
This is a genuine queryInterface: an object’s interfaces live at
different virtual-table offsets, so the pointer for one interface is
not binary-compatible with another and must be queried, not merely
reinterpreted. Fails with an openDAQ error when the object does not
implement T (use BaseObject::try_cast / BaseObject::is_a to
probe first).
For the few interfaces the C API exposes no GUID for (T::interface_id()
is None), the pointer is reinterpreted unchecked, which is sound only
when the object really lies on T’s inheritance chain.
Examples found in repository?
More examples
22fn show<T: Interface>(label: &str, components: Vec<T>) -> opendaq::Result<()> {
23 let ids = components
24 .iter()
25 .map(|c| c.to_base_object().cast::<Component>()?.local_id())
26 .collect::<opendaq::Result<Vec<_>>>()?;
27 let listing = if ids.is_empty() {
28 "(none)".to_string()
29 } else {
30 ids.join(", ")
31 };
32 println!("{label}\n => {listing}\n");
33 Ok(())
34}
35
36fn main() -> opendaq::Result<()> {
37 let instance = Instance::new()?;
38 instance.add_device("daqref://device0")?;
39 let root = instance.root_device()?.expect("root device");
40
41 // Give a couple of channels some tags, so the tag filter has something to
42 // match. (RefCh0 and RefCh1 come from the reference device unlabelled.)
43 let everything = SearchFilter::recursive(&SearchFilter::any()?)?;
44 for channel in root.channels_with(Some(&everything))? {
45 let tags = channel.tags()?.expect("tags").cast::<TagsPrivate>()?;
46 tags.add("analog")?;
47 if channel.local_id()? == "RefCh0" {
48 tags.add("primary")?;
49 }
50 }
51
52 show(
53 "channels, no filter (immediate children only)",
54 root.channels()?,
55 )?;
56
57 show(
58 "channels, recursive(any)",
59 root.channels_with(Some(&SearchFilter::recursive(&SearchFilter::any()?)?))?,
60 )?;
61
62 show(
63 "channels, recursive(id = RefCh1)",
64 root.channels_with(Some(&SearchFilter::recursive(&SearchFilter::local_id(
65 "RefCh1",
66 )?)?))?,
67 )?;
68
69 let ai0_or_ai1 = SearchFilter::or(
70 &SearchFilter::local_id("AI0")?,
71 &SearchFilter::local_id("AI1")?,
72 )?;
73 show(
74 "signals, recursive(id = AI0 OR id = AI1)",
75 root.signals_with(Some(&SearchFilter::recursive(&ai0_or_ai1)?))?,
76 )?;
77
78 let not_ref_ch1 = SearchFilter::not(&SearchFilter::local_id("RefCh1")?)?;
79 show(
80 "channels, recursive(NOT id = RefCh1)",
81 root.channels_with(Some(&SearchFilter::recursive(¬_ref_ch1)?))?,
82 )?;
83
84 let analog_and_not_ref_ch1 = SearchFilter::and(
85 &SearchFilter::required_tags(vec!["analog"])?,
86 &SearchFilter::not(&SearchFilter::local_id("RefCh1")?)?,
87 )?;
88 show(
89 "channels, recursive(tag = analog AND NOT id = RefCh1)",
90 root.channels_with(Some(&SearchFilter::recursive(&analog_and_not_ref_ch1)?))?,
91 )?;
92
93 Ok(())
94}8fn main() -> opendaq::Result<()> {
9 let instance = Instance::new()?;
10 instance.add_device("daqref://device0")?;
11
12 let channel = instance
13 .find_component("Dev/RefDev0/IO/AI/RefCh0")?
14 .expect("reference channel not found")
15 .cast::<Channel>()?;
16 let signal = &channel.signals()?[0];
17
18 let reader = StreamReader::<f64>::new(signal)?;
19 println!("some samples: {:?}", reader.read(100, 1000)?.values());
20 println!("and more samples: {:?}", reader.read(100, 1000)?.values());
21 println!("and more still: {:?}", reader.read(100, 1000)?.values());
22 Ok(())
23}39fn main() -> opendaq::Result<()> {
40 let instance = Instance::new()?;
41 instance.add_device("daqref://device0")?;
42
43 let channel = instance
44 .find_component("Dev/RefDev0/IO/AI/RefCh0")?
45 .expect("reference channel not found")
46 .cast::<Channel>()?;
47 let signal = &channel.signals()?[0];
48
49 let reader = StreamReader::<f64>::new(signal)?;
50 let converter = TickConverter::from_signal(signal)?;
51
52 let (values, ticks) = reader.read_with_domain(10, 2000)?;
53 println!("Read {} samples:", values.sample_count());
54 for (value, tick) in values.iter().zip(&ticks) {
55 println!(
56 " {value:.6} @ {}",
57 timestamp_to_string(converter.tick_to_unix_nanos(*tick))
58 );
59 }
60 Ok(())
61}Sourcepub fn try_cast<T: Interface>(&self) -> Option<T>
pub fn try_cast<T: Interface>(&self) -> Option<T>
Like BaseObject::cast, but returns None when the object does not
implement T.
Sourcepub fn is_a<T: Interface>(&self) -> bool
pub fn is_a<T: Interface>(&self) -> bool
True when the object implements interface T (a borrowInterface
probe; adds no reference). Returns false for interfaces without a
GUID in the C API, which cannot be probed.
Sourcepub fn equals<T: Interface>(&self, other: &T) -> Result<bool>
pub fn equals<T: Interface>(&self, other: &T) -> Result<bool>
True when openDAQ considers the two objects equal.
Sourcepub fn ptr_eq<T: Interface>(&self, other: &T) -> bool
pub fn ptr_eq<T: Interface>(&self, other: &T) -> bool
Identity comparison: both wrappers refer to the same native object. (Note that pointers to different interfaces of one object differ; this compares the raw interface pointers.)
Sourcepub fn dispose(&self) -> Result<()>
pub fn dispose(&self) -> Result<()>
Release the object’s internal resources early (openDAQ dispose).
The wrapper itself stays alive; most callers never need this.
Sourcepub fn component_kind(&self) -> Option<ComponentKind>
pub fn component_kind(&self) -> Option<ComponentKind>
The most-derived component interface this object implements (probed
most-derived first), or None when it is not a component.
Sourcepub fn to_value(&self) -> Result<Value>
pub fn to_value(&self) -> Result<Value>
The natural Rust value of this object: a boxed scalar yields its
native value, a daq list a Vec, a daq dict key/value pairs – with
elements converted recursively – and an object with no natural Rust
form (a device, a property object, …) comes back as
Value::Object, for the caller to BaseObject::cast.
Trait Implementations§
Source§impl Deref for DataRule
impl Deref for DataRule
Source§type Target = BaseObject
type Target = BaseObject
Source§fn deref(&self) -> &BaseObject
fn deref(&self) -> &BaseObject
Source§impl Interface for DataRule
impl Interface for DataRule
Source§fn interface_id() -> Option<IntfID>
fn interface_id() -> Option<IntfID>
None for the few coretypes interfaces the
C API exposes no id for (IBaseObject, IFunction, IProcedure, …).Source§unsafe fn from_raw(ptr: *mut c_void) -> Option<Self>
unsafe fn from_raw(ptr: *mut c_void) -> Option<Self>
None for null. Read moreSource§fn as_base_object(&self) -> &BaseObject
fn as_base_object(&self) -> &BaseObject
IBaseObject interface.Source§fn to_base_object(&self) -> BaseObject
fn to_base_object(&self) -> BaseObject
BaseObject handle to the same underlying object.