File indexing completed on 2024-05-12 04:41:10

0001 /* AtCore KDE Libary for 3D Printers
0002     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0003     SPDX-FileCopyrightText: 2016, 2018 Tomaz Canabrava <tcanabrava@kde.org>
0004     SPDX-FileCopyrightText: 2016-2017 Patrick José Pereira <patrickjp@kde.org>
0005     SPDX-FileCopyrightText: 2016-2019 Chris Rizzitello <rizzitello@kde.org>
0006     SPDX-FileCopyrightText: 2018 Lays Rodrigues <lays.rodrigues@kde.org>
0007     SPDX-FileCopyrightText: 2018 Leandro Santiago <leandrosansilva@gmail.com>
0008 */
0009 
0010 #include <QRegularExpressionMatch>
0011 #include <cmath>
0012 
0013 #include "temperature.h"
0014 /**
0015  * @brief The TemperaturePrivate class
0016  *
0017  * Private Data of Temperature
0018  */
0019 
0020 struct Temperature::TemperaturePrivate {
0021     /** Regex to capture Bed Temperature. Looks for B: then grabs ##.## */
0022     static const QRegularExpression bedRegEx;
0023     /** bedTemp: Bed current temperature */
0024     float bedTemp = 0.0;
0025     /** bedTargetTemp: Bed target temperature */
0026     float bedTargetTemp = 0.0;
0027     /** extruderTemp: Extruder current temperature */
0028     float extruderTemp = 0.0;
0029     /** extruderTargetTemp: Extruder target temperature */
0030     float extruderTargetTemp = 0.0;
0031     /** Regex to capture Bed Target Temperature: Find B:## /## and grab the second set of numbers */
0032     static const QRegularExpression targetBedRegEx;
0033     /** Regex to capture Extruder Target Temperature Finds T:## /## and grabs the second set of numbers */
0034     static const QRegularExpression targetTempRegEx;
0035     /** Regex to capture Extruder Temperature. Looks for T: then grabs ##.## */
0036     static const QRegularExpression tempRegEx;
0037 };
0038 
0039 /**
0040  * @brief Temperature::TemperaturePrivate::bedRegEx
0041  *  Look for B: capture Any int or float as "bed"
0042  *  Examples:
0043  *   B: 25.0/50.0 (Captures 25.0)
0044  *   B: 25/50  (Captures 25)
0045  */
0046 const QRegularExpression Temperature::TemperaturePrivate::bedRegEx = QRegularExpression(QStringLiteral(R"(B:(?<bed>\d+\.?\d*))"));
0047 
0048 /**
0049  * @brief Temperature::TemperaturePrivate::targetBedRegEx
0050  *  Look for B: [anything ] /. Capture any int or float after the '/' as "bedTarget"
0051  *  Examples:
0052  *   B: 25.0 /50.0 (Captures 50.0)
0053  *   B: 25/50 (Captures 50)
0054  */
0055 const QRegularExpression Temperature::TemperaturePrivate::targetBedRegEx = QRegularExpression(QStringLiteral(R"(B:[^\/]*\/(?<bedTarget>\d+\.?\d*))"));
0056 
0057 /**
0058  * @brief Temperature::TemperaturePrivate::targetTempRegEx
0059  *  Look for T: [anything ] /. Capture any int or float after the '/' as "extruderTarget"
0060  *  Examples:
0061  *   T: 25.0 /50.0 (Captures 50.0)
0062  *   T: 25/50 (Captures 50)
0063  */
0064 const QRegularExpression Temperature::TemperaturePrivate::targetTempRegEx = QRegularExpression(QStringLiteral(R"(T:[^\/]*\/(?<extruderTarget>\d+\.?\d*))"));
0065 
0066 /**
0067  * @brief Temperature::TemperaturePrivate::tempRegEx
0068  *  Look for T: capture Any int or float as "extruder"
0069  *  Examples:
0070  *   T: 25.0 /50 (Captures 25.0)
0071  *   T: 25/50 (Captures 25)
0072  */
0073 const QRegularExpression Temperature::TemperaturePrivate::tempRegEx = QRegularExpression(QStringLiteral(R"(T:(?<extruder>\d+\.?\d*))"));
0074 
0075 Temperature::Temperature(QObject *parent)
0076     : QObject(parent)
0077     , d(new TemperaturePrivate)
0078 {
0079 }
0080 
0081 Temperature::~Temperature()
0082 {
0083     delete d;
0084 }
0085 
0086 float Temperature::bedTargetTemperature() const
0087 {
0088     return d->bedTargetTemp;
0089 }
0090 
0091 float Temperature::bedTemperature() const
0092 {
0093     return d->bedTemp;
0094 }
0095 
0096 float Temperature::extruderTargetTemperature() const
0097 {
0098     return d->extruderTargetTemp;
0099 }
0100 
0101 float Temperature::extruderTemperature() const
0102 {
0103     return d->extruderTemp;
0104 }
0105 
0106 void Temperature::decodeTemp(const QByteArray &msg)
0107 {
0108     QString msgString = QString::fromLatin1(msg);
0109     QRegularExpressionMatch tempCheck = d->tempRegEx.match(msgString);
0110     QRegularExpressionMatch targetTempCheck = d->targetTempRegEx.match(msgString);
0111 
0112     if (tempCheck.hasMatch()) {
0113         d->extruderTemp = tempCheck.captured(QStringLiteral("extruder")).toFloat();
0114         Q_EMIT extruderTemperatureChanged();
0115     }
0116 
0117     if (targetTempCheck.hasMatch()) {
0118         d->extruderTargetTemp = targetTempCheck.captured(QStringLiteral("extruderTarget")).toFloat();
0119         Q_EMIT extruderTargetTemperatureChanged();
0120     }
0121 
0122     if (msgString.contains(QStringLiteral("B:"), Qt::CaseInsensitive))  {
0123         QRegularExpressionMatch bedCheck = d->bedRegEx.match(msgString);
0124         QRegularExpressionMatch targetBedCheck = d->targetBedRegEx.match(msgString);
0125 
0126         if (bedCheck.hasMatch()) {
0127             d->bedTemp = bedCheck.captured(QStringLiteral("bed")).toFloat();
0128             Q_EMIT bedTemperatureChanged();
0129         }
0130 
0131         if (targetBedCheck.hasMatch()) {
0132             d->bedTargetTemp = targetBedCheck.captured(QStringLiteral("bedTarget")).toFloat();
0133             Q_EMIT bedTargetTemperatureChanged();
0134         }
0135     }
0136 }
0137 
0138 void Temperature::resetData()
0139 {
0140     d->extruderTemp = 0.0;
0141     d->extruderTargetTemp = 0.0;
0142     d->bedTemp = 0.0;
0143     d->bedTargetTemp = 0.0;
0144 }