LCOV - code coverage report
Current view: top level - src/app - calibratecommand.cpp (source / functions) Hit Total Coverage
Project: QtPokit Lines: 29 40 72.5 %
Version: Functions: 6 8 75.0 %

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

Generated by: LCOV version 1.14