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 "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 360 : CalibrateCommand::CalibrateCommand(QObject * const parent) : DeviceCommand(parent) 24 : { 25 : 26 360 : } 27 : 28 540 : QStringList CalibrateCommand::requiredOptions(const QCommandLineParser &parser) const 29 : { 30 1782 : return DeviceCommand::requiredOptions(parser) + QStringList{ 31 : QLatin1String("temperature"), 32 1566 : }; 33 : } 34 : 35 260 : QStringList CalibrateCommand::supportedOptions(const QCommandLineParser &parser) const 36 : { 37 260 : return DeviceCommand::supportedOptions(parser); 38 : } 39 : 40 : /*! 41 : * \copybrief DeviceCommand::processOptions 42 : * 43 : * This implementation extends DeviceCommand::processOptions to process additional CLI options 44 : * supported (or required) by this command. 45 : */ 46 240 : QStringList CalibrateCommand::processOptions(const QCommandLineParser &parser) 47 : { 48 240 : QStringList errors = DeviceCommand::processOptions(parser); 49 240 : if (!errors.isEmpty()) { 50 : return errors; 51 : } 52 : 53 220 : const QString temperatureString = parser.value(QLatin1String("temperature")); 54 : bool ok; 55 220 : const float temperatureFloat = temperatureString.toFloat(&ok); 56 220 : if (ok) { 57 160 : temperature = temperatureFloat; 58 : } else { 59 78 : errors.append(tr("Unrecognised temperature format: %1").arg(temperatureString)); 60 : } 61 : return errors; 62 154 : } 63 : 64 : /*! 65 : * \copybrief DeviceCommand::getService 66 : * 67 : * This override returns a pointer to a CalibrationService object. 68 : */ 69 0 : AbstractPokitService * CalibrateCommand::getService() 70 : { 71 : Q_ASSERT(device); 72 0 : if (!service) { 73 0 : service = device->calibration(); 74 : Q_ASSERT(service); 75 0 : connect(service, &CalibrationService::temperatureCalibrated, 76 0 : this, &CalibrateCommand::temperatureCalibrated); 77 : } 78 0 : return service; 79 : } 80 : 81 : /*! 82 : * \copybrief DeviceCommand::serviceDetailsDiscovered 83 : * 84 : * This override sets the ambient temperature, via the Calibration service. 85 : */ 86 0 : void CalibrateCommand::serviceDetailsDiscovered() 87 : { 88 : Q_ASSERT(service); 89 0 : DeviceCommand::serviceDetailsDiscovered(); // Just logs consistently. 90 0 : qCInfo(lc).noquote() << tr("Calibrating temperature at %1 degrees celcius...").arg(temperature); 91 0 : if (!service->calibrateTemperature(0)) { 92 0 : QCoreApplication::exit(EXIT_FAILURE); 93 : } 94 0 : } 95 : 96 : /*! 97 : * Handles CalibrationService::temperatureCalibrated events, by outputting the result and exiting. 98 : */ 99 60 : void CalibrateCommand::temperatureCalibrated() 100 : { 101 60 : switch (format) { 102 20 : case OutputFormat::Csv: 103 26 : std::cout << qUtf8Printable(tr("calibration_result\nsuccess\n")); 104 20 : break; 105 : case OutputFormat::Json: 106 32 : std::cout << qUtf8Printable(QLatin1String("true\n")); 107 20 : break; 108 20 : case OutputFormat::Text: 109 26 : std::cout << qUtf8Printable(tr("Done.\n")); 110 20 : break; 111 : } 112 60 : if (device) disconnect(); // Will exit the application once disconnected. 113 60 : }