Added physicalOutputQty for daq devices, added possibility to inspect from Python whether device has monitor. Added unit for equation in Qtys. Version bump 1.3.0
All checks were successful
Building, testing and releasing LASP if it has a tag / Build-Test-Ubuntu (push) Successful in 2m49s
Building, testing and releasing LASP if it has a tag / Release-Ubuntu (push) Has been skipped

This commit is contained in:
Anne de Jong 2024-01-10 12:26:38 +01:00
parent 0be8dd71d9
commit 514ed1aa32
8 changed files with 64 additions and 19 deletions

View File

@ -44,22 +44,13 @@ Daq::Daq(const DeviceInfo &devinfo, const DaqConfiguration &config)
: DaqConfiguration(config), DeviceInfo(devinfo) { : DaqConfiguration(config), DeviceInfo(devinfo) {
DEBUGTRACE_ENTER; DEBUGTRACE_ENTER;
if (duplexMode()) {
if (neninchannels() == 0) {
throw rte("Duplex mode enabled, but no input channels enabled");
}
if (nenoutchannels() == 0) {
throw rte("Duplex mode enabled, but no output channels enabled");
}
}
if(!duplexMode() && monitorOutput) { if(!duplexMode() && monitorOutput) {
throw rte("Output monitoring only allowed when running in duplex mode"); throw rte("Duplex mode requires enabling both input and output channels. Please make sure at least one output channel is enabled, or disable hardware output loopback in DAQ configuration.");
} }
if (!hasInternalOutputMonitor && monitorOutput) { if (!hasInternalOutputMonitor && monitorOutput) {
throw rte( throw rte(
"Output monitor flag set, but device does not have output monitor"); "Output monitor flag set, but device does not have hardware output monitor.");
} }
if (!config.match(devinfo)) { if (!config.match(devinfo)) {

View File

@ -35,12 +35,14 @@ DaqConfiguration::DaqConfiguration(const DeviceInfo &device) {
us i = 0; us i = 0;
for (auto &inch : inchannel_config) { for (auto &inch : inchannel_config) {
inch.name = "Unnamed input channel " + std::to_string(i); inch.name = "Unnamed input channel " + std::to_string(i);
inch.rangeIndex = device.prefInputRangeIndex;
i++; i++;
} }
i = 0; i = 0;
for (auto &outch : outchannel_config) { for (auto &outch : outchannel_config) {
outch.name = "Unnamed output channel " + std::to_string(i); outch.name = "Unnamed output channel " + std::to_string(i);
outch.rangeIndex = device.prefOutputRangeIndex;
i++; i++;
} }

View File

@ -68,14 +68,26 @@ public:
us prefFramesPerBlockIndex = 0; us prefFramesPerBlockIndex = 0;
/** /**
* @brief Available ranges for the input, i.e. +/- 1V and/or +/- 10 V etc. * @brief Available ranges for the input, i.e. +/- 1V and/or +/- 10 V etc.
*/ */
dvec availableInputRanges; dvec availableInputRanges;
/** /**
* @brief Its preffered range * @brief Available ranges for the output, i.e. +/- 1V and/or +/- 10 V etc.
*/
dvec availableOutputRanges;
/**
* @brief Its preffered input range
*/ */
int prefInputRangeIndex = 0; int prefInputRangeIndex = 0;
/**
* @brief Its preffered output range
*/
int prefOutputRangeIndex = 0;
/** /**
* @brief The number of input channels available for the device * @brief The number of input channels available for the device
*/ */
@ -125,13 +137,29 @@ public:
bool duplexModeForced = false; bool duplexModeForced = false;
/** /**
* @brief The physical quantity of the output signal. For 'normal' audio * @brief Indicates whether the device is able to run in duplex mode. If false,
* devices cannot run in duplex mode, and the `duplexModeForced` flag is meaningless.
*/
bool hasDuplexMode = false;
/**
* @brief The physical quantity of the input signal from DAQ. For 'normal' audio
* interfaces, this is typically a 'number' between +/- full scale. For some
* real DAQ devices however, the input quantity corresponds to a physical signal,
* such a Volts.
*/
DaqChannel::Qty physicalInputQty = DaqChannel::Qty::Number;
/**
* @brief The physical quantity of the output signal from DAQ. For 'normal' audio
* devices, this is typically a 'number' between +/- full scale. For some * devices, this is typically a 'number' between +/- full scale. For some
* devices however, the output quantity corresponds to a physical signal, * real DAQ devices however, the input quantity corresponds to a physical signal,
* such a Volts. * such a Volts.
*/ */
DaqChannel::Qty physicalOutputQty = DaqChannel::Qty::Number; DaqChannel::Qty physicalOutputQty = DaqChannel::Qty::Number;
/** /**
* @brief String representation of DeviceInfo * @brief String representation of DeviceInfo
* *

View File

@ -99,6 +99,7 @@ void fillRtAudioDeviceInfo(DeviceInfoList &devinfolist) {
d.ninchannels = devinfo.inputChannels; d.ninchannels = devinfo.inputChannels;
d.availableInputRanges = {1.0}; d.availableInputRanges = {1.0};
d.availableOutputRanges = {1.0};
RtAudioFormat formats = devinfo.nativeFormats; RtAudioFormat formats = devinfo.nativeFormats;
if (formats & RTAUDIO_SINT8) { if (formats & RTAUDIO_SINT8) {

View File

@ -68,6 +68,7 @@ void fillUlDaqDeviceInfo(DeviceInfoList &devinfolist) {
} }
devinfo.physicalOutputQty = DaqChannel::Qty::Voltage; devinfo.physicalOutputQty = DaqChannel::Qty::Voltage;
devinfo.physicalInputQty = DaqChannel::Qty::Voltage;
devinfo.availableDataTypes.push_back( devinfo.availableDataTypes.push_back(
DataTypeDescriptor::DataType::dtype_fl64); DataTypeDescriptor::DataType::dtype_fl64);
@ -79,7 +80,9 @@ void fillUlDaqDeviceInfo(DeviceInfoList &devinfolist) {
devinfo.availableFramesPerBlock = {512, 1024, 2048, 4096, 8192}; devinfo.availableFramesPerBlock = {512, 1024, 2048, 4096, 8192};
devinfo.availableInputRanges = {1.0, 10.0}; devinfo.availableInputRanges = {1.0, 10.0};
devinfo.availableOutputRanges = {10.0};
devinfo.prefInputRangeIndex = 0; devinfo.prefInputRangeIndex = 0;
devinfo.prefOutputRangeIndex = 0;
devinfo.ninchannels = 4; devinfo.ninchannels = 4;
devinfo.noutchannels = 1; devinfo.noutchannels = 1;
@ -90,6 +93,7 @@ void fillUlDaqDeviceInfo(DeviceInfoList &devinfolist) {
devinfo.hasInternalOutputMonitor = true; devinfo.hasInternalOutputMonitor = true;
devinfo.hasDuplexMode = true;
devinfo.duplexModeForced = true; devinfo.duplexModeForced = true;
// Finally, this devinfo is pushed back in list // Finally, this devinfo is pushed back in list

View File

@ -29,6 +29,9 @@ void init_deviceinfo(py::module& m) {
devinfo.def_readonly("availableInputRanges", devinfo.def_readonly("availableInputRanges",
&DeviceInfo::availableInputRanges); &DeviceInfo::availableInputRanges);
devinfo.def_readonly("prefInputRangeIndex", &DeviceInfo::prefInputRangeIndex); devinfo.def_readonly("prefInputRangeIndex", &DeviceInfo::prefInputRangeIndex);
devinfo.def_readonly("availableOutputRanges",
&DeviceInfo::availableOutputRanges);
devinfo.def_readonly("prefOutputRangeIndex", &DeviceInfo::prefOutputRangeIndex);
devinfo.def_readonly("ninchannels", &DeviceInfo::ninchannels); devinfo.def_readonly("ninchannels", &DeviceInfo::ninchannels);
devinfo.def_readonly("noutchannels", &DeviceInfo::noutchannels); devinfo.def_readonly("noutchannels", &DeviceInfo::noutchannels);
@ -36,7 +39,10 @@ void init_deviceinfo(py::module& m) {
devinfo.def_readonly("hasInputACCouplingSwitch", devinfo.def_readonly("hasInputACCouplingSwitch",
&DeviceInfo::hasInputACCouplingSwitch); &DeviceInfo::hasInputACCouplingSwitch);
devinfo.def_readonly("hasDuplexMode", &DeviceInfo::hasDuplexMode);
devinfo.def_readonly("duplexModeForced", &DeviceInfo::duplexModeForced);
devinfo.def_readonly("hasInternalOutputMonitor", &DeviceInfo::hasInternalOutputMonitor);
devinfo.def_readonly("physicalInputQty", &DeviceInfo::physicalInputQty);
devinfo.def_readonly("physicalOutputQty", &DeviceInfo::physicalOutputQty); devinfo.def_readonly("physicalOutputQty", &DeviceInfo::physicalOutputQty);
} }

View File

@ -5,7 +5,7 @@ requires-python = ">=3.10"
description = "Library for Acoustic Signal Processing" description = "Library for Acoustic Signal Processing"
license = { "file" = "LICENSE" } license = { "file" = "LICENSE" }
authors = [{ "name" = "J.A. de Jong", "email" = "j.a.dejong@ascee.nl" }] authors = [{ "name" = "J.A. de Jong", "email" = "j.a.dejong@ascee.nl" }]
version = "1.2.0" version = "1.3.0"
keywords = ["DSP", "DAQ", "Signal processing"] keywords = ["DSP", "DAQ", "Signal processing"]

View File

@ -62,8 +62,9 @@ class Qty:
name: str name: str
# I.e.: Pascal # I.e.: Pascal
unit_name: str unit_name: str
# I.e.: Pa # I.e.: -, Pa, V
unit_symb: str unit_symb: str
# I.e.: ('dB SPL') <== tuple of possible level units # I.e.: ('dB SPL') <== tuple of possible level units
level_unit: object level_unit: object
# Contains a tuple of possible level names, including its reference value. # Contains a tuple of possible level names, including its reference value.
@ -92,6 +93,18 @@ class Qty:
""" """
return self.cpp_enum.value return self.cpp_enum.value
@property
def unit_symb_eq(self):
"""Unit symbol to be used in equations
Returns:
String: V, Pa, 1,
"""
if self.unit_symb != '-':
return self.unit_symb
else:
return '1'
@unique @unique