Measure a single value
openDAQ offers a variety of solutions for reading Signal values, including Readers.
However, for developers requiring access to only the most recent value, the Signal interface provides a method for doing just that.
Getting the last value of a Signal
Reading the last value of a Signal yields an openDAQ Base object-type value. Said value contains the last sample of the most recent Packet sent through the Signal.
-
Cpp
-
Python
// Get last value of a Signal
auto myLastValue = mySignal.getLastValue();
# Get last value of a Signal
my_last_value = my_signal.last_value
Last value and Signal types
The method for getting the last value yields an openDAQ Base object-type value.
The underlying type of the openDAQ Base object-type value we get from the method call corresponds to the Sample Type in the Data Descriptor of the Signal.
-
openDAQ Float object-type corresponds to
Float32
orFloat64
Sample Types -
openDAQ Integer object-type corresponds to
Int8
throughInt64
orUInt8
throughUInt64
Sample Types -
openDAQ Complex Float object-type corresponds to
ComplexFloat32
orComplexFloat64
Sample Types -
openDAQ Range object-type corresponds to
RangeInt64
Sample Type -
openDAQ Struct object-type corresponds to
Struct
Sample Type and the Data Descriptor must have Struct Fields defined -
openDAQ List object-type corresponds to any of the aforementioned Sample Types and the Data Descriptor must have Dimensions defined
To retrieve the value Sample Type, one can do:
-
Cpp
-
Python
// Retrieve the Signal's Sample Type
auto mySampleType = mySignal.getDescriptor().getSampleType();
# Retrieve the Signal's Sample Type
my_sample_type = my_signal.descriptor.sample_type
Last value for Struct
If the underlying type of the openDAQ Base object-type value we get from the method call is an openDAQ Struct object-type, the Signal’s Data Descriptor has Struct Fields.
All Structs and their respective Struct Fields have their names set. |
For example:
-
Cpp
-
Python
// Check Signal Data Descriptor's Sample Type and name
auto myDescriptor = mySignal.getDescriptor();
assert(myDescriptor.getSampleType() == SampleType::Struct);
assert(myDescriptor.getName() == "MyStruct");
// Check Struct Fields
auto myStructFields = myDescriptor.getStructFields();
assert(myStructFields.getCount() == 2);
assert(myStructFields[0].getSampleType() == SampleType::Int32);
assert(myStructFields[0].getName() == "MyInt32");
assert(myStructFields[1].getSampleType() == SampleType::Float64);
assert(myStructFields[1].getName() == "MyFloat64");
# Not supported in Python yet
Knowing this, we can then do:
-
Cpp
-
Python
// Get last value of a Signal
StructPtr myStruct = mySignal.getLastValue();
// Extract values
int32_t myInt = myStruct.get("MyInt32");
double myFloat = myStruct.get("MyFloat64");
# Not supported in Python yet
Structs can be nested within the Data Descriptor. |
Last value for List
It’s possible for a value of a Signal to be a List.
Dimensions of the Data Descriptor for Lists contain exactly one dimension. |
-
Cpp
-
Python
// Check Dimensions count in Signal's Data Descriptor
assert(mySignal.getDescriptor().getDimensions().getCount() == 1);
// Get last value of a Signal
ListPtr<IBaseObject> myList = mySignal.getLastValue();
// Check the number of elements in List
assert(myList.getCount() == 2);
// Extract the second item on list
auto myItem = myList.getItemAt(1);
# Check Dimensions count in Signal's Data Descriptor
assert len(my_signal.descriptor.dimensions) == 1
# Get last value of a Signal
my_list = my_signal.last_value
# Check the number of elements in List
assert len(my_list) == 2
# Extract the second item on list
my_item = my_list[1]
In the above example, the item’s underlying type will depend upon Signal Data Descriptor’s Sample Type.
Lists may contain (nested) Structs. |