LCOV - code coverage report
Current view: top level - src/cli - infocommand.cpp (source / functions) Coverage Total Hit
Project: Dokit Lines: 83.9 % 93 78
Version: Functions: 84.6 % 13 11

            Line data    Source code
       1              : // SPDX-FileCopyrightText: 2022-2025 Paul Colby <git@colby.id.au>
       2              : // SPDX-License-Identifier: LGPL-3.0-or-later
       3              : 
       4              : #include "infocommand.h"
       5              : 
       6              : #include <qtpokit/deviceinfoservice.h>
       7              : #include <qtpokit/pokitdevice.h>
       8              : 
       9              : #include <QJsonDocument>
      10              : #include <QJsonObject>
      11              : 
      12              : #include <iostream>
      13              : 
      14              : /*!
      15              :  * \class InfoCommand
      16              :  *
      17              :  * The InfoCommand class implements the `info` CLI command.
      18              :  */
      19              : 
      20              : /*!
      21              :  * Construct a new InfoCommand object with \a parent.
      22              :  */
      23         1596 : InfoCommand::InfoCommand(QObject * const parent) : DeviceCommand(parent)
      24          596 : {
      25              : 
      26         1716 : }
      27              : 
      28          200 : QStringList InfoCommand::requiredOptions(const QCommandLineParser &parser) const
      29          235 : {
      30          635 :     return DeviceCommand::requiredOptions(parser) + QStringList{
      31          585 :     };
      32          235 : }
      33              : 
      34           80 : QStringList InfoCommand::supportedOptions(const QCommandLineParser &parser) const
      35           94 : {
      36          174 :     return DeviceCommand::supportedOptions(parser);
      37           94 : }
      38              : 
      39              : /*!
      40              :  * \copybrief DeviceCommand::processOptions
      41              :  *
      42              :  * This implementation extends DeviceCommand::processOptions to process additional CLI options
      43              :  * supported (or required) by this command.
      44              :  */
      45           40 : QStringList InfoCommand::processOptions(const QCommandLineParser &parser)
      46           47 : {
      47           87 :     QStringList errors = DeviceCommand::processOptions(parser);
      48           47 :     if (!errors.isEmpty()) {
      49            0 :         return errors;
      50            0 :     }
      51              : 
      52           47 :     return errors;
      53           47 : }
      54              : 
      55              : /*!
      56              :  * \copybrief DeviceCommand::getService
      57              :  *
      58              :  * This override returns a pointer to a DeviceInfoService object.
      59              :  */
      60            0 : AbstractPokitService * InfoCommand::getService()
      61            0 : {
      62            0 :     Q_ASSERT(device);
      63            0 :     if (!service) {
      64            0 :         service = device->deviceInformation();
      65            0 :         Q_ASSERT(service);
      66            0 :     }
      67            0 :     return service;
      68            0 : }
      69              : 
      70              : /*!
      71              :  * \copybrief DeviceCommand::serviceDetailsDiscovered
      72              :  *
      73              :  * This override fetches the current device's information, and outputs it in the selected format.
      74              :  */
      75          960 : void InfoCommand::serviceDetailsDiscovered()
      76          408 : {
      77         1368 :     DeviceCommand::serviceDetailsDiscovered(); // Just logs consistently.
      78         1368 :     const QLowEnergyController * const controller = (device) ? device->controller() : nullptr;
      79         1368 :     const QString deviceName = (controller) ? controller->remoteName() : QString();
      80         1368 :     const QBluetoothAddress deviceAddress = (controller) ? controller->remoteAddress() : QBluetoothAddress();
      81         1368 :     const QBluetoothUuid deviceUuid = (controller) ? controller->remoteDeviceUuid() : QBluetoothUuid();
      82         1368 :     const QString serialNumber = service->serialNumber();
      83         1368 :     switch (format) {
      84          456 :     case OutputFormat::Csv:
      85          592 :         std::cout << qUtf8Printable(tr("device_name,device_address,device_uuid,manufacturer_name,model_number,"
      86          136 :                             "hardware_revision,firmware_revision,software_revision,serial_number\n"));
      87         2090 :         std::cout << qUtf8Printable(QString::fromLatin1("%1,%2,%3,%4,%5,%6,%7,%8,%9\n").arg(
      88          136 :             escapeCsvField(deviceName),
      89          136 :             (deviceAddress.isNull()) ? QString() : deviceAddress.toString(),
      90          136 :             (deviceUuid.isNull()) ? QString() : deviceUuid.toString(),
      91          136 :             escapeCsvField(service->manufacturer()), escapeCsvField(service->modelNumber()),
      92          136 :             escapeCsvField(service->hardwareRevision()), escapeCsvField(service->firmwareRevision()),
      93          136 :             escapeCsvField(service->softwareRevision()), escapeCsvField(serialNumber)));
      94          456 :         break;
      95          456 :     case OutputFormat::Json: {
      96          136 :         QJsonObject jsonObject{
      97          640 :             { QLatin1String("manufacturerName"), service->manufacturer() },
      98          776 :             { QLatin1String("modelNumber"),      service->modelNumber() },
      99          776 :             { QLatin1String("hardwareRevision"), service->hardwareRevision() },
     100          776 :             { QLatin1String("firmwareRevision"), service->firmwareRevision() },
     101          776 :             { QLatin1String("softwareRevision"), service->softwareRevision() },
     102         2832 :         };
     103          456 :         if (!deviceName.isEmpty()) {
     104          539 :             jsonObject.insert(QLatin1String("deviceName"), deviceName);
     105          119 :         }
     106          456 :         if (!deviceAddress.isNull()) {
     107           90 :             jsonObject.insert(QLatin1String("deviceAddress"), deviceAddress.toString());
     108           17 :         }
     109          440 :         if (!deviceUuid.isNull()) {
     110          260 :             jsonObject.insert(QLatin1String("deviceUuid"), deviceUuid.toString());
     111           48 :         }
     112          456 :         if (!serialNumber.isNull()) {
     113            0 :             jsonObject.insert(QLatin1String("serialNumber"), serialNumber);
     114            0 :         }
     115          776 :         std::cout << QJsonDocument(jsonObject).toJson().toStdString();
     116          456 :     }   break;
     117          136 :     case OutputFormat::Text:
     118          456 :         if (!deviceName.isEmpty()) {
     119          798 :             std::cout << qUtf8Printable(tr("Device name:       %1\n").arg(deviceName));
     120          119 :         }
     121          456 :         if (!deviceAddress.isNull()) {
     122          112 :             std::cout << qUtf8Printable(tr("Device addres:     %1\n").arg(deviceAddress.toString()));
     123           17 :         }
     124          440 :         if (!deviceUuid.isNull()) {
     125          348 :             std::cout << qUtf8Printable(tr("Device UUID:       %1\n").arg(deviceUuid.toString()));
     126           48 :         }
     127          928 :         std::cout << qUtf8Printable(tr("Manufacturer name: %1\n").arg(service->manufacturer()));
     128          928 :         std::cout << qUtf8Printable(tr("Model number:      %1\n").arg(service->modelNumber()));
     129          928 :         std::cout << qUtf8Printable(tr("Hardware revision: %1\n").arg(service->hardwareRevision()));
     130          928 :         std::cout << qUtf8Printable(tr("Firmware revision: %1\n").arg(service->firmwareRevision()));
     131          928 :         std::cout << qUtf8Printable(tr("Software revision: %1\n").arg(service->softwareRevision()));
     132          456 :         if (!serialNumber.isNull()) {
     133            0 :             std::cout << qUtf8Printable(tr("Serial number:     %1\n").arg(serialNumber));
     134            0 :         }
     135          136 :         break;
     136          408 :     }
     137         1368 :     if (device) disconnect(); // Will exit the application once disconnected.
     138         4096 : }
        

Generated by: LCOV version 2.2-1