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

  • C#

// Get last value of a Signal
auto myLastValue = mySignal.getLastValue();
# Get last value of a Signal
my_last_value = my_signal.last_value
// Get last value of a Signal
var myLastValue = mySignal.LastValue;

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 or Float64 Sample Types

  • openDAQ™ Integer object-type corresponds to Int8 through Int64 or UInt8 through UInt64 Sample Types

  • openDAQ™ Complex Float object-type corresponds to ComplexFloat32 or ComplexFloat64 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

  • C#

// 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
// Retrieve the Signal's Sample Type
var mySampleType = mySignal.Descriptor.SampleType;

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

  • C#

// 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
var myDescriptor = mySignal.Descriptor;
Debug.Assert(myDescriptor.SampleType == SampleType.Struct);
Debug.Assert(myDescriptor.Name == "MyStruct");
// Check Struct Fields
var myStructFields = myDescriptor.StructFields;
Debug.Assert(myStructFields.Count == 2);
Debug.Assert(myStructFields[0].SampleType == SampleType.Int32);
Debug.Assert(myStructFields[0].Name == "MyInt32");
Debug.Assert(myStructFields[1].SampleType == SampleType.Float64);
Debug.Assert(myStructFields[1].Name == "MyFloat64");

Knowing this, we can then do:

  • Cpp

  • Python

  • C#

// 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
Struct myStruct = mySignal.LastValue;
// Extract values
long myInt = myStruct.Get("MyInt32");
double myFloat = myStruct.Get("MyFloat64");

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

  • C#

// 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 in List
my_item = my_list[1]
// Check Dimensions count in Signal's Data Descriptor
Debug.Assert(mySignal.Descriptor.Dimensions.Count == 1);
// Get last value of a Signal
var myList = mySignal.LastValue.Cast<ListObject<BaseObject>>();
// Check the number of elements in List
Debug.Assert(myList.Count == 2);
// Extract the second item on list
var myItem = myList.GetItemAt(1);

In the above example, the item’s underlying type will depend upon Signal Data Descriptor’s Sample Type.

Lists may contain (nested) Structs.