LCOV - code coverage report
Current view: top level - src/cli - devicecommand.cpp (source / functions) Hit Total Coverage
Project: Dokit Lines: 126 149 84.6 %
Version: Functions: 20 41 48.8 %

          Line data    Source code
       1             : // SPDX-FileCopyrightText: 2022-2024 Paul Colby <git@colby.id.au>
       2             : // SPDX-License-Identifier: LGPL-3.0-or-later
       3             : 
       4             : #include "devicecommand.h"
       5             : 
       6             : #include <qtpokit/abstractpokitservice.h>
       7             : #include <qtpokit/pokitdevice.h>
       8             : #include <qtpokit/pokitdiscoveryagent.h>
       9             : #include "qtpokit/pokitmeter.h"
      10             : #include "qtpokit/pokitpro.h"
      11             : 
      12             : /*!
      13             :  * \class DeviceCommand
      14             :  *
      15             :  * The AbstractCommand class extends AbstractCommand to add a PokitDevice instance.
      16             :  */
      17             : 
      18             : /*!
      19             :  * Construct a new DeviceCommand object with \a parent.
      20             :  */
      21        7580 : DeviceCommand::DeviceCommand(QObject * const parent) : AbstractCommand(parent)
      22             : {
      23             : 
      24        7580 : }
      25             : 
      26             : /*!
      27             :  * Begins scanning for the Pokit device.
      28             :  */
      29          40 : bool DeviceCommand::start()
      30             : {
      31          84 :     qCInfo(lc).noquote() << ((deviceToScanFor.isNull())
      32          68 :         ? tr("Looking for first available Pokit device...")
      33          86 :         : tr(R"(Looking for device "%1"...)").arg(deviceToScanFor));
      34          40 :     discoveryAgent->start();
      35          40 :     return true;
      36             : }
      37             : 
      38             : /*!
      39             :  * Disconnects the underlying Pokit device, and sets \a exitCode to be return to the OS once the
      40             :  * disconnection has taken place.
      41             :  */
      42         540 : void DeviceCommand::disconnect(int exitCode)
      43             : {
      44         606 :     qCDebug(lc).noquote() << tr("Disconnecting Pokit device...");
      45             :     Q_ASSERT(device);
      46             :     Q_ASSERT(device->controller());
      47         540 :     exitCodeOnDisconnect = exitCode;
      48         540 :     device->controller()->disconnectFromDevice();
      49         540 : }
      50             : 
      51             : /*!
      52             :  * \fn virtual AbstractPokitService * DeviceCommand::getService() = 0
      53             :  *
      54             :  * Returns a Pokit service object for the derived command class. This will be called by
      55             :  * deviceDiscovered() when the requested Pokit device has been found, after which
      56             :  * deviceDiscovered() will connect the returned service's common signals, and kick off the
      57             :  * device's connection process.
      58             :  */
      59             : 
      60             : #define DOKIT_CLI_IF_LESS_THAN_RETURN(value, ns, label) \
      61             : if (value <= ns::maxValue(label).toUInt()) { \
      62             :         return label; \
      63             : }
      64             : 
      65             : /**
      66             :  * \fn template<typename T> static T DeviceCommand::minRange(const quint32 maxValue)
      67             :  *
      68             :  * Returns the lowest \a T range that can measure at least up to \a maxValue, or AutoRange if no such range is
      69             :  * available.
      70             :  *
      71             :  * \tparam T Range enumerator to evaluate ranges for. Must be one of:
      72             :  *   * PokitMeter::CurrentRange
      73             :  *   * PokitMeter::ResistanceRange
      74             :  *   * PokitMeter::VoltageRange
      75             :  *   * PokitPro::CapacitanceRange
      76             :  *   * PokitPro::CurrentRange
      77             :  *   * PokitPro::ResistanceRange
      78             :  *   * PokitPro::VoltageRange
      79             :  *
      80             :  * \cond Doxygen has "only very limited support for member specialization at the moment", so hide these from Doxygen.
      81             :  * Specifically, if we don't hide them, then Doxygen (at least the current version: v1.9.6) sees the following
      82             :  * specialisations as new, public, non-static members.
      83             :  */
      84             : 
      85             : /*!
      86             :  * Returns the lowest PokitMeter::CurrentRange value that can measure at least up to \a maxValue, or AutoRange if
      87             :  * the Pokit Meter cannot measure as high as \a maxValue.
      88             :  */
      89         260 : template<> PokitMeter::CurrentRange DeviceCommand::minRange<>(const quint32 maxValue)
      90             : {
      91         260 :     if (maxValue == 0) return PokitMeter::CurrentRange::AutoRange;
      92         240 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitMeter, PokitMeter::CurrentRange::_10mA)
      93         200 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitMeter, PokitMeter::CurrentRange::_30mA)
      94         160 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitMeter, PokitMeter::CurrentRange::_150mA)
      95         100 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitMeter, PokitMeter::CurrentRange::_300mA)
      96          60 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitMeter, PokitMeter::CurrentRange::_2A)
      97             :     return PokitMeter::CurrentRange::AutoRange;
      98             : }
      99             : 
     100             : /*!
     101             :  * Returns the lowest PokitMeter::ResistanceRange value that can measure at least up to \a maxValue, or AutoRange if
     102             :  * the Pokit Meter cannot measure as high as \a maxValue.
     103             :  */
     104         380 : template<> PokitMeter::ResistanceRange DeviceCommand::minRange(const quint32 maxValue)
     105             : {
     106         380 :     if (maxValue == 0) return PokitMeter::ResistanceRange::AutoRange;
     107         360 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitMeter, PokitMeter::ResistanceRange::_160)
     108         320 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitMeter, PokitMeter::ResistanceRange::_330)
     109         280 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitMeter, PokitMeter::ResistanceRange::_890)
     110         240 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitMeter, PokitMeter::ResistanceRange::_1K5)
     111         200 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitMeter, PokitMeter::ResistanceRange::_10K)
     112         160 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitMeter, PokitMeter::ResistanceRange::_100K)
     113         120 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitMeter, PokitMeter::ResistanceRange::_470K)
     114          60 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitMeter, PokitMeter::ResistanceRange::_1M)
     115             :     return PokitMeter::ResistanceRange::AutoRange;
     116             : }
     117             : 
     118             : /*!
     119             :  * Returns the lowest PokitMeter::VoltageRange value that can measure at least up to \a maxValue, or AutoRange if
     120             :  * the Pokit Meter cannot measure as high as \a maxValue.
     121             :  */
     122         300 : template<> PokitMeter::VoltageRange DeviceCommand::minRange(const quint32 maxValue)
     123             : {
     124         300 :     if (maxValue == 0) return PokitMeter::VoltageRange::AutoRange;
     125         280 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitMeter, PokitMeter::VoltageRange::_300mV)
     126         240 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitMeter, PokitMeter::VoltageRange::_2V)
     127         200 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitMeter, PokitMeter::VoltageRange::_6V)
     128         160 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitMeter, PokitMeter::VoltageRange::_12V)
     129         120 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitMeter, PokitMeter::VoltageRange::_30V)
     130          60 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitMeter, PokitMeter::VoltageRange::_60V)
     131             :     return PokitMeter::VoltageRange::AutoRange;
     132             : }
     133             : 
     134             : /*!
     135             :  * Returns the lowest PokitPro::CapacitanceRange value that can measure at least up to \a maxValue, or AutoRange if
     136             :  * the Pokit Pro cannot measure as high as \a maxValue.
     137             :  */
     138         180 : template<> PokitPro::CapacitanceRange DeviceCommand::minRange(const quint32 maxValue)
     139             : {
     140         180 :     if (maxValue == 0) return PokitPro::CapacitanceRange::AutoRange;
     141         160 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitPro, PokitPro::CapacitanceRange::_100nF)
     142         120 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitPro, PokitPro::CapacitanceRange::_10uF)
     143          80 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitPro, PokitPro::CapacitanceRange::_1mF)
     144             :     return PokitPro::CapacitanceRange::AutoRange;
     145             : }
     146             : 
     147             : /*!
     148             :  * Returns the lowest PokitPro::CurrentRange value that can measure at least up to \a maxValue, or AutoRange if
     149             :  * the Pokit Pro cannot measure as high as \a maxValue.
     150             :  */
     151         340 : template<> PokitPro::CurrentRange DeviceCommand::minRange(const quint32 maxValue)
     152             : {
     153         340 :     if (maxValue == 0) return PokitPro::CurrentRange::AutoRange;
     154         320 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitPro, PokitPro::CurrentRange::_500uA)
     155         280 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitPro, PokitPro::CurrentRange::_2mA)
     156         240 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitPro, PokitPro::CurrentRange::_10mA)
     157         200 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitPro, PokitPro::CurrentRange::_125mA)
     158         140 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitPro, PokitPro::CurrentRange::_300mA)
     159         100 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitPro, PokitPro::CurrentRange::_3A)
     160          60 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitPro, PokitPro::CurrentRange::_10A)
     161             :     return PokitPro::CurrentRange::AutoRange;
     162             : }
     163             : 
     164             : /*!
     165             :  * Returns the lowest PokitPro::ResistanceRange value that can measure at least up to \a maxValue, or AutoRange if
     166             :  * the Pokit Pro cannot measure as high as \a maxValue.
     167             :  */
     168         500 : template<> PokitPro::ResistanceRange DeviceCommand::minRange(const quint32 maxValue)
     169             : {
     170         500 :     if (maxValue == 0) return PokitPro::ResistanceRange::AutoRange;
     171         480 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitPro, PokitPro::ResistanceRange::_30)
     172         440 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitPro, PokitPro::ResistanceRange::_75)
     173         400 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitPro, PokitPro::ResistanceRange::_400)
     174         360 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitPro, PokitPro::ResistanceRange::_5K)
     175         320 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitPro, PokitPro::ResistanceRange::_10K)
     176         280 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitPro, PokitPro::ResistanceRange::_15K)
     177         240 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitPro, PokitPro::ResistanceRange::_40K)
     178         200 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitPro, PokitPro::ResistanceRange::_500K)
     179         140 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitPro, PokitPro::ResistanceRange::_700K)
     180         100 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitPro, PokitPro::ResistanceRange::_1M)
     181          60 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitPro, PokitPro::ResistanceRange::_3M)
     182             :     return PokitPro::ResistanceRange::AutoRange;
     183             : }
     184             : 
     185             : /*!
     186             :  * Returns the lowest PokitPro::VoltageRange value that can measure at least up to \a maxValue, or AutoRange if
     187             :  * the Pokit Pro cannot measure as high as \a maxValue.
     188             :  */
     189         380 : template<> PokitPro::VoltageRange DeviceCommand::minRange(const quint32 maxValue)
     190             : {
     191         380 :     if (maxValue == 0) return PokitPro::VoltageRange::AutoRange;
     192         360 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitPro, PokitPro::VoltageRange::_250mV)
     193         320 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitPro, PokitPro::VoltageRange::_2V)
     194         280 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitPro, PokitPro::VoltageRange::_10V)
     195         240 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitPro, PokitPro::VoltageRange::_30V)
     196         200 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitPro, PokitPro::VoltageRange::_60V)
     197         160 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitPro, PokitPro::VoltageRange::_125V)
     198         100 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitPro, PokitPro::VoltageRange::_400V)
     199          60 :     DOKIT_CLI_IF_LESS_THAN_RETURN(maxValue, PokitPro, PokitPro::VoltageRange::_600V)
     200             :     return PokitPro::VoltageRange::AutoRange;
     201             : }
     202             : 
     203             : /// \endcond
     204             : 
     205             : /*!
     206             :  * Returns the \a product's lowest capacitance range that can measure at least up to \a maxValue (nF), or AutoRange if
     207             :  * no such range is available.
     208             :  *
     209             :  * \note Since Pokit Meters do not support capacitance measurement, \a product should not be PokitProduct::PokitMeter.
     210             :  *
     211             :  * \see minRange<PokitPro::CapacitanceRange>
     212             :  */
     213          20 : quint8 DeviceCommand::minCapacitanceRange(const PokitProduct product, const quint32 maxValue)
     214             : {
     215          20 :     switch (product) {
     216             :     case PokitProduct::PokitMeter:
     217             :         Q_ASSERT_X(false, "DeviceCommand::minCapacitanceRange", "Pokit Meter has no capacitance support.");
     218             :         return 255;
     219          20 :     case PokitProduct::PokitPro:
     220          20 :         return +minRange<PokitPro::CapacitanceRange>(maxValue);
     221             :     }
     222             :     Q_ASSERT_X(false, "DeviceCommand::minCapacitanceRange", "Unknown PokitProduct enum value");
     223             :     return 255;
     224             : }
     225             : 
     226             : /*!
     227             :  * Returns the \a product's lowest current range that can measure at least up to \a maxValue (µA), or AutoRange if no
     228             :  * such range is available.
     229             :  *
     230             :  * \see DeviceCommand::minRange<PokitMeter::CurrentRange>(const quint32 maxValue)
     231             :  * \see minRange<PokitPro::CurrentRange>(const quint32 maxValue)
     232             :  */
     233          40 : quint8 DeviceCommand::minCurrentRange(const PokitProduct product, const quint32 maxValue)
     234             : {
     235          40 :     switch (product) {
     236          20 :     case PokitProduct::PokitMeter:
     237          20 :         return +minRange<PokitMeter::CurrentRange>(maxValue);
     238          20 :     case PokitProduct::PokitPro:
     239          20 :         return +minRange<PokitPro::CurrentRange>(maxValue);
     240             :     }
     241             :     Q_ASSERT_X(false, "DeviceCommand::minCurrentRange", "Unknown PokitProduct enum value");
     242             :     return 255;
     243             : }
     244             : 
     245             : /*!
     246             :  * Returns the \a product's lowest resistance range that can measure at least up to \a maxValue (Ω), or AutoRange if no
     247             :  * such range is available.
     248             :  *
     249             :  * \see DeviceCommand::minRange<PokitMeter::ResistanceRange>(const quint32 maxValue)
     250             :  * \see minRange<PokitPro::ResistanceRange>(const quint32 maxValue)
     251             :  */
     252          40 : quint8 DeviceCommand::minResistanceRange(const PokitProduct product, const quint32 maxValue)
     253             : {
     254          40 :     switch (product) {
     255          20 :     case PokitProduct::PokitMeter:
     256          20 :         return +minRange<PokitMeter::ResistanceRange>(maxValue);
     257          20 :     case PokitProduct::PokitPro:
     258          20 :         return +minRange<PokitPro::ResistanceRange>(maxValue);
     259             :     }
     260             :     Q_ASSERT_X(false, "DeviceCommand::minResistanceRange", "Unknown PokitProduct enum value");
     261             :     return 255;
     262             : }
     263             : 
     264             : /*!
     265             :  t
     266             : * Returns the \a product's lowest voltage range that can measure at least up to \a maxValue (mV), or AutoRange if no
     267             :  * such range is available.
     268             :  *
     269             :  * \see DeviceCommand::minRange<PokitMeter::VoltageRange>(const quint32 maxValue)
     270             :  * \see minRange<PokitPro::VoltageRange>(const quint32 maxValue)
     271             :  */
     272          40 : quint8 DeviceCommand::minVoltageRange(const PokitProduct product, const quint32 maxValue)
     273             : {
     274          40 :     switch (product) {
     275          20 :     case PokitProduct::PokitMeter:
     276          20 :         return +minRange<PokitMeter::VoltageRange>(maxValue);
     277          20 :     case PokitProduct::PokitPro:
     278          20 :         return +minRange<PokitPro::VoltageRange>(maxValue);
     279             :     }
     280             :     Q_ASSERT_X(false, "DeviceCommand::minVoltageRange", "Unknown PokitProduct enum value");
     281             :     return 255;
     282             : }
     283             : 
     284             : #undef DOKIT_CLI_IF_LESS_THAN_RETURN
     285             : 
     286             : 
     287             : /*!
     288             :  * Handles controller error events. This base implementation simply logs \a error and then exits
     289             :  * with `EXIT_FAILURE`. Derived classes may override this slot to implement their own error
     290             :  * handing if desired.
     291             :  */
     292          40 : void DeviceCommand::controllerError(QLowEnergyController::Error error)
     293             : {
     294         124 :     qCWarning(lc).noquote() << tr("Bluetooth controller error:") << error;
     295          40 :     QCoreApplication::exit(EXIT_FAILURE);
     296          40 : }
     297             : 
     298             : /*!
     299             :  * Handles devics disconnection events. This base implementation simply logs and exits the
     300             :  * application (via QCoreApplication::exit) with the current exitCodeOnDisconnect value, which is
     301             :  * initialise to `EXIT_FAILURE` in the constructor, but should be set to `EXIT_SUCESS` if/when
     302             :  * the derived command class has completed its actions and requested the disconnection (as opposed
     303             :  * to a spontaneous disconnection on error).
     304             :  */
     305          20 : void DeviceCommand::deviceDisconnected()
     306             : {
     307          22 :     qCDebug(lc).noquote() << tr("Pokit device disconnected. Exiting with code %1.")
     308           0 :         .arg(exitCodeOnDisconnect);
     309          20 :     QCoreApplication::exit(exitCodeOnDisconnect);
     310          20 : }
     311             : 
     312             : /*!
     313             :  * Handles service error events. This base implementation simply logs \a error and then exits
     314             :  * with `EXIT_FAILURE`. Derived classes may override this slot to implement their own error
     315             :  * handing if desired.
     316             :  *
     317             :  * \note As this base class does not construct services (derived classed do), its up to the derived
     318             :  * classed to connect this slot to the relevant service's error signal if desired.
     319             :  */
     320          40 : void DeviceCommand::serviceError(const QLowEnergyService::ServiceError error)
     321             : {
     322         124 :     qCWarning(lc).noquote() << tr("Bluetooth service error:") << error;
     323          40 :     QCoreApplication::exit(EXIT_FAILURE);
     324          40 : }
     325             : 
     326             : /*!
     327             :  * Handles service detail discovery events. This base implementation simply logs the event, and
     328             :  * nothing more. Derived classes may (usually do) override this slot to provide their own processing
     329             :  * when a services details have been discovered.
     330             :  */
     331         400 : void DeviceCommand::serviceDetailsDiscovered()
     332             : {
     333         452 :     qCDebug(lc).noquote() << tr("Service details discovered.");
     334         400 : }
     335             : 
     336             : /*!
     337             :  * Checks if \a info is the device (if any) we're looking for, and if so, create a contoller and
     338             :  * service, and begins connecting to the device.
     339             :  */
     340          20 : void DeviceCommand::deviceDiscovered(const QBluetoothDeviceInfo &info)
     341             : {
     342             :     Q_ASSERT(isPokitProduct(info));
     343             : 
     344          20 :     if (device) {
     345           0 :         qCDebug(lc).noquote() << tr(R"(Ignoring additional Pokit device "%1" (%2) at (%3).)")
     346           0 :             .arg(info.name(), info.deviceUuid().toString(), info.address().toString());
     347           0 :         return;
     348             :     }
     349             : 
     350          60 :     if ((deviceToScanFor.isEmpty()) || (deviceToScanFor == info.name()) ||
     351          79 :         ((!info.address().isNull()) && (info.address() == QBluetoothAddress(deviceToScanFor))) ||
     352          40 :         ((!info.deviceUuid().isNull()) && (info.deviceUuid() == QBluetoothUuid(deviceToScanFor))))
     353             :     {
     354           0 :         qCDebug(lc).noquote() << tr(R"(Found Pokit device "%1" (%2) at (%3).)")
     355           0 :             .arg(info.name(), info.deviceUuid().toString(), info.address().toString());
     356           0 :         discoveryAgent->stop();
     357             : 
     358           0 :         device = new PokitDevice(info, this);
     359           0 :         connect(device->controller(), &QLowEnergyController::disconnected,
     360           0 :                 this, &DeviceCommand::deviceDisconnected);
     361           0 :         connect(device->controller(),
     362             :             #if (QT_VERSION < QT_VERSION_CHECK(6, 2, 0))
     363             :             QOverload<QLowEnergyController::Error>::of(&QLowEnergyController::error),
     364             :             #else
     365             :             &QLowEnergyController::errorOccurred,
     366             :             #endif
     367           0 :             this, &DeviceCommand::controllerError, Qt::QueuedConnection);
     368             : 
     369           0 :         AbstractPokitService * const service = getService();
     370           0 :         service->setPokitProduct(pokitProduct(info));
     371             : 
     372             :         Q_ASSERT(service);
     373           0 :         connect(service, &AbstractPokitService::serviceDetailsDiscovered,
     374           0 :                 this, &DeviceCommand::serviceDetailsDiscovered);
     375           0 :         connect(service, &AbstractPokitService::serviceErrorOccurred,
     376           0 :                 this, &DeviceCommand::serviceError);
     377             : 
     378           0 :         qCDebug(lc).noquote() << tr(R"(Connecting to %1 device "%2" (%3) at (%4).)").arg(
     379           0 :             toString(*service->pokitProduct()), info.name(), info.deviceUuid().toString(), info.address().toString());
     380           0 :         device->controller()->connectToDevice();
     381           0 :         return;
     382             :     }
     383             : 
     384          22 :     qCDebug(lc).noquote() << tr(R"(Ignoring non-matching Pokit device "%1" (%2) at (%3).)")
     385           0 :         .arg(info.name(), info.deviceUuid().toString(), info.address().toString());
     386           2 :     return;
     387             : }
     388             : 
     389             : /*!
     390             :  * Checks that the requested device was discovered, and if not, reports and error and exits.
     391             :  */
     392          40 : void DeviceCommand::deviceDiscoveryFinished()
     393             : {
     394          40 :     if (!device) {
     395          84 :         qCWarning(lc).noquote() << ((deviceToScanFor.isNull())
     396          68 :             ? tr("Failed to find any Pokit device.")
     397          86 :             : tr(R"(Failed to find device "%1".)").arg(deviceToScanFor));
     398          40 :         QCoreApplication::exit(EXIT_FAILURE);
     399             :     }
     400          40 : }

Generated by: LCOV version 1.14