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 "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 440 : InfoCommand::InfoCommand(QObject * const parent) : DeviceCommand(parent) 24 : { 25 : 26 440 : } 27 : 28 100 : QStringList InfoCommand::requiredOptions(const QCommandLineParser &parser) const 29 : { 30 200 : return DeviceCommand::requiredOptions(parser) + QStringList{ 31 190 : }; 32 : } 33 : 34 40 : QStringList InfoCommand::supportedOptions(const QCommandLineParser &parser) const 35 : { 36 40 : return DeviceCommand::supportedOptions(parser); 37 : } 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 20 : QStringList InfoCommand::processOptions(const QCommandLineParser &parser) 46 : { 47 20 : QStringList errors = DeviceCommand::processOptions(parser); 48 : if (!errors.isEmpty()) { 49 : return errors; 50 : } 51 : 52 : return errors; 53 : } 54 : 55 : /*! 56 : * \copybrief DeviceCommand::getService 57 : * 58 : * This override returns a pointer to a DeviceInfoService object. 59 : */ 60 0 : AbstractPokitService * InfoCommand::getService() 61 : { 62 : Q_ASSERT(device); 63 0 : if (!service) { 64 0 : service = device->deviceInformation(); 65 : Q_ASSERT(service); 66 : } 67 0 : return service; 68 : } 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 360 : void InfoCommand::serviceDetailsDiscovered() 76 : { 77 360 : DeviceCommand::serviceDetailsDiscovered(); // Just logs consistently. 78 360 : const QLowEnergyController * const controller = (device) ? device->controller() : nullptr; 79 360 : const QString deviceName = (controller) ? controller->remoteName() : QString(); 80 360 : const QBluetoothAddress deviceAddress = (controller) ? controller->remoteAddress() : QBluetoothAddress(); 81 360 : const QBluetoothUuid deviceUuid = (controller) ? controller->remoteDeviceUuid() : QBluetoothUuid(); 82 360 : const QString serialNumber = service->serialNumber(); 83 360 : switch (format) { 84 120 : case OutputFormat::Csv: 85 168 : std::cout << qUtf8Printable(tr("device_name,device_address,device_uuid,manufacturer_name,model_number," 86 : "hardware_revision,firmware_revision,software_revision,serial_number\n")); 87 468 : std::cout << qUtf8Printable(QString::fromLatin1("%1,%2,%3,%4,%5,%6,%7,%8,%9\n").arg( 88 : escapeCsvField(deviceName), 89 : (deviceAddress.isNull()) ? QString() : deviceAddress.toString(), 90 : (deviceUuid.isNull()) ? QString() : deviceUuid.toString(), 91 : escapeCsvField(service->manufacturer()), escapeCsvField(service->modelNumber()), 92 : escapeCsvField(service->hardwareRevision()), escapeCsvField(service->firmwareRevision()), 93 : escapeCsvField(service->softwareRevision()), escapeCsvField(serialNumber))); 94 120 : break; 95 28 : case OutputFormat::Json: { 96 : QJsonObject jsonObject{ 97 240 : { QLatin1String("manufacturerName"), service->manufacturer() }, 98 240 : { QLatin1String("modelNumber"), service->modelNumber() }, 99 240 : { QLatin1String("hardwareRevision"), service->hardwareRevision() }, 100 240 : { QLatin1String("firmwareRevision"), service->firmwareRevision() }, 101 240 : { QLatin1String("softwareRevision"), service->softwareRevision() }, 102 1428 : }; 103 120 : if (!deviceName.isEmpty()) { 104 123 : jsonObject.insert(QLatin1String("deviceName"), deviceName); 105 : } 106 120 : if (!deviceAddress.isNull()) { 107 21 : jsonObject.insert(QLatin1String("deviceAddress"), deviceAddress.toString()); 108 : } 109 120 : if (!deviceUuid.isNull()) { 110 44 : jsonObject.insert(QLatin1String("deviceUuid"), deviceUuid.toString()); 111 : } 112 120 : if (!serialNumber.isNull()) { 113 0 : jsonObject.insert(QLatin1String("serialNumber"), serialNumber); 114 : } 115 240 : std::cout << QJsonDocument(jsonObject).toJson().toStdString(); 116 120 : } break; 117 : case OutputFormat::Text: 118 120 : if (!deviceName.isEmpty()) { 119 242 : std::cout << qUtf8Printable(tr("Device name: %1\n").arg(deviceName)); 120 : } 121 120 : if (!deviceAddress.isNull()) { 122 38 : std::cout << qUtf8Printable(tr("Device addres: %1\n").arg(deviceAddress.toString())); 123 : } 124 120 : if (!deviceUuid.isNull()) { 125 112 : std::cout << qUtf8Printable(tr("Device UUID: %1\n").arg(deviceUuid.toString())); 126 : } 127 288 : std::cout << qUtf8Printable(tr("Manufacturer name: %1\n").arg(service->manufacturer())); 128 288 : std::cout << qUtf8Printable(tr("Model number: %1\n").arg(service->modelNumber())); 129 288 : std::cout << qUtf8Printable(tr("Hardware revision: %1\n").arg(service->hardwareRevision())); 130 288 : std::cout << qUtf8Printable(tr("Firmware revision: %1\n").arg(service->firmwareRevision())); 131 288 : std::cout << qUtf8Printable(tr("Software revision: %1\n").arg(service->softwareRevision())); 132 120 : if (!serialNumber.isNull()) { 133 0 : std::cout << qUtf8Printable(tr("Serial number: %1\n").arg(serialNumber)); 134 : } 135 : break; 136 : } 137 360 : if (device) disconnect(); // Will exit the application once disconnected. 138 788 : }