Dokit
Internal development documentation
Loading...
Searching...
No Matches
DsoCommand Class Reference

The DsoCommand class implements the dso CLI command. More...

Inheritance diagram for DsoCommand:
[legend]
Collaboration diagram for DsoCommand:
[legend]

Public Slots

QStringList processOptions (const QCommandLineParser &parser) override
 Processes the relevant options from the command line parser.
Public Slots inherited from DeviceCommand
bool start () override
 Begins scanning for the Pokit device.
Public Slots inherited from AbstractCommand
virtual QStringList processOptions (const QCommandLineParser &parser)
 Processes the relevant options from the command line parser.
virtual bool start ()=0
 Begins the functionality of this command, and returns true if begun successfully, false otherwise.

Public Member Functions

 DsoCommand (QObject *const parent=nullptr)
 Construct a new DsoCommand object with parent.
QStringList requiredOptions (const QCommandLineParser &parser) const override
 Returns a list of CLI option names required by this command.
QStringList supportedOptions (const QCommandLineParser &parser) const override
 Returns a list of CLI option names supported by this command.
Public Member Functions inherited from DeviceCommand
 DeviceCommand (QObject *const parent=nullptr)
 Construct a new DeviceCommand object with parent.
Public Member Functions inherited from AbstractCommand
 AbstractCommand (QObject *const parent=nullptr)
 Constructs a new command with parent.
Public Member Functions inherited from QObject
virtual const QMetaObjectmetaObject () const const
 QObject (QObject *parent)
virtual bool event (QEvent *e)
virtual bool eventFilter (QObject *watched, QEvent *event)
QString objectName () const const
void setObjectName (const QString &name)
bool isWidgetType () const const
bool isWindowType () const const
bool signalsBlocked () const const
bool blockSignals (bool block)
QThreadthread () const const
void moveToThread (QThread *targetThread)
int startTimer (int interval, Qt::TimerType timerType)
int startTimer (std::chrono::milliseconds time, Qt::TimerType timerType)
void killTimer (int id)
findChild (const QString &name, Qt::FindChildOptions options) const const
QList< T > findChildren (const QString &name, Qt::FindChildOptions options) const const
QList< T > findChildren (const QRegExp &regExp, Qt::FindChildOptions options) const const
QList< T > findChildren (const QRegularExpression &re, Qt::FindChildOptions options) const const
const QObjectListchildren () const const
void setParent (QObject *parent)
void installEventFilter (QObject *filterObj)
void removeEventFilter (QObject *obj)
QMetaObject::Connection connect (const QObject *sender, const char *signal, const char *method, Qt::ConnectionType type) const const
bool disconnect (const char *signal, const QObject *receiver, const char *method) const const
bool disconnect (const QObject *receiver, const char *method) const const
void dumpObjectTree ()
void dumpObjectInfo ()
void dumpObjectTree () const const
void dumpObjectInfo () const const
bool setProperty (const char *name, const QVariant &value)
QVariant property (const char *name) const const
QList< QByteArraydynamicPropertyNames () const const
void destroyed (QObject *obj)
void objectNameChanged (const QString &objectName)
QObjectparent () const const
bool inherits (const char *className) const const
void deleteLater ()
 Q_DISABLE_COPY (Class)
 Q_DISABLE_MOVE (Class)
 Q_DISABLE_COPY_MOVE (Class)
qobject_cast (QObject *object)
qobject_cast (const QObject *object)
qFindChild (const QObject *obj, const QString &name)
QList< T > qFindChildren (const QObject *obj, const QString &name)
QList< T > qFindChildren (const QObject *obj, const QRegExp &regExp)
 Q_CLASSINFO (Name, Value)
 Q_INTERFACES (...)
 Q_PROPERTY (...)
 Q_ENUMS (...)
 Q_FLAGS (...)
 Q_ENUM (...)
 Q_FLAG (...)
 Q_ENUM_NS (...)
 Q_FLAG_NS (...)
 Q_OBJECT Q_OBJECT
 Q_GADGET Q_GADGET
 Q_NAMESPACE Q_NAMESPACE
 Q_NAMESPACE_EXPORT (EXPORT_MACRO)
 Q_SIGNALS Q_SIGNALS
 Q_SIGNAL Q_SIGNAL
 Q_SLOTS Q_SLOTS
 Q_SLOT Q_SLOT
 Q_EMIT Q_EMIT
 Q_INVOKABLE Q_INVOKABLE
 Q_REVISION Q_REVISION
 Q_SET_OBJECT_NAME (Object)
 QT_NO_NARROWING_CONVERSIONS_IN_CONNECT QT_NO_NARROWING_CONVERSIONS_IN_CONNECT

Protected Slots

void serviceDetailsDiscovered () override
 Handles service detail discovery events.
Protected Slots inherited from DeviceCommand
virtual void controllerError (const QLowEnergyController::Error error)
 Handles controller error events.
virtual void deviceDisconnected ()
 Handles device disconnection events.
virtual void serviceError (const QLowEnergyService::ServiceError error)
 Handles service error events.
virtual void serviceDetailsDiscovered ()
 Handles service detail discovery events.
Protected Slots inherited from AbstractCommand
virtual void deviceDiscovered (const QBluetoothDeviceInfo &info)=0
 Handles PokitDiscoveryAgent::pokitDeviceDiscovered signal.
virtual void deviceDiscoveryFinished ()=0
 Handles PokitDiscoveryAgent::deviceDiscoveryFinished signal.

Protected Member Functions

AbstractPokitServicegetService () override
 Returns a Pokit service object for the derived command class.
Protected Member Functions inherited from DeviceCommand
void disconnect (int exitCode=EXIT_SUCCESS)
 Disconnects the underlying Pokit device, and sets exitCode to be return to the OS once the disconnection has taken place.
Protected Member Functions inherited from QObject
QObjectsender () const const
int senderSignalIndex () const const
int receivers (const char *signal) const const
bool isSignalConnected (const QMetaMethod &signal) const const
virtual void timerEvent (QTimerEvent *event)
virtual void childEvent (QChildEvent *event)
virtual void customEvent (QEvent *event)
virtual void connectNotify (const QMetaMethod &signal)
virtual void disconnectNotify (const QMetaMethod &signal)

Private Slots

void settingsWritten ()
 Invoked when the DSO settings have been written.
void metadataRead (const DsoService::Metadata &data)
 Invoked when metadata has been received from the DSO.
void outputSamples (const DsoService::Samples &samples)
 Outputs DSO samples in the selected output format.

Private Attributes

quint8(* minRangeFunc )(const PokitProduct product, const quint32 maxValue)
 Pointer to function for converting rangeOptionValue to a Pokit device's range enumerator.
quint32 rangeOptionValue { 0 }
 The parsed value of range option.
DsoServiceservice { nullptr }
 Bluetooth service this command interacts with.
DsoService::Settings settings
 Settings for the Pokit device's DSO mode.
DsoService::Metadata metadata
 Most recent DSO metadata.
qint32 samplesToGo { 0 }
 Number of samples we're expecting in the current window.
bool showCsvHeader { true }
 Whether or not to show a header as the first line of CSV output.

Additional Inherited Members

Public Types inherited from AbstractCommand
enum class  OutputFormat { Csv , Json , Text }
 Supported output formats. More...
Static Public Member Functions inherited from AbstractCommand
static QString appendSiPrefix (const double value, int precision=6)
 Returns a human-readable version of value, with up-to precision decimal digits, and SI unit prefix when appropiate.
static QString escapeCsvField (const QString &field)
 Returns an RFC 4180 compliant version of field.
template<typename R, typename T = quint32>
static T parseNumber (const QString &value, const QString &unit, const T sensibleMinimum=0)
 Returns value as an integer multiple of the ratio R, as number of type T.
Static Public Member Functions inherited from QObject
QString tr (const char *sourceText, const char *disambiguation, int n)
QString trUtf8 (const char *sourceText, const char *disambiguation, int n)
QMetaObject::Connection connect (const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QMetaObject::Connection connect (const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method, Qt::ConnectionType type)
QMetaObject::Connection connect (const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type)
QMetaObject::Connection connect (const QObject *sender, PointerToMemberFunction signal, Functor functor)
QMetaObject::Connection connect (const QObject *sender, PointerToMemberFunction signal, const QObject *context, Functor functor, Qt::ConnectionType type)
bool disconnect (const QObject *sender, const char *signal, const QObject *receiver, const char *method)
bool disconnect (const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method)
bool disconnect (const QMetaObject::Connection &connection)
bool disconnect (const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method)
Public Attributes inherited from QObject
typedef QObjectList
Static Protected Member Functions inherited from DeviceCommand
template<typename T>
static T minRange (const quint32 maxValue)
static quint8 minCapacitanceRange (const PokitProduct product, const quint32 maxValue)
 Returns the product's lowest capacitance range that can measure at least up to maxValue (nF), or AutoRange if no such range is available.
static quint8 minCurrentRange (const PokitProduct product, const quint32 maxValue)
 Returns the product's lowest current range that can measure at least up to maxValue (μA), or AutoRange if no such range is available.
static quint8 minResistanceRange (const PokitProduct product, const quint32 maxValue)
 Returns the product's lowest resistance range that can measure at least up to maxValue (Ω), or AutoRange if no such range is available.
static quint8 minVoltageRange (const PokitProduct product, const quint32 maxValue)
 Returns the product's lowest voltage range that can measure at least up to maxValue (mV), or AutoRange if no such range is available.
Static Protected Member Functions inherited from AbstractCommand
static Q_LOGGING_CATEGORY (lc, "dokit.cli.command", QtInfoMsg)
 Logging category for UI commands.
Protected Attributes inherited from DeviceCommand
PokitDevicedevice { nullptr }
 Pokit Bluetooth device (if any) this command interacts with.
int exitCodeOnDisconnect { EXIT_FAILURE }
 Exit code to return on device disconnection.
Protected Attributes inherited from AbstractCommand
QString deviceToScanFor
 Device (if any) that were passed to processOptions().
PokitDiscoveryAgentdiscoveryAgent
 Agent for Pokit device discovery.
OutputFormat format { OutputFormat::Text }
 Selected output format.
Properties inherited from QObject
 objectName

Detailed Description

The DsoCommand class implements the dso CLI command.

Definition at line 10 of file dsocommand.h.

Constructor & Destructor Documentation

◆ DsoCommand()

DsoCommand::DsoCommand ( QObject *const parent = nullptr)
explicit

Construct a new DsoCommand object with parent.

Definition at line 25 of file dsocommand.cpp.

26{
27
28}
DeviceCommand(QObject *const parent=nullptr)
Construct a new DeviceCommand object with parent.
QObject * parent() const const

References DeviceCommand::DeviceCommand(), QObject::parent(), and QObject::QObject().

Here is the call graph for this function:

Member Function Documentation

◆ getService()

AbstractPokitService * DsoCommand::getService ( )
overrideprotectedvirtual

Returns a Pokit service object for the derived command class.

This override returns a pointer to a DsoService object.

Implements DeviceCommand.

Definition at line 186 of file dsocommand.cpp.

187{
188 Q_ASSERT(device);
189 if (!service) {
190 service = device->dso();
191 Q_ASSERT(service);
194 }
195 return service;
196}
PokitDevice * device
Pokit Bluetooth device (if any) this command interacts with.
DsoService * service
Bluetooth service this command interacts with.
Definition dsocommand.h:32
void settingsWritten()
Invoked when the DSO settings have been written.
void settingsWritten()
This signal is emitted when the Settings characteristic has been written successfully.
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)

References QObject::connect(), DeviceCommand::device, service, settingsWritten(), and DsoService::settingsWritten().

Here is the call graph for this function:

◆ metadataRead

void DsoCommand::metadataRead ( const DsoService::Metadata & data)
privateslot

Invoked when metadata has been received from the DSO.

Definition at line 248 of file dsocommand.cpp.

249{
250 qCDebug(lc) << "status:" << (int)(data.status);
251 qCDebug(lc) << "scale:" << data.scale;
252 qCDebug(lc) << "mode:" << DsoService::toString(data.mode);
253 qCDebug(lc) << "range:" << service->toString(data.range, data.mode);
254 qCDebug(lc) << "samplingWindow:" << (int)data.samplingWindow;
255 qCDebug(lc) << "numberOfSamples:" << data.numberOfSamples;
256 qCDebug(lc) << "samplingRate:" << data.samplingRate << "Hz";
257 this->metadata = data;
258 this->samplesToGo = data.numberOfSamples;
259}
qint32 samplesToGo
Number of samples we're expecting in the current window.
Definition dsocommand.h:38
DsoService::Metadata metadata
Most recent DSO metadata.
Definition dsocommand.h:37
static QString toString(const Command &command)
Returns command as a user-friendly string.
quint32 samplingRate
Sampling rate used during last acquisition (1 to 1MHz).
Definition dsoservice.h:92
DsoStatus status
Current DSO status.
Definition dsoservice.h:86
float scale
Scale to apply to read samples.
Definition dsoservice.h:87
quint16 numberOfSamples
Number of samples acquired (1 to 8192).
Definition dsoservice.h:91
quint8 range
Range used during last acquisition.
Definition dsoservice.h:89
Mode mode
Operation mode used during last acquisition.
Definition dsoservice.h:88
quint32 samplingWindow
Sampling window (microseconds) used during last acquisition.
Definition dsoservice.h:90

References metadata, DsoService::Metadata::mode, DsoService::Metadata::numberOfSamples, DsoService::Metadata::range, samplesToGo, DsoService::Metadata::samplingRate, DsoService::Metadata::samplingWindow, DsoService::Metadata::scale, service, DsoService::Metadata::status, and DsoService::toString().

Referenced by settingsWritten().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ outputSamples

void DsoCommand::outputSamples ( const DsoService::Samples & samples)
privateslot

Outputs DSO samples in the selected output format.

Definition at line 264 of file dsocommand.cpp.

265{
266 QString unit;
267 switch (metadata.mode) {
268 case DsoService::Mode::DcVoltage: unit = u"Vdc"_s; break;
269 case DsoService::Mode::AcVoltage: unit = u"Vac"_s; break;
270 case DsoService::Mode::DcCurrent: unit = u"Adc"_s; break;
271 case DsoService::Mode::AcCurrent: unit = u"Aac"_s; break;
272 default:
273 qCDebug(lc).noquote() << tr(R"(No known unit for mode %1 "%2".)").arg((int)metadata.mode)
275 }
276 const QString range = service->toString(metadata.range, metadata.mode);
277
278 for (const qint16 &sample: samples) {
279 static int sampleNumber = 0; ++sampleNumber;
280 const float value = sample * metadata.scale;
281 switch (format) {
283 for (; showCsvHeader; showCsvHeader = false) {
284 std::cout << qUtf8Printable(tr("sample_number,value,unit,range\n"));
285 }
286 std::cout << qUtf8Printable(QString::fromLatin1("%1,%2,%3,%4\n")
287 .arg(sampleNumber).arg(value).arg(unit, range));
288 break;
290 std::cout << QJsonDocument(QJsonObject{
291 { u"value"_s, value },
292 { u"unit"_s, unit },
293 { u"range"_s, range },
294 { u"mode"_s, DsoService::toString(metadata.mode) },
295 }).toJson().toStdString();
296 break;
298 std::cout << qUtf8Printable(tr("%1 %2 %3\n").arg(sampleNumber).arg(value).arg(unit));
299 break;
300 }
301 --samplesToGo;
302 }
303 if (samplesToGo <= 0) {
304 qCInfo(lc).noquote() << tr("Finished fetching %Ln sample/s (with %L2 to remaining).",
305 nullptr, metadata.numberOfSamples).arg(samplesToGo);
306 if (device) disconnect(); // Will exit the application once disconnected.
307 }
308}
OutputFormat format
Selected output format.
@ Text
Plain unstructured text.
@ Csv
RFC 4180 compliant CSV text.
@ Json
RFC 8259 compliant JSON text.
void disconnect(int exitCode=EXIT_SUCCESS)
Disconnects the underlying Pokit device, and sets exitCode to be return to the OS once the disconnect...
bool showCsvHeader
Whether or not to show a header as the first line of CSV output.
Definition dsocommand.h:39
@ DcVoltage
Measure DC voltage.
Definition dsoservice.h:55
@ AcCurrent
Measure AC current.
Definition dsoservice.h:58
@ AcVoltage
Measure AC voltage.
Definition dsoservice.h:56
@ DcCurrent
Measure DC current.
Definition dsoservice.h:57
QString tr(const char *sourceText, const char *disambiguation, int n)
QString arg(qlonglong a, int fieldWidth, int base, QChar fillChar) const const
QString fromLatin1(const char *str, int size)

References DsoService::AcCurrent, DsoService::AcVoltage, QString::arg(), AbstractCommand::Csv, DsoService::DcCurrent, DsoService::DcVoltage, DeviceCommand::device, DeviceCommand::disconnect(), AbstractCommand::format, QString::fromLatin1(), AbstractCommand::Json, metadata, samplesToGo, service, showCsvHeader, AbstractCommand::Text, DsoService::toString(), and QObject::tr().

Referenced by settingsWritten().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ processOptions

QStringList DsoCommand::processOptions ( const QCommandLineParser & parser)
overrideslot

Processes the relevant options from the command line parser.

This implementation extends DeviceCommand::processOptions to process additional CLI options supported (or required) by this command.

Todo
Does Pokit Pro allow 'Auto' in DSO mode?

Definition at line 54 of file dsocommand.cpp.

55{
56 QStringList errors = DeviceCommand::processOptions(parser);
57 if (!errors.isEmpty()) {
58 return errors;
59 }
60
61 // Parse the (required) mode option.
62 if (const QString mode = parser.value(u"mode"_s).trimmed().toLower();
63 mode.startsWith(u"ac v"_s) || mode.startsWith(u"vac"_s)) {
65 } else if (mode.startsWith(u"dc v"_s) || mode.startsWith(u"vdc"_s)) {
67 } else if (mode.startsWith(u"ac c"_s) || mode.startsWith(u"aac"_s)) {
69 } else if (mode.startsWith(u"dc c"_s) || mode.startsWith(u"adc"_s)) {
71 } else {
72 errors.append(tr("Unknown DSO mode: %1").arg(parser.value(u"mode"_s)));
73 return errors;
74 }
75
76 // Parse the (required) range option.
77 QString unit;
78 {
79 const QString value = parser.value(u"range"_s);
80 quint32 sensibleMinimum = 0;
81 switch (settings.mode) {
83 Q_ASSERT(false); // Not possible, since the mode parsing above never allows Idle.
84 break;
88 unit = u"V"_s;
89 sensibleMinimum = 50; // mV.
90 break;
94 unit = u"A"_s;
95 sensibleMinimum = 5; // mA.
96 break;
97 }
98 Q_ASSERT(!unit.isEmpty());
99 rangeOptionValue = parseNumber<std::milli>(value, unit, sensibleMinimum);
100 if (rangeOptionValue == 0) {
101 errors.append(tr("Invalid range value: %1").arg(value));
102 }
103 }
104
105 // Parse the trigger-level option.
106 if (parser.isSet(u"trigger-level"_s)) {
107 float sign = 1.0;
108 const QString rawValue = parser.value(u"trigger-level"_s);
109 QString absValue = rawValue;
110 DOKIT_STRING_INDEX_TYPE nonSpacePos;
111 for (nonSpacePos = 0; (nonSpacePos < rawValue.length()) && (rawValue.at(nonSpacePos) == u' '); ++nonSpacePos);
112 if ((nonSpacePos < rawValue.length()) && (rawValue.at(nonSpacePos) == u'-')) {
113 absValue = rawValue.mid(nonSpacePos+1);
114 sign = -1.0;
115 }
116 const float level = parseNumber<std::ratio<1>,float>(absValue, unit, 0.f);
117 qCDebug(lc) << "Trigger level" << rawValue << absValue << nonSpacePos << sign << level;
118 if (qIsNaN(level)) {
119 errors.append(tr("Invalid trigger-level value: %1").arg(rawValue));
120 } else {
121 settings.triggerLevel = sign * level;
122 qCDebug(lc) << "Trigger level" << settings.triggerLevel;
123 // Check the trigger level is within the Votage / Current range.
124 /// \todo Does Pokit Pro allow 'Auto' in DSO mode?
125 if ((rangeOptionValue != 0) && (qAbs(settings.triggerLevel) > (rangeOptionValue/1000.0))) {
126 errors.append(tr("Trigger-level %1%2 is outside range ±%3%2").arg(
127 appendSiPrefix(settings.triggerLevel), unit, appendSiPrefix(rangeOptionValue / 1000.0)));
128 }
129 }
130 }
131
132 // Parse the trigger-mode option.
133 if (parser.isSet(u"trigger-mode"_s)) {
134 const QString triggerMode = parser.value(u"trigger-mode"_s).trimmed().toLower();
135 if (triggerMode.startsWith(u"free"_s)) {
137 } else if (triggerMode.startsWith(u"ris"_s)) {
139 } else if (triggerMode.startsWith(u"fall"_s)) {
141 } else {
142 errors.append(tr("Unknown trigger mode: %1").arg(parser.value(u"trigger-mode"_s)));
143 }
144 }
145
146 // Ensure that if either trigger option is present, then both are.
147 if (parser.isSet(u"trigger-level"_s) != parser.isSet(u"trigger-mode"_s)) {
148 errors.append(tr("If either option is provided, then both must be: trigger-level, trigger-mode"));
149 }
150
151 // Parse the interval option.
152 if (parser.isSet(u"interval"_s)) {
153 const QString value = parser.value(u"interval"_s);
154 const quint32 interval = parseNumber<std::micro>(value, u"s"_s, (quint32)500'000);
155 if (interval == 0) {
156 errors.append(tr("Invalid interval value: %1").arg(value));
157 } else {
158 settings.samplingWindow = interval;
159 }
160 }
161
162 // Parse the samples option.
163 if (parser.isSet(u"samples"_s)) {
164 const QString value = parser.value(u"samples"_s);
165 const quint32 samples = parseNumber<std::ratio<1>>(value, u"S"_s);
166 if (samples == 0) {
167 errors.append(tr("Invalid samples value: %1").arg(value));
168 } else if (samples > std::numeric_limits<quint16>::max()) {
169 errors.append(tr("Samples value (%1) must be no greater than %2")
170 .arg(value).arg(std::numeric_limits<quint16>::max()));
171 } else {
172 if (samples > 8192) {
173 qCWarning(lc).noquote() << tr("Pokit devices do not officially support great than 8192 samples");
174 }
175 settings.numberOfSamples = (quint16)samples;
176 }
177 }
178 return errors;
179}
static QString appendSiPrefix(const double value, int precision=6)
Returns a human-readable version of value, with up-to precision decimal digits, and SI unit prefix wh...
static T parseNumber(const QString &value, const QString &unit, const T sensibleMinimum=0)
Returns value as an integer multiple of the ratio R, as number of type T.
virtual QStringList processOptions(const QCommandLineParser &parser)
Processes the relevant options from the command line parser.
static quint8 minVoltageRange(const PokitProduct product, const quint32 maxValue)
Returns the product's lowest voltage range that can measure at least up to maxValue (mV),...
static quint8 minCurrentRange(const PokitProduct product, const quint32 maxValue)
Returns the product's lowest current range that can measure at least up to maxValue (μA),...
DsoService::Settings settings
Settings for the Pokit device's DSO mode.
Definition dsocommand.h:33
quint8(* minRangeFunc)(const PokitProduct product, const quint32 maxValue)
Pointer to function for converting rangeOptionValue to a Pokit device's range enumerator.
Definition dsocommand.h:30
quint32 rangeOptionValue
The parsed value of range option.
Definition dsocommand.h:31
@ Idle
Make device idle.
Definition dsoservice.h:54
@ FreeRunning
Run free, without waiting for edge triggers.
Definition dsoservice.h:45
@ RisingEdgeTrigger
Trigger on a rising edge.
Definition dsoservice.h:46
@ FallingEdgeTrigger
Trigger on a falling edge.
Definition dsoservice.h:47
bool isSet(const QString &name) const const
QString value(const QString &optionName) const const
void append(const T &value)
bool isEmpty() const const
const QChar at(int position) const const
bool isEmpty() const const
int length() const const
QString mid(int position, int n) const const
bool startsWith(const QString &s, Qt::CaseSensitivity cs) const const
QString toLower() const const
QString trimmed() const const
#define DOKIT_STRING_INDEX_TYPE
Internal macro for matching the index type used by QString methods.

References DsoService::AcCurrent, DsoService::AcVoltage, QList::append(), AbstractCommand::appendSiPrefix(), QString::at(), DsoService::DcCurrent, DsoService::DcVoltage, DOKIT_STRING_INDEX_TYPE, DsoService::FallingEdgeTrigger, DsoService::FreeRunning, DsoService::Idle, QList::isEmpty(), QString::isEmpty(), QCommandLineParser::isSet(), QString::length(), QString::mid(), DeviceCommand::minCurrentRange(), minRangeFunc, DeviceCommand::minVoltageRange(), AbstractCommand::parseNumber(), AbstractCommand::processOptions(), rangeOptionValue, DsoService::RisingEdgeTrigger, settings, QString::startsWith(), QString::toLower(), QObject::tr(), QString::trimmed(), and QCommandLineParser::value().

Here is the call graph for this function:

◆ requiredOptions()

QStringList DsoCommand::requiredOptions ( const QCommandLineParser & parser) const
overridevirtual

Returns a list of CLI option names required by this command.

The main console appication may use this list to output an error (and exit) if any of the returned names are not found in the parsed CLI options.

The (already parsed) parser may be used adjust the returned required options depending on the value of other options. For example, the logger command only requires the --mode option if the --command option is start.

This base implementation simply returns an empty list. Derived classes should override this function to include any required options.

Reimplemented from AbstractCommand.

Definition at line 30 of file dsocommand.cpp.

31{
32 return DeviceCommand::requiredOptions(parser) + QStringList{
33 u"mode"_s,
34 u"range"_s,
35 };
36}
virtual QStringList requiredOptions(const QCommandLineParser &parser) const
Returns a list of CLI option names required by this command.

References AbstractCommand::requiredOptions().

Here is the call graph for this function:

◆ serviceDetailsDiscovered

void DsoCommand::serviceDetailsDiscovered ( )
overrideprotectedslot

Handles service detail discovery events.

This override fetches the current device's status, and outputs it in the selected format.

Definition at line 203 of file dsocommand.cpp.

204{
205 DeviceCommand::serviceDetailsDiscovered(); // Just logs consistently.
207 const QString range = service->toString(settings.range, settings.mode);
208 const QString triggerInfo = (settings.command == DsoService::Command::FreeRunning) ? QString() :
209 tr(", and a %1 at %2%3%4").arg(DsoService::toString(settings.command).toLower(),
210 (settings.triggerLevel < 0.) ? u"-"_s : u""_s, appendSiPrefix(qAbs(settings.triggerLevel)),
211 range.at(range.size()-1));
212 qCInfo(lc).noquote() << tr("Sampling %1, with range %2, %Ln sample/s over %L3us%4.", nullptr, settings.numberOfSamples)
213 .arg(DsoService::toString(settings.mode), (range.isNull()) ? QString::fromLatin1("N/A") : range)
214 .arg(settings.samplingWindow).arg(triggerInfo);
215 service->setSettings(settings);
216}
virtual void serviceDetailsDiscovered()
Handles service detail discovery events.
QTPOKIT_EXPORT PokitProduct pokitProduct(const QBluetoothDeviceInfo &info)
Returns the PokitProduct corresponding the Bluetooth device info.
bool isNull() const const
int size() const const

References AbstractCommand::appendSiPrefix(), QString::arg(), QString::at(), DsoService::FreeRunning, QString::fromLatin1(), QString::isNull(), minRangeFunc, rangeOptionValue, service, DeviceCommand::serviceDetailsDiscovered(), settings, QString::size(), DsoService::toString(), and QObject::tr().

Here is the call graph for this function:

◆ settingsWritten

void DsoCommand::settingsWritten ( )
privateslot

Invoked when the DSO settings have been written.

Definition at line 235 of file dsocommand.cpp.

236{
237 Q_ASSERT(service);
238 qCDebug(lc).noquote() << tr("Settings written; DSO has started.");
241 service->enableMetadataNotifications();
242 service->enableReadingNotifications();
243}
void outputSamples(const DsoService::Samples &samples)
Outputs DSO samples in the selected output format.
void metadataRead(const DsoService::Metadata &data)
Invoked when metadata has been received from the DSO.
void metadataRead(const DsoService::Metadata &meta)
This signal is emitted when the Metadata characteristic has been read successfully.
void samplesRead(const DsoService::Samples &samples)
This signal is emitted when the Reading characteristic has been notified.

References QObject::connect(), metadataRead(), DsoService::metadataRead(), outputSamples(), DsoService::samplesRead(), service, and QObject::tr().

Referenced by getService().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ supportedOptions()

QStringList DsoCommand::supportedOptions ( const QCommandLineParser & parser) const
overridevirtual

Returns a list of CLI option names supported by this command.

The main console appication may use this list to output a warning for any parsed CLI options not included in the returned list.

The (already parsed) parser may be used adjust the returned supported options depending on the value of other options. For example, the logger command only supported the --timestamp option if the --command option is start.

This base implementation simply returns requiredOptions(). Derived classes should override this function to include optional options, such as:

QStringList Derived::supportedOptions(const QCommandLineParser &parser) const
{
list.sort();
list.removeDuplicates(); // Optional, recommended.
return list;
}
virtual QStringList supportedOptions(const QCommandLineParser &parser) const
Returns a list of CLI option names supported by this command.
int removeDuplicates()
void sort(Qt::CaseSensitivity cs)

Reimplemented from AbstractCommand.

Definition at line 38 of file dsocommand.cpp.

39{
40 return DeviceCommand::supportedOptions(parser) + QStringList{
41 u"interval"_s,
42 u"samples"_s,
43 u"trigger-level"_s,
44 u"trigger-mode"_s,
45 };
46}

References AbstractCommand::supportedOptions().

Here is the call graph for this function:

Member Data Documentation

◆ metadata

DsoService::Metadata DsoCommand::metadata
private

Most recent DSO metadata.

Definition at line 37 of file dsocommand.h.

Referenced by metadataRead(), and outputSamples().

◆ minRangeFunc

quint8(* DsoCommand::minRangeFunc) (const PokitProduct product, const quint32 maxValue)
inlineprivate

Pointer to function for converting rangeOptionValue to a Pokit device's range enumerator.

This function pointer is assigned during the command line parsing, but is not invoked until after the device's services are discovered, because prior to that discovery, we don't know which product (Meter vs Pro vs Clamp, etc) we're talking to and thus which enumerator list to be using.

If the current mode does not support ranges (eg diode, and continuity modes), then this member will be nullptr.

See also
processOptions
serviceDetailsDiscovered

Definition at line 30 of file dsocommand.h.

30{ nullptr };

Referenced by processOptions(), and serviceDetailsDiscovered().

◆ rangeOptionValue

quint32 DsoCommand::rangeOptionValue { 0 }
private

The parsed value of range option.

Definition at line 31 of file dsocommand.h.

31{ 0 }; ///< The parsed value of range option.

Referenced by processOptions(), and serviceDetailsDiscovered().

◆ samplesToGo

qint32 DsoCommand::samplesToGo { 0 }
private

Number of samples we're expecting in the current window.

Definition at line 38 of file dsocommand.h.

38{ 0 }; ///< Number of samples we're expecting in the current window.

Referenced by metadataRead(), and outputSamples().

◆ service

DsoService* DsoCommand::service { nullptr }
private

Bluetooth service this command interacts with.

Definition at line 32 of file dsocommand.h.

32{ nullptr }; ///< Bluetooth service this command interacts with.

Referenced by getService(), metadataRead(), outputSamples(), serviceDetailsDiscovered(), and settingsWritten().

◆ settings

DsoService::Settings DsoCommand::settings
private
Initial value:

Settings for the Pokit device's DSO mode.

Definition at line 33 of file dsocommand.h.

33 { ///< Settings for the Pokit device's DSO mode.
36 };

Referenced by processOptions(), and serviceDetailsDiscovered().

◆ showCsvHeader

bool DsoCommand::showCsvHeader { true }
private

Whether or not to show a header as the first line of CSV output.

Definition at line 39 of file dsocommand.h.

39{ true }; ///< Whether or not to show a header as the first line of CSV output.

Referenced by outputSamples().


The documentation for this class was generated from the following files: