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 }