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: 2019 Chris Rizzitello <rizzitello@kde.org> 0004 SPDX-FileCopyrightText: 2019 Lays Rodrigues <lays.rodrigues@kde.org> 0005 */ 0006 0007 #include "machineinfo.h" 0008 0009 #include <QCoreApplication> 0010 #include <QLoggingCategory> 0011 0012 Q_LOGGING_CATEGORY(MACHINE_INFO, "org.kde.atelier.core.machineInfo") 0013 0014 const QMap<MachineInfo::KEY, MachineInfo::keyInfo> MachineInfo::decoderMap = {{KEY::NAME, {QStringLiteral("Name"), QStringLiteral("ProfileName")}}, 0015 {KEY::BAUDRATE, {QStringLiteral("bps"), 115200}}, 0016 {KEY::FIRMWARE, {QStringLiteral("firmware"), QStringLiteral("Auto-Detect")}}, 0017 {KEY::MAXBEDTEMP, {QStringLiteral("maximumTemperatureBed"), 0}}, 0018 {KEY::MAXEXTTEMP, {QStringLiteral("maximumTemperatureExtruder"), 0}}, 0019 {KEY::POSTPAUSE, {QStringLiteral("postPause"), QString()}}, 0020 {KEY::ISCARTESIAN, {QStringLiteral("isCartesian"), false}}, 0021 {KEY::XMAX, {QStringLiteral("dimensionX"), 200}}, 0022 {KEY::YMAX, {QStringLiteral("dimensionY"), 200}}, 0023 {KEY::ZMAX, {QStringLiteral("dimensionZ"), 180}}, 0024 {KEY::AUTOTEMPREPORT, {QStringLiteral("autoReportTemp"), false}}}; 0025 0026 MachineInfo *MachineInfo::instance() 0027 { 0028 static MachineInfo m; 0029 return &m; 0030 } 0031 0032 MachineInfo::MachineInfo(QObject *parent) 0033 : QObject(parent) 0034 , m_settings(new QSettings(QSettings::IniFormat, QSettings::UserScope, QStringLiteral("atcore"), QStringLiteral("profiles"), this)) 0035 { 0036 } 0037 0038 QObject *MachineInfo::qmlSingletonRegister(QQmlEngine *engine, QJSEngine *scriptEngine) 0039 { 0040 Q_UNUSED(scriptEngine) 0041 engine->setObjectOwnership(instance(), QQmlEngine::CppOwnership); 0042 return instance(); 0043 } 0044 0045 QVariantMap MachineInfo::readProfile(const QString &profileName) const 0046 { 0047 m_settings->sync(); 0048 m_settings->beginGroup(profileName); 0049 QVariantMap data {{decoderMap[KEY::NAME].name, m_settings->group()}}; 0050 for (int i = 1; i < decoderMap.size(); i++) { 0051 data.insert(decoderMap[MachineInfo::KEY(i)].name, m_settings->value(decoderMap[MachineInfo::KEY(i)].name, decoderMap[MachineInfo::KEY(i)].defaultValue)); 0052 } 0053 m_settings->endGroup(); 0054 return data; 0055 } 0056 0057 QVariant MachineInfo::readKey(const QString &profileName, MachineInfo::KEY key) const 0058 { 0059 if (profileName.isEmpty()) { 0060 return decoderMap[key].defaultValue; 0061 } 0062 0063 if (key == KEY::NAME) { 0064 return profileName; 0065 } 0066 0067 m_settings->sync(); 0068 return m_settings->value(QStringLiteral("%1/%2").arg(profileName, decoderMap[key].name), decoderMap[key].defaultValue); 0069 } 0070 0071 bool MachineInfo::storeKey(const QString &profileName, const MachineInfo::KEY key, const QVariant &value) const 0072 { 0073 if (key == KEY::NAME) { 0074 // copyProfile Q_EMITs profilesChanged 0075 return copyProfile(profileName, value.toString(), true); 0076 } 0077 0078 if (!profileNames().contains(profileName)) { 0079 qCWarning(MACHINE_INFO) << "Keysave: Profile does not exsits, create profile before attempting to store keys."; 0080 return false; 0081 } 0082 0083 if (readKey(profileName, key) == value) { 0084 return false; 0085 } 0086 0087 m_settings->beginGroup(profileName); 0088 m_settings->setValue(decoderMap[key].name, value); 0089 m_settings->endGroup(); 0090 m_settings->sync(); 0091 Q_EMIT profilesChanged(); 0092 return true; 0093 } 0094 0095 bool MachineInfo::copyProfile(const QString &srcProfile, const QString &destProfile, bool rmSrc) const 0096 { 0097 if (srcProfile.isEmpty() || destProfile.isEmpty()) { 0098 qCWarning(MACHINE_INFO) << "Profile Copy Error: Source or Destination Profile Is Empty."; 0099 return false; 0100 } 0101 0102 if (!profileNames().contains(srcProfile)) { 0103 qCWarning(MACHINE_INFO) << "Profile Copy Error: Source Not Found."; 0104 return false; 0105 } 0106 0107 if (srcProfile == destProfile) { 0108 qCWarning(MACHINE_INFO) << "Profile Copy Error: Source is Destination."; 0109 return false; 0110 } 0111 QVariantMap newProfile = readProfile(srcProfile); 0112 m_settings->beginGroup(destProfile); 0113 for (int i = 1; i < decoderMap.size(); i++) { 0114 m_settings->setValue(decoderMap[MachineInfo::KEY(i)].name, newProfile[decoderMap[MachineInfo::KEY(i)].name]); 0115 } 0116 m_settings->endGroup(); 0117 m_settings->sync(); 0118 if (rmSrc) { 0119 removeProfile(srcProfile); 0120 // removeProfile Q_EMITs profilesChanged 0121 } else { 0122 Q_EMIT profilesChanged(); 0123 } 0124 return true; 0125 } 0126 0127 bool MachineInfo::removeProfile(const QString &profileName) const 0128 { 0129 if (!profileNames().contains(profileName)) { 0130 qCWarning(MACHINE_INFO) << "Profile Remove Error: Profile not found."; 0131 return false; 0132 } 0133 m_settings->beginGroup(profileName); 0134 m_settings->remove(QString()); 0135 m_settings->endGroup(); 0136 m_settings->sync(); 0137 Q_EMIT profilesChanged(); 0138 return true; 0139 } 0140 0141 void MachineInfo::storeProfile(const QMap<MachineInfo::KEY, QVariant> &profile) const 0142 { 0143 m_settings->beginGroup(profile[KEY::NAME].toString()); 0144 for (int i = 1; i < decoderMap.size(); i++) { 0145 m_settings->setValue(decoderMap[MachineInfo::KEY(i)].name, profile[MachineInfo::KEY(i)]); 0146 } 0147 m_settings->endGroup(); 0148 m_settings->sync(); 0149 Q_EMIT profilesChanged(); 0150 } 0151 0152 void MachineInfo::storeProfile(const QVariantMap &profile) const 0153 { 0154 m_settings->beginGroup(profile.first().toString()); 0155 for (auto it = profile.begin(), end = profile.end(); it != end; ++it) { 0156 m_settings->setValue(it.key(), it.value()); 0157 } 0158 m_settings->endGroup(); 0159 m_settings->sync(); 0160 Q_EMIT profilesChanged(); 0161 } 0162 0163 QStringList MachineInfo::profileNames() const 0164 { 0165 m_settings->sync(); 0166 return m_settings->childGroups(); 0167 } 0168 0169 QString MachineInfo::keyName(const MachineInfo::KEY key) const 0170 { 0171 auto it = decoderMap.find(key); 0172 if (it != decoderMap.end()) { 0173 return it.value().name; 0174 } 0175 return QString(); 0176 }