Line data Source code
1 : // SPDX-FileCopyrightText: 2022 Paul Colby <git@colby.id.au> 2 : // SPDX-License-Identifier: LGPL-3.0-or-later 3 : 4 : #include "calibratecommand.h" 5 : 6 : #include <qtpokit/calibrationservice.h> 7 : #include <qtpokit/pokitdevice.h> 8 : 9 : #include <QJsonDocument> 10 : #include <QJsonObject> 11 : 12 : #include <iostream> 13 : 14 : /*! 15 : * \class CalibrateCommand 16 : * 17 : * The CalibrateCommand class implements the `calibrate` CLI command. 18 : */ 19 : 20 : /*! 21 : * Construct a new CalibrateCommand object with \a parent. 22 : */ 23 306 : CalibrateCommand::CalibrateCommand(QObject * const parent) : DeviceCommand(parent), 24 306 : service(nullptr), temperature(std::numeric_limits<float>::quiet_NaN()) 25 : { 26 : 27 306 : } 28 : 29 459 : QStringList CalibrateCommand::requiredOptions(const QCommandLineParser &parser) const 30 : { 31 1377 : return DeviceCommand::requiredOptions(parser) + QStringList{ 32 : QLatin1String("temperature"), 33 1296 : }; 34 : } 35 : 36 221 : QStringList CalibrateCommand::supportedOptions(const QCommandLineParser &parser) const 37 : { 38 221 : return DeviceCommand::supportedOptions(parser); 39 : } 40 : 41 : /*! 42 : * \copybrief DeviceCommand::processOptions 43 : * 44 : * This implementation extends DeviceCommand::processOptions to process additional CLI options 45 : * supported (or required) by this command. 46 : */ 47 204 : QStringList CalibrateCommand::processOptions(const QCommandLineParser &parser) 48 : { 49 204 : QStringList errors = DeviceCommand::processOptions(parser); 50 204 : if (!errors.isEmpty()) { 51 : return errors; 52 : } 53 : 54 275 : const QString temperatureString = parser.value(QLatin1String("temperature")); 55 : bool ok; 56 187 : const float temperatureFloat = temperatureString.toFloat(&ok); 57 187 : if (ok) { 58 136 : temperature = temperatureFloat; 59 : } else { 60 60 : errors.append(tr("Unrecognised temperature format: %1").arg(temperatureString)); 61 : } 62 : return errors; 63 66 : } 64 : 65 : /*! 66 : * \copybrief DeviceCommand::getService 67 : * 68 : * This override returns a pointer to a CalibrationService object. 69 : */ 70 0 : AbstractPokitService * CalibrateCommand::getService() 71 : { 72 : Q_ASSERT(device); 73 0 : if (!service) { 74 0 : service = device->calibration(); 75 : Q_ASSERT(service); 76 0 : connect(service, &CalibrationService::temperatureCalibrated, 77 : this, &CalibrateCommand::temperatureCalibrated); 78 : } 79 0 : return service; 80 : } 81 : 82 : /*! 83 : * \copybrief DeviceCommand::serviceDetailsDiscovered 84 : * 85 : * This override sets the ambient temperature, via the Calibration service. 86 : */ 87 0 : void CalibrateCommand::serviceDetailsDiscovered() 88 : { 89 : Q_ASSERT(service); 90 0 : DeviceCommand::serviceDetailsDiscovered(); // Just logs consistently. 91 0 : qCInfo(lc).noquote() << tr("Calibrating temperature at %1 degrees celcius...").arg(temperature); 92 0 : if (!service->calibrateTemperature(0)) { 93 0 : QCoreApplication::exit(EXIT_FAILURE); 94 : } 95 0 : } 96 : 97 : /*! 98 : * Handles CalibrationService::temperatureCalibrated events, by outputting the result and exiting. 99 : */ 100 51 : void CalibrateCommand::temperatureCalibrated() 101 : { 102 51 : switch (format) { 103 6 : case OutputFormat::Csv: 104 20 : std::cout << qUtf8Printable(tr("calibration_result\nsuccess\n")); 105 17 : break; 106 : case OutputFormat::Json: 107 23 : std::cout << qUtf8Printable(QLatin1String("true\n")); 108 17 : break; 109 6 : case OutputFormat::Text: 110 20 : std::cout << qUtf8Printable(tr("Done.\n")); 111 17 : break; 112 : } 113 51 : if (device) disconnect(); // Will exit the application once disconnected. 114 51 : }