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