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 : }
|